Copy disabled (too large)
Download .txt
Showing preview only (108,864K chars total). Download the full file to get everything.
Repository: DGA-MI-SSI/YaCo
Branch: master
Commit: 9b85e6ca1809
Files: 17644
Total size: 121.5 MB
Directory structure:
gitextract_092dub5g/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── YaCo/
│ ├── exec_ida.py
│ ├── export_all.py
│ ├── load_yadb.py
│ └── yaco_plugin.py
├── YaDiff/
│ ├── MergeYaDB.cpp
│ ├── YaDiffLib/
│ │ ├── Algo/
│ │ │ ├── Algo.cpp
│ │ │ ├── Algo.hpp
│ │ │ ├── CallerXRefMatch.cpp
│ │ │ ├── CallerXRefMatch.hpp
│ │ │ ├── ExactMatch.cpp
│ │ │ ├── ExactMatch.hpp
│ │ │ ├── ExternalMappingMatch.cpp
│ │ │ ├── ExternalMappingMatch.hpp
│ │ │ ├── VectorSign/
│ │ │ │ ├── ArchArm.cpp
│ │ │ │ ├── ArchArm.hpp
│ │ │ │ ├── ArchMips.cpp
│ │ │ │ ├── ArchMips.hpp
│ │ │ │ ├── ArchPpc.cpp
│ │ │ │ ├── ArchPpc.hpp
│ │ │ │ ├── ArchX86.cpp
│ │ │ │ ├── ArchX86.hpp
│ │ │ │ ├── IArch.cpp
│ │ │ │ ├── IArch.hpp
│ │ │ │ ├── InstructionVector.cpp
│ │ │ │ ├── InstructionVector.hpp
│ │ │ │ ├── VectorDistance.cpp
│ │ │ │ ├── VectorDistance.hpp
│ │ │ │ ├── VectorHelpers.cpp
│ │ │ │ ├── VectorHelpers.hpp
│ │ │ │ ├── VectorTypes.cpp
│ │ │ │ └── VectorTypes.hpp
│ │ │ ├── VectorSign.cpp
│ │ │ ├── VectorSign.hpp
│ │ │ ├── XRefOffsetMatch.cpp
│ │ │ ├── XRefOffsetMatch.hpp
│ │ │ └── json.hpp
│ │ ├── Matching.cpp
│ │ ├── Matching.hpp
│ │ ├── Propagate.cpp
│ │ ├── Propagate.hpp
│ │ ├── VersionRelation.cpp
│ │ ├── VersionRelation.hpp
│ │ ├── YaDiff.cpp
│ │ └── YaDiff.hpp
│ ├── merge_idb.py
│ └── tests/
│ └── YaDiffLib_test/
│ ├── data/
│ │ ├── TestExternalMappingMatch1.xml
│ │ ├── TestExternalMappingMatch2.xml
│ │ ├── TestExternalMappingMatchAlgo.json
│ │ ├── TestMatchBasicBlock1.xml
│ │ ├── TestMatchBasicBlock2.xml
│ │ ├── TestMatchStruct1.xml
│ │ ├── TestMatchStruct2.xml
│ │ ├── TestParentXrefOfDataMatch1.xml
│ │ ├── TestParentXrefOfDataMatch2.xml
│ │ ├── TestSigComp1.xml
│ │ ├── TestSigComp2.xml
│ │ ├── TestXrefOfDataMatch1.xml
│ │ ├── TestXrefOfDataMatch2.xml
│ │ ├── config.xml
│ │ ├── diff/
│ │ │ └── tbf_small_c.xml
│ │ └── merge/
│ │ ├── TestMergeAttribute1.xml
│ │ ├── TestMergeAttribute2.xml
│ │ ├── TestMergeAttributeResult1.xml
│ │ ├── TestMergeAttributeResult2.xml
│ │ ├── TestMergeComment1.xml
│ │ ├── TestMergeComment2.xml
│ │ ├── TestMergeCommentResult1.xml
│ │ ├── TestMergeCommentResult2.xml
│ │ ├── TestMergeMultiStrucXrefs1.xml
│ │ ├── TestMergeMultiStrucXrefs2.xml
│ │ ├── TestMergeMultiStrucXrefsResult1.xml
│ │ ├── TestMergeMultiStrucXrefsResult2.xml
│ │ ├── TestMergeName1.xml
│ │ ├── TestMergeName2.xml
│ │ ├── TestMergeName2Result.xml
│ │ ├── TestMergeParentExport1.xml
│ │ ├── TestMergeParentExport2.xml
│ │ ├── TestMergeParentExportFunction11Result2.xml
│ │ ├── TestMergeParentExportFunction2Result2.xml
│ │ ├── TestMergeXrefs1.xml
│ │ ├── TestMergeXrefs2.xml
│ │ ├── TestMergeXrefsLoop1.xml
│ │ ├── TestMergeXrefsLoop2.xml
│ │ ├── TestMergeXrefsLoopResult11.xml
│ │ ├── TestMergeXrefsLoopResult111.xml
│ │ ├── TestMergeXrefsLoopResult2.xml
│ │ ├── TestMergeXrefsMissing1.xml
│ │ ├── TestMergeXrefsMissing2.xml
│ │ ├── TestMergeXrefsMissingResult1.xml
│ │ ├── TestMergeXrefsMissingResult2.xml
│ │ ├── TestMergeXrefsMissingResult41.xml
│ │ ├── TestMergeXrefsResult1.xml
│ │ └── TestMergeXrefsResult2.xml
│ ├── test_Algo.cpp
│ ├── test_VersionRelation.cpp
│ └── test_YaDiffLib.cpp
├── YaLibs/
│ ├── YaToolsIDALib/
│ │ ├── Events.cpp
│ │ ├── Events.hpp
│ │ ├── Hash.cpp
│ │ ├── Hash.hpp
│ │ ├── Hooks.cpp
│ │ ├── Hooks.hpp
│ │ ├── Ida.h
│ │ ├── IdaDeleter.cpp
│ │ ├── IdaDeleter.hpp
│ │ ├── IdaModel.cpp
│ │ ├── IdaModel.hpp
│ │ ├── IdaVisitor.cpp
│ │ ├── IdaVisitor.hpp
│ │ ├── PluginArm.cpp
│ │ ├── Plugins.hpp
│ │ ├── Pool.hpp
│ │ ├── Repository.cpp
│ │ ├── Repository.hpp
│ │ ├── Strucs.cpp
│ │ ├── Strucs.hpp
│ │ ├── YaCo.cpp
│ │ ├── YaCo.hpp
│ │ ├── YaHelpers.cpp
│ │ └── YaHelpers.hpp
│ ├── YaToolsLib/
│ │ ├── Bench.h
│ │ ├── BinHex.cpp
│ │ ├── BinHex.hpp
│ │ ├── Configuration.cpp
│ │ ├── Configuration.hpp
│ │ ├── FileUtils.cpp
│ │ ├── FileUtils.hpp
│ │ ├── FlatBufferModel.cpp
│ │ ├── FlatBufferModel.hpp
│ │ ├── FlatBufferVisitor.cpp
│ │ ├── FlatBufferVisitor.hpp
│ │ ├── Git.cpp
│ │ ├── Git.hpp
│ │ ├── GitAsync.cpp
│ │ ├── HSignature.cpp
│ │ ├── HSignature.hpp
│ │ ├── HVersion.cpp
│ │ ├── HVersion.hpp
│ │ ├── Helpers.h
│ │ ├── IModel.hpp
│ │ ├── IModelSink.hpp
│ │ ├── IModelVisitor.hpp
│ │ ├── LibGit.h
│ │ ├── Logger.cpp
│ │ ├── Logger.hpp
│ │ ├── MemoryModel.cpp
│ │ ├── MemoryModel.hpp
│ │ ├── Merger.cpp
│ │ ├── Merger.hpp
│ │ ├── ModelIndex.hpp
│ │ ├── Random.cpp
│ │ ├── Random.hpp
│ │ ├── Relation.hpp
│ │ ├── Signature.cpp
│ │ ├── Signature.hpp
│ │ ├── Utils.cpp
│ │ ├── Utils.hpp
│ │ ├── XmlAccept.cpp
│ │ ├── XmlAccept.hpp
│ │ ├── XmlVisitor.cpp
│ │ ├── XmlVisitor.hpp
│ │ ├── YaEnums.hpp
│ │ ├── YaTypes.cpp
│ │ ├── YaTypes.hpp
│ │ ├── Yatools.cpp
│ │ ├── Yatools.hpp
│ │ └── yadb.fbs
│ ├── YaToolsPy/
│ │ ├── YaSwig.cpp
│ │ ├── YaSwig.hpp
│ │ ├── YaToolsPy.h
│ │ ├── YaToolsPy32.i
│ │ └── YaToolsPy64.i
│ └── tests/
│ ├── YaToolsLib_test/
│ │ ├── ExporterValidatorVisitor.cpp
│ │ ├── ExporterValidatorVisitor.hpp
│ │ ├── test_DatabaseModel.cpp
│ │ ├── test_XMLDatabaseModel.cpp
│ │ ├── test_common.hpp
│ │ ├── test_configuration.cpp
│ │ ├── test_git.cpp
│ │ ├── test_model.hpp
│ │ └── test_yatools.cpp
│ ├── data/
│ │ └── test_configuration.xml
│ └── integration/
│ └── integration.cpp
├── YaToolsUtils/
│ ├── YaToolsBinToVect/
│ │ └── bintovect.py
│ ├── YaToolsCacheMerger/
│ │ └── CacheMerger.cpp
│ ├── YaToolsFBToXML/
│ │ └── FBToXML.cpp
│ ├── YaToolsXMLToFB/
│ │ └── XMLToFB.cpp
│ └── YaToolsYaDBToVectors/
│ └── yadbtovectors.cpp
├── build/
│ ├── CMakeLists.txt
│ ├── capstone.cmake
│ ├── common.cmake
│ ├── configure.sh
│ ├── configure_2017.cmd
│ ├── deploy.cmd
│ ├── deploy.sh
│ ├── deploy_debug.cmd
│ ├── deploy_dev.sh
│ ├── files/
│ │ ├── capstone.linux.files.cmake
│ │ ├── capstone.nt.files.cmake
│ │ ├── charset.linux.files.cmake
│ │ ├── charset.nt.files.cmake
│ │ ├── farmhash.linux.files.cmake
│ │ ├── farmhash.nt.files.cmake
│ │ ├── flatbuffers.linux.files.cmake
│ │ ├── flatbuffers.nt.files.cmake
│ │ ├── flatc.linux.files.cmake
│ │ ├── flatc.nt.files.cmake
│ │ ├── git2.linux.files.cmake
│ │ ├── git2.nt.files.cmake
│ │ ├── gtest.linux.files.cmake
│ │ ├── gtest.nt.files.cmake
│ │ ├── http_parser.linux.files.cmake
│ │ ├── http_parser.nt.files.cmake
│ │ ├── iconv.linux.files.cmake
│ │ ├── iconv.nt.files.cmake
│ │ ├── integration_tests.linux.files.cmake
│ │ ├── integration_tests.nt.files.cmake
│ │ ├── libxml2.linux.files.cmake
│ │ ├── libxml2.nt.files.cmake
│ │ ├── mbedtls.linux.files.cmake
│ │ ├── mbedtls.nt.files.cmake
│ │ ├── regex.linux.files.cmake
│ │ ├── regex.nt.files.cmake
│ │ ├── ssh2.linux.files.cmake
│ │ ├── ssh2.nt.files.cmake
│ │ ├── swig.linux.files.cmake
│ │ ├── swig.nt.files.cmake
│ │ ├── yacachemerger.linux.files.cmake
│ │ ├── yacachemerger.nt.files.cmake
│ │ ├── yadbtovector.linux.files.cmake
│ │ ├── yadbtovector.nt.files.cmake
│ │ ├── yadiff.linux.files.cmake
│ │ ├── yadiff.nt.files.cmake
│ │ ├── yadifflib.linux.files.cmake
│ │ ├── yadifflib.nt.files.cmake
│ │ ├── yadifflib_tests.linux.files.cmake
│ │ ├── yadifflib_tests.nt.files.cmake
│ │ ├── yafb2xml.linux.files.cmake
│ │ ├── yafb2xml.nt.files.cmake
│ │ ├── yaida32.linux.files.cmake
│ │ ├── yaida32.nt.files.cmake
│ │ ├── yaida64.linux.files.cmake
│ │ ├── yaida64.nt.files.cmake
│ │ ├── yatools.linux.files.cmake
│ │ ├── yatools.nt.files.cmake
│ │ ├── yatools_tests.linux.files.cmake
│ │ ├── yatools_tests.nt.files.cmake
│ │ ├── yaxml2fb.linux.files.cmake
│ │ ├── yaxml2fb.nt.files.cmake
│ │ ├── zlib.linux.files.cmake
│ │ └── zlib.nt.files.cmake
│ ├── flatbuffer.cmake
│ ├── package.py
│ ├── undeploy.cmd
│ ├── yadeps.cmake
│ └── yatools.cmake
├── deps/
│ ├── capstone-3.0.4/
│ │ ├── LEB128.h
│ │ ├── MCDisassembler.h
│ │ ├── MCFixedLenDisassembler.h
│ │ ├── MCInst.c
│ │ ├── MCInst.h
│ │ ├── MCInstrDesc.c
│ │ ├── MCInstrDesc.h
│ │ ├── MCRegisterInfo.c
│ │ ├── MCRegisterInfo.h
│ │ ├── MathExtras.h
│ │ ├── SStream.c
│ │ ├── SStream.h
│ │ ├── arch/
│ │ │ ├── AArch64/
│ │ │ │ ├── AArch64AddressingModes.h
│ │ │ │ ├── AArch64BaseInfo.c
│ │ │ │ ├── AArch64BaseInfo.h
│ │ │ │ ├── AArch64Disassembler.c
│ │ │ │ ├── AArch64Disassembler.h
│ │ │ │ ├── AArch64GenAsmWriter.inc
│ │ │ │ ├── AArch64GenDisassemblerTables.inc
│ │ │ │ ├── AArch64GenInstrInfo.inc
│ │ │ │ ├── AArch64GenRegisterInfo.inc
│ │ │ │ ├── AArch64GenSubtargetInfo.inc
│ │ │ │ ├── AArch64InstPrinter.c
│ │ │ │ ├── AArch64InstPrinter.h
│ │ │ │ ├── AArch64Mapping.c
│ │ │ │ ├── AArch64Mapping.h
│ │ │ │ ├── AArch64MappingInsn.inc
│ │ │ │ ├── AArch64MappingInsnOp.inc
│ │ │ │ ├── AArch64Module.c
│ │ │ │ └── ARMMappingInsnOp.inc
│ │ │ ├── ARM/
│ │ │ │ ├── ARMAddressingModes.h
│ │ │ │ ├── ARMBaseInfo.h
│ │ │ │ ├── ARMDisassembler.c
│ │ │ │ ├── ARMDisassembler.h
│ │ │ │ ├── ARMGenAsmWriter.inc
│ │ │ │ ├── ARMGenDisassemblerTables.inc
│ │ │ │ ├── ARMGenInstrInfo.inc
│ │ │ │ ├── ARMGenRegisterInfo.inc
│ │ │ │ ├── ARMGenSubtargetInfo.inc
│ │ │ │ ├── ARMInstPrinter.c
│ │ │ │ ├── ARMInstPrinter.h
│ │ │ │ ├── ARMMapping.c
│ │ │ │ ├── ARMMapping.h
│ │ │ │ ├── ARMMappingInsn.inc
│ │ │ │ ├── ARMMappingInsnOp.inc
│ │ │ │ └── ARMModule.c
│ │ │ ├── M68K/
│ │ │ │ ├── M68KDisassembler.c
│ │ │ │ ├── M68KDisassembler.h
│ │ │ │ ├── M68KInstPrinter.c
│ │ │ │ ├── M68KInstPrinter.h
│ │ │ │ └── M68KModule.c
│ │ │ ├── Mips/
│ │ │ │ ├── MipsDisassembler.c
│ │ │ │ ├── MipsDisassembler.h
│ │ │ │ ├── MipsGenAsmWriter.inc
│ │ │ │ ├── MipsGenDisassemblerTables.inc
│ │ │ │ ├── MipsGenInstrInfo.inc
│ │ │ │ ├── MipsGenRegisterInfo.inc
│ │ │ │ ├── MipsGenSubtargetInfo.inc
│ │ │ │ ├── MipsInstPrinter.c
│ │ │ │ ├── MipsInstPrinter.h
│ │ │ │ ├── MipsMapping.c
│ │ │ │ ├── MipsMapping.h
│ │ │ │ ├── MipsMappingInsn.inc
│ │ │ │ └── MipsModule.c
│ │ │ ├── PowerPC/
│ │ │ │ ├── PPCDisassembler.c
│ │ │ │ ├── PPCDisassembler.h
│ │ │ │ ├── PPCGenAsmWriter.inc
│ │ │ │ ├── PPCGenDisassemblerTables.inc
│ │ │ │ ├── PPCGenInstrInfo.inc
│ │ │ │ ├── PPCGenRegisterInfo.inc
│ │ │ │ ├── PPCGenSubtargetInfo.inc
│ │ │ │ ├── PPCInstPrinter.c
│ │ │ │ ├── PPCInstPrinter.h
│ │ │ │ ├── PPCMapping.c
│ │ │ │ ├── PPCMapping.h
│ │ │ │ ├── PPCMappingInsn.inc
│ │ │ │ ├── PPCModule.c
│ │ │ │ └── PPCPredicates.h
│ │ │ ├── Sparc/
│ │ │ │ ├── Sparc.h
│ │ │ │ ├── SparcDisassembler.c
│ │ │ │ ├── SparcDisassembler.h
│ │ │ │ ├── SparcGenAsmWriter.inc
│ │ │ │ ├── SparcGenDisassemblerTables.inc
│ │ │ │ ├── SparcGenInstrInfo.inc
│ │ │ │ ├── SparcGenRegisterInfo.inc
│ │ │ │ ├── SparcGenSubtargetInfo.inc
│ │ │ │ ├── SparcInstPrinter.c
│ │ │ │ ├── SparcInstPrinter.h
│ │ │ │ ├── SparcMapping.c
│ │ │ │ ├── SparcMapping.h
│ │ │ │ ├── SparcMappingInsn.inc
│ │ │ │ └── SparcModule.c
│ │ │ ├── SystemZ/
│ │ │ │ ├── SystemZDisassembler.c
│ │ │ │ ├── SystemZDisassembler.h
│ │ │ │ ├── SystemZGenAsmWriter.inc
│ │ │ │ ├── SystemZGenDisassemblerTables.inc
│ │ │ │ ├── SystemZGenInstrInfo.inc
│ │ │ │ ├── SystemZGenRegisterInfo.inc
│ │ │ │ ├── SystemZGenSubtargetInfo.inc
│ │ │ │ ├── SystemZInstPrinter.c
│ │ │ │ ├── SystemZInstPrinter.h
│ │ │ │ ├── SystemZMCTargetDesc.c
│ │ │ │ ├── SystemZMCTargetDesc.h
│ │ │ │ ├── SystemZMapping.c
│ │ │ │ ├── SystemZMapping.h
│ │ │ │ ├── SystemZMappingInsn.inc
│ │ │ │ └── SystemZModule.c
│ │ │ ├── X86/
│ │ │ │ ├── X86ATTInstPrinter.c
│ │ │ │ ├── X86BaseInfo.h
│ │ │ │ ├── X86Disassembler.c
│ │ │ │ ├── X86Disassembler.h
│ │ │ │ ├── X86DisassemblerDecoder.c
│ │ │ │ ├── X86DisassemblerDecoder.h
│ │ │ │ ├── X86DisassemblerDecoderCommon.h
│ │ │ │ ├── X86GenAsmWriter.inc
│ │ │ │ ├── X86GenAsmWriter1.inc
│ │ │ │ ├── X86GenAsmWriter1_reduce.inc
│ │ │ │ ├── X86GenAsmWriter_reduce.inc
│ │ │ │ ├── X86GenDisassemblerTables.inc
│ │ │ │ ├── X86GenDisassemblerTables_reduce.inc
│ │ │ │ ├── X86GenInstrInfo.inc
│ │ │ │ ├── X86GenInstrInfo_reduce.inc
│ │ │ │ ├── X86GenRegisterInfo.inc
│ │ │ │ ├── X86ImmSize.inc
│ │ │ │ ├── X86InstPrinter.h
│ │ │ │ ├── X86IntelInstPrinter.c
│ │ │ │ ├── X86Mapping.c
│ │ │ │ ├── X86Mapping.h
│ │ │ │ ├── X86MappingInsn.inc
│ │ │ │ ├── X86MappingInsnOp.inc
│ │ │ │ ├── X86MappingInsnOp_reduce.inc
│ │ │ │ ├── X86MappingInsn_reduce.inc
│ │ │ │ └── X86Module.c
│ │ │ └── XCore/
│ │ │ ├── XCoreDisassembler.c
│ │ │ ├── XCoreDisassembler.h
│ │ │ ├── XCoreGenAsmWriter.inc
│ │ │ ├── XCoreGenDisassemblerTables.inc
│ │ │ ├── XCoreGenInstrInfo.inc
│ │ │ ├── XCoreGenRegisterInfo.inc
│ │ │ ├── XCoreInstPrinter.c
│ │ │ ├── XCoreInstPrinter.h
│ │ │ ├── XCoreMapping.c
│ │ │ ├── XCoreMapping.h
│ │ │ ├── XCoreMappingInsn.inc
│ │ │ └── XCoreModule.c
│ │ ├── bindings/
│ │ │ └── python/
│ │ │ ├── build/
│ │ │ │ └── lib/
│ │ │ │ └── capstone/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── arm.py
│ │ │ │ ├── arm64.py
│ │ │ │ ├── arm64_const.py
│ │ │ │ ├── arm_const.py
│ │ │ │ ├── m68k.py
│ │ │ │ ├── m68k_const.py
│ │ │ │ ├── mips.py
│ │ │ │ ├── mips_const.py
│ │ │ │ ├── ppc.py
│ │ │ │ ├── ppc_const.py
│ │ │ │ ├── sparc.py
│ │ │ │ ├── sparc_const.py
│ │ │ │ ├── systemz.py
│ │ │ │ ├── sysz_const.py
│ │ │ │ ├── x86.py
│ │ │ │ ├── x86_const.py
│ │ │ │ ├── xcore.py
│ │ │ │ └── xcore_const.py
│ │ │ ├── capstone/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── arm.py
│ │ │ │ ├── arm64.py
│ │ │ │ ├── arm64_const.py
│ │ │ │ ├── arm_const.py
│ │ │ │ ├── m68k.py
│ │ │ │ ├── m68k_const.py
│ │ │ │ ├── mips.py
│ │ │ │ ├── mips_const.py
│ │ │ │ ├── ppc.py
│ │ │ │ ├── ppc_const.py
│ │ │ │ ├── sparc.py
│ │ │ │ ├── sparc_const.py
│ │ │ │ ├── systemz.py
│ │ │ │ ├── sysz_const.py
│ │ │ │ ├── x86.py
│ │ │ │ ├── x86_const.py
│ │ │ │ ├── xcore.py
│ │ │ │ └── xcore_const.py
│ │ │ └── setup.py
│ │ ├── cs.c
│ │ ├── cs_priv.h
│ │ ├── include/
│ │ │ └── capstone/
│ │ │ ├── arm.h
│ │ │ ├── arm64.h
│ │ │ ├── capstone.h
│ │ │ ├── m68k.h
│ │ │ ├── mips.h
│ │ │ ├── platform.h
│ │ │ ├── ppc.h
│ │ │ ├── sparc.h
│ │ │ ├── systemz.h
│ │ │ ├── x86.h
│ │ │ └── xcore.h
│ │ ├── myinttypes.h
│ │ ├── utils.c
│ │ └── utils.h
│ ├── farmhash-1.1/
│ │ ├── COPYING
│ │ ├── Makefile.am
│ │ ├── Makefile.in
│ │ ├── NEWS
│ │ ├── README
│ │ ├── Understanding_Hash_Functions
│ │ ├── aclocal.m4
│ │ ├── compile
│ │ ├── config.guess
│ │ ├── config.h.in
│ │ ├── config.sub
│ │ ├── configure
│ │ ├── configure.ac
│ │ ├── depcomp
│ │ ├── dev/
│ │ │ ├── INSTRUCTIONS
│ │ │ ├── PATCH
│ │ │ ├── SELFTESTCityHash128WithSeed
│ │ │ ├── SELFTESTFingerprint128
│ │ │ ├── SELFTESTHash32
│ │ │ ├── SELFTESTHash32WithSeed
│ │ │ ├── SELFTESTHash64
│ │ │ ├── SELFTESTHash64WithSeed
│ │ │ ├── SELFTESTHash64WithSeeds
│ │ │ ├── TESTBOILERPLATEHash32
│ │ │ ├── TESTBOILERPLATEHash32WithSeed
│ │ │ ├── TESTBOILERPLATEHash64
│ │ │ ├── TESTBOILERPLATEHash64WithSeed
│ │ │ ├── TESTBOILERPLATEHash64WithSeeds
│ │ │ ├── WRAPPERuint32tconstcharssizetlen
│ │ │ ├── WRAPPERuint32tconstcharssizetlenuint32tseed
│ │ │ ├── WRAPPERuint32tconstcharssizetlenuint64tseed
│ │ │ ├── WRAPPERuint32tconstcharssizetlenuint64tseed0uint64tseed1
│ │ │ ├── WRAPPERuint64tconstcharssizetlen
│ │ │ ├── WRAPPERuint64tconstcharssizetlenuint64tseed
│ │ │ ├── WRAPPERuint64tconstcharssizetlenuint64tseed0uint64tseed1
│ │ │ ├── basics.cc
│ │ │ ├── builder.cc
│ │ │ ├── cmake_m32
│ │ │ ├── create-self-test
│ │ │ ├── do-in-parallel
│ │ │ ├── f.cc
│ │ │ ├── farmhash.h
│ │ │ ├── farmhashcc.cc
│ │ │ ├── farmhashmk.cc
│ │ │ ├── farmhashna.cc
│ │ │ ├── farmhashns.cc
│ │ │ ├── farmhashnt.cc
│ │ │ ├── farmhashsa.cc
│ │ │ ├── farmhashsu.cc
│ │ │ ├── farmhashte.cc
│ │ │ ├── farmhashuo.cc
│ │ │ ├── farmhashxo.cc
│ │ │ ├── fix-copyright
│ │ │ ├── platform.cc
│ │ │ ├── remove-from-to
│ │ │ └── self-test-skeleton.cc
│ │ ├── install-sh
│ │ ├── ltmain.sh
│ │ ├── m4/
│ │ │ ├── libtool.m4
│ │ │ ├── ltoptions.m4
│ │ │ ├── ltsugar.m4
│ │ │ ├── ltversion.m4
│ │ │ └── lt~obsolete.m4
│ │ ├── missing
│ │ ├── src/
│ │ │ ├── Makefile.am
│ │ │ ├── Makefile.in
│ │ │ ├── farm-test.cc
│ │ │ ├── farmhash.cc
│ │ │ └── farmhash.h
│ │ └── test-driver
│ ├── flatbuffers-1.8.0/
│ │ ├── .gitattributes
│ │ ├── .github/
│ │ │ ├── ISSUE_TEMPLATE.md
│ │ │ └── PULL_REQUEST_TEMPLATE.md
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CMake/
│ │ │ ├── BuildFlatBuffers.cmake
│ │ │ ├── FindFlatBuffers.cmake
│ │ │ ├── FlatbuffersConfig.cmake
│ │ │ └── PackageDebian.cmake
│ │ ├── CMakeLists.txt
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE.txt
│ │ ├── android/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradlew
│ │ │ ├── gradlew.bat
│ │ │ ├── jni/
│ │ │ │ ├── Android.mk
│ │ │ │ ├── Application.mk
│ │ │ │ ├── build_flatc.bat
│ │ │ │ ├── include.mk
│ │ │ │ ├── main.cpp
│ │ │ │ ├── msbuild.py
│ │ │ │ └── run_flatc.py
│ │ │ └── res/
│ │ │ └── values/
│ │ │ └── strings.xml
│ │ ├── appveyor.yml
│ │ ├── biicode/
│ │ │ ├── README.md
│ │ │ ├── cmake/
│ │ │ │ └── biicode.cmake
│ │ │ └── support/
│ │ │ └── bii-travis.sh
│ │ ├── biicode.conf
│ │ ├── composer.json
│ │ ├── docs/
│ │ │ ├── footer.html
│ │ │ ├── header.html
│ │ │ └── source/
│ │ │ ├── Benchmarks.md
│ │ │ ├── Building.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── CUsage.md
│ │ │ ├── Compiler.md
│ │ │ ├── CppUsage.md
│ │ │ ├── FlatBuffers.md
│ │ │ ├── FlexBuffers.md
│ │ │ ├── GoApi.md
│ │ │ ├── GoApi_generated.txt
│ │ │ ├── GoUsage.md
│ │ │ ├── Grammar.md
│ │ │ ├── Internals.md
│ │ │ ├── JavaCsharpUsage.md
│ │ │ ├── JavaScriptUsage.md
│ │ │ ├── PHPUsage.md
│ │ │ ├── PythonUsage.md
│ │ │ ├── README_TO_GENERATE_DOCS.md
│ │ │ ├── Schemas.md
│ │ │ ├── Support.md
│ │ │ ├── Tutorial.md
│ │ │ ├── WhitePaper.md
│ │ │ ├── doxyfile
│ │ │ ├── doxygen_layout.xml
│ │ │ ├── gRPC/
│ │ │ │ └── CppUsage.md
│ │ │ ├── groups
│ │ │ └── style.css
│ │ ├── go/
│ │ │ ├── builder.go
│ │ │ ├── doc.go
│ │ │ ├── encode.go
│ │ │ ├── grpc.go
│ │ │ ├── lib.go
│ │ │ ├── sizes.go
│ │ │ ├── struct.go
│ │ │ └── table.go
│ │ ├── grpc/
│ │ │ ├── README.md
│ │ │ ├── samples/
│ │ │ │ └── greeter/
│ │ │ │ ├── client.cpp
│ │ │ │ ├── greeter.fbs
│ │ │ │ └── server.cpp
│ │ │ ├── src/
│ │ │ │ └── compiler/
│ │ │ │ ├── config.h
│ │ │ │ ├── cpp_generator.cc
│ │ │ │ ├── cpp_generator.h
│ │ │ │ ├── go_generator.cc
│ │ │ │ ├── go_generator.h
│ │ │ │ └── schema_interface.h
│ │ │ └── tests/
│ │ │ ├── go_test.go
│ │ │ └── grpctest.cpp
│ │ ├── include/
│ │ │ └── flatbuffers/
│ │ │ ├── base.h
│ │ │ ├── code_generators.h
│ │ │ ├── flatbuffers.h
│ │ │ ├── flatc.h
│ │ │ ├── flexbuffers.h
│ │ │ ├── grpc.h
│ │ │ ├── hash.h
│ │ │ ├── idl.h
│ │ │ ├── minireflect.h
│ │ │ ├── reflection.h
│ │ │ ├── reflection_generated.h
│ │ │ ├── registry.h
│ │ │ ├── stl_emulation.h
│ │ │ └── util.h
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── google/
│ │ │ └── flatbuffers/
│ │ │ ├── Constants.java
│ │ │ ├── FlatBufferBuilder.java
│ │ │ ├── Struct.java
│ │ │ └── Table.java
│ │ ├── js/
│ │ │ └── flatbuffers.js
│ │ ├── net/
│ │ │ └── FlatBuffers/
│ │ │ ├── ByteBuffer.cs
│ │ │ ├── FlatBufferBuilder.cs
│ │ │ ├── FlatBufferConstants.cs
│ │ │ ├── FlatBuffers.csproj
│ │ │ ├── IFlatbufferObject.cs
│ │ │ ├── Offset.cs
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── Struct.cs
│ │ │ └── Table.cs
│ │ ├── package.json
│ │ ├── php/
│ │ │ ├── ByteBuffer.php
│ │ │ ├── Constants.php
│ │ │ ├── FlatbufferBuilder.php
│ │ │ ├── Struct.php
│ │ │ └── Table.php
│ │ ├── pom.xml
│ │ ├── python/
│ │ │ ├── __init__.py
│ │ │ ├── flatbuffers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── compat.py
│ │ │ │ ├── encode.py
│ │ │ │ ├── number_types.py
│ │ │ │ ├── packer.py
│ │ │ │ └── table.py
│ │ │ └── setup.py
│ │ ├── readme.md
│ │ ├── reflection/
│ │ │ ├── generate_code.sh
│ │ │ └── reflection.fbs
│ │ ├── samples/
│ │ │ ├── SampleBinary.cs
│ │ │ ├── SampleBinary.java
│ │ │ ├── SampleBinary.php
│ │ │ ├── android/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── build.gradle
│ │ │ │ ├── gradle/
│ │ │ │ │ └── wrapper/
│ │ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ ├── gradlew
│ │ │ │ ├── gradlew.bat
│ │ │ │ ├── jni/
│ │ │ │ │ ├── Android.mk
│ │ │ │ │ ├── Application.mk
│ │ │ │ │ ├── main.cpp
│ │ │ │ │ └── schemas/
│ │ │ │ │ └── animal.fbs
│ │ │ │ └── res/
│ │ │ │ └── values/
│ │ │ │ └── strings.xml
│ │ │ ├── android_sample.sh
│ │ │ ├── csharp_sample.sh
│ │ │ ├── go_sample.sh
│ │ │ ├── java_sample.sh
│ │ │ ├── javascript_sample.sh
│ │ │ ├── monster.fbs
│ │ │ ├── monster_generated.h
│ │ │ ├── monsterdata.json
│ │ │ ├── php_sample.sh
│ │ │ ├── python_sample.sh
│ │ │ ├── sample_binary.cpp
│ │ │ ├── sample_binary.go
│ │ │ ├── sample_binary.py
│ │ │ ├── sample_text.cpp
│ │ │ └── samplebinary.js
│ │ ├── src/
│ │ │ ├── code_generators.cpp
│ │ │ ├── flatc.cpp
│ │ │ ├── flatc_main.cpp
│ │ │ ├── flathash.cpp
│ │ │ ├── idl_gen_cpp.cpp
│ │ │ ├── idl_gen_fbs.cpp
│ │ │ ├── idl_gen_general.cpp
│ │ │ ├── idl_gen_go.cpp
│ │ │ ├── idl_gen_grpc.cpp
│ │ │ ├── idl_gen_js.cpp
│ │ │ ├── idl_gen_json_schema.cpp
│ │ │ ├── idl_gen_php.cpp
│ │ │ ├── idl_gen_python.cpp
│ │ │ ├── idl_gen_text.cpp
│ │ │ ├── idl_parser.cpp
│ │ │ ├── reflection.cpp
│ │ │ └── util.cpp
│ │ └── tests/
│ │ ├── FlatBuffers.Test/
│ │ │ ├── Assert.cs
│ │ │ ├── ByteBufferTests.cs
│ │ │ ├── FlatBufferBuilderTests.cs
│ │ │ ├── FlatBuffers.Test.csproj
│ │ │ ├── FlatBuffersExampleTests.cs
│ │ │ ├── FlatBuffersFuzzTests.cs
│ │ │ ├── FlatBuffersTestClassAttribute.cs
│ │ │ ├── FlatBuffersTestMethodAttribute.cs
│ │ │ ├── FuzzTestData.cs
│ │ │ ├── Lcg.cs
│ │ │ ├── NetTest.sh
│ │ │ ├── Program.cs
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── Resources/
│ │ │ │ └── monsterdata_test.mon
│ │ │ └── TestTable.cs
│ │ ├── GoTest.sh
│ │ ├── JavaScriptTest.js
│ │ ├── JavaScriptTest.sh
│ │ ├── JavaScriptUnionVectorTest.js
│ │ ├── JavaTest.bat
│ │ ├── JavaTest.java
│ │ ├── JavaTest.sh
│ │ ├── MyGame/
│ │ │ ├── Example/
│ │ │ │ ├── Ability.cs
│ │ │ │ ├── Ability.go
│ │ │ │ ├── Ability.java
│ │ │ │ ├── Ability.php
│ │ │ │ ├── Ability.py
│ │ │ │ ├── Any.cs
│ │ │ │ ├── Any.go
│ │ │ │ ├── Any.java
│ │ │ │ ├── Any.php
│ │ │ │ ├── Any.py
│ │ │ │ ├── Color.cs
│ │ │ │ ├── Color.go
│ │ │ │ ├── Color.java
│ │ │ │ ├── Color.php
│ │ │ │ ├── Color.py
│ │ │ │ ├── Monster.cs
│ │ │ │ ├── Monster.go
│ │ │ │ ├── Monster.java
│ │ │ │ ├── Monster.php
│ │ │ │ ├── Monster.py
│ │ │ │ ├── MonsterStorage_grpc.go
│ │ │ │ ├── Stat.cs
│ │ │ │ ├── Stat.go
│ │ │ │ ├── Stat.java
│ │ │ │ ├── Stat.php
│ │ │ │ ├── Stat.py
│ │ │ │ ├── Test.cs
│ │ │ │ ├── Test.go
│ │ │ │ ├── Test.java
│ │ │ │ ├── Test.php
│ │ │ │ ├── Test.py
│ │ │ │ ├── TestSimpleTableWithEnum.cs
│ │ │ │ ├── TestSimpleTableWithEnum.go
│ │ │ │ ├── TestSimpleTableWithEnum.java
│ │ │ │ ├── TestSimpleTableWithEnum.php
│ │ │ │ ├── TestSimpleTableWithEnum.py
│ │ │ │ ├── TypeAliases.cs
│ │ │ │ ├── TypeAliases.go
│ │ │ │ ├── TypeAliases.java
│ │ │ │ ├── TypeAliases.php
│ │ │ │ ├── TypeAliases.py
│ │ │ │ ├── Vec3.cs
│ │ │ │ ├── Vec3.go
│ │ │ │ ├── Vec3.java
│ │ │ │ ├── Vec3.php
│ │ │ │ ├── Vec3.py
│ │ │ │ └── __init__.py
│ │ │ ├── Example2/
│ │ │ │ ├── Monster.cs
│ │ │ │ ├── Monster.go
│ │ │ │ ├── Monster.java
│ │ │ │ ├── Monster.php
│ │ │ │ ├── Monster.py
│ │ │ │ └── __init__.py
│ │ │ ├── InParentNamespace.cs
│ │ │ ├── InParentNamespace.go
│ │ │ ├── InParentNamespace.java
│ │ │ ├── InParentNamespace.php
│ │ │ ├── InParentNamespace.py
│ │ │ └── __init__.py
│ │ ├── PythonTest.sh
│ │ ├── TestAll.sh
│ │ ├── TypeScriptTest.sh
│ │ ├── fuzzer/
│ │ │ ├── build_fuzzer.sh
│ │ │ ├── build_run_parser_test.sh
│ │ │ ├── build_run_verifier_test.sh
│ │ │ ├── flatbuffers_parser_fuzzer.cc
│ │ │ └── flatbuffers_verifier_fuzzer.cc
│ │ ├── generate_code.bat
│ │ ├── generate_code.sh
│ │ ├── go_test.go
│ │ ├── include_test/
│ │ │ ├── include_test1.fbs
│ │ │ └── sub/
│ │ │ └── include_test2.fbs
│ │ ├── monster_test.bfbs
│ │ ├── monster_test.fbs
│ │ ├── monster_test.grpc.fb.cc
│ │ ├── monster_test.grpc.fb.h
│ │ ├── monster_test.schema.json
│ │ ├── monster_test_generated.h
│ │ ├── monster_test_generated.js
│ │ ├── monster_test_generated.ts
│ │ ├── monsterdata_python_wire.mon
│ │ ├── monsterdata_test.golden
│ │ ├── monsterdata_test.json
│ │ ├── monsterdata_test.mon
│ │ ├── namespace_test/
│ │ │ ├── NamespaceA/
│ │ │ │ ├── NamespaceB/
│ │ │ │ │ ├── EnumInNestedNS.cs
│ │ │ │ │ ├── EnumInNestedNS.go
│ │ │ │ │ ├── EnumInNestedNS.java
│ │ │ │ │ ├── EnumInNestedNS.php
│ │ │ │ │ ├── EnumInNestedNS.py
│ │ │ │ │ ├── StructInNestedNS.cs
│ │ │ │ │ ├── StructInNestedNS.go
│ │ │ │ │ ├── StructInNestedNS.java
│ │ │ │ │ ├── StructInNestedNS.php
│ │ │ │ │ ├── StructInNestedNS.py
│ │ │ │ │ ├── TableInNestedNS.cs
│ │ │ │ │ ├── TableInNestedNS.go
│ │ │ │ │ ├── TableInNestedNS.java
│ │ │ │ │ ├── TableInNestedNS.php
│ │ │ │ │ ├── TableInNestedNS.py
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── SecondTableInA.cs
│ │ │ │ ├── SecondTableInA.go
│ │ │ │ ├── SecondTableInA.java
│ │ │ │ ├── SecondTableInA.php
│ │ │ │ ├── SecondTableInA.py
│ │ │ │ ├── TableInC.cs
│ │ │ │ ├── TableInC.go
│ │ │ │ ├── TableInC.java
│ │ │ │ ├── TableInC.php
│ │ │ │ ├── TableInC.py
│ │ │ │ ├── TableInFirstNS.cs
│ │ │ │ ├── TableInFirstNS.go
│ │ │ │ ├── TableInFirstNS.java
│ │ │ │ ├── TableInFirstNS.php
│ │ │ │ ├── TableInFirstNS.py
│ │ │ │ └── __init__.py
│ │ │ ├── NamespaceC/
│ │ │ │ ├── TableInC.cs
│ │ │ │ ├── TableInC.go
│ │ │ │ ├── TableInC.java
│ │ │ │ ├── TableInC.php
│ │ │ │ ├── TableInC.py
│ │ │ │ └── __init__.py
│ │ │ ├── namespace_test1.fbs
│ │ │ ├── namespace_test1_generated.h
│ │ │ ├── namespace_test1_generated.js
│ │ │ ├── namespace_test1_generated.ts
│ │ │ ├── namespace_test2.fbs
│ │ │ ├── namespace_test2_generated.h
│ │ │ ├── namespace_test2_generated.js
│ │ │ └── namespace_test2_generated.ts
│ │ ├── phpTest.php
│ │ ├── phpUnionVectorTest.php
│ │ ├── phpUnionVectorTest.sh
│ │ ├── prototest/
│ │ │ ├── imported.proto
│ │ │ ├── test.golden
│ │ │ └── test.proto
│ │ ├── py_test.py
│ │ ├── test.cpp
│ │ ├── unicode_test.json
│ │ └── union_vector/
│ │ ├── Attacker.php
│ │ ├── BookReader.php
│ │ ├── Character.php
│ │ ├── Movie.php
│ │ ├── Rapunzel.php
│ │ ├── union_vector.fbs
│ │ ├── union_vector_generated.h
│ │ ├── union_vector_generated.js
│ │ └── union_vector_generated.ts
│ ├── gtest-1.7.0/
│ │ ├── CHANGES
│ │ ├── CMakeLists.txt
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── Makefile.am
│ │ ├── Makefile.in
│ │ ├── README
│ │ ├── aclocal.m4
│ │ ├── build-aux/
│ │ │ ├── config.guess
│ │ │ ├── config.h.in
│ │ │ ├── config.sub
│ │ │ ├── depcomp
│ │ │ ├── install-sh
│ │ │ ├── ltmain.sh
│ │ │ └── missing
│ │ ├── cmake/
│ │ │ └── internal_utils.cmake
│ │ ├── codegear/
│ │ │ ├── gtest.cbproj
│ │ │ ├── gtest.groupproj
│ │ │ ├── gtest_all.cc
│ │ │ ├── gtest_link.cc
│ │ │ ├── gtest_main.cbproj
│ │ │ └── gtest_unittest.cbproj
│ │ ├── configure
│ │ ├── configure.ac
│ │ ├── fused-src/
│ │ │ └── gtest/
│ │ │ ├── gtest-all.cc
│ │ │ ├── gtest.h
│ │ │ └── gtest_main.cc
│ │ ├── include/
│ │ │ └── gtest/
│ │ │ ├── gtest-death-test.h
│ │ │ ├── gtest-message.h
│ │ │ ├── gtest-param-test.h
│ │ │ ├── gtest-param-test.h.pump
│ │ │ ├── gtest-printers.h
│ │ │ ├── gtest-spi.h
│ │ │ ├── gtest-test-part.h
│ │ │ ├── gtest-typed-test.h
│ │ │ ├── gtest.h
│ │ │ ├── gtest_pred_impl.h
│ │ │ ├── gtest_prod.h
│ │ │ └── internal/
│ │ │ ├── gtest-death-test-internal.h
│ │ │ ├── gtest-filepath.h
│ │ │ ├── gtest-internal.h
│ │ │ ├── gtest-linked_ptr.h
│ │ │ ├── gtest-param-util-generated.h
│ │ │ ├── gtest-param-util-generated.h.pump
│ │ │ ├── gtest-param-util.h
│ │ │ ├── gtest-port.h
│ │ │ ├── gtest-string.h
│ │ │ ├── gtest-tuple.h
│ │ │ ├── gtest-tuple.h.pump
│ │ │ ├── gtest-type-util.h
│ │ │ └── gtest-type-util.h.pump
│ │ ├── m4/
│ │ │ ├── acx_pthread.m4
│ │ │ ├── gtest.m4
│ │ │ ├── libtool.m4
│ │ │ ├── ltoptions.m4
│ │ │ ├── ltsugar.m4
│ │ │ ├── ltversion.m4
│ │ │ └── lt~obsolete.m4
│ │ ├── make/
│ │ │ └── Makefile
│ │ ├── msvc/
│ │ │ ├── gtest-md.sln
│ │ │ ├── gtest-md.vcproj
│ │ │ ├── gtest.sln
│ │ │ ├── gtest.vcproj
│ │ │ ├── gtest_main-md.vcproj
│ │ │ ├── gtest_main.vcproj
│ │ │ ├── gtest_prod_test-md.vcproj
│ │ │ ├── gtest_prod_test.vcproj
│ │ │ ├── gtest_unittest-md.vcproj
│ │ │ └── gtest_unittest.vcproj
│ │ ├── samples/
│ │ │ ├── prime_tables.h
│ │ │ ├── sample1.cc
│ │ │ ├── sample1.h
│ │ │ ├── sample10_unittest.cc
│ │ │ ├── sample1_unittest.cc
│ │ │ ├── sample2.cc
│ │ │ ├── sample2.h
│ │ │ ├── sample2_unittest.cc
│ │ │ ├── sample3-inl.h
│ │ │ ├── sample3_unittest.cc
│ │ │ ├── sample4.cc
│ │ │ ├── sample4.h
│ │ │ ├── sample4_unittest.cc
│ │ │ ├── sample5_unittest.cc
│ │ │ ├── sample6_unittest.cc
│ │ │ ├── sample7_unittest.cc
│ │ │ ├── sample8_unittest.cc
│ │ │ └── sample9_unittest.cc
│ │ ├── scripts/
│ │ │ ├── fuse_gtest_files.py
│ │ │ ├── gen_gtest_pred_impl.py
│ │ │ ├── gtest-config.in
│ │ │ ├── pump.py
│ │ │ └── test/
│ │ │ └── Makefile
│ │ ├── src/
│ │ │ ├── gtest-all.cc
│ │ │ ├── gtest-death-test.cc
│ │ │ ├── gtest-filepath.cc
│ │ │ ├── gtest-internal-inl.h
│ │ │ ├── gtest-port.cc
│ │ │ ├── gtest-printers.cc
│ │ │ ├── gtest-test-part.cc
│ │ │ ├── gtest-typed-test.cc
│ │ │ ├── gtest.cc
│ │ │ └── gtest_main.cc
│ │ ├── test/
│ │ │ ├── gtest-death-test_ex_test.cc
│ │ │ ├── gtest-death-test_test.cc
│ │ │ ├── gtest-filepath_test.cc
│ │ │ ├── gtest-linked_ptr_test.cc
│ │ │ ├── gtest-listener_test.cc
│ │ │ ├── gtest-message_test.cc
│ │ │ ├── gtest-options_test.cc
│ │ │ ├── gtest-param-test2_test.cc
│ │ │ ├── gtest-param-test_test.cc
│ │ │ ├── gtest-param-test_test.h
│ │ │ ├── gtest-port_test.cc
│ │ │ ├── gtest-printers_test.cc
│ │ │ ├── gtest-test-part_test.cc
│ │ │ ├── gtest-tuple_test.cc
│ │ │ ├── gtest-typed-test2_test.cc
│ │ │ ├── gtest-typed-test_test.cc
│ │ │ ├── gtest-typed-test_test.h
│ │ │ ├── gtest-unittest-api_test.cc
│ │ │ ├── gtest_all_test.cc
│ │ │ ├── gtest_break_on_failure_unittest.py
│ │ │ ├── gtest_break_on_failure_unittest_.cc
│ │ │ ├── gtest_catch_exceptions_test.py
│ │ │ ├── gtest_catch_exceptions_test_.cc
│ │ │ ├── gtest_color_test.py
│ │ │ ├── gtest_color_test_.cc
│ │ │ ├── gtest_env_var_test.py
│ │ │ ├── gtest_env_var_test_.cc
│ │ │ ├── gtest_environment_test.cc
│ │ │ ├── gtest_filter_unittest.py
│ │ │ ├── gtest_filter_unittest_.cc
│ │ │ ├── gtest_help_test.py
│ │ │ ├── gtest_help_test_.cc
│ │ │ ├── gtest_list_tests_unittest.py
│ │ │ ├── gtest_list_tests_unittest_.cc
│ │ │ ├── gtest_main_unittest.cc
│ │ │ ├── gtest_no_test_unittest.cc
│ │ │ ├── gtest_output_test.py
│ │ │ ├── gtest_output_test_.cc
│ │ │ ├── gtest_output_test_golden_lin.txt
│ │ │ ├── gtest_pred_impl_unittest.cc
│ │ │ ├── gtest_premature_exit_test.cc
│ │ │ ├── gtest_prod_test.cc
│ │ │ ├── gtest_repeat_test.cc
│ │ │ ├── gtest_shuffle_test.py
│ │ │ ├── gtest_shuffle_test_.cc
│ │ │ ├── gtest_sole_header_test.cc
│ │ │ ├── gtest_stress_test.cc
│ │ │ ├── gtest_test_utils.py
│ │ │ ├── gtest_throw_on_failure_ex_test.cc
│ │ │ ├── gtest_throw_on_failure_test.py
│ │ │ ├── gtest_throw_on_failure_test_.cc
│ │ │ ├── gtest_uninitialized_test.py
│ │ │ ├── gtest_uninitialized_test_.cc
│ │ │ ├── gtest_unittest.cc
│ │ │ ├── gtest_xml_outfile1_test_.cc
│ │ │ ├── gtest_xml_outfile2_test_.cc
│ │ │ ├── gtest_xml_outfiles_test.py
│ │ │ ├── gtest_xml_output_unittest.py
│ │ │ ├── gtest_xml_output_unittest_.cc
│ │ │ ├── gtest_xml_test_utils.py
│ │ │ ├── production.cc
│ │ │ └── production.h
│ │ └── xcode/
│ │ ├── Config/
│ │ │ ├── DebugProject.xcconfig
│ │ │ ├── FrameworkTarget.xcconfig
│ │ │ ├── General.xcconfig
│ │ │ ├── ReleaseProject.xcconfig
│ │ │ ├── StaticLibraryTarget.xcconfig
│ │ │ └── TestTarget.xcconfig
│ │ ├── Resources/
│ │ │ └── Info.plist
│ │ ├── Samples/
│ │ │ └── FrameworkSample/
│ │ │ ├── Info.plist
│ │ │ ├── WidgetFramework.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── runtests.sh
│ │ │ ├── widget.cc
│ │ │ ├── widget.h
│ │ │ └── widget_test.cc
│ │ ├── Scripts/
│ │ │ ├── runtests.sh
│ │ │ └── versiongenerate.py
│ │ └── gtest.xcodeproj/
│ │ └── project.pbxproj
│ ├── libgit2-0.27.2/
│ │ ├── .HEADER
│ │ ├── .editorconfig
│ │ ├── .gitattributes
│ │ ├── .github/
│ │ │ └── ISSUE_TEMPLATE
│ │ ├── .gitignore
│ │ ├── .mailmap
│ │ ├── .travis.yml
│ │ ├── AUTHORS
│ │ ├── CHANGELOG.md
│ │ ├── CMakeLists.txt
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── CONVENTIONS.md
│ │ ├── COPYING
│ │ ├── PROJECTS.md
│ │ ├── README.md
│ │ ├── THREADING.md
│ │ ├── TROUBLESHOOTING.md
│ │ ├── api.docurium
│ │ ├── appveyor.yml
│ │ ├── deps/
│ │ │ ├── http-parser/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── LICENSE-MIT
│ │ │ │ ├── http_parser.c
│ │ │ │ └── http_parser.h
│ │ │ ├── regex/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── config.h
│ │ │ │ ├── regcomp.c
│ │ │ │ ├── regex.c
│ │ │ │ ├── regex.h
│ │ │ │ ├── regex_internal.c
│ │ │ │ ├── regex_internal.h
│ │ │ │ └── regexec.c
│ │ │ ├── winhttp/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── urlmon.h
│ │ │ │ ├── winhttp.def
│ │ │ │ ├── winhttp.h
│ │ │ │ └── winhttp64.def
│ │ │ └── zlib/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── adler32.c
│ │ │ ├── crc32.c
│ │ │ ├── crc32.h
│ │ │ ├── deflate.c
│ │ │ ├── deflate.h
│ │ │ ├── gzguts.h
│ │ │ ├── infback.c
│ │ │ ├── inffast.c
│ │ │ ├── inffast.h
│ │ │ ├── inffixed.h
│ │ │ ├── inflate.c
│ │ │ ├── inflate.h
│ │ │ ├── inftrees.c
│ │ │ ├── inftrees.h
│ │ │ ├── trees.c
│ │ │ ├── trees.h
│ │ │ ├── zconf.h
│ │ │ ├── zlib.h
│ │ │ ├── zutil.c
│ │ │ └── zutil.h
│ │ ├── docs/
│ │ │ ├── checkout-internals.md
│ │ │ ├── diff-internals.md
│ │ │ ├── error-handling.md
│ │ │ ├── merge-df_conflicts.txt
│ │ │ └── release.md
│ │ ├── examples/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── COPYING
│ │ │ ├── README.md
│ │ │ ├── add.c
│ │ │ ├── blame.c
│ │ │ ├── cat-file.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── describe.c
│ │ │ ├── diff.c
│ │ │ ├── for-each-ref.c
│ │ │ ├── general.c
│ │ │ ├── init.c
│ │ │ ├── log.c
│ │ │ ├── merge.c
│ │ │ ├── network/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── clone.c
│ │ │ │ ├── common.c
│ │ │ │ ├── common.h
│ │ │ │ ├── fetch.c
│ │ │ │ ├── git2.c
│ │ │ │ ├── index-pack.c
│ │ │ │ └── ls-remote.c
│ │ │ ├── remote.c
│ │ │ ├── rev-list.c
│ │ │ ├── rev-parse.c
│ │ │ ├── showindex.c
│ │ │ ├── status.c
│ │ │ ├── tag.c
│ │ │ └── test/
│ │ │ └── test-rev-list.sh
│ │ ├── git.git-authors
│ │ ├── include/
│ │ │ ├── git2/
│ │ │ │ ├── annotated_commit.h
│ │ │ │ ├── attr.h
│ │ │ │ ├── blame.h
│ │ │ │ ├── blob.h
│ │ │ │ ├── branch.h
│ │ │ │ ├── buffer.h
│ │ │ │ ├── checkout.h
│ │ │ │ ├── cherrypick.h
│ │ │ │ ├── clone.h
│ │ │ │ ├── commit.h
│ │ │ │ ├── common.h
│ │ │ │ ├── config.h
│ │ │ │ ├── cred_helpers.h
│ │ │ │ ├── describe.h
│ │ │ │ ├── diff.h
│ │ │ │ ├── errors.h
│ │ │ │ ├── filter.h
│ │ │ │ ├── global.h
│ │ │ │ ├── graph.h
│ │ │ │ ├── ignore.h
│ │ │ │ ├── index.h
│ │ │ │ ├── indexer.h
│ │ │ │ ├── inttypes.h
│ │ │ │ ├── merge.h
│ │ │ │ ├── message.h
│ │ │ │ ├── net.h
│ │ │ │ ├── notes.h
│ │ │ │ ├── object.h
│ │ │ │ ├── odb.h
│ │ │ │ ├── odb_backend.h
│ │ │ │ ├── oid.h
│ │ │ │ ├── oidarray.h
│ │ │ │ ├── pack.h
│ │ │ │ ├── patch.h
│ │ │ │ ├── pathspec.h
│ │ │ │ ├── proxy.h
│ │ │ │ ├── rebase.h
│ │ │ │ ├── refdb.h
│ │ │ │ ├── reflog.h
│ │ │ │ ├── refs.h
│ │ │ │ ├── refspec.h
│ │ │ │ ├── remote.h
│ │ │ │ ├── repository.h
│ │ │ │ ├── reset.h
│ │ │ │ ├── revert.h
│ │ │ │ ├── revparse.h
│ │ │ │ ├── revwalk.h
│ │ │ │ ├── signature.h
│ │ │ │ ├── stash.h
│ │ │ │ ├── status.h
│ │ │ │ ├── stdint.h
│ │ │ │ ├── strarray.h
│ │ │ │ ├── submodule.h
│ │ │ │ ├── sys/
│ │ │ │ │ ├── commit.h
│ │ │ │ │ ├── config.h
│ │ │ │ │ ├── diff.h
│ │ │ │ │ ├── filter.h
│ │ │ │ │ ├── hashsig.h
│ │ │ │ │ ├── index.h
│ │ │ │ │ ├── mempack.h
│ │ │ │ │ ├── merge.h
│ │ │ │ │ ├── odb_backend.h
│ │ │ │ │ ├── openssl.h
│ │ │ │ │ ├── refdb_backend.h
│ │ │ │ │ ├── reflog.h
│ │ │ │ │ ├── refs.h
│ │ │ │ │ ├── repository.h
│ │ │ │ │ ├── stream.h
│ │ │ │ │ ├── time.h
│ │ │ │ │ └── transport.h
│ │ │ │ ├── tag.h
│ │ │ │ ├── trace.h
│ │ │ │ ├── transaction.h
│ │ │ │ ├── transport.h
│ │ │ │ ├── tree.h
│ │ │ │ ├── types.h
│ │ │ │ ├── version.h
│ │ │ │ └── worktree.h
│ │ │ └── git2.h
│ │ ├── libgit2.pc.in
│ │ ├── libgit2_clar.supp
│ │ ├── script/
│ │ │ ├── appveyor-mingw.sh
│ │ │ ├── cibuild.sh
│ │ │ ├── coverity.sh
│ │ │ ├── install-deps-osx.sh
│ │ │ ├── user_model.c
│ │ │ └── user_nodefs.h
│ │ ├── src/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── annotated_commit.c
│ │ │ ├── annotated_commit.h
│ │ │ ├── apply.c
│ │ │ ├── apply.h
│ │ │ ├── array.h
│ │ │ ├── attr.c
│ │ │ ├── attr.h
│ │ │ ├── attr_file.c
│ │ │ ├── attr_file.h
│ │ │ ├── attrcache.c
│ │ │ ├── attrcache.h
│ │ │ ├── bitvec.h
│ │ │ ├── blame.c
│ │ │ ├── blame.h
│ │ │ ├── blame_git.c
│ │ │ ├── blame_git.h
│ │ │ ├── blob.c
│ │ │ ├── blob.h
│ │ │ ├── branch.c
│ │ │ ├── branch.h
│ │ │ ├── buf_text.c
│ │ │ ├── buf_text.h
│ │ │ ├── buffer.c
│ │ │ ├── buffer.h
│ │ │ ├── cache.c
│ │ │ ├── cache.h
│ │ │ ├── cc-compat.h
│ │ │ ├── checkout.c
│ │ │ ├── checkout.h
│ │ │ ├── cherrypick.c
│ │ │ ├── clone.c
│ │ │ ├── clone.h
│ │ │ ├── commit.c
│ │ │ ├── commit.h
│ │ │ ├── commit_list.c
│ │ │ ├── commit_list.h
│ │ │ ├── common.h
│ │ │ ├── config.c
│ │ │ ├── config.h
│ │ │ ├── config_cache.c
│ │ │ ├── config_file.c
│ │ │ ├── config_file.h
│ │ │ ├── config_parse.c
│ │ │ ├── config_parse.h
│ │ │ ├── crlf.c
│ │ │ ├── date.c
│ │ │ ├── delta.c
│ │ │ ├── delta.h
│ │ │ ├── describe.c
│ │ │ ├── diff.c
│ │ │ ├── diff.h
│ │ │ ├── diff_driver.c
│ │ │ ├── diff_driver.h
│ │ │ ├── diff_file.c
│ │ │ ├── diff_file.h
│ │ │ ├── diff_generate.c
│ │ │ ├── diff_generate.h
│ │ │ ├── diff_parse.c
│ │ │ ├── diff_parse.h
│ │ │ ├── diff_print.c
│ │ │ ├── diff_stats.c
│ │ │ ├── diff_tform.c
│ │ │ ├── diff_tform.h
│ │ │ ├── diff_xdiff.c
│ │ │ ├── diff_xdiff.h
│ │ │ ├── errors.c
│ │ │ ├── features.h.in
│ │ │ ├── fetch.c
│ │ │ ├── fetch.h
│ │ │ ├── fetchhead.c
│ │ │ ├── fetchhead.h
│ │ │ ├── filebuf.c
│ │ │ ├── filebuf.h
│ │ │ ├── fileops.c
│ │ │ ├── fileops.h
│ │ │ ├── filter.c
│ │ │ ├── filter.h
│ │ │ ├── fnmatch.c
│ │ │ ├── fnmatch.h
│ │ │ ├── global.c
│ │ │ ├── global.h
│ │ │ ├── graph.c
│ │ │ ├── hash/
│ │ │ │ ├── hash_collisiondetect.h
│ │ │ │ ├── hash_common_crypto.h
│ │ │ │ ├── hash_generic.c
│ │ │ │ ├── hash_generic.h
│ │ │ │ ├── hash_openssl.h
│ │ │ │ ├── hash_win32.c
│ │ │ │ ├── hash_win32.h
│ │ │ │ └── sha1dc/
│ │ │ │ ├── sha1.c
│ │ │ │ ├── sha1.h
│ │ │ │ ├── ubc_check.c
│ │ │ │ └── ubc_check.h
│ │ │ ├── hash.c
│ │ │ ├── hash.h
│ │ │ ├── hashsig.c
│ │ │ ├── ident.c
│ │ │ ├── idxmap.c
│ │ │ ├── idxmap.h
│ │ │ ├── ignore.c
│ │ │ ├── ignore.h
│ │ │ ├── index.c
│ │ │ ├── index.h
│ │ │ ├── indexer.c
│ │ │ ├── indexer.h
│ │ │ ├── integer.h
│ │ │ ├── iterator.c
│ │ │ ├── iterator.h
│ │ │ ├── khash.h
│ │ │ ├── map.h
│ │ │ ├── merge.c
│ │ │ ├── merge.h
│ │ │ ├── merge_driver.c
│ │ │ ├── merge_driver.h
│ │ │ ├── merge_file.c
│ │ │ ├── message.c
│ │ │ ├── message.h
│ │ │ ├── mwindow.c
│ │ │ ├── mwindow.h
│ │ │ ├── netops.c
│ │ │ ├── netops.h
│ │ │ ├── notes.c
│ │ │ ├── notes.h
│ │ │ ├── object.c
│ │ │ ├── object.h
│ │ │ ├── object_api.c
│ │ │ ├── odb.c
│ │ │ ├── odb.h
│ │ │ ├── odb_loose.c
│ │ │ ├── odb_mempack.c
│ │ │ ├── odb_pack.c
│ │ │ ├── offmap.c
│ │ │ ├── offmap.h
│ │ │ ├── oid.c
│ │ │ ├── oid.h
│ │ │ ├── oidarray.c
│ │ │ ├── oidarray.h
│ │ │ ├── oidmap.c
│ │ │ ├── oidmap.h
│ │ │ ├── pack-objects.c
│ │ │ ├── pack-objects.h
│ │ │ ├── pack.c
│ │ │ ├── pack.h
│ │ │ ├── parse.c
│ │ │ ├── parse.h
│ │ │ ├── patch.c
│ │ │ ├── patch.h
│ │ │ ├── patch_generate.c
│ │ │ ├── patch_generate.h
│ │ │ ├── patch_parse.c
│ │ │ ├── patch_parse.h
│ │ │ ├── path.c
│ │ │ ├── path.h
│ │ │ ├── pathspec.c
│ │ │ ├── pathspec.h
│ │ │ ├── pool.c
│ │ │ ├── pool.h
│ │ │ ├── posix.c
│ │ │ ├── posix.h
│ │ │ ├── pqueue.c
│ │ │ ├── pqueue.h
│ │ │ ├── proxy.c
│ │ │ ├── proxy.h
│ │ │ ├── push.c
│ │ │ ├── push.h
│ │ │ ├── rebase.c
│ │ │ ├── refdb.c
│ │ │ ├── refdb.h
│ │ │ ├── refdb_fs.c
│ │ │ ├── refdb_fs.h
│ │ │ ├── reflog.c
│ │ │ ├── reflog.h
│ │ │ ├── refs.c
│ │ │ ├── refs.h
│ │ │ ├── refspec.c
│ │ │ ├── refspec.h
│ │ │ ├── remote.c
│ │ │ ├── remote.h
│ │ │ ├── repo_template.h
│ │ │ ├── repository.c
│ │ │ ├── repository.h
│ │ │ ├── reset.c
│ │ │ ├── revert.c
│ │ │ ├── revparse.c
│ │ │ ├── revwalk.c
│ │ │ ├── revwalk.h
│ │ │ ├── settings.c
│ │ │ ├── sha1_lookup.c
│ │ │ ├── sha1_lookup.h
│ │ │ ├── signature.c
│ │ │ ├── signature.h
│ │ │ ├── sortedcache.c
│ │ │ ├── sortedcache.h
│ │ │ ├── stash.c
│ │ │ ├── status.c
│ │ │ ├── status.h
│ │ │ ├── stream.h
│ │ │ ├── streams/
│ │ │ │ ├── curl.c
│ │ │ │ ├── curl.h
│ │ │ │ ├── openssl.c
│ │ │ │ ├── openssl.h
│ │ │ │ ├── socket.c
│ │ │ │ ├── socket.h
│ │ │ │ ├── stransport.c
│ │ │ │ ├── stransport.h
│ │ │ │ ├── tls.c
│ │ │ │ └── tls.h
│ │ │ ├── strmap.c
│ │ │ ├── strmap.h
│ │ │ ├── strnlen.h
│ │ │ ├── submodule.c
│ │ │ ├── submodule.h
│ │ │ ├── sysdir.c
│ │ │ ├── sysdir.h
│ │ │ ├── tag.c
│ │ │ ├── tag.h
│ │ │ ├── thread-utils.c
│ │ │ ├── thread-utils.h
│ │ │ ├── trace.c
│ │ │ ├── trace.h
│ │ │ ├── trailer.c
│ │ │ ├── transaction.c
│ │ │ ├── transaction.h
│ │ │ ├── transport.c
│ │ │ ├── transports/
│ │ │ │ ├── auth.c
│ │ │ │ ├── auth.h
│ │ │ │ ├── auth_negotiate.c
│ │ │ │ ├── auth_negotiate.h
│ │ │ │ ├── cred.c
│ │ │ │ ├── cred.h
│ │ │ │ ├── cred_helpers.c
│ │ │ │ ├── git.c
│ │ │ │ ├── http.c
│ │ │ │ ├── http.h
│ │ │ │ ├── local.c
│ │ │ │ ├── smart.c
│ │ │ │ ├── smart.h
│ │ │ │ ├── smart_pkt.c
│ │ │ │ ├── smart_protocol.c
│ │ │ │ ├── ssh.c
│ │ │ │ ├── ssh.h
│ │ │ │ └── winhttp.c
│ │ │ ├── tree-cache.c
│ │ │ ├── tree-cache.h
│ │ │ ├── tree.c
│ │ │ ├── tree.h
│ │ │ ├── tsort.c
│ │ │ ├── unix/
│ │ │ │ ├── map.c
│ │ │ │ ├── posix.h
│ │ │ │ ├── pthread.h
│ │ │ │ └── realpath.c
│ │ │ ├── userdiff.h
│ │ │ ├── util.c
│ │ │ ├── util.h
│ │ │ ├── varint.c
│ │ │ ├── varint.h
│ │ │ ├── vector.c
│ │ │ ├── vector.h
│ │ │ ├── win32/
│ │ │ │ ├── dir.c
│ │ │ │ ├── dir.h
│ │ │ │ ├── error.c
│ │ │ │ ├── error.h
│ │ │ │ ├── findfile.c
│ │ │ │ ├── findfile.h
│ │ │ │ ├── git2.rc
│ │ │ │ ├── map.c
│ │ │ │ ├── mingw-compat.h
│ │ │ │ ├── msvc-compat.h
│ │ │ │ ├── path_w32.c
│ │ │ │ ├── path_w32.h
│ │ │ │ ├── posix.h
│ │ │ │ ├── posix_w32.c
│ │ │ │ ├── precompiled.c
│ │ │ │ ├── precompiled.h
│ │ │ │ ├── reparse.h
│ │ │ │ ├── thread.c
│ │ │ │ ├── thread.h
│ │ │ │ ├── utf-conv.c
│ │ │ │ ├── utf-conv.h
│ │ │ │ ├── version.h
│ │ │ │ ├── w32_buffer.c
│ │ │ │ ├── w32_buffer.h
│ │ │ │ ├── w32_crtdbg_stacktrace.c
│ │ │ │ ├── w32_crtdbg_stacktrace.h
│ │ │ │ ├── w32_stack.c
│ │ │ │ ├── w32_stack.h
│ │ │ │ ├── w32_util.c
│ │ │ │ ├── w32_util.h
│ │ │ │ └── win32-compat.h
│ │ │ ├── worktree.c
│ │ │ ├── worktree.h
│ │ │ ├── xdiff/
│ │ │ │ ├── xdiff.h
│ │ │ │ ├── xdiffi.c
│ │ │ │ ├── xdiffi.h
│ │ │ │ ├── xemit.c
│ │ │ │ ├── xemit.h
│ │ │ │ ├── xhistogram.c
│ │ │ │ ├── xinclude.h
│ │ │ │ ├── xmacros.h
│ │ │ │ ├── xmerge.c
│ │ │ │ ├── xpatience.c
│ │ │ │ ├── xprepare.c
│ │ │ │ ├── xprepare.h
│ │ │ │ ├── xtypes.h
│ │ │ │ ├── xutils.c
│ │ │ │ └── xutils.h
│ │ │ ├── zstream.c
│ │ │ └── zstream.h
│ │ └── tests/
│ │ ├── CMakeLists.txt
│ │ ├── README.md
│ │ ├── apply/
│ │ │ ├── fromdiff.c
│ │ │ └── fromfile.c
│ │ ├── attr/
│ │ │ ├── attr_expect.h
│ │ │ ├── file.c
│ │ │ ├── flags.c
│ │ │ ├── ignore.c
│ │ │ ├── lookup.c
│ │ │ └── repo.c
│ │ ├── blame/
│ │ │ ├── blame_helpers.c
│ │ │ ├── blame_helpers.h
│ │ │ ├── buffer.c
│ │ │ ├── getters.c
│ │ │ ├── harder.c
│ │ │ └── simple.c
│ │ ├── buf/
│ │ │ ├── basic.c
│ │ │ ├── oom.c
│ │ │ ├── percent.c
│ │ │ ├── quote.c
│ │ │ └── splice.c
│ │ ├── checkout/
│ │ │ ├── binaryunicode.c
│ │ │ ├── checkout_helpers.c
│ │ │ ├── checkout_helpers.h
│ │ │ ├── conflict.c
│ │ │ ├── crlf.c
│ │ │ ├── head.c
│ │ │ ├── icase.c
│ │ │ ├── index.c
│ │ │ ├── nasty.c
│ │ │ ├── tree.c
│ │ │ └── typechange.c
│ │ ├── cherrypick/
│ │ │ ├── bare.c
│ │ │ └── workdir.c
│ │ ├── clar/
│ │ │ ├── fixtures.h
│ │ │ ├── fs.h
│ │ │ ├── print.h
│ │ │ └── sandbox.h
│ │ ├── clar.c
│ │ ├── clar.h
│ │ ├── clar_libgit2.c
│ │ ├── clar_libgit2.h
│ │ ├── clar_libgit2_timer.c
│ │ ├── clar_libgit2_timer.h
│ │ ├── clar_libgit2_trace.c
│ │ ├── clar_libgit2_trace.h
│ │ ├── clone/
│ │ │ ├── empty.c
│ │ │ ├── local.c
│ │ │ ├── nonetwork.c
│ │ │ └── transport.c
│ │ ├── commit/
│ │ │ ├── commit.c
│ │ │ ├── parent.c
│ │ │ ├── parse.c
│ │ │ ├── signature.c
│ │ │ └── write.c
│ │ ├── config/
│ │ │ ├── add.c
│ │ │ ├── backend.c
│ │ │ ├── conditionals.c
│ │ │ ├── config_helpers.c
│ │ │ ├── config_helpers.h
│ │ │ ├── configlevel.c
│ │ │ ├── global.c
│ │ │ ├── include.c
│ │ │ ├── multivar.c
│ │ │ ├── new.c
│ │ │ ├── read.c
│ │ │ ├── readonly.c
│ │ │ ├── rename.c
│ │ │ ├── snapshot.c
│ │ │ ├── stress.c
│ │ │ ├── validkeyname.c
│ │ │ └── write.c
│ │ ├── core/
│ │ │ ├── array.c
│ │ │ ├── bitvec.c
│ │ │ ├── buffer.c
│ │ │ ├── copy.c
│ │ │ ├── dirent.c
│ │ │ ├── encoding.c
│ │ │ ├── env.c
│ │ │ ├── errors.c
│ │ │ ├── features.c
│ │ │ ├── filebuf.c
│ │ │ ├── ftruncate.c
│ │ │ ├── futils.c
│ │ │ ├── hex.c
│ │ │ ├── iconv.c
│ │ │ ├── init.c
│ │ │ ├── link.c
│ │ │ ├── mkdir.c
│ │ │ ├── oid.c
│ │ │ ├── oidmap.c
│ │ │ ├── opts.c
│ │ │ ├── path.c
│ │ │ ├── pool.c
│ │ │ ├── posix.c
│ │ │ ├── pqueue.c
│ │ │ ├── rmdir.c
│ │ │ ├── sha1.c
│ │ │ ├── sortedcache.c
│ │ │ ├── stat.c
│ │ │ ├── stream.c
│ │ │ ├── string.c
│ │ │ ├── strmap.c
│ │ │ ├── strtol.c
│ │ │ ├── structinit.c
│ │ │ ├── useragent.c
│ │ │ ├── vector.c
│ │ │ └── zstream.c
│ │ ├── date/
│ │ │ ├── date.c
│ │ │ └── rfc2822.c
│ │ ├── describe/
│ │ │ ├── describe.c
│ │ │ ├── describe_helpers.c
│ │ │ ├── describe_helpers.h
│ │ │ └── t6120.c
│ │ ├── diff/
│ │ │ ├── binary.c
│ │ │ ├── blob.c
│ │ │ ├── diff_helpers.c
│ │ │ ├── diff_helpers.h
│ │ │ ├── diffiter.c
│ │ │ ├── drivers.c
│ │ │ ├── format_email.c
│ │ │ ├── index.c
│ │ │ ├── notify.c
│ │ │ ├── parse.c
│ │ │ ├── patch.c
│ │ │ ├── patchid.c
│ │ │ ├── pathspec.c
│ │ │ ├── racediffiter.c
│ │ │ ├── rename.c
│ │ │ ├── stats.c
│ │ │ ├── submodules.c
│ │ │ ├── tree.c
│ │ │ └── workdir.c
│ │ ├── fetchhead/
│ │ │ ├── fetchhead_data.h
│ │ │ └── nonetwork.c
│ │ ├── filter/
│ │ │ ├── blob.c
│ │ │ ├── crlf.c
│ │ │ ├── crlf.h
│ │ │ ├── custom.c
│ │ │ ├── custom_helpers.c
│ │ │ ├── custom_helpers.h
│ │ │ ├── file.c
│ │ │ ├── ident.c
│ │ │ ├── query.c
│ │ │ ├── stream.c
│ │ │ └── wildcard.c
│ │ ├── generate.py
│ │ ├── generate_crlf.sh
│ │ ├── graph/
│ │ │ └── descendant_of.c
│ │ ├── index/
│ │ │ ├── add.c
│ │ │ ├── addall.c
│ │ │ ├── bypath.c
│ │ │ ├── cache.c
│ │ │ ├── collision.c
│ │ │ ├── conflicts.c
│ │ │ ├── conflicts.h
│ │ │ ├── crlf.c
│ │ │ ├── filemodes.c
│ │ │ ├── inmemory.c
│ │ │ ├── names.c
│ │ │ ├── nsec.c
│ │ │ ├── racy.c
│ │ │ ├── read_index.c
│ │ │ ├── read_tree.c
│ │ │ ├── rename.c
│ │ │ ├── reuc.c
│ │ │ ├── stage.c
│ │ │ ├── tests.c
│ │ │ └── version.c
│ │ ├── iterator/
│ │ │ ├── index.c
│ │ │ ├── iterator_helpers.c
│ │ │ ├── iterator_helpers.h
│ │ │ ├── tree.c
│ │ │ └── workdir.c
│ │ ├── main.c
│ │ ├── merge/
│ │ │ ├── conflict_data.h
│ │ │ ├── driver.c
│ │ │ ├── files.c
│ │ │ ├── merge_helpers.c
│ │ │ ├── merge_helpers.h
│ │ │ ├── trees/
│ │ │ │ ├── automerge.c
│ │ │ │ ├── commits.c
│ │ │ │ ├── modeconflict.c
│ │ │ │ ├── recursive.c
│ │ │ │ ├── renames.c
│ │ │ │ ├── treediff.c
│ │ │ │ ├── trivial.c
│ │ │ │ └── whitespace.c
│ │ │ └── workdir/
│ │ │ ├── analysis.c
│ │ │ ├── dirty.c
│ │ │ ├── recursive.c
│ │ │ ├── renames.c
│ │ │ ├── setup.c
│ │ │ ├── simple.c
│ │ │ ├── submodules.c
│ │ │ └── trivial.c
│ │ ├── message/
│ │ │ └── trailer.c
│ │ ├── network/
│ │ │ ├── cred.c
│ │ │ ├── fetchlocal.c
│ │ │ ├── matchhost.c
│ │ │ ├── refspecs.c
│ │ │ ├── remote/
│ │ │ │ ├── createthenload.c
│ │ │ │ ├── defaultbranch.c
│ │ │ │ ├── delete.c
│ │ │ │ ├── isvalidname.c
│ │ │ │ ├── local.c
│ │ │ │ ├── push.c
│ │ │ │ ├── remotes.c
│ │ │ │ └── rename.c
│ │ │ └── urlparse.c
│ │ ├── notes/
│ │ │ ├── notes.c
│ │ │ └── notesref.c
│ │ ├── object/
│ │ │ ├── blob/
│ │ │ │ ├── filter.c
│ │ │ │ ├── fromstream.c
│ │ │ │ └── write.c
│ │ │ ├── cache.c
│ │ │ ├── commit/
│ │ │ │ └── commitstagedfile.c
│ │ │ ├── lookup.c
│ │ │ ├── lookupbypath.c
│ │ │ ├── message.c
│ │ │ ├── peel.c
│ │ │ ├── raw/
│ │ │ │ ├── chars.c
│ │ │ │ ├── compare.c
│ │ │ │ ├── convert.c
│ │ │ │ ├── data.h
│ │ │ │ ├── fromstr.c
│ │ │ │ ├── hash.c
│ │ │ │ ├── short.c
│ │ │ │ ├── size.c
│ │ │ │ ├── type2string.c
│ │ │ │ └── write.c
│ │ │ ├── shortid.c
│ │ │ ├── tag/
│ │ │ │ ├── list.c
│ │ │ │ ├── peel.c
│ │ │ │ ├── read.c
│ │ │ │ └── write.c
│ │ │ └── tree/
│ │ │ ├── attributes.c
│ │ │ ├── duplicateentries.c
│ │ │ ├── frompath.c
│ │ │ ├── read.c
│ │ │ ├── update.c
│ │ │ ├── walk.c
│ │ │ └── write.c
│ │ ├── odb/
│ │ │ ├── alternates.c
│ │ │ ├── backend/
│ │ │ │ ├── backend_helpers.c
│ │ │ │ ├── backend_helpers.h
│ │ │ │ ├── mempack.c
│ │ │ │ ├── multiple.c
│ │ │ │ ├── nobackend.c
│ │ │ │ ├── nonrefreshing.c
│ │ │ │ └── simple.c
│ │ │ ├── emptyobjects.c
│ │ │ ├── foreach.c
│ │ │ ├── freshen.c
│ │ │ ├── largefiles.c
│ │ │ ├── loose.c
│ │ │ ├── loose_data.h
│ │ │ ├── mixed.c
│ │ │ ├── pack_data.h
│ │ │ ├── pack_data_one.h
│ │ │ ├── packed.c
│ │ │ ├── packed_one.c
│ │ │ ├── sorting.c
│ │ │ └── streamwrite.c
│ │ ├── online/
│ │ │ ├── badssl.c
│ │ │ ├── clone.c
│ │ │ ├── fetch.c
│ │ │ ├── fetchhead.c
│ │ │ ├── push.c
│ │ │ ├── push_util.c
│ │ │ ├── push_util.h
│ │ │ └── remotes.c
│ │ ├── pack/
│ │ │ ├── indexer.c
│ │ │ ├── packbuilder.c
│ │ │ └── sharing.c
│ │ ├── patch/
│ │ │ ├── parse.c
│ │ │ ├── patch_common.h
│ │ │ └── print.c
│ │ ├── path/
│ │ │ ├── core.c
│ │ │ ├── dotgit.c
│ │ │ └── win32.c
│ │ ├── perf/
│ │ │ ├── helper__perf__do_merge.c
│ │ │ ├── helper__perf__do_merge.h
│ │ │ ├── helper__perf__timer.c
│ │ │ ├── helper__perf__timer.h
│ │ │ └── merge.c
│ │ ├── precompiled.c
│ │ ├── precompiled.h
│ │ ├── rebase/
│ │ │ ├── abort.c
│ │ │ ├── inmemory.c
│ │ │ ├── iterator.c
│ │ │ ├── merge.c
│ │ │ ├── setup.c
│ │ │ └── submodule.c
│ │ ├── refs/
│ │ │ ├── branches/
│ │ │ │ ├── create.c
│ │ │ │ ├── delete.c
│ │ │ │ ├── ishead.c
│ │ │ │ ├── iterator.c
│ │ │ │ ├── lookup.c
│ │ │ │ ├── move.c
│ │ │ │ ├── name.c
│ │ │ │ ├── remote.c
│ │ │ │ ├── upstream.c
│ │ │ │ └── upstreamname.c
│ │ │ ├── crashes.c
│ │ │ ├── create.c
│ │ │ ├── delete.c
│ │ │ ├── dup.c
│ │ │ ├── foreachglob.c
│ │ │ ├── isvalidname.c
│ │ │ ├── iterator.c
│ │ │ ├── list.c
│ │ │ ├── listall.c
│ │ │ ├── lookup.c
│ │ │ ├── namespaces.c
│ │ │ ├── normalize.c
│ │ │ ├── overwrite.c
│ │ │ ├── pack.c
│ │ │ ├── peel.c
│ │ │ ├── races.c
│ │ │ ├── read.c
│ │ │ ├── ref_helpers.c
│ │ │ ├── ref_helpers.h
│ │ │ ├── reflog/
│ │ │ │ ├── drop.c
│ │ │ │ ├── messages.c
│ │ │ │ ├── reflog.c
│ │ │ │ ├── reflog_helpers.c
│ │ │ │ └── reflog_helpers.h
│ │ │ ├── rename.c
│ │ │ ├── revparse.c
│ │ │ ├── setter.c
│ │ │ ├── shorthand.c
│ │ │ ├── transactions.c
│ │ │ ├── unicode.c
│ │ │ └── update.c
│ │ ├── remote/
│ │ │ └── insteadof.c
│ │ ├── repo/
│ │ │ ├── config.c
│ │ │ ├── discover.c
│ │ │ ├── env.c
│ │ │ ├── getters.c
│ │ │ ├── hashfile.c
│ │ │ ├── head.c
│ │ │ ├── headtree.c
│ │ │ ├── init.c
│ │ │ ├── message.c
│ │ │ ├── new.c
│ │ │ ├── open.c
│ │ │ ├── pathspec.c
│ │ │ ├── repo_helpers.c
│ │ │ ├── repo_helpers.h
│ │ │ ├── reservedname.c
│ │ │ ├── setters.c
│ │ │ ├── shallow.c
│ │ │ └── state.c
│ │ ├── reset/
│ │ │ ├── default.c
│ │ │ ├── hard.c
│ │ │ ├── mixed.c
│ │ │ ├── reset_helpers.c
│ │ │ ├── reset_helpers.h
│ │ │ └── soft.c
│ │ ├── resources/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── attr/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── attributes
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 10/
│ │ │ │ │ │ │ └── 8bb4e7fd7b16490dc33ff7d972151e73d7166e
│ │ │ │ │ │ ├── 16/
│ │ │ │ │ │ │ └── 983da6643656bb44c43965ecb6855c6d574512
│ │ │ │ │ │ ├── 21/
│ │ │ │ │ │ │ └── 7878ab49e1314388ea2e32dc6fdb58a1b969e0
│ │ │ │ │ │ ├── 24/
│ │ │ │ │ │ │ └── fa9a9fc4e202313e24b648087495441dab432b
│ │ │ │ │ │ ├── 29/
│ │ │ │ │ │ │ └── 29de282ce999e95183aedac6451d3384559c4b
│ │ │ │ │ │ ├── 2b/
│ │ │ │ │ │ │ └── 40c5aca159b04ea8d20ffe36cdf8b09369b14a
│ │ │ │ │ │ ├── 2c/
│ │ │ │ │ │ │ └── 66e14f77196ea763fb1e41612c1aa2bc2d8ed2
│ │ │ │ │ │ ├── 2d/
│ │ │ │ │ │ │ └── e7dfe3588f3c7e9ad59e7d50ba90e3329df9d9
│ │ │ │ │ │ ├── 37/
│ │ │ │ │ │ │ └── 0fe9ec224ce33e71f9e5ec2bd1142ce9937a6a
│ │ │ │ │ │ ├── 3a/
│ │ │ │ │ │ │ └── 6df026462ebafe455af9867d27eda20a9e0974
│ │ │ │ │ │ ├── 3b/
│ │ │ │ │ │ │ └── 74db7ab381105dc0d28f8295a77f6a82989292
│ │ │ │ │ │ ├── 3e/
│ │ │ │ │ │ │ └── 42ffc54a663f9401cc25843d6c0e71a33e4249
│ │ │ │ │ │ ├── 45/
│ │ │ │ │ │ │ ├── 141a79a77842c59a63229403220a4e4be74e3d
│ │ │ │ │ │ │ ├── 5a314fa848d52ae1f11d254da4f60858fc97f4
│ │ │ │ │ │ │ └── b983be36b73c0788dc9cbcb76cbb80fc7bb057
│ │ │ │ │ │ ├── 4d/
│ │ │ │ │ │ │ └── 713dc48e6b1bd75b0d61ad078ba9ca3a56745d
│ │ │ │ │ │ ├── 4e/
│ │ │ │ │ │ │ └── 49ba8c5b6c32ff28cd9dcb60be34df50fcc485
│ │ │ │ │ │ ├── 55/
│ │ │ │ │ │ │ └── 6f8c827b8e4a02ad5cab77dca2bcb3e226b0b3
│ │ │ │ │ │ ├── 58/
│ │ │ │ │ │ │ └── 19a185d77b03325aaf87cafc771db36f6ddca7
│ │ │ │ │ │ ├── 60/
│ │ │ │ │ │ │ └── 5812ab7fe421fdd325a935d35cb06a9234a7d7
│ │ │ │ │ │ ├── 6b/
│ │ │ │ │ │ │ └── ab5c79cd5140d0f800917f550eb2a3dc32b0da
│ │ │ │ │ │ ├── 6d/
│ │ │ │ │ │ │ └── 968d62c89c7d9ea23a4c9a7b665d017c3d8ffd
│ │ │ │ │ │ ├── 71/
│ │ │ │ │ │ │ └── 7fc31f6b84f9d6fc3a4edbca259d7fc92beee2
│ │ │ │ │ │ ├── 8d/
│ │ │ │ │ │ │ └── 0b9df9bd30be7910ddda60548d485bc302b911
│ │ │ │ │ │ ├── 93/
│ │ │ │ │ │ │ └── 61f40bb97239cf55811892e14de2e344168ba1
│ │ │ │ │ │ ├── 94/
│ │ │ │ │ │ │ └── da4faa0a6bfb8ee6ccf7153801a69202b31857
│ │ │ │ │ │ ├── 96/
│ │ │ │ │ │ │ └── 089fd31ce1d3ee2afb0ba09ba063066932f027
│ │ │ │ │ │ ├── 99/
│ │ │ │ │ │ │ └── eae476896f4907224978b88e5ecaa6c5bb67a9
│ │ │ │ │ │ ├── 9e/
│ │ │ │ │ │ │ └── 5bdc47d6a80f2be0ea3049ad74231b94609242
│ │ │ │ │ │ ├── 9f/
│ │ │ │ │ │ │ └── b40b6675dde60b5697afceae91b66d908c02d9
│ │ │ │ │ │ ├── a0/
│ │ │ │ │ │ │ └── f7217ae99f5ac3e88534f5cea267febc5fa85b
│ │ │ │ │ │ ├── a5/
│ │ │ │ │ │ │ ├── 6bbcecaeac760cc26239384d2d4c614e7e4320
│ │ │ │ │ │ │ └── d76cad53f66f1312bd995909a5bab3c0820770
│ │ │ │ │ │ ├── a9/
│ │ │ │ │ │ │ └── 7cc019851d401a4f1d091cb91a15890a0dd1ba
│ │ │ │ │ │ ├── b4/
│ │ │ │ │ │ │ └── 35cd5689a0fb54afbeda4ac20368aa480e8f04
│ │ │ │ │ │ ├── c0/
│ │ │ │ │ │ │ └── 091889c0c77142b87a1fa5123a6398a61d33e7
│ │ │ │ │ │ ├── c4/
│ │ │ │ │ │ │ └── 85abe35abd4aa6fd83b076a78bbea9e2e7e06c
│ │ │ │ │ │ ├── c7/
│ │ │ │ │ │ │ └── aadd770d5907a8475c29e9ee21a27b88bf675d
│ │ │ │ │ │ ├── c9/
│ │ │ │ │ │ │ └── 6bbb2c2557a8325ae1559e3ba79cdcecb23076
│ │ │ │ │ │ ├── ce/
│ │ │ │ │ │ │ └── 39a97a7fb1fa90bcf5e711249c1e507476ae0e
│ │ │ │ │ │ ├── d5/
│ │ │ │ │ │ │ └── 7da33c16b14326ecb05d19bbea908f5e4c47d9
│ │ │ │ │ │ ├── d8/
│ │ │ │ │ │ │ └── 00886d9c86731ae5c4a62b0b77c437015e00d2
│ │ │ │ │ │ ├── dc/
│ │ │ │ │ │ │ └── cada462d3df8ac6de596fb8c896aba9344f941
│ │ │ │ │ │ ├── de/
│ │ │ │ │ │ │ └── 863bff4976c9ed7e17a4da0fd524908dc84049
│ │ │ │ │ │ ├── e5/
│ │ │ │ │ │ │ └── 63cf4758f0d646f1b14b76016aa17fa9e549a4
│ │ │ │ │ │ ├── ec/
│ │ │ │ │ │ │ └── b97df2a174987475ac816e3847fc8e9f6c596b
│ │ │ │ │ │ ├── ed/
│ │ │ │ │ │ │ └── f3dcee4003d71f139777898882ccd097e34c53
│ │ │ │ │ │ ├── f2/
│ │ │ │ │ │ │ └── c6d717cf4a5a3e6b02684155ab07b766982165
│ │ │ │ │ │ ├── f5/
│ │ │ │ │ │ │ └── b0af1fb4f5c0cd7aad880711d368a07333c307
│ │ │ │ │ │ ├── fb/
│ │ │ │ │ │ │ └── 5067b1aef3ac1ada4b379dbcb7d17255df7d78
│ │ │ │ │ │ ├── fe/
│ │ │ │ │ │ │ └── 773770c5a6cc7185580c9204b1ff18a33ff3fc
│ │ │ │ │ │ └── ff/
│ │ │ │ │ │ └── 69f8639ce2e6010b3f33a74160aad98b48da2b
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── attr0
│ │ │ │ ├── attr1
│ │ │ │ ├── attr2
│ │ │ │ ├── attr3
│ │ │ │ ├── binfile
│ │ │ │ ├── dir/
│ │ │ │ │ └── file
│ │ │ │ ├── file
│ │ │ │ ├── gitattributes
│ │ │ │ ├── gitignore
│ │ │ │ ├── ign
│ │ │ │ ├── macro_bad
│ │ │ │ ├── macro_test
│ │ │ │ ├── root_test1
│ │ │ │ ├── root_test2
│ │ │ │ ├── root_test3
│ │ │ │ ├── root_test4.txt
│ │ │ │ └── sub/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── abc
│ │ │ │ ├── dir/
│ │ │ │ │ └── file
│ │ │ │ ├── file
│ │ │ │ ├── ign/
│ │ │ │ │ ├── file
│ │ │ │ │ └── sub/
│ │ │ │ │ └── file
│ │ │ │ ├── sub/
│ │ │ │ │ ├── .gitattributes
│ │ │ │ │ ├── dir
│ │ │ │ │ ├── file
│ │ │ │ │ └── subsub.txt
│ │ │ │ ├── subdir_test1
│ │ │ │ └── subdir_test2.txt
│ │ │ ├── attr_index/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── exclude
│ │ │ │ │ │ └── refs
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 38/
│ │ │ │ │ │ │ └── 12cfef36615db1788d4e63f90028007e17a348
│ │ │ │ │ │ ├── 59/
│ │ │ │ │ │ │ └── d942b8be2784bc96db9b22202c10815c9a077b
│ │ │ │ │ │ ├── cd/
│ │ │ │ │ │ │ └── f17ea3fe625ef812f4dce7f423f4f299287505
│ │ │ │ │ │ ├── f7/
│ │ │ │ │ │ │ └── 2502ddd01412bb20796ff812af56fd53b82b52
│ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ └── packs
│ │ │ │ │ │ └── pack/
│ │ │ │ │ │ ├── pack-4e6438607204ce78827e3885594b2c0bb4f13895.idx
│ │ │ │ │ │ └── pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack
│ │ │ │ │ ├── packed-refs
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── README.md
│ │ │ │ ├── README.txt
│ │ │ │ ├── gitattributes
│ │ │ │ └── sub/
│ │ │ │ └── sub/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── README.md
│ │ │ │ └── README.txt
│ │ │ ├── bad.index
│ │ │ ├── bad_tag.git/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── objects/
│ │ │ │ │ └── pack/
│ │ │ │ │ ├── pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx
│ │ │ │ │ └── pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack
│ │ │ │ ├── packed-refs
│ │ │ │ └── refs/
│ │ │ │ └── dummy-marker.txt
│ │ │ ├── big.index
│ │ │ ├── binaryunicode/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── exclude
│ │ │ │ │ │ └── refs
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ └── packs
│ │ │ │ │ │ └── pack/
│ │ │ │ │ │ ├── pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.idx
│ │ │ │ │ │ └── pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ ├── branch1
│ │ │ │ │ ├── branch2
│ │ │ │ │ └── master
│ │ │ │ └── file.txt
│ │ │ ├── blametest.git/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── description
│ │ │ │ ├── objects/
│ │ │ │ │ ├── 0c/
│ │ │ │ │ │ └── bab4d45fd61e55a1c9697f9f9cb07a12e15448
│ │ │ │ │ ├── 1a/
│ │ │ │ │ │ └── ac69ae5d96461afc4d81d0066cb12f5b05a35b
│ │ │ │ │ ├── 1b/
│ │ │ │ │ │ └── 5f0775af166331c854bd8d1bca3450eaf2532a
│ │ │ │ │ ├── 37/
│ │ │ │ │ │ └── 681a80ca21064efd5c3bf2ef41eb3d05a1428b
│ │ │ │ │ ├── 48/
│ │ │ │ │ │ └── 2f2c370e35c2c314fc1f96db2beb33f955a26a
│ │ │ │ │ ├── 4e/
│ │ │ │ │ │ └── ecfea484f8005d101e547f6bfb07c99e2b114e
│ │ │ │ │ ├── 5a/
│ │ │ │ │ │ └── 572e2e94825f54b95417eacaa089d560c5a5e9
│ │ │ │ │ ├── 63/
│ │ │ │ │ │ ├── d671eb32d250e4a83766ebbc60e818c1e1e93a
│ │ │ │ │ │ └── eb57322e363e18d460da5ea8284f3cd2340b36
│ │ │ │ │ ├── 66/
│ │ │ │ │ │ └── 53ff42313eb5c82806f145391b18a9699800c7
│ │ │ │ │ ├── 8b/
│ │ │ │ │ │ └── 137891791fe96927ad78e64b0aad7bded08bdc
│ │ │ │ │ ├── 96/
│ │ │ │ │ │ └── 679d59cf9f74d69b3c920f258559b5e8c9a18a
│ │ │ │ │ ├── 98/
│ │ │ │ │ │ └── 89d6e5557761aa8e3607e80c874a6dc51ada7c
│ │ │ │ │ ├── aa/
│ │ │ │ │ │ └── 06ecca6c4ad6432ab9313e556ca92ba4bcf9e9
│ │ │ │ │ ├── ad/
│ │ │ │ │ │ └── 9cb4eac23df2fe5e1264287a5872ea2a1ff8b2
│ │ │ │ │ ├── b1/
│ │ │ │ │ │ └── 76dfc3a4dc8734e4c579f77236a9c8d0a965d2
│ │ │ │ │ ├── b9/
│ │ │ │ │ │ ├── 0bb887b7c03750ae6b352ffe76ab9d2e86ee7d
│ │ │ │ │ │ └── 9f7ac0b88909253d829554c14af488c3b0f3a5
│ │ │ │ │ ├── bc/
│ │ │ │ │ │ └── 7c5ac2bafe828a68e9d1d460343718d6fbe136
│ │ │ │ │ ├── cf/
│ │ │ │ │ │ └── e0e1e1e3ba18f149fd47f5e1aef6016b2260c3
│ │ │ │ │ ├── d0/
│ │ │ │ │ │ └── 67729932057cdb7527a833d6799c4ddc520640
│ │ │ │ │ ├── da/
│ │ │ │ │ │ └── 237394e6132d20d30f175b9b73c8638fddddda
│ │ │ │ │ ├── de/
│ │ │ │ │ │ └── 9fe35f9906e1994e083cc59c87232bf418795b
│ │ │ │ │ ├── e5/
│ │ │ │ │ │ └── b41c1ea533f87388ab69b13baf0b5a562d6243
│ │ │ │ │ └── ef/
│ │ │ │ │ └── 32df4d259143933715c74951f932d9892364d1
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ └── master
│ │ │ ├── cherrypick/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 01/
│ │ │ │ │ │ │ └── a2b453c2647c71ccfefc285f2266d1f00b8253
│ │ │ │ │ │ ├── 02/
│ │ │ │ │ │ │ └── 67838e09bbc5969bba035be2d27c8a6de694d8
│ │ │ │ │ │ ├── 06/
│ │ │ │ │ │ │ └── 3fc9f01e6e9ec2a8d8f749885e931875e50d37
│ │ │ │ │ │ ├── 08/
│ │ │ │ │ │ │ └── 9ac03f76058b5ba0b44bb268f317f9242481e9
│ │ │ │ │ │ ├── 0d/
│ │ │ │ │ │ │ └── 447a6c2528b06616cde3b209a4b4ea3dcb8d65
│ │ │ │ │ │ ├── 11/
│ │ │ │ │ │ │ └── 24c2c1ae07b26fded662d6c3f3631d9dc16f88
│ │ │ │ │ │ ├── 12/
│ │ │ │ │ │ │ └── 905f4ea5b76f9d3fdcfe73e462201c06ae632a
│ │ │ │ │ │ ├── 19/
│ │ │ │ │ │ │ └── c5c7207054604b69c84d08a7571ef9672bb5c2
│ │ │ │ │ │ ├── 1c/
│ │ │ │ │ │ │ ├── 2116845780455ecf916538c1cc27c4222452af
│ │ │ │ │ │ │ └── c85eb4ff0a8438fde1b14274c6f87f891b36a0
│ │ │ │ │ │ ├── 1e/
│ │ │ │ │ │ │ └── 1cb7391d25dcd8daba88f1f627f3045982286c
│ │ │ │ │ │ ├── 20/
│ │ │ │ │ │ │ └── fc1a4c9d994021f43d33ab75e4252e27ca661d
│ │ │ │ │ │ ├── 28/
│ │ │ │ │ │ │ └── d9eb4208074ad1cc84e71ccc908b34573f05d2
│ │ │ │ │ │ ├── 2a/
│ │ │ │ │ │ │ ├── 26c7e88b285613b302ba76712bc998863f3cbc
│ │ │ │ │ │ │ └── c3b376093de405b0a951bff578655b1c2b7fa1
│ │ │ │ │ │ ├── 2c/
│ │ │ │ │ │ │ └── acbcaabf785f1ac231e8519849d4ad38692f2c
│ │ │ │ │ │ ├── 35/
│ │ │ │ │ │ │ └── cb210149022c7379b0a67b0dec13cc628ff87d
│ │ │ │ │ │ ├── 38/
│ │ │ │ │ │ │ └── c05a857e831a7e759d83778bfc85d003e21c45
│ │ │ │ │ │ ├── 3f/
│ │ │ │ │ │ │ └── 9eed8946df9e2c737d3b8dc0b8e78959aacd92
│ │ │ │ │ │ ├── 40/
│ │ │ │ │ │ │ └── 9a1bec58bf35348e8b62b72bb9c1f45cf5a587
│ │ │ │ │ │ ├── 44/
│ │ │ │ │ │ │ └── cd2ed2052c9c68f9a439d208e9614dc2a55c70
│ │ │ │ │ │ ├── 48/
│ │ │ │ │ │ │ └── 7434cace79238a7091e2220611d4f20a765690
│ │ │ │ │ │ ├── 49/
│ │ │ │ │ │ │ └── 20ad2f17162dcc8823ad491444dcb87f5899c9
│ │ │ │ │ │ ├── 4b/
│ │ │ │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904
│ │ │ │ │ │ ├── 4c/
│ │ │ │ │ │ │ └── 532774cc1fea37f6efc2256763a64d38c8cdde
│ │ │ │ │ │ ├── 51/
│ │ │ │ │ │ │ └── 145af30d411a50195b66517d825e69bf57ed22
│ │ │ │ │ │ ├── 54/
│ │ │ │ │ │ │ ├── 61de53ffadbf15be4dd6345997c15689573209
│ │ │ │ │ │ │ └── 784f10955e92ab27e4fa832e40cb2baf1edbdc
│ │ │ │ │ │ ├── 56/
│ │ │ │ │ │ │ └── 3f6473a3858f99b80e5f93c660512ed38e1e6f
│ │ │ │ │ │ ├── 58/
│ │ │ │ │ │ │ └── a957ef0061c1a8ef995c855dfab4f5da8d6617
│ │ │ │ │ │ ├── 5d/
│ │ │ │ │ │ │ └── c7e1f440ce74d5503a0dfbc6c30e091475f774
│ │ │ │ │ │ ├── 5e/
│ │ │ │ │ │ │ └── 2206cda1c56430ad107a6866a829c159e0b9ea
│ │ │ │ │ │ ├── 5f/
│ │ │ │ │ │ │ └── 77a2a13935ac62a629553f8944ad57b1ed8b4a
│ │ │ │ │ │ ├── 63/
│ │ │ │ │ │ │ └── c0d92b95253c4a40d3883f423a54be47d2c4c8
│ │ │ │ │ │ ├── 6c/
│ │ │ │ │ │ │ └── e83eb5f0fd34a10c3d25c6b36d2ed7ec0d6ce7
│ │ │ │ │ │ ├── 6d/
│ │ │ │ │ │ │ └── 1c2afe5eeb9e497528e2780ac468a5465cbc96
│ │ │ │ │ │ ├── 74/
│ │ │ │ │ │ │ └── f06b5bfec6d33d7264f73606b57a7c0b963819
│ │ │ │ │ │ ├── 82/
│ │ │ │ │ │ │ └── 8b08c52d2cba30952e0e008f60b25b5ba0d41a
│ │ │ │ │ │ ├── 85/
│ │ │ │ │ │ │ ├── 36dd6f0ec3ddecb9f9b6c8c64c6d322cd01211
│ │ │ │ │ │ │ └── a4a1d791973644f24c72f5e89420d3064cc452
│ │ │ │ │ │ ├── 8b/
│ │ │ │ │ │ │ └── 5c30499a71001189b647f4d5b57fa8f04897ce
│ │ │ │ │ │ ├── 96/
│ │ │ │ │ │ │ └── 4ea3da044d9083181a88ba6701de9e35778bf4
│ │ │ │ │ │ ├── 9c/
│ │ │ │ │ │ │ ├── c39fca3765a2facbe31157f7d60c2602193f36
│ │ │ │ │ │ │ └── cb9bf50c011fd58dcbaa65df917bf79539717f
│ │ │ │ │ │ ├── a1/
│ │ │ │ │ │ │ └── 0b59f4280491afe6e430c30654a7acc67d4a33
│ │ │ │ │ │ ├── a2/
│ │ │ │ │ │ │ └── 1b4bfe7a04ab18024fb57f4ae9a52a1acef394
│ │ │ │ │ │ ├── a4/
│ │ │ │ │ │ │ └── 3a050c588d4e92f11a6b139680923e9728477d
│ │ │ │ │ │ ├── a5/
│ │ │ │ │ │ │ └── 8ca3fee5eb68b11adc2703e5843f968c9dad1e
│ │ │ │ │ │ ├── a6/
│ │ │ │ │ │ │ ├── 61b5dec1004e2c62654ded3762370c27cf266b
│ │ │ │ │ │ │ └── 9ef8fcbb9a2c509a7dbf4f23d257eb551d5610
│ │ │ │ │ │ ├── a8/
│ │ │ │ │ │ │ └── 3c6f70297b805dedc549e6583582966f6ebcab
│ │ │ │ │ │ ├── a9/
│ │ │ │ │ │ │ └── 020cd240774e4d672732bcb82d516d9685da76
│ │ │ │ │ │ ├── ab/
│ │ │ │ │ │ │ ├── 4115f808bc585b60f822da7020af86d20f62c8
│ │ │ │ │ │ │ └── e4603bc7cd5b8167a267e0e2418fd2348f8cff
│ │ │ │ │ │ ├── b8/
│ │ │ │ │ │ │ └── 26e9b36e22e949ec885e7a1f3db496bbab6cd0
│ │ │ │ │ │ ├── ba/
│ │ │ │ │ │ │ └── fbf6912c09505ac60575cd43d3f2aba3bd84d8
│ │ │ │ │ │ ├── bb/
│ │ │ │ │ │ │ └── 14296ffa9dfbf935ec9ce2f9ed7808d952226b
│ │ │ │ │ │ ├── bc/
│ │ │ │ │ │ │ └── 4dd0744364d1db380a9811bd264c101065231e
│ │ │ │ │ │ ├── bd/
│ │ │ │ │ │ │ ├── 65d4083845ed5ed4e1fe5feb85ac395d0760c8
│ │ │ │ │ │ │ ├── 6ffc8c6c41f0f85ff9e3d61c9479516bac0024
│ │ │ │ │ │ │ └── a51965cb36c0c5731c8cb50b80a36cac81018e
│ │ │ │ │ │ ├── ce/
│ │ │ │ │ │ │ └── d8fb81b6ec534d5deaf2a48b4b96c799712507
│ │ │ │ │ │ ├── cf/
│ │ │ │ │ │ │ └── c4f0999a8367568e049af4f72e452d40828a15
│ │ │ │ │ │ ├── d0/
│ │ │ │ │ │ │ └── f21e17beb5b9d953b1d8349049818a4f2edd1e
│ │ │ │ │ │ ├── d3/
│ │ │ │ │ │ │ └── d77487660ee3c0194ee01dc5eaf478782b1c7e
│ │ │ │ │ │ ├── e2/
│ │ │ │ │ │ │ └── 33b9ed408a95e9d4b65fec7fc34943a556deb2
│ │ │ │ │ │ ├── e5/
│ │ │ │ │ │ │ └── 183bfd18e3a0a691fadde2f0d5610b73282d31
│ │ │ │ │ │ ├── e6/
│ │ │ │ │ │ │ └── ae8889c40c77d7be02758235b5b3f7a4f2a129
│ │ │ │ │ │ ├── e7/
│ │ │ │ │ │ │ └── 811a2bc55635f182750f0420da5ad232c1af91
│ │ │ │ │ │ ├── e9/
│ │ │ │ │ │ │ └── b63f3655b2ad80c0ff587389b5a9589a3a7110
│ │ │ │ │ │ ├── eb/
│ │ │ │ │ │ │ └── da71fe44dcb60c53b8fbd53208a1204d32e959
│ │ │ │ │ │ ├── f0/
│ │ │ │ │ │ │ ├── 5ed049854c1596a7cc0e957fab34961077f3ae
│ │ │ │ │ │ │ └── a4e1c66bb548cd2b22eebefda703872e969775
│ │ │ │ │ │ ├── f2/
│ │ │ │ │ │ │ └── ec8c8cf1a9fb7aa047a25a4308bfe860237ad4
│ │ │ │ │ │ ├── f5/
│ │ │ │ │ │ │ └── 684c96bf40c709877b56404cd8a5dd2d2a7978
│ │ │ │ │ │ └── f9/
│ │ │ │ │ │ └── 0f9dcbdac2cce5cc166346160e19cb693ef4e8
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ ├── automerge-branch
│ │ │ │ │ ├── master
│ │ │ │ │ ├── merge-branch
│ │ │ │ │ ├── merge-conflicts
│ │ │ │ │ ├── merge-mainline
│ │ │ │ │ ├── orphan
│ │ │ │ │ └── renames
│ │ │ │ ├── file1.txt
│ │ │ │ ├── file2.txt
│ │ │ │ └── file3.txt
│ │ │ ├── config/
│ │ │ │ ├── .gitconfig
│ │ │ │ ├── config-include
│ │ │ │ ├── config-included
│ │ │ │ ├── config0
│ │ │ │ ├── config1
│ │ │ │ ├── config10
│ │ │ │ ├── config11
│ │ │ │ ├── config12
│ │ │ │ ├── config13
│ │ │ │ ├── config14
│ │ │ │ ├── config15
│ │ │ │ ├── config16
│ │ │ │ ├── config17
│ │ │ │ ├── config18
│ │ │ │ ├── config19
│ │ │ │ ├── config2
│ │ │ │ ├── config20
│ │ │ │ ├── config3
│ │ │ │ ├── config4
│ │ │ │ ├── config5
│ │ │ │ ├── config6
│ │ │ │ ├── config7
│ │ │ │ ├── config8
│ │ │ │ └── config9
│ │ │ ├── crlf/
│ │ │ │ └── .gitted/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── index
│ │ │ │ ├── objects/
│ │ │ │ │ ├── 04/
│ │ │ │ │ │ ├── 4bcd5c9bf5ebdd51e514a9a36457018f06f6e1
│ │ │ │ │ │ └── de00b358f13389948756732158eaaaefa1448c
│ │ │ │ │ ├── 09/
│ │ │ │ │ │ └── 7722be9b67b48dfe3b19396d02fd535300ee46
│ │ │ │ │ ├── 0a/
│ │ │ │ │ │ └── a76e474d259bd7c13eb726a1396c381db55c88
│ │ │ │ │ ├── 0d/
│ │ │ │ │ │ └── 06894e14df22e066763ae906e0ed3eb79c205f
│ │ │ │ │ ├── 0e/
│ │ │ │ │ │ └── 052888828a954ca17e5882638e3c6a083e75c0
│ │ │ │ │ ├── 0f/
│ │ │ │ │ │ └── f5a53f19bfd2b5eea1ba550295c47515678987
│ │ │ │ │ ├── 16/
│ │ │ │ │ │ ├── 78031ee023a23bd3515e4e1693b661a69f0a73
│ │ │ │ │ │ └── c72b67861f8524a5bebc05cd20472d3fca00da
│ │ │ │ │ ├── 18/
│ │ │ │ │ │ └── c637c5d9aba6eed226ee1840cd1ca2e6c4e4c5
│ │ │ │ │ ├── 20/
│ │ │ │ │ │ └── 3555c5676d75cd80d69b50beb1f4b588c59ceb
│ │ │ │ │ ├── 23/
│ │ │ │ │ │ └── f4582779e60bfa7f14750ad507399a58876611
│ │ │ │ │ ├── 2a/
│ │ │ │ │ │ └── d3df895f68f4dda6a0a815c620b909bdd27c05
│ │ │ │ │ ├── 2b/
│ │ │ │ │ │ ├── 55b4b94f655c857635b6a9005c056aa7de3532
│ │ │ │ │ │ └── d9d81b51a867352bab307b89cbb5b4a69adfe1
│ │ │ │ │ ├── 2c/
│ │ │ │ │ │ └── 03f9f407b576eae80327864bab572e282a33ea
│ │ │ │ │ ├── 33/
│ │ │ │ │ │ └── cdead44e1c3ec178e39a4a69085280dbacf01b
│ │ │ │ │ ├── 38/
│ │ │ │ │ │ └── 1cfe630df902bc29271a202d3277981180e4a6
│ │ │ │ │ ├── 3f/
│ │ │ │ │ │ └── 96bdca0e37616026afaa325c148cec4aa62d04
│ │ │ │ │ ├── 41/
│ │ │ │ │ │ └── 7786fc35b3c71aa546e3f95eb5da3c8dad8c41
│ │ │ │ │ ├── 47/
│ │ │ │ │ │ └── fbc2c28a18df0dc773276a253eb85c7516ca50
│ │ │ │ │ ├── 4b/
│ │ │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904
│ │ │ │ │ ├── 5a/
│ │ │ │ │ │ └── fb6a14a864e30787857dd92af837e8cdd2cb1b
│ │ │ │ │ ├── 68/
│ │ │ │ │ │ └── 03c385642cebc8103fddd526ef395d75678a7e
│ │ │ │ │ ├── 69/
│ │ │ │ │ │ └── 597764abeaa1a403ebf589d2ea579c6a8f877e
│ │ │ │ │ ├── 6a/
│ │ │ │ │ │ └── e3e9c11a51f0aabebcffcbd5c00f4beed143c9
│ │ │ │ │ ├── 6c/
│ │ │ │ │ │ └── 589757f65a970a6cc07c71c3f3d2528c611cbc
│ │ │ │ │ ├── 77/
│ │ │ │ │ │ └── afe26d93c49279ca90604c125496920753fede
│ │ │ │ │ ├── 78/
│ │ │ │ │ │ └── db270c1841841f75a8157321bdcb50ab12e6c3
│ │ │ │ │ ├── 79/
│ │ │ │ │ │ └── 9770d1cff46753a57db7a066159b5610da6e3a
│ │ │ │ │ ├── 7c/
│ │ │ │ │ │ └── ce67e58173e2b01f7db124ceaabe3183d19c49
│ │ │ │ │ ├── 85/
│ │ │ │ │ │ └── 340755cfe5e28c2835781978bb1cece91b3d0f
│ │ │ │ │ ├── 92/
│ │ │ │ │ │ └── 0e90a663bea5d740989d5f935f6dfb473a0c5d
│ │ │ │ │ ├── 96/
│ │ │ │ │ │ └── 87e444bcbb85645cb496080434c292f1b57182
│ │ │ │ │ ├── 97/
│ │ │ │ │ │ └── 449da2d225557c558ac244384d487e66c3e591
│ │ │ │ │ ├── 9a/
│ │ │ │ │ │ └── 6c3533fef19abd6eec8e61206b5c51982b80d9
│ │ │ │ │ ├── 9d/
│ │ │ │ │ │ └── 29b5bb165bf65637ffcb5ededb82ddd7c3fd13
│ │ │ │ │ ├── a2/
│ │ │ │ │ │ └── 34455d62297f1856c4603686150c59fcb0aafe
│ │ │ │ │ ├── a9/
│ │ │ │ │ │ └── a2e8913c1dbe2812fac5e6b4e0a4bd5d0d5966
│ │ │ │ │ ├── aa/
│ │ │ │ │ │ └── f083a9cb53dac3669dcfa0e48921580d629ec7
│ │ │ │ │ ├── af/
│ │ │ │ │ │ └── 6fcf6da196f615d7cda269b55b5c4ecfb4a5b3
│ │ │ │ │ ├── bb/
│ │ │ │ │ │ └── 29a7b46b5d4ba3ea17b238ae561b81d59dc818
│ │ │ │ │ ├── c3/
│ │ │ │ │ │ └── e11722855ff260bd27418988ac1467c4e9e73a
│ │ │ │ │ ├── c8/
│ │ │ │ │ │ └── d0b1ebcaccdd8f968c4aae3c2175e7fed651fe
│ │ │ │ │ ├── cd/
│ │ │ │ │ │ ├── 574f5a2baa4c79504f8837b730fa0b11defe99
│ │ │ │ │ │ └── d3dacc5c0501d5ea57bbdf90e3d80176606139
│ │ │ │ │ ├── d1/
│ │ │ │ │ │ └── 1e7ef63ba7db1db3b1b99cdbafc57a8549f8a4
│ │ │ │ │ ├── dc/
│ │ │ │ │ │ └── 88e3b917de821e25962bea7ec1f55c4ce2112c
│ │ │ │ │ ├── de/
│ │ │ │ │ │ └── 5bfa165999d9d6c6dbafad2a7e709f93ec30fd
│ │ │ │ │ ├── e5/
│ │ │ │ │ │ └── 062da7d7802cf492975eda580f09ac4876bd88
│ │ │ │ │ ├── e6/
│ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ │ │ │ │ ├── ea/
│ │ │ │ │ │ └── 030d3c6cec212069eca698cabaa5b4550f1511
│ │ │ │ │ ├── ef/
│ │ │ │ │ │ └── 0dcd356d77221e9c27f4f3928ad28e80b87ceb
│ │ │ │ │ ├── f2/
│ │ │ │ │ │ └── b745d7f47d114a3a6b31a7b628e61e804d1a58
│ │ │ │ │ ├── f4/
│ │ │ │ │ │ └── d25b796d86387205a5498175d66e91d1e5006a
│ │ │ │ │ └── fe/
│ │ │ │ │ ├── 085d9ace90cc675b87df15e1aeed0c3a31407f
│ │ │ │ │ └── ab3713c4659bb22700042b3c55b8d60d0a952b
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ ├── empty-files
│ │ │ │ └── master
│ │ │ ├── crlf_data/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── posix/
│ │ │ │ │ ├── autocrlf_false/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,-crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,-text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text_auto/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text_auto,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_false,text_auto,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,-crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,-text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text_auto/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text_auto,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_input,text_auto,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,-crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,-text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,text/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,text,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,text,eol_lf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,text_auto/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ ├── autocrlf_true,text_auto,eol_crlf/
│ │ │ │ │ │ ├── all-crlf
│ │ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ │ ├── all-lf
│ │ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ │ ├── more-crlf
│ │ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ │ ├── more-lf
│ │ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ │ └── zero-byte
│ │ │ │ │ └── autocrlf_true,text_auto,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ └── windows/
│ │ │ │ ├── autocrlf_false/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,-crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,-text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text_auto/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text_auto,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_false,text_auto,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,-crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,-text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text_auto/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text_auto,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_input,text_auto,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,-crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,-text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,text/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,text,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,text,eol_lf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,text_auto/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ ├── autocrlf_true,text_auto,eol_crlf/
│ │ │ │ │ ├── all-crlf
│ │ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ │ ├── all-lf
│ │ │ │ │ ├── all-lf-utf8bom
│ │ │ │ │ ├── binary-all-crlf
│ │ │ │ │ ├── binary-all-lf
│ │ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ │ ├── mixed-lf-cr
│ │ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ │ ├── more-crlf
│ │ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ │ ├── more-lf
│ │ │ │ │ ├── more-lf-utf8bom
│ │ │ │ │ └── zero-byte
│ │ │ │ └── autocrlf_true,text_auto,eol_lf/
│ │ │ │ ├── all-crlf
│ │ │ │ ├── all-crlf-utf8bom
│ │ │ │ ├── all-lf
│ │ │ │ ├── all-lf-utf8bom
│ │ │ │ ├── binary-all-crlf
│ │ │ │ ├── binary-all-lf
│ │ │ │ ├── binary-mixed-lf-cr
│ │ │ │ ├── binary-mixed-lf-cr-crlf
│ │ │ │ ├── few-utf8-chars-crlf
│ │ │ │ ├── few-utf8-chars-lf
│ │ │ │ ├── many-utf8-chars-crlf
│ │ │ │ ├── many-utf8-chars-lf
│ │ │ │ ├── mixed-lf-cr
│ │ │ │ ├── mixed-lf-cr-crlf
│ │ │ │ ├── more-crlf
│ │ │ │ ├── more-crlf-utf8bom
│ │ │ │ ├── more-lf
│ │ │ │ ├── more-lf-utf8bom
│ │ │ │ └── zero-byte
│ │ │ ├── deprecated-mode.git/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── description
│ │ │ │ ├── index
│ │ │ │ ├── info/
│ │ │ │ │ └── exclude
│ │ │ │ ├── objects/
│ │ │ │ │ ├── 06/
│ │ │ │ │ │ └── 262edc257418e9987caf999f9a7a3e1547adff
│ │ │ │ │ ├── 08/
│ │ │ │ │ │ └── 10fb7818088ff5ac41ee49199b51473b1bd6c7
│ │ │ │ │ ├── 1b/
│ │ │ │ │ │ └── 05fdaa881ee45b48cbaa5e9b037d667a47745e
│ │ │ │ │ └── 3d/
│ │ │ │ │ └── 0970ec547fc41ef8a5882dde99c6adce65b021
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ └── master
│ │ │ ├── describe/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 03/
│ │ │ │ │ │ │ └── 00021985931292d0611b9232e757035fefc04d
│ │ │ │ │ │ ├── 10/
│ │ │ │ │ │ │ ├── 8b485d8268ea595df8ffea74f0f4b186577d32
│ │ │ │ │ │ │ └── bd08b099ecb79184c60183f5c94ca915f427ad
│ │ │ │ │ │ ├── 17/
│ │ │ │ │ │ │ └── 8481050188cf00d7d9cd5a11e43ab8fab9294f
│ │ │ │ │ │ ├── 19/
│ │ │ │ │ │ │ └── 1faf88a5826a99f475baaf8b13652c4e40bfe6
│ │ │ │ │ │ ├── 1e/
│ │ │ │ │ │ │ └── 016431ec7b22dd3e23f3e6f5f68f358f9227cf
│ │ │ │ │ │ ├── 22/
│ │ │ │ │ │ │ └── 3b7836fb19fdf64ba2d3cd6173c6a283141f78
│ │ │ │ │ │ ├── 25/
│ │ │ │ │ │ │ └── d5edf8c0ef17e8a13b8da75913dcec4ea7afc1
│ │ │ │ │ │ ├── 2b/
│ │ │ │ │ │ │ └── df67abb163a4ffb2d7f3f0880c9fe5068ce782
│ │ │ │ │ │ ├── 31/
│ │ │ │ │ │ │ └── fc9136820b507e938a9c6b88bf2c567a9f6f4b
│ │ │ │ │ │ ├── 42/
│ │ │ │ │ │ │ └── 8f9554a2eec22de29898819b579466af7c1583
│ │ │ │ │ │ ├── 4d/
│ │ │ │ │ │ │ └── 6558b8fa764baeb0f19c1e857df91e0eda5a0f
│ │ │ │ │ │ ├── 4f/
│ │ │ │ │ │ │ └── 2d9ce01ad5249cabdc6565366af8aff85b1525
│ │ │ │ │ │ ├── 52/
│ │ │ │ │ │ │ └── 912fbab0715dec53d43053966e78ad213ba359
│ │ │ │ │ │ ├── 56/
│ │ │ │ │ │ │ └── 26abf0f72e58d7a153368ba57db4c673c0e171
│ │ │ │ │ │ ├── 61/
│ │ │ │ │ │ │ └── 26a5f9c57ebc81e64370ec3095184ad92dab1c
│ │ │ │ │ │ ├── 62/
│ │ │ │ │ │ │ └── d8fe9f6db631bd3a19140699101c9e281c9f9d
│ │ │ │ │ │ ├── 65/
│ │ │ │ │ │ │ └── a91bc2262480dce4c5979519aae6668368eb4e
│ │ │ │ │ │ ├── 68/
│ │ │ │ │ │ │ └── 0166b6cd31f76354fee2572618e6b0142d05e6
│ │ │ │ │ │ ├── 69/
│ │ │ │ │ │ │ └── 3a3de402bb23897ed5c931273e53c78eff0495
│ │ │ │ │ │ ├── 6a/
│ │ │ │ │ │ │ └── 12b56088706aa6c39ccd23b7c7ce60f3a0b9a1
│ │ │ │ │ │ ├── 6d/
│ │ │ │ │ │ │ └── 218e42592043041c4da016ff298cf241b86c3c
│ │ │ │ │ │ ├── 75/
│ │ │ │ │ │ │ └── bb152c600647586c226d98411b1d2f9861af5a
│ │ │ │ │ │ ├── 81/
│ │ │ │ │ │ │ └── f4b1aac643e6983fab370eae8aefccecbf3a4c
│ │ │ │ │ │ ├── 8e/
│ │ │ │ │ │ │ └── c1d96451ff05451720e4e8968812c46b35e5e4
│ │ │ │ │ │ ├── 94/
│ │ │ │ │ │ │ └── 9b98e208015bfc0e2f573debc34ae2f97a7f0e
│ │ │ │ │ │ ├── 9c/
│ │ │ │ │ │ │ └── 06d71b8406ab97537e3acdc39a2c4ade7a9411
│ │ │ │ │ │ ├── a6/
│ │ │ │ │ │ │ └── 095f816e81f64651595d488badc42399837d6a
│ │ │ │ │ │ ├── a9/
│ │ │ │ │ │ │ ├── e3325a07117aa5381e044a8d96c26eb30d729d
│ │ │ │ │ │ │ └── eb02af13df030159e39f70330d5c8a47655691
│ │ │ │ │ │ ├── aa/
│ │ │ │ │ │ │ ├── d8d5cef3915ab78b3227abaaac99b62db9eb54
│ │ │ │ │ │ │ └── ddd4f14847e0e323924ec262c2343249a84f8b
│ │ │ │ │ │ ├── b2/
│ │ │ │ │ │ │ └── 40c0fb88c5a629e00ebc1275fa1f33e364a705
│ │ │ │ │ │ ├── ce/
│ │ │ │ │ │ │ └── 1c4f8b6120122e23d4442925d98c56c41917d8
│ │ │ │ │ │ ├── d5/
│ │ │ │ │ │ │ └── aab219a814ddbe4b3aaedf03cdea491b218ec4
│ │ │ │ │ │ ├── f2/
│ │ │ │ │ │ │ └── ad6c76f0115a6ba5b00456a849810e7ec0af20
│ │ │ │ │ │ └── f7/
│ │ │ │ │ │ ├── 0f10e4db19068f79bc43844b49f3eece45c4e8
│ │ │ │ │ │ └── 19efd430d52bcfc8566a43b2eb655688d38871
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── another
│ │ │ │ ├── file
│ │ │ │ └── side
│ │ │ ├── diff/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 29/
│ │ │ │ │ │ │ └── ab7053bb4dde0298e03e2c179e890b7dd465a7
│ │ │ │ │ │ ├── 3e/
│ │ │ │ │ │ │ └── 5bcbad2a68e5bc60a53b8388eea53a1a7ab847
│ │ │ │ │ │ ├── 54/
│ │ │ │ │ │ │ └── 6c735f16a3b44d9784075c2c0dab2ac9bf1989
│ │ │ │ │ │ ├── 7a/
│ │ │ │ │ │ │ └── 9e0b02e63179929fed24f0a3e0f19168114d10
│ │ │ │ │ │ ├── 7b/
│ │ │ │ │ │ │ └── 808f723a8ca90df319682c221187235af76693
│ │ │ │ │ │ ├── 88/
│ │ │ │ │ │ │ └── 789109439c1e1c3cd45224001edee5304ed53c
│ │ │ │ │ │ ├── cb/
│ │ │ │ │ │ │ └── 8294e696339863df760b2ff5d1e275bee72455
│ │ │ │ │ │ └── d7/
│ │ │ │ │ │ └── 0d245ed97ed2aa596dd1af6536e4bfdb047b69
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── another.txt
│ │ │ │ └── readme.txt
│ │ │ ├── diff_format_email/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 06/
│ │ │ │ │ │ │ └── b7b69a62cbd1e53c6c4e0c3f16473dcfdb4af6
│ │ │ │ │ │ ├── 0a/
│ │ │ │ │ │ │ └── 37045ca6d8503e9bcf06a12abbbc8e92664cce
│ │ │ │ │ │ ├── 10/
│ │ │ │ │ │ │ └── 808fe9c9be5a190c0ba68d1a002233fb363508
│ │ │ │ │ │ ├── 13/
│ │ │ │ │ │ │ └── ecf3d572dbc5e5b32c8ba067d1d1e0939572e8
│ │ │ │ │ │ ├── 17/
│ │ │ │ │ │ │ └── cfad36e93db7706b16bef5ef842ba1e5ca06ab
│ │ │ │ │ │ ├── 1a/
│ │ │ │ │ │ │ ├── 9932083f96b0db42552103d40076f62fa8235e
│ │ │ │ │ │ │ └── e3be57f869687d983066a0f5d2aaea1b82ddc5
│ │ │ │ │ │ ├── 1b/
│ │ │ │ │ │ │ └── 525b0a6c5218b069b601ce91fce8eaf0a54e20
│ │ │ │ │ │ ├── 1e/
│ │ │ │ │ │ │ ├── 82c3b234e37da82e5b23e0e2a70bca68ee12c6
│ │ │ │ │ │ │ └── 875da9b1e67f853b2eec3e202c21c867097234
│ │ │ │ │ │ ├── 20/
│ │ │ │ │ │ │ └── 609dbbc32bbfc827528eec3fcea2d024e6dd8a
│ │ │ │ │ │ ├── 23/
│ │ │ │ │ │ │ └── f92946d3f38bd090f700d3e8e7b728ffc58264
│ │ │ │ │ │ ├── 24/
│ │ │ │ │ │ │ ├── 97c5249408494e66e25070a8c74e49eaeeb6c3
│ │ │ │ │ │ │ └── 9a4263be23b4d1c02484cb840b6eca4c6cf74d
│ │ │ │ │ │ ├── 25/
│ │ │ │ │ │ │ └── 2a3e19fd2c6fb7b20c111142c5bd5fb9ea6b8e
│ │ │ │ │ │ ├── 27/
│ │ │ │ │ │ │ └── 93544db9060bab4f9169e5b89c82f9fa7c7fa6
│ │ │ │ │ │ ├── 29/
│ │ │ │ │ │ │ └── 1f1ff3cbb9a6f153678d9657679e3d4bf257df
│ │ │ │ │ │ ├── 2f/
│ │ │ │ │ │ │ └── f7b811eee62a73959350b1f7349f6f4d0c882d
│ │ │ │ │ │ ├── 39/
│ │ │ │ │ │ │ └── 91dce9e71a0641ca49a6a4eea6c9e7ff402ed4
│ │ │ │ │ │ ├── 45/
│ │ │ │ │ │ │ └── eef2a9317e179984649de247269e38cd5d99cf
│ │ │ │ │ │ ├── 4a/
│ │ │ │ │ │ │ └── 076277b884c519a932be67e346db2ac80a98fa
│ │ │ │ │ │ ├── 4c/
│ │ │ │ │ │ │ ├── 3bd7182ad66ea7aa20ba47ae82812b710d169c
│ │ │ │ │ │ │ └── a10087e696d2ba78d07b146a118e9a7096ed4f
│ │ │ │ │ │ ├── 4d/
│ │ │ │ │ │ │ └── de2b17d1c982cd988f21d24350a214401e4a1e
│ │ │ │ │ │ ├── 4f/
│ │ │ │ │ │ │ └── 31e0248ac800a1edc78b74f74e86f5eba90e87
│ │ │ │ │ │ ├── 50/
│ │ │ │ │ │ │ ├── 17c9456d013b2c7712d29aab73b681c880f509
│ │ │ │ │ │ │ └── 438cfa585c1d15cf3650ed1bf641da937cc261
│ │ │ │ │ │ ├── 52/
│ │ │ │ │ │ │ ├── 19b9784f9a92d7bd7cb567a6d6a21bfb86697e
│ │ │ │ │ │ │ └── c3cd1ff6234b95fecbaf9ef13624da17697b8d
│ │ │ │ │ │ ├── 53/
│ │ │ │ │ │ │ └── 525d4cc3ef3ba4a5cbf69492fdffb4e4a74558
│ │ │ │ │ │ ├── 55/
│ │ │ │ │ │ │ └── 0d730ba1b8c4937ea170b37c7ba91d792c0aaa
│ │ │ │ │ │ ├── 62/
│ │ │ │ │ │ │ └── 7e7e12d87e07a83fad5b6bfa25e86ead4a5270
│ │ │ │ │ │ ├── 66/
│ │ │ │ │ │ │ └── 81f1844dc677e5ff07ffd993461f5c441e6af5
│ │ │ │ │ │ ├── 69/
│ │ │ │ │ │ │ └── ddefb5c245e2f9ee62bd4cabd8ebe60a01e448
│ │ │ │ │ │ ├── 6b/
│ │ │ │ │ │ │ ├── 6c2067c6d968f9bddb9b900ee1ab7e5b067430
│ │ │ │ │ │ │ └── ef49b206b29d9c46456e075722cd1a48b41e4c
│ │ │ │ │ │ ├── 6c/
│ │ │ │ │ │ │ └── 15659c036377aebf3b4569959ca1f5bedb551f
│ │ │ │ │ │ ├── 6e/
│ │ │ │ │ │ │ └── 05acc5a5dab507d91a0a0cc0fb05a3dd98892d
│ │ │ │ │ │ ├── 73/
│ │ │ │ │ │ │ └── 09653445ecf038d3e3dd9ed55edb6cb541a4ba
│ │ │ │ │ │ ├── 74/
│ │ │ │ │ │ │ ├── 6d514eae0c330261d37940cab33aa97fefbd93
│ │ │ │ │ │ │ └── a4d5394ebcfa7e9f445680897dfbc96586bc86
│ │ │ │ │ │ ├── 77/
│ │ │ │ │ │ │ └── d0a3ed37236a7941d564f08d68d3b36462d231
│ │ │ │ │ │ ├── 7a/
│ │ │ │ │ │ │ ├── de76dd34bba4733cf9878079f9fd4a456a9189
│ │ │ │ │ │ │ └── ff11da95ca2be0bfb74b06e7cc1c480559dbe7
│ │ │ │ │ │ ├── 7f/
│ │ │ │ │ │ │ └── 854619451620f7fbcec7ea171675e615ce92b6
│ │ │ │ │ │ ├── 87/
│ │ │ │ │ │ │ └── 3806f6f27e631eb0b23e4b56bea2bfac14a373
│ │ │ │ │ │ ├── 89/
│ │ │ │ │ │ │ ├── 47a46e2097638ca6040ad4877246f4186ec3bd
│ │ │ │ │ │ │ └── 7d3af16ca9e420cd071b1c4541bd2b91d04c8c
│ │ │ │ │ │ ├── 8d/
│ │ │ │ │ │ │ ├── 7523f6fcb2404257889abe0d96f093d9f524f9
│ │ │ │ │ │ │ └── fa038554d5b682a51bda8ee3038cee6c63be76
│ │ │ │ │ │ ├── 92/
│ │ │ │ │ │ │ └── 64b96c6d104d0e07ae33d3007b6a48246c6f92
│ │ │ │ │ │ ├── 94/
│ │ │ │ │ │ │ ├── 350226b3aa14efac831c803a51f7a09f3fc31a
│ │ │ │ │ │ │ ├── 75e21dcbc515af8f641576400e4b450e5f4c03
│ │ │ │ │ │ │ └── aaae8954e8bb613de636071da663a621695911
│ │ │ │ │ │ ├── 9a/
│ │ │ │ │ │ │ ├── 2d780ac2ea0aeabdb9d2a876e6bbfff17b2c44
│ │ │ │ │ │ │ ├── c0329b8b7a4046210d8b8b02ac02055667de63
│ │ │ │ │ │ │ └── c35ff15cd8864aeafd889e4826a3150f0b06c4
│ │ │ │ │ │ ├── 9b/
│ │ │ │ │ │ │ └── 997daca2a0beb5cc44b32c64f100a9a26d4d4b
│ │ │ │ │ │ ├── a3/
│ │ │ │ │ │ │ └── ac918e3a6604294b239cb956363e83d71abb3b
│ │ │ │ │ │ ├── a5/
│ │ │ │ │ │ │ └── ac978d4f2a1784f847f41223a34c3e78934238
│ │ │ │ │ │ ├── a7/
│ │ │ │ │ │ │ ├── 29eab45c84563135e8631d4010230bc0479f1f
│ │ │ │ │ │ │ └── a65f98355b5a7567bcc395f6f7936c9252cf57
│ │ │ │ │ │ ├── a9/
│ │ │ │ │ │ │ └── 7157a0d0571698728b6f2f7675b456c98c5961
│ │ │ │ │ │ ├── af/
│ │ │ │ │ │ │ └── 8f41d0cb7a3079a8f8e231ea2ab8b97837ce13
│ │ │ │ │ │ ├── b0/
│ │ │ │ │ │ │ └── 5cecf1949d192b6df852b3f71853ef820ee235
│ │ │ │ │ │ ├── b4/
│ │ │ │ │ │ │ └── f457c219dbb3517be908d4e70f0ada2fd8b8f9
│ │ │ │ │ │ ├── bd/
│ │ │ │ │ │ │ ├── 474b2519cc15eab801ff851cc7d50f0dee49a1
│ │ │ │ │ │ │ └── f7ba6bc5c4e57ca6595928dcbe6753c8a663ff
│ │ │ │ │ │ ├── c7/
│ │ │ │ │ │ │ └── 1a05d36025c806496a74d46d7d596eb23295c4
│ │ │ │ │ │ ├── cb/
│ │ │ │ │ │ │ └── a89408dc016f4caddb6dc886fcb58f587a78df
│ │ │ │ │ │ ├── cd/
│ │ │ │ │ │ │ ├── 471f0d8770371e1bc78bcbb38db4c7e4106bd2
│ │ │ │ │ │ │ └── ed722d05305c6b181f188c118d2d9810f39bb8
│ │ │ │ │ │ ├── ce/
│ │ │ │ │ │ │ └── 2792fcae8d704a56901754a0583a7418a21d8a
│ │ │ │ │ │ ├── d1/
│ │ │ │ │ │ │ └── 4aa252e52a709d03a3d3d0d965e177eb0a674e
│ │ │ │ │ │ ├── d3/
│ │ │ │ │ │ │ └── b6b38486f620b5b532a8cc6e0198ab7c3f52e4
│ │ │ │ │ │ ├── d5/
│ │ │ │ │ │ │ └── ff67764c82f729b13c26a09576570d884d9687
│ │ │ │ │ │ ├── d7/
│ │ │ │ │ │ │ └── bb447df12c6a8aba8727005482fb211f11297a
│ │ │ │ │ │ ├── db/
│ │ │ │ │ │ │ └── e8727e4806ae88ccc3f0755cae8f8cb7efa2cc
│ │ │ │ │ │ ├── e1/
│ │ │ │ │ │ │ └── 2af77c510e8ce4c261a3758736109c2c2dd1f0
│ │ │ │ │ │ ├── e6/
│ │ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ │ │ │ │ │ ├── e9/
│ │ │ │ │ │ │ └── 091231467304a5ef112de02361d795ef051ee1
│ │ │ │ │ │ ├── ee/
│ │ │ │ │ │ │ └── 251372f131d82e575f16fe51c778406d88f8c2
│ │ │ │ │ │ ├── f3/
│ │ │ │ │ │ │ └── d35bd592fefd8280fc0c302fa9f27dbdd721a3
│ │ │ │ │ │ ├── f4/
│ │ │ │ │ │ │ └── 07be01334e07bfb8f57cd2078f0ee3eb61e085
│ │ │ │ │ │ ├── f9/
│ │ │ │ │ │ │ └── e215d309644e24fa50d6bd6e6eedba166e56bc
│ │ │ │ │ │ ├── fc/
│ │ │ │ │ │ │ └── a0c10eb9f1af6494a448d5733d283f5232a514
│ │ │ │ │ │ └── ff/
│ │ │ │ │ │ └── 8d35b41494f7f0dc92f95d67f54fff274d3fcb
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ ├── binary
│ │ │ │ │ ├── master
│ │ │ │ │ ├── multihunk
│ │ │ │ │ └── rename
│ │ │ │ ├── file1.txt.renamed
│ │ │ │ ├── file2.txt
│ │ │ │ └── file3.txt
│ │ │ ├── duplicate.git/
│ │ │ │ ├── COMMIT_EDITMSG
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── description
│ │ │ │ ├── index
│ │ │ │ ├── info/
│ │ │ │ │ ├── exclude
│ │ │ │ │ └── refs
│ │ │ │ ├── logs/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── objects/
│ │ │ │ │ ├── 03/
│ │ │ │ │ │ └── 8d718da6a1ebbc6a7780a96ed75a70cc2ad6e2
│ │ │ │ │ ├── 0d/
│ │ │ │ │ │ └── deadede9e6d6ccddce0ee1e5749eed0485e5ea
│ │ │ │ │ ├── ce/
│ │ │ │ │ │ └── 013625030ba8dba906f756967f9e9ca394464a
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── packs
│ │ │ │ │ └── pack/
│ │ │ │ │ ├── pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.idx
│ │ │ │ │ ├── pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.pack
│ │ │ │ │ ├── pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.idx
│ │ │ │ │ ├── pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.pack
│ │ │ │ │ ├── pack-e87994ad581c9af946de0eb890175c08cd005f38.idx
│ │ │ │ │ ├── pack-e87994ad581c9af946de0eb890175c08cd005f38.pack
│ │ │ │ │ ├── pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.idx
│ │ │ │ │ └── pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack
│ │ │ │ ├── packed-refs
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ └── dummy-marker.txt
│ │ │ ├── empty_bare.git/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── description
│ │ │ │ ├── info/
│ │ │ │ │ └── exclude
│ │ │ │ ├── objects/
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── dummy-marker.txt
│ │ │ │ │ └── pack/
│ │ │ │ │ └── dummy-marker.txt
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ └── dummy-marker.txt
│ │ │ ├── empty_standard_repo/
│ │ │ │ └── .gitted/
│ │ │ │ ├── HEAD
│ │ │ │ ├── config
│ │ │ │ ├── description
│ │ │ │ ├── info/
│ │ │ │ │ └── exclude
│ │ │ │ ├── objects/
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── dummy-marker.txt
│ │ │ │ │ └── pack/
│ │ │ │ │ └── dummy-marker.txt
│ │ │ │ └── refs/
│ │ │ │ └── heads/
│ │ │ │ └── dummy-marker.txt
│ │ │ ├── filemodes/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 99/
│ │ │ │ │ │ │ └── 62c8453ba6f0cf8dac7c5dcc2fa2897fa9964a
│ │ │ │ │ │ ├── a5/
│ │ │ │ │ │ │ └── c5dd0fc6c313159a69b1d19d7f61a9f978e8f1
│ │ │ │ │ │ └── e7/
│ │ │ │ │ │ └── 48d196331bcb20267eaaee4ff3326cb73b8182
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── exec_off
│ │ │ │ ├── exec_off2on_staged
│ │ │ │ ├── exec_off2on_workdir
│ │ │ │ ├── exec_off_untracked
│ │ │ │ ├── exec_on
│ │ │ │ ├── exec_on2off_staged
│ │ │ │ ├── exec_on2off_workdir
│ │ │ │ └── exec_on_untracked
│ │ │ ├── gitgit.index
│ │ │ ├── icase/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 3e/
│ │ │ │ │ │ │ └── 257c57f136a1cb8f2b8e9a2e5bc8ec0258bdce
│ │ │ │ │ │ ├── 4d/
│ │ │ │ │ │ │ └── d6027d083575c7431396dc2a3174afeb393c93
│ │ │ │ │ │ ├── 62/
│ │ │ │ │ │ │ └── e0af52c199ec731fe4ad230041cd3286192d49
│ │ │ │ │ │ ├── 76/
│ │ │ │ │ │ │ └── d6e1d231b1085fcce151427e9899335de74be6
│ │ │ │ │ │ └── d4/
│ │ │ │ │ │ └── 4e18fb93b7107b5cd1b95d601591d77869a1b6
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── B
│ │ │ │ ├── D
│ │ │ │ ├── F
│ │ │ │ ├── H
│ │ │ │ ├── J
│ │ │ │ ├── L/
│ │ │ │ │ ├── 1
│ │ │ │ │ ├── B
│ │ │ │ │ ├── D
│ │ │ │ │ ├── a
│ │ │ │ │ └── c
│ │ │ │ ├── a
│ │ │ │ ├── c
│ │ │ │ ├── e
│ │ │ │ ├── g
│ │ │ │ ├── i
│ │ │ │ └── k/
│ │ │ │ ├── 1
│ │ │ │ ├── B
│ │ │ │ ├── D
│ │ │ │ ├── a
│ │ │ │ └── c
│ │ │ ├── indexv4/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 4c/
│ │ │ │ │ │ │ └── 9109b3e671d851eec87e0e72f6305b582e7e99
│ │ │ │ │ │ ├── b0/
│ │ │ │ │ │ │ └── 952dbb50bed5f01e03e31b296184cb183e54a7
│ │ │ │ │ │ └── e6/
│ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── file.tx
│ │ │ │ ├── file.txt
│ │ │ │ ├── file.txz
│ │ │ │ ├── foo
│ │ │ │ └── zzz
│ │ │ ├── issue_1397/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 7f/
│ │ │ │ │ │ │ └── 483a738f867e5b21c8f377d70311f011eb48b5
│ │ │ │ │ │ ├── 83/
│ │ │ │ │ │ │ └── 12e0889a9cbab77c732b6bc39b51a683e3a318
│ │ │ │ │ │ ├── 8a/
│ │ │ │ │ │ │ └── 7ef047fc933edb62e84e7977b0612ec3f6f283
│ │ │ │ │ │ ├── 8e/
│ │ │ │ │ │ │ └── 8f80088a9274fd23584992f587083ca1bcbbac
│ │ │ │ │ │ ├── f2/
│ │ │ │ │ │ │ └── c62dea0372a0578e053697d5c1ba1ac05e774a
│ │ │ │ │ │ └── ff/
│ │ │ │ │ │ └── 3578d64d199d5b48d92bbb569e0a273e411741
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── crlf_file.txt
│ │ │ │ └── some_other_crlf_file.txt
│ │ │ ├── issue_592/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── COMMIT_EDITMSG
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 06/
│ │ │ │ │ │ │ └── 07ee9d4ccce8e4c4fa13c2c7d727e7faba4e0e
│ │ │ │ │ │ ├── 49/
│ │ │ │ │ │ │ └── 363a72a90d9424240258cd3759f23788ecf1d8
│ │ │ │ │ │ ├── 4d/
│ │ │ │ │ │ │ └── 383e87f0371ba8fa353f3912db6862b2625e85
│ │ │ │ │ │ ├── 71/
│ │ │ │ │ │ │ └── 44be264b61825fbff68046fe999bdfe96a1792
│ │ │ │ │ │ ├── be/
│ │ │ │ │ │ │ └── de83ee10b5b3f00239660b00acec2d55fd0b84
│ │ │ │ │ │ ├── e3/
│ │ │ │ │ │ │ └── 8fcc7a6060f5eb5b876e836b52ae4769363f21
│ │ │ │ │ │ └── f1/
│ │ │ │ │ │ └── adef63cb08891a0942b76fc4b9c50c6c494bc7
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── a.txt
│ │ │ │ ├── c/
│ │ │ │ │ └── a.txt
│ │ │ │ ├── l.txt
│ │ │ │ └── t/
│ │ │ │ ├── a.txt
│ │ │ │ └── b.txt
│ │ │ ├── issue_592b/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── description
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── exclude
│ │ │ │ │ ├── logs/
│ │ │ │ │ │ ├── HEAD
│ │ │ │ │ │ └── refs/
│ │ │ │ │ │ └── heads/
│ │ │ │ │ │ └── master
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 3f/
│ │ │ │ │ │ │ └── bf1852f72fd268e36457b13a18cdd9a4c9ea35
│ │ │ │ │ │ ├── 6f/
│ │ │ │ │ │ │ └── a891d3e578c83e1c03bdb9e0fdd8e6e934157f
│ │ │ │ │ │ ├── 80/
│ │ │ │ │ │ │ └── 07d41d5794e6ce4d4d2c97e370d5a9aa6d5213
│ │ │ │ │ │ ├── a6/
│ │ │ │ │ │ │ └── 5fb6583a7c425284142f285bc359a2d6565513
│ │ │ │ │ │ ├── ae/
│ │ │ │ │ │ │ └── be7a55922c7097ef91ca3a7bc327a901d87c2c
│ │ │ │ │ │ ├── b3/
│ │ │ │ │ │ │ └── 44b055867fcdc1f01eaa75056a43e868eb4fbc
│ │ │ │ │ │ └── f7/
│ │ │ │ │ │ └── d75fbfad8b1d2e307ced287ea78aad403cdce3
│ │ │ │ │ └── refs/
│ │ │ │ │ └── heads/
│ │ │ │ │ └── master
│ │ │ │ ├── gitignore
│ │ │ │ ├── ignored/
│ │ │ │ │ ├── contained/
│ │ │ │ │ │ ├── ignored3.txt
│ │ │ │ │ │ └── tracked3.txt
│ │ │ │ │ ├── ignored2.txt
│ │ │ │ │ └── tracked2.txt
│ │ │ │ ├── ignored1.txt
│ │ │ │ └── tracked1.txt
│ │ │ ├── merge-recursive/
│ │ │ │ ├── .gitted/
│ │ │ │ │ ├── HEAD
│ │ │ │ │ ├── config
│ │ │ │ │ ├── index
│ │ │ │ │ ├── info/
│ │ │ │ │ │ └── refs
│ │ │ │ │ ├── objects/
│ │ │ │ │ │ ├── 00/
│ │ │ │ │ │ │ ├── 6b298c5702b04c00370d0414959765b82fd722
│ │ │ │ │ │ │ └── 7f1ee2af8e5d99906867c4237510e1790a89b8
│ │ │ │ │ │ ├── 01/
│ │ │ │ │ │ │ └── 6eef4a6fefd36bdcaa93ad773449ddc5c73cbb
│ │ │ │ │ │ ├── 03/
│ │ │ │ │ │ │ └── 9d0da126f24b819a5a38186249c7f96be3824c
│ │ │ │ │ │ ├── 05/
│ │ │ │ │ │ │ ├── 63b7706dcdcf94bc0c02cd96c137940278eca9
│ │ │ │ │ │ │ └── c6a04ac101ab1a9836a95d5ec8d16b6f6304fd
│ │ │ │ │ │ ├── 06/
│ │ │ │ │ │ │ └── db153c36829fc656e05cdf5a3bf7183f3c10aa
│ │ │ │ │ │ ├── 07/
│ │ │ │ │ │ │ ├── 10c3c796e0704361472ecb904413fca0107a25
│ │ │ │ │ │ │ └── 2d89dcf3a7671ac34a8e875bb72fb39bcf14d7
│ │ │ │ │ │ ├── 08/
│ │ │ │ │ │ │ └── f01e1bff7e442d574eb221913515b4bd27ccd6
│ │ │ │ │ │ ├── 0b/
│ │ │ │ │ │ │ ├── b7ed583d7e9ad507e8b902594f5c9126ea456b
│ │ │ │ │ │ │ └── beee1982b493330e375a85bbfddaba3d561556
│ │ │ │ │ │ ├── 0c/
│ │ │ │ │ │ │ └── e202f64fa8356c1a32835fce4058ca76b0c7ed
│ │ │ │ │ │ ├── 0e/
│ │ │ │ │ │ │ ├── 8126647ec607f0a14122cec4b15315d790c8ff
│ │ │ │ │ │ │ └── c39d71c1b074905350ce20ce3f0629f737a2a9
│ │ │ │ │ │ ├── 0f/
│ │ │ │ │ │ │ └── a6ead2731b9d138afe38c336c9727ea05027a7
│ │ │ │ │ │ ├── 12/
│ │ │ │ │ │ │ └── 4d4fe29d3433fdaa2f0f455d226f2c79d89cf3
│ │ │ │ │ │ ├── 15/
│ │ │ │ │ │ │ ├── 311229e70fa62653f73dde1d4deef1a8e47a11
│ │ │ │ │ │ │ └── faa0c9991f2d65686e844651faa2ff9827887b
│ │ │ │ │ │ ├── 16/
│ │ │ │ │ │ │ └── 895aa5e13f8907d4adab81285557d938fad342
│ │ │ │ │ │ ├── 17/
│ │ │ │ │ │ │ └── 946ad3088f931102e5d81f94cf2825fc188953
│ │ │ │ │ │ ├── 18/
│ │ │ │ │ │ │ └── 2d0d250d1d7adcc60c178be5be98358b3a2fd1
│ │ │ │ │ │ ├── 1b/
│ │ │ │ │ │ │ ├── c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321c
│ │ │ │ │ │ │ └── de1883de4977ea3e664b315da951d1f614c3b1
│ │ │ │ │ │ ├── 1c/
│ │ │ │ │ │ │ └── 1bdb80c04233d1a9b9755913ee233987be6175
│ │ │ │ │ │ ├── 1e/
│ │ │ │ │ │ │ └── 8dff96faaaa24f84943d2d9601dde61cb0398a
│ │ │ │ │ │ ├── 21/
│ │ │ │ │ │ │ └── 950d5e4e4d1a871b4dfcf72ecb6b9c162c434e
│ │ │ │ │ │ ├── 23/
│ │ │ │ │ │ │ ├── b427bf6278724433e64ef4cf6dc166c4f2e246
│ │ │ │ │ │ │ └── cf2687a9327d55abbbd788ff04fa932072aebc
│ │ │ │ │ │ ├── 26/
│ │ │ │ │ │ │ └── d3c94459b4faa08f009b15867993ca34153592
│ │ │ │ │ │ ├── 2c/
│ │ │ │ │ │ │ └── ba583804a4a6fad1baf97c959be447238d1489
│ │ │ │ │ │ ├── 2e/
│ │ │ │ │ │ │ └── 7ae0d42fb7b6126f6a08ac6314ac07833a52f6
│ │ │ │ │ │ ├── 30/
│ │ │ │ │ │ │ └── 39c07db695c8c99d0a7c7e32f0afe40eae0be0
│ │ │ │ │ │ ├── 34/
│ │ │ │ │ │ │ └── 8f16ffaeb73f319a75cec5b16a0a47d2d5e27c
│ │ │ │ │ │ ├── 35/
│ │ │ │ │ │ │ ├── 8efd6f589384fa8baf92234db9c7899a53916e
│ │ │ │ │ │ │ └── dda4f3f9b3794d92a46d908790e550ed100eae
│ │ │ │ │ │ ├── 36/
│ │ │ │ │ │ │ └── 71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9
│ │ │ │ │ │ ├── 37/
│ │ │ │ │ │ │ ├── 185b25a204309bf74817da1a607518f13ca3ed
│ │ │ │ │ │ │ └── a5054a9f9b4628e3924c5cb8f2147c6e2a3efc
│ │ │ │ │ │ ├── 38/
│ │ │ │ │ │ │ └── 55170cef875708da06ab9ad7fc6a73b531cda1
│ │ │ │ │ │ ├── 39/
│ │ │ │ │ │ │ └── 78944e4cd53edcc10a170ab2ff142f7295b958
│ │ │ │ │ │ ├── 3a/
│ │ │ │ │ │ │ ├── 0dc89a8bd20e74fae69d2e038b47360fafb02e
│ │ │ │ │ │ │ ├── 3f5a6ec1c968d1d2d5d20dee0d161a4351f279
│ │ │ │ │ │ │ └── 8c70144d0334721154b1e0529716b368483d6f
│ │ │ │ │ │ ├── 3b/
│ │ │ │ │ │ │ └── 919b6e8a575b4779c8243ebea3e3beb436e88f
│ │ │ │ │ │ ├── 3e/
│ │ │ │ │ │ │ └── eff81b57a0ac15a5ab6bb3a8e92511a01a429c
│ │ │ │ │ │ ├── 3f/
│ │ │ │ │ │ │ └── d41804a7906db846af5e868444782e546af46a
│ │ │ │ │ │ ├── 40/
│ │ │ │ │ │ │ └── 9f5d072decec684331672f2d6c0a9bc3640adb
│ │ │ │ │ │ ├── 41/
│ │ │ │ │ │ │ └── 71bb8d40e9fc830d79b757dc06ec6c14548b78
│ │ │ │ │ │ ├── 42/
│ │ │ │ │ │ │ ├── 1b392106e079df6d412babd5636697938269ec
│ │ │ │ │ │ │ ├── 44d13e2bbc38510320443bbb003f3967d12436
│ │ │ │ │ │ │ └── cdad903aef3e7b614675e6584a8be417941911
│ │ │ │ │ │ ├── 43/
│ │ │ │ │ │ │ ├── 2faca0c62dc556ad71a22f23e541a46a8b0f6f
│ │ │ │ │ │ │ ├── 5424798e5e1b21dd4588d1c291ba4eb179a838
│ │ │ │ │ │ │ └── 6ea75c99f527e4b42fddb46abedf7726eb719d
│ │ │ │ │ │ ├── 44/
│ │ │ │ │ │ │ └── faf5fba1af850dae54f8b2345938d3c7ae479f
│ │ │ │ │ │ ├── 48/
│ │ │ │ │ │ │ └── 3065df53c0f4a02cdc6b2910b05d388fc17ffb
│ │ │ │ │ │ ├── 4a/
│ │ │ │ │ │ │ └── 06b258fed8a4d15967ec4253ae7366b70f727d
│ │ │ │ │ │ ├── 4b/
│ │ │ │ │ │ │ ├── 7c5650008b
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
* -text
================================================
FILE: .gitignore
================================================
*.pyc
.cproject
.idea
.project
bin/
gmon.out
out/
testdata/
tmp*
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# YaCo - Collaborative Reverse-Engineering for IDA
# YaDiff - Symbols Propagation between IDA databases
## [Latest Releases](https://github.com/DGA-MI-SSI/YaCo/releases)
## Yaco
**YaCo** is a [**Hex-Rays IDA**](https://www.hex-rays.com/products/ida/) plugin enabling collaborative reverse-engineering on IDA databases for multiple users. Incremental database changes are stored & synchronized through **Git** distributed version control system.
Both offline & online work is supported.
### Motivation
**IDA** does not allow multiple users to work on the same binary.
During large malware analysis, we had to use a team of reversers and manual synchronization is a tedious and error-prone process.
**YaCo** goals are:
* Support all **IDA** events
* Be fast, users must not wait for synchronisation events
* Prevent conflicts between users
* Be user-friendly & easy to install
## YaDiff
**YaDiff** is a standalone command-line tool allowing symbol, comment, enum & struct propagation between distinct IDA databases.
### Motivation
There are two major use cases for YaDiff
* Merging previously-analyzed binary symbols into an updated binary
* Merging debug symbols from an external library into another stripped binary
### Usage
* Uncompress the release into a directory
* Put each of your two IDA databases in a different directory
* Call merge_idb.py on those two databases
```
python $yatools_directory/YaTools/bin/merge_idb.py $source_dir/source.idb $destination_dir/destination.idb
```
* Open ```$destination_dir/destination.yadiff_local.idb``` and check results
## Installation
### Debian stretch/x64
**YaTools** is 64-bit only, like **IDA** 7.1.
Install dependencies
```
sudo apt install build-essential git cmake python2.7 libpython2.7 libpython2.7-dev
```
Configure & build **YaTools**
```
export NUM_CPU=4
export IDA_DIR=/opt/ida7.1/
export IDASDK_DIR=/opt/idasdk71/
$yaco/build> ./configure.sh
$yaco/out/x64_RelWithDebInfo> make -j $NUM_CPU
$yaco/out/x64_RelWithDebInfo> ctest . --output-on-failure -C RelWithDebInfo -j $NUM_CPU
$IDA_DIR/plugins> $yaco/build/deploy.sh
```
### Windows
CMake & Python 2.7 64-bit must be installed and in the PATH
Only visual studio 2017 is currently supported
Configure and build **YaTools**
```
# export directories without quotes
set NUM_CPU=4
set IDA_DIR=C:\Program Files\IDA Pro 7.1
set IDASDK_DIR=C:\idasdk71
$yaco/build> configure_2017.cmd
$yaco/out/x64> cmake --build . --config RelWithDebInfo
$yaco/out/x64> ctest . --output-on-failure -C RelWithDebInfo -j %NUM_CPU%
$IDA_DIR/plugins> $yaco/build/deploy.cmd
```
## YaCo Usage
### First user
To create the **YaCo** environment:
1. open binary or idb file as usual
2. click on Edit menu, Plugins, YaCo
3. enter path to Git remote (could be a file system path, or empty to use current dir)
4. a warning will inform you that **IDA** have to be re-launch with correct idb
5. **IDA** auto close
6. launch **IDA** for your FILE_local.idb file
7. save database
8. start working as usual
Warning, in order to use it with multiple users, **YaCo** project must be in a bare Git repository.
### Other users
Setup **YaCo** environment:
1. clone a **YaCo** project
2. open idb/i64 file with ida
3. click on Edit menu, Plugins, YaCo
4. a warning will inform you that **IDA** has to be re-launched with correct idb
5. **IDA** auto close
6. launch **IDA** for your FILE_local.idb file
7. save database
8. start working as usual
### How it works
**YaCo** uses a Git server to synchronize changes between users.
In the local repository, **YaCo** stores the original IDB and incremental changes as xml files & commits.
Note that the database is not modified anymore unless you force a synchronisation.
When saving the database, we fetch remote changes, rebase local changes on top of those, import this new state into IDA and push this state to the remote Git server.
Any Git server should work, for example github, gitlab or gitea instances. Note that some Git hosts have a file size limit, which can be an issue for large IDB files. See [#13](https://github.com/DGA-MI-SSI/YaCo/issues/13).
Currently, **YaCo** only supports SSH authentication. To keep the plugin user-friendly, there is no mechanism asking for passwords & passphrases on every Git operation. Instead, it is recommended to use an ssh agent, like pageant under windows or ssh-agent under linux.
### How to use YaCo with git & SSH on Windows
You have a git repository, on github or equivalent
* Clone the git repository ```git clone git@server_name:group_name/repo_name.git```
* Import/generate your SSH key with puttygen.exe & save the private key into a ppk file
* Associate your public key in your server profile
* Start pageant.exe & add your ppk key
* Try to connect once using bare SSH on your server with plink ```plink git@server_name:group_name/repo_name.git```
* It should connect & exit immediately
* Copy the file.idb into file_local.idb in the repository
* Open file_local.idb with IDA & check YaCo is properly starting
* Save the file once & check whether YaCo is able to fetch, rebase & push on the git server
## Contributors
* Benoît Amiaux
* Frederic Grelot
* Jeremy Bouetard
* Martin Tourneboeuf
* Maxime Pinard
* Valerian Comiti
## License
YaCo is licensed under the GNU General Public License v3.0 that can be found in the LICENSE file
================================================
FILE: YaCo/exec_ida.py
================================================
# Copyright (C) 2017 The YaCo Authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import platform
import subprocess
import tempfile
IDLE_PRIORITY_CLASS = 0x00000040
class Exec:
def __init__(self, idaq, database, *args):
self.idaq = idaq
self.database = database
self.args = list(args)
# options
self.is_idle = False
self.cwd = None
fd, fname = tempfile.mkstemp(dir=os.path.dirname(database), prefix="tmp_", suffix=".log")
os.close(fd)
os.remove(fname)
self.logfile = fname
self.delete_log = True
# options
def set_idle(self, is_idle):
self.is_idle = is_idle
return self
def with_cwd(self, cwd):
self.cwd = cwd
return self
def with_log(self, log):
self.logfile = log
self.delete_log = False
return self
def with_script(self, script, *args):
# there can never be enough quotes
q = '\\\"'
qargs = ''
if len(args):
qargs = ' ' + q + (q + ' ' + q).join(args) + q
cmd = '-S"%s%s%s%s"' % (q, script, q, qargs)
self.args.append(cmd)
return self
# get all arguments
def get_args(self):
return ['"' + self.idaq + '"', '-L"' + self.logfile + '"'] + self.args + ['"' + self.database + '"']
def __str__(self):
return ' '.join(self.get_args())
# start ida in background
def start(self):
flags = 0
is_windows = platform.system() == "Windows"
if self.is_idle and is_windows:
flags |= IDLE_PRIORITY_CLASS
# we MUST give a string & bypass subprocess quoting
# or subprocess will mangle script arguments
args = ' '.join(self.get_args())
# on linux we MUST use shell=True because Popen with string arg expect no arguments
# and we cannot use an argument array on windows due to invalid script arg escaping...
self.process = subprocess.Popen(args, cwd=self.cwd, creationflags=flags, shell=not is_windows)
def join(self):
code = self.process.wait()
if code == 0:
return None
err = hex(code)
if not self.delete_log:
return err
with open(self.logfile, 'rb') as fh:
err = fh.read().strip()
return err
# start & join
def run(self):
self.start()
return self.join()
================================================
FILE: YaCo/export_all.py
================================================
# Copyright (C) 2017 The YaCo Authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import argparse
import idc
import logging
import os
import sys
prog = idc.ARGV[0] if len(idc.ARGV) else None
parser = argparse.ArgumentParser(prog=prog, description='Export IDA database')
parser.add_argument('bin_dir', type=os.path.abspath, help='YaCo bin directory')
parser.add_argument("--output", type=os.path.abspath, default="database/database.yadb", help="output filename")
args = parser.parse_args(idc.ARGV[1:])
root_dir = os.path.abspath(os.path.join(args.bin_dir, '..'))
for path in ['bin', 'YaCo']:
sys.path.append(os.path.join(root_dir, path))
# import yatools dependencies
if idc.__EA64__:
import YaToolsPy64 as ya
else:
import YaToolsPy32 as ya
idc.Wait()
name, _ = os.path.splitext(idc.get_idb_path())
try:
os.makedirs(os.path.dirname(args.output))
except:
pass
ya.export_from_ida(name, args.output)
idc.Exit(0)
================================================
FILE: YaCo/load_yadb.py
================================================
# Copyright (C) 2017 The YaCo Authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import argparse
import idaapi
import idc
import logging
import os
import sys
prog = idc.ARGV[0] if len(idc.ARGV) else None
parser = argparse.ArgumentParser(prog=prog, description="Import to IDA database")
parser.add_argument("bin_dir", type=os.path.abspath, help="YaCo bin directory")
parser.add_argument("filename", type=os.path.abspath, help="Input yadb database")
parser.add_argument("--no-exit", action="store_true", help="Do not exit IDA when done")
parser.add_argument("--quick", action="store_true", help="Skip IDA auto-analysis")
args = parser.parse_args(idc.ARGV[1:])
root_dir = os.path.abspath(os.path.join(args.bin_dir, '..'))
for path in ['bin', 'YaCo']:
sys.path.append(os.path.join(root_dir, path))
# import yatools dependencies
if idc.__EA64__:
import YaToolsPy64 as ya
else:
import YaToolsPy32 as ya
idc.Wait()
name, _ = os.path.splitext(idc.GetIdbPath())
ya.import_to_ida(name, args.filename)
if not args.quick:
idc.Wait()
idaapi.cvar.database_flags = idaapi.DBFL_COMP
if not args.no_exit:
idc.Exit(0)
================================================
FILE: YaCo/yaco_plugin.py
================================================
# Copyright (C) 2017 The YaCo Authors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import idaapi
import idc
import inspect
import os
import sys
import traceback
yaco = None
def start():
global yaco
if idc.__EA64__:
import YaToolsPy64 as ya
else:
import YaToolsPy32 as ya
if not yaco:
yaco = ya.make_yaco()
def close():
global yaco
yaco = None
def is_enabled():
opts = idaapi.get_plugin_options("yaco")
return not opts or "disable_plugin" not in opts.split(':')
class YaCoPlugin(idaapi.plugin_t):
flags = idaapi.PLUGIN_UNL
comment = "YaCo plugin"
help = "YaCo: Yet Another Collaboration tool plugin"
wanted_name = "YaCo"
wanted_hotkey = ""
def init(self, *args, **kwargs):
if not is_enabled():
print("yaco: disabled")
return idaapi.PLUGIN_SKIP
root_dir = os.path.abspath(os.path.join(inspect.getsourcefile(lambda: 0), "..", "YaTools"))
for path in ["YaCo", "bin"]:
path = os.path.join(root_dir, path)
print("yaco: using %s" % path)
sys.path.append(path)
input_filename = idc.GetIdbPath()
if input_filename.count("_local.") > 0 and os.path.exists(".git"):
print("yaco: initializing")
start()
if not yaco.is_started():
return idaapi.PLUGIN_SKIP
return idaapi.PLUGIN_KEEP
if "_local." not in input_filename and os.path.exists(".git"):
print("""
*******************************************************
WARNING : You have opened a database in a git project,
WARNING : but your database doesn't match a YaCo project.
WARNING : YaCo is disabled !
*******************************************************
""")
return idaapi.PLUGIN_OK
return idaapi.PLUGIN_KEEP
def run(self, *args, **kwargs):
start()
def term(self, *args, **kwargs):
close()
def PLUGIN_ENTRY():
return YaCoPlugin()
================================================
FILE: YaDiff/MergeYaDB.cpp
================================================
#include "Yatools.hpp"
#include "YaDiff.hpp"
#include "Propagate.hpp"
#include "Configuration.hpp"
#include "FlatBufferVisitor.hpp"
#include "FlatBufferModel.hpp"
#include <iostream>
using namespace std;
#if 0
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("yadiff", (FMT), ## __VA_ARGS__)
#else
#define LOG(...) do {} while(0)
#endif
void usage(char* argv[])
{
std::cerr << argv[0] << ": <config.xml> <ref_db.yadb> <new_db.yadb> <yadiff.yadb>" << std::endl;
std::cerr << "\tconfig.xml: " << std::endl;
std::cerr << "\tref_db.yadb: " << std::endl;
std::cerr << "\tnew_db.yadb: " << std::endl;
std::cerr << "\tcache.yadb: update for new_db with information from ref_db" << std::endl;
}
int main(int argc, char** argv)
{
if (argc != 5)
{
usage(argv);
return -1;
}
globals::InitFileLogger(*globals::Get().logger, stdout);
const auto config = Configuration(argv[1]);
yadiff::YaDiff(config).MergeCacheFiles(argv[2], argv[3], argv[4]);
return 0;
}
================================================
FILE: YaDiff/YaDiffLib/Algo/Algo.cpp
================================================
#include "Algo.hpp"
#include "ExactMatch.hpp"
#include "XRefOffsetMatch.hpp"
#include "CallerXRefMatch.hpp"
#include "ExternalMappingMatch.hpp"
#include "Helpers.h"
#include "VectorSign.hpp"
#include <memory>
STATIC_ASSERT_POD(yadiff::AlgoCfg);
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeDiffAlgo(const AlgoCfg& config)
{
switch(config.Algo)
{
case ALGO_EXACT_MATCH:
return MakeExactMatchAlgo(config);
case ALGO_XREF_OFFSET_MATCH:
return MakeXRefOffsetMatchAlgo(config);
case ALGO_CALLER_XREF_MATCH:
return MakeCallerXRefMatchAlgo(config);
case ALGO_VECTOR_SIGN:
return MakeVectorSignAlgo(config);
case ALGO_EXTERNAL_MAPPING_MATCH:
return MakeExternalMappingMatchAlgo(config);
default:
return nullptr;
}
}
}
================================================
FILE: YaDiff/YaDiffLib/Algo/Algo.hpp
================================================
#pragma once
#include <functional>
namespace std { template<typename T> class shared_ptr; }
struct IModel;
struct Relation;
namespace yadiff
{
enum Algo_e
{
ALGO_EXACT_MATCH,
ALGO_XREF_OFFSET_MATCH,
ALGO_CALLER_XREF_MATCH,
ALGO_VECTOR_SIGN,
ALGO_EXTERNAL_MAPPING_MATCH,
};
enum AlgoFlag_e
{
AF_XREF_OFFSET_DONE = 1 << 0,
AF_CALLER_XREF_DONE = 1 << 1,
};
enum TrustDiffingRelations_e
{
DO_NOT_TRUST_DIFFING_RELATIONS = 0,
TRUST_DIFFING_RELATIONS = 1,
};
struct ExactMatchCfg
{
};
struct XRefOffsetMatchCfg
{
};
struct CallerXRefMatchCfg
{
TrustDiffingRelations_e TrustDiffingRelations;
};
struct VectorSignCfg
{
const char* mapDestination;
};
struct ExternalMappingMatchCfg
{
const char* MappingFilePath;
bool CustomRelationConfidence;
int RelationConfidence;
};
struct AlgoCfg
{
Algo_e Algo;
ExactMatchCfg ExactMatch;
XRefOffsetMatchCfg XRefOffsetMatch;
CallerXRefMatchCfg CallerXRefMatch;
VectorSignCfg VectorSign;
ExternalMappingMatchCfg ExternalMappingMatch;
int NbThreads;
bool bMultiThread;
};
typedef std::function<bool (const Relation&)> OnRelationFn;
typedef std::function<void (const OnRelationFn&)> RelationWalkerfn;
struct IDiffAlgo
{
virtual ~IDiffAlgo() {}
/*
* prepares input signature databases
* TODO : document return type
*/
virtual bool Prepare(const IModel& db1, const IModel& db2) = 0;
/*
* uses previously registered signature databases and input version relations
* to compute a new version relation vector
* output: vector of new Relation
* input: vector of previously matched Relation
* TODO : document return type
*/
virtual bool Analyse(const OnRelationFn& output, const RelationWalkerfn& input) = 0;
// virtual void Analyse(YadiffRelationMap& output, const YadiffRelationMap& input) = 0;
virtual const char* GetName() const = 0;
};
std::shared_ptr<IDiffAlgo> MakeDiffAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/CallerXRefMatch.cpp
================================================
#include "XRefOffsetMatch.hpp"
#include "Algo.hpp"
#include "Helpers.h"
#include "Yatools.hpp"
#include <Signature.hpp>
#include <VersionRelation.hpp>
#include <memory>
#include <map>
#include <set>
#if 0
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("caller", (FMT), ## __VA_ARGS__)
#else
#define LOG(...) do {} while(0)
#endif
namespace
{
class CallerXRefMatchAlgo: public yadiff::IDiffAlgo
{
public:
virtual ~CallerXRefMatchAlgo(){}
CallerXRefMatchAlgo(const yadiff::AlgoCfg& config);
/*
* prepares input signature databases
*/
bool Prepare(const IModel& db1, const IModel& db2) override;
/*
* uses previously registered signature databases and input version relations
* to compute a new version relation vector
*/
bool Analyse(const yadiff::OnRelationFn& output, const yadiff::RelationWalkerfn& input) override;
const char* GetName() const override;
private:
const IModel* pDb1_;
const IModel* pDb2_;
const yadiff::AlgoCfg config_;
};
}
const char* CallerXRefMatchAlgo::GetName() const{
return "CallerXRefMatchAlgo";
}
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeCallerXRefMatchAlgo(const AlgoCfg& config)
{
return std::make_shared<CallerXRefMatchAlgo>(config);
}
}
CallerXRefMatchAlgo::CallerXRefMatchAlgo(const yadiff::AlgoCfg& config):
pDb1_(nullptr),
pDb2_(nullptr),
config_(config)
{
}
bool CallerXRefMatchAlgo::Prepare(const IModel& db1, const IModel& db2)
{
pDb1_ = &db1;
pDb2_ = &db2;
return true;
}
bool CallerXRefMatchAlgo::Analyse(const yadiff::OnRelationFn& output, const yadiff::RelationWalkerfn& input)
{
if(pDb1_ == nullptr)
return false;
if(pDb2_ == nullptr)
return false;
struct sig_association_s
{
std::set<HVersion> local_obj;
std::set<HVersion> remote_obj;
};
struct sig_map_t
{
std::map<HSignature, sig_association_s> data;
};
typedef std::map<YaToolObjectType_e, sig_map_t> sigs_container_t;
Relation new_relation;
memset(&new_relation, 0, sizeof new_relation);
new_relation.confidence_ = RELATION_CONFIDENCE_MAX;
new_relation.type_ = RELATION_TYPE_EXACT_MATCH;
new_relation.direction_ = RELATION_DIRECTION_BOTH;
// iterate over all previously computed relation
input([&](const Relation& relation){
if(relation.flags_ & yadiff::AF_CALLER_XREF_DONE)
return true;
if (relation.confidence_ != RELATION_CONFIDENCE_MAX)
{
return true;
}
switch (relation.type_)
{
case RELATION_TYPE_DIFF:
if (config_.CallerXRefMatch.TrustDiffingRelations == yadiff::DO_NOT_TRUST_DIFFING_RELATIONS)
{
return true;
}
break;
case RELATION_TYPE_EXACT_MATCH:
break;
default:
return true;
break;
}
// set relation as treated
Relation tmp = relation;
tmp.flags_ |= yadiff::AF_CALLER_XREF_DONE;
output(tmp);
sigs_container_t sigs_container;
/************ construct signature maps ****************************************/
// for each xref from obj1
relation.version1_.walk_xrefs_to([&](const HVersion& local_version)
{
const auto type = local_version.type();
local_version.walk_signatures([&](const HSignature& signature)
{
sigs_container[type].data[signature].local_obj.insert(local_version);
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
// for each xref from obj2
relation.version2_.walk_xrefs_to([&](const HVersion& remote_version)
{
const auto type = remote_version.type();
remote_version.walk_signatures([&](const HSignature& signature)
{
sigs_container[type].data[signature].remote_obj.insert(remote_version);
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
/*******************************************************************************/
for (const auto& sig_container : sigs_container)
{
const auto object_type = sig_container.first;
const sig_map_t& sig_map = sig_container.second;
std::set<HVersion> LocalDiffsObjectVersion;
std::set<HVersion> RemoteDiffsObjectVersion;
for (const auto& sig : sig_map.data)
{
const std::set<HVersion>& LocalXrefObjectVersionSet = sig.second.local_obj;
const std::set<HVersion>& RemoteXrefObjectVersionSet = sig.second.remote_obj;
LOG(DEBUG, "LocalXrefObjectVersionSet.size(): %zd RemoteXrefObjectVersionSet.size(): %zd\n", LocalXrefObjectVersionSet.size(), RemoteXrefObjectVersionSet.size());
//ASSOCIATION : if entry has two set of one element each
if ( (LocalXrefObjectVersionSet.size() == 1) && (RemoteXrefObjectVersionSet.size() == 1) )
{
// HVersion localXrefObjectVersion = *LocalXrefObjectVersionSet.begin();
// HVersion remoteXrefObjectVersion = *RemoteXrefObjectVersionSet.begin();
// add relation ???
new_relation.confidence_ = RELATION_CONFIDENCE_MAX;
new_relation.type_ = RELATION_TYPE_EXACT_MATCH;
new_relation.direction_ = RELATION_DIRECTION_BOTH;
new_relation.version1_ = *LocalXrefObjectVersionSet.begin();
new_relation.version2_ = *RemoteXrefObjectVersionSet.begin();
LOG(INFO, "from %lx(%s) <-> %lx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
LOG(INFO, "associate %lx(%s) <-> %lx(%s)\n", new_relation.version1_.address(), new_relation.version1_.username().value, new_relation.version2_.address(), new_relation.version2_.username().value);
output(new_relation);
}
else
{
if((LocalXrefObjectVersionSet.size() == 1) && (RemoteXrefObjectVersionSet.size() == 0))
{
LocalDiffsObjectVersion.insert(*LocalXrefObjectVersionSet.begin());
}
if((LocalXrefObjectVersionSet.size() == 0) && (RemoteXrefObjectVersionSet.size() == 1))
{
RemoteDiffsObjectVersion.insert(*RemoteXrefObjectVersionSet.begin());
}
}
}
// if there is only one signature for each local ad remote db, and a diffing relation
if((LocalDiffsObjectVersion.size() == 1) && (RemoteDiffsObjectVersion.size() == 1))
{
const HVersion& diff_version1 = *LocalDiffsObjectVersion.begin();
const HVersion& diff_version2 = *RemoteDiffsObjectVersion.begin();
const HVersion* diff_parent1 = nullptr;
const HVersion* diff_parent2 = nullptr;
new_relation.confidence_ = RELATION_CONFIDENCE_MAX;
new_relation.type_ = RELATION_TYPE_DIFF;
new_relation.direction_ = RELATION_DIRECTION_BOTH;
new_relation.version1_ = diff_version1;
new_relation.version2_ = diff_version2;
LOG(INFO, "from %lx(%s) <-> %lx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
LOG(INFO, "associate %lx(%s) <-> %lx(%s)\n", new_relation.version1_.address(), new_relation.version1_.username().value, new_relation.version2_.address(), new_relation.version2_.username().value);
output(new_relation);
/* try to propagate diff relations to parent only for basic blocks */
if (OBJECT_TYPE_BASIC_BLOCK != object_type)
{
continue;
}
diff_version1.walk_xrefs_to([&](const HVersion& local_version)
{
diff_parent1 = &local_version;
new_relation.version1_ = local_version;
return WALK_STOP;
});
diff_version2.walk_xrefs_to([&](const HVersion& local_version)
{
diff_parent2 = &local_version;
new_relation.version2_ = local_version;
return WALK_STOP;
});
if (nullptr != diff_parent1 && nullptr != diff_parent2)
{
LOG(INFO, "from %lx(%s) <-> %lx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
LOG(INFO, "--> associate %lx(%s) <-> %lx(%s)\n", new_relation.version1_.address(), new_relation.version1_.username().value, new_relation.version2_.address(), new_relation.version2_.username().value);
output(new_relation);
}
}
}
return true;
});
return true;
}
================================================
FILE: YaDiff/YaDiffLib/Algo/CallerXRefMatch.hpp
================================================
#pragma once
namespace std { template<typename T> class shared_ptr; }
namespace yadiff { struct IDiffAlgo; }
namespace yadiff { struct AlgoCfg; }
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeCallerXRefMatchAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/ExactMatch.cpp
================================================
#include "ExactMatch.hpp"
#include "Algo.hpp"
#include "Helpers.h"
#include "Yatools.hpp"
#include "IModel.hpp"
#include "VersionRelation.hpp"
#include <utility>
#include <memory>
#include <chrono>
#if 0
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("exact", (FMT), ## __VA_ARGS__)
#else
#define LOG(...) do {} while(0)
#endif
namespace yadiff
{
class ExactMatchAlgo: public IDiffAlgo
{
public:
virtual ~ExactMatchAlgo(){}
ExactMatchAlgo(const AlgoCfg& config);
/*
* prepares input signature databases
*/
bool Prepare(const IModel& db1, const IModel& db2) override;
/*
* uses previously registered signature databases and input version relations
* to compute a new version relation vector
*/
bool Analyse(const OnRelationFn& output, const RelationWalkerfn& input) override;
const char* GetName() const override;
private:
const IModel* pDb1_;
const IModel* pDb2_;
const AlgoCfg config_;
};
std::shared_ptr<IDiffAlgo> MakeExactMatchAlgo(const AlgoCfg& config)
{
return std::make_shared<ExactMatchAlgo>(config);
}
const char* ExactMatchAlgo::GetName() const{
return "ExactMatchAlgo";
}
ExactMatchAlgo::ExactMatchAlgo(const AlgoCfg& config):
pDb1_(nullptr),
pDb2_(nullptr),
config_(config)
{
}
bool ExactMatchAlgo::Prepare(const IModel& db1, const IModel& db2)
{
pDb1_ = &db1;
pDb2_ = &db2;
return true;
}
bool ExactMatchAlgo::Analyse(const OnRelationFn& output, const RelationWalkerfn& input)
{
UNUSED(input);
int i = 0;
int exactMatchInitial = 0;
if(nullptr == pDb1_)
return false;
if(nullptr == pDb2_)
return false;
Relation relation;
memset(&relation, 0, sizeof relation);
relation.confidence_ = RELATION_CONFIDENCE_MAX;
relation.type_ = RELATION_TYPE_EXACT_MATCH;
relation.direction_ = RELATION_DIRECTION_BOTH;
LOG(DEBUG, "matching %zd objects version to %zd objects version\n", pDb1_->num_objects(), pDb2_->num_objects());
pDb1_->walk_uniques([&](const HVersion& object_version, const HSignature& signature)
{
//cout << object_version << endl;
//check if object has collisions in the other database
relation.version1_ = object_version;
i++;
if (pDb2_->size_matching(signature) != 1)
return WALK_CONTINUE;
/* Don't trust basic block for initial association */
if (object_version.type() == OBJECT_TYPE_BASIC_BLOCK)
return WALK_CONTINUE;
pDb2_->walk_matching(signature, [&](const HVersion& remote_object_version) -> ContinueWalking_e
{
/* Don't associate different object types */
if (object_version.type() != remote_object_version.type())
return WALK_CONTINUE;
relation.version2_ = remote_object_version;
LOG(INFO, "associate %lx(%s) <-> %lx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
output(relation);
exactMatchInitial++;
/* we do not iterate, we have found only one match */
return WALK_STOP;
});
if (i % 10000 == 0)
{
LOG(INFO, "%d/%d objects version exactly matched (over a total of %zd)\n", exactMatchInitial, i, number_of_object);
}
return WALK_CONTINUE;
});
// this->sortRelations();
return true;
}
}
================================================
FILE: YaDiff/YaDiffLib/Algo/ExactMatch.hpp
================================================
#pragma once
namespace std { template<typename T> class shared_ptr; }
class IDiffAlgo;
struct AlgoCfg;
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeExactMatchAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/ExternalMappingMatch.cpp
================================================
#include "ExternalMappingMatch.hpp"
#include "Algo.hpp"
#include "IModel.hpp"
#include "VersionRelation.hpp"
#include "json.hpp"
#include "Helpers.h"
#include "Yatools.hpp"
#include <utility>
#include <memory>
#include <chrono>
#include <fstream>
#include <iostream>
#include <unordered_map>
#ifdef _MSC_VER
# include <filesystem>
#else
# include <experimental/filesystem>
#endif
using namespace std;
using namespace std::experimental;
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("external", (FMT), ## __VA_ARGS__)
using json = nlohmann::json;
namespace yadiff
{
struct ExternalMappingEntry
{
offset_t src;
offset_t dst;
std::string comment;
ExternalMappingEntry(offset_t s_, offset_t d_, std::string c_): src(s_), dst(d_), comment(c_){}
};
class ExternalMappingMatchAlgo: public IDiffAlgo
{
public:
virtual ~ExternalMappingMatchAlgo(){}
ExternalMappingMatchAlgo(const AlgoCfg& config);
/*
* prepares input signature databases
*/
virtual bool Prepare(const IModel& db1, const IModel& db2);
/*
* uses previously registered signature databases and input version relations
* to compute a new version relation vector
*/
virtual bool Analyse(const OnRelationFn& output, const RelationWalkerfn& input);
virtual const char* GetName() const;
private:
const IModel* pDb1_;
const IModel* pDb2_;
const AlgoCfg config_;
std::vector<ExternalMappingEntry>mapping_;
};
std::shared_ptr<IDiffAlgo> MakeExternalMappingMatchAlgo(const AlgoCfg& config)
{
return std::make_shared<ExternalMappingMatchAlgo>(config);
}
const char* ExternalMappingMatchAlgo::GetName() const{
return "ExternalMappingMatchAlgo";
}
ExternalMappingMatchAlgo::ExternalMappingMatchAlgo(const AlgoCfg& config):
pDb1_(nullptr),
pDb2_(nullptr),
config_(config)
{
}
bool ExternalMappingMatchAlgo::Prepare(const IModel& db1, const IModel& db2)
{
pDb1_ = &db1;
pDb2_ = &db2;
// load JSON mapping
if(!filesystem::exists(filesystem::path(config_.ExternalMappingMatch.MappingFilePath)))
{
LOG(ERROR, "json file %s does not exist\n", config_.ExternalMappingMatch.MappingFilePath);
return false;
}
std::ifstream file(config_.ExternalMappingMatch.MappingFilePath);
json data = json::parse(file);
for(auto it = data.begin(); it != data.end(); ++it)
{
const auto element = *it;
auto it_src = element.find("src");
if(it_src == element.end())
{
LOG(WARNING, "invalid JSON entry, no src in it\n");
continue;
}
auto it_dst = element.find("dst");
if(it_dst == element.end())
{
LOG(WARNING, "JSON entry, no dst in it\n");
continue;
}
auto it_comment = element.find("comment");
if(it_comment == element.end())
{
LOG(WARNING, "invalid JSON entry, no comment in it\n");
continue;
}
mapping_.emplace_back(ExternalMappingEntry{*it_src, *it_dst, *it_comment});
}
return true;
}
bool ExternalMappingMatchAlgo::Analyse(const OnRelationFn& output, const RelationWalkerfn& input)
{
UNUSED(input);
if(nullptr == pDb1_)
return false;
if(nullptr == pDb2_)
return false;
// std::vector<offset_t> src_offset_to_treat;
std::unordered_map<offset_t, offset_t> offset_to_treat;
for(const auto entry : mapping_)
{
offset_to_treat.emplace(std::make_pair(entry.src, entry.dst));
// src_offset_to_treat.push_back(entry.src);
}
Relation relation;
memset(&relation, 0, sizeof relation);
if(config_.ExternalMappingMatch.CustomRelationConfidence)
relation.confidence_ = config_.ExternalMappingMatch.RelationConfidence;
else
relation.confidence_ = RELATION_CONFIDENCE_GOOD;
relation.direction_ = RELATION_DIRECTION_BOTH;
pDb1_->walk([&](const HVersion& src_version)
{
const auto match = offset_to_treat.find(src_version.address());
if(match == offset_to_treat.end())
return WALK_CONTINUE;
// src address found, stat looking for dst address
pDb2_->walk([&](const HVersion& dst_version)
{
if(match->second != dst_version.address())
return WALK_CONTINUE;
// check signatures
relation.type_ = RELATION_TYPE_DIFF;
bool sign_found = false;
src_version.walk_signatures([&](const HSignature& src_sign)
{
dst_version.walk_signatures([&](const HSignature& dst_sign)
{
if(src_sign == dst_sign)
{
sign_found = true;
relation.type_ = RELATION_TYPE_EXACT_MATCH;
return WALK_STOP;
}
return WALK_CONTINUE;
});
return sign_found ? WALK_STOP : WALK_CONTINUE;
});
relation.version1_ = src_version;
relation.version2_ = dst_version;
output(relation);
offset_to_treat.erase(match->first);
return WALK_STOP;
});
// if there is no more mapping to do, stop iterating
return offset_to_treat.empty() ? WALK_STOP : WALK_CONTINUE;
});
return true;
}
}
================================================
FILE: YaDiff/YaDiffLib/Algo/ExternalMappingMatch.hpp
================================================
#pragma once
namespace std { template<typename T> class shared_ptr; }
class IDiffAlgo;
struct AlgoCfg;
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeExternalMappingMatchAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchArm.cpp
================================================
#include "ArchArm.hpp"
#include "Helpers.h"
#include "IArch.hpp"
#include "VectorTypes.hpp"
#include <map>
#include <vector>
#include <memory>
// Must init
namespace
{
typedef std::map<arm_insn, std::vector<yadiff::InstructionType_e>> InsMap_t;
struct ArmArch : public yadiff::IArch
{
ArmArch();
bool IsInstructionType(const cs_insn&, yadiff::InstructionType_e) const override;
private:
bool CheckMap(arm_insn instructionId, yadiff::InstructionType_e instructionTypeA) const;
InsMap_t insmap;
};
}
ArmArch::ArmArch()
{
}
#if 0
bool ArmArch::CheckMap(arm_insn instructionId, yadiff::InstructionType_e instructionTypeA) const
{
const auto it = insmap.find(instructionId);
if(it == insmap.end())
return false;
for(const auto instructionType : it->second)
if(instructionType == instructionTypeA)
return true;
return false;
}
#endif
bool ArmArch::IsInstructionType(const cs_insn& instruction, yadiff::InstructionType_e type) const
{
const cs_detail* detail = instruction.detail;
const arm_insn insn_id = static_cast<arm_insn>(instruction.id);
switch (type)
{
// OK
case yadiff::INST_TYPE_ANY:
return true;
// OK: LDR R3,[R5, #8]
case yadiff::INST_TYPE_READ:
return detail->arm.op_count >= 2
&& detail->arm.operands[1].type == ARM_OP_MEM;
// OK: STR R3, [R4,#0x10]
case yadiff::INST_TYPE_WRITE:
return detail->arm.op_count >= 2
&& detail->arm.operands[0].type == ARM_OP_MEM;
// NO
case yadiff::INST_TYPE_MOV:
return false;
// OK
case yadiff::INST_TYPE_CALL:
for (auto i : instruction.detail->groups)
{
if (i == CS_GRP_CALL)
return true;
}
return false;
// NO
case yadiff::INST_TYPE_STRING:
{
return false;
}
// OK
case yadiff::INST_TYPE_FLOAT:
for (auto i : instruction.detail->groups)
{
if (i == ARM_GRP_VFP2
|| i == ARM_GRP_VFP3
|| i == ARM_GRP_VFP4)
return true;
}
return false;
// OK: Use the conditional field (upper 4 bits)
case yadiff::INST_TYPE_CONDITIONAL:
if (instruction.detail->arm.cc != ARM_CC_AL)
return true;
return false;
// OK: Update flag details
case yadiff::INST_TYPE_TEST:
return instruction.detail->arm.update_flags;
// NO
case yadiff::INST_TYPE_ARITHMETIC:
return false;
// NO
case yadiff::INST_TYPE_LOGICAL:
return false;
// NO
case yadiff::INST_TYPE_SHIFT:
return false;
// NO
case yadiff::INST_TYPE_CLEAR:
return false;
// NO: inc and dec
case yadiff::INST_TYPE_INDEX:
// ADDS Rx, Rx, #1; SUB Rx, Rx, #1
if (insn_id == ARM_INS_SUB || insn_id == ARM_INS_ADD)
{
if (instruction.detail->arm.op_count == 3)
{
bool operand3 = instruction.detail->arm.operands[0].type == ARM_OP_REG
&& instruction.detail->arm.operands[1].type == ARM_OP_REG
&& instruction.detail->arm.operands[2].type == ARM_OP_IMM;
operand3 &= instruction.detail->arm.operands[0].reg
== instruction.detail->arm.operands[1].reg;
operand3 &= instruction.detail->arm.operands[2].imm == 1;
}
}
return false;
// OK: if MOV
case yadiff::INST_TYPE_REG_MOVE:
// Is mov with 2 operand regs
if (!IsInstructionType(instruction, yadiff::INST_TYPE_MOV))
return false;
return instruction.detail->arm.op_count == 2
&& instruction.detail->arm.operands[0].type == ARM_OP_REG
&& instruction.detail->arm.operands[1].type == ARM_OP_REG;
case yadiff::INST_TYPE_COUNT:
break;
}
return false;
}
std::shared_ptr<yadiff::IArch> yadiff::MakeArmArch()
{
return std::make_shared<ArmArch>();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchArm.hpp
================================================
#pragma once
#include "IArch.hpp"
namespace yadiff
{
std::shared_ptr<IArch> MakeArmArch();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchMips.cpp
================================================
#include "ArchMips.hpp"
#include "Helpers.h"
#include "IArch.hpp"
#include "VectorTypes.hpp"
#include <map>
#include <vector>
#include <memory>
// Must init
namespace
{
typedef std::map<mips_insn, std::vector<yadiff::InstructionType_e>> InsMap_t;
struct MipsArch : public yadiff::IArch
{
MipsArch();
bool IsInstructionType(const cs_insn&, yadiff::InstructionType_e) const override;
bool CheckMap(mips_insn instructionId, yadiff::InstructionType_e instructionTypeA) const;
InsMap_t insmap;
};
}
bool MipsArch::CheckMap(mips_insn instructionId, yadiff::InstructionType_e instructionTypeA) const
{
const auto it = insmap.find(instructionId);
if (it == insmap.end())
return false;
for (const auto instructionType : it->second)
if (instructionType == instructionTypeA)
return true;
return false;
}
MipsArch::MipsArch()
{
// Read
static const mips_insn readList[] =
{
MIPS_INS_LB, MIPS_INS_LBU, MIPS_INS_LH, MIPS_INS_LHU, MIPS_INS_LL, MIPS_INS_LW, MIPS_INS_LWL, MIPS_INS_LWR,
};
for (mips_insn i : readList)
insmap[i].push_back(yadiff::INST_TYPE_READ);
// Write
static const mips_insn writeList[] =
{
MIPS_INS_SB, MIPS_INS_SC, MIPS_INS_SH, MIPS_INS_SW, MIPS_INS_SWL, MIPS_INS_SWR,
};
for (mips_insn i : writeList)
insmap[i].push_back(yadiff::INST_TYPE_WRITE);
// Arithmetic
static const mips_insn arithmeticList[] =
{
MIPS_INS_ADD, MIPS_INS_ADDI, MIPS_INS_ADDIU, MIPS_INS_ADDU, MIPS_INS_CLO, MIPS_INS_CLZ, MIPS_INS_DIV,
MIPS_INS_DIVU, MIPS_INS_MADD, MIPS_INS_MADDU, MIPS_INS_MSUB, MIPS_INS_MSUBU, MIPS_INS_MUL, MIPS_INS_MULT,
MIPS_INS_MULTU, MIPS_INS_SEB, MIPS_INS_SEH, MIPS_INS_SLT, MIPS_INS_SLTI, MIPS_INS_SLTIU, MIPS_INS_SLTU,
MIPS_INS_SUB, MIPS_INS_SUBU,
};
for (mips_insn i : arithmeticList)
insmap[i].push_back(yadiff::INST_TYPE_ARITHMETIC);
// LOgical
static const mips_insn logicalList[] =
{
MIPS_INS_AND, MIPS_INS_ANDI, MIPS_INS_LUI, MIPS_INS_NOR, MIPS_INS_OR, MIPS_INS_ORI, MIPS_INS_XOR, MIPS_INS_XORI,
};
for (mips_insn i : logicalList)
insmap[i].push_back(yadiff::INST_TYPE_LOGICAL);
// Shift
static const mips_insn shiftList[] =
{
MIPS_INS_ROTR, MIPS_INS_ROTRV, MIPS_INS_SLL, MIPS_INS_SLLV, MIPS_INS_SRA, MIPS_INS_SRAV, MIPS_INS_SRL, MIPS_INS_SRLV,
};
for (mips_insn i : shiftList)
insmap[i].push_back(yadiff::INST_TYPE_SHIFT);
// Move (reg 2 reg)
static const mips_insn movList[] =
{
MIPS_INS_MFHI, MIPS_INS_MFLO, MIPS_INS_MOVF, MIPS_INS_MOVN, MIPS_INS_MOVT, MIPS_INS_MOVZ, MIPS_INS_MTHI, MIPS_INS_MTLO,
};
for (mips_insn i : movList)
insmap[i].push_back(yadiff::INST_TYPE_MOV);
// FPU
static const mips_insn fpuList[] =
{
// arith
// MIPS_INS_REC, MIPS_INS_RSQRT,
MIPS_INS_ABS, MIPS_INS_ADD, MIPS_INS_DIV, MIPS_INS_MADD, MIPS_INS_MSUB, MIPS_INS_MUL, MIPS_INS_NEG, MIPS_INS_NMADD,
MIPS_INS_NMSUB, MIPS_INS_SQRT, MIPS_INS_SUB,
// branch
MIPS_INS_BC1F, MIPS_INS_BC1T,
// compare
MIPS_INS_C,
// convert
// MIPS_INS_ALNV, MIPS_INS_PLL, MIPS_INS_PLU, MIPS_INS_PUL, MIPS_INS_PUU,
MIPS_INS_CEIL, MIPS_INS_CEIL, MIPS_INS_CVT, MIPS_INS_CVT, MIPS_INS_CVT, MIPS_INS_CVT, MIPS_INS_CVT,
MIPS_INS_CVT, MIPS_INS_CVT, MIPS_INS_FLOOR, MIPS_INS_FLOOR,
MIPS_INS_ROUND, MIPS_INS_ROUND, MIPS_INS_TRUNC,
// memory
// MIPS_INS_PREFX,
MIPS_INS_LDC1, MIPS_INS_LDXC1, MIPS_INS_LUXC1, MIPS_INS_LWC1, MIPS_INS_LWXC1,
MIPS_INS_SDC1, MIPS_INS_SDXC1, MIPS_INS_SUXC1, MIPS_INS_SWC1, MIPS_INS_SWXC1,
// move
MIPS_INS_CFC1, MIPS_INS_CTC1, MIPS_INS_MFC1, MIPS_INS_MFHC1, MIPS_INS_MOV, MIPS_INS_MOVF, MIPS_INS_MOVN,
MIPS_INS_MOVT, MIPS_INS_MOVZ, MIPS_INS_MTC1, MIPS_INS_MTHC1,
// obsolete
MIPS_INS_BC1FL, MIPS_INS_BC1TL,
};
for (mips_insn i : fpuList)
insmap[i].push_back(yadiff::INST_TYPE_FLOAT);
// Conditional
static const mips_insn condList[] =
{
MIPS_INS_BEQ, MIPS_INS_BGEZ, MIPS_INS_BGEZAL, MIPS_INS_BGTZ, MIPS_INS_BLEZ, MIPS_INS_BLTZ,
MIPS_INS_BLTZAL, MIPS_INS_BNE,
};
for (mips_insn i : condList)
insmap[i].push_back(yadiff::INST_TYPE_CONDITIONAL);
}
bool MipsArch::IsInstructionType(const cs_insn& instruction, yadiff::InstructionType_e type) const
{
const cs_detail* detail = instruction.detail;
const mips_insn insn_id = static_cast<mips_insn>(instruction.id);
bool res;
UNUSED(detail);
UNUSED(insn_id);
switch (type)
{
// OK
case yadiff::INST_TYPE_ANY:
return true;
// ..
case yadiff::INST_TYPE_READ:
return CheckMap(insn_id, yadiff::INST_TYPE_READ);
// ..
case yadiff::INST_TYPE_WRITE:
return CheckMap(insn_id, yadiff::INST_TYPE_WRITE);
// TODO: add the add instruction from MOV pseudo
case yadiff::INST_TYPE_MOV:
res = MipsArch::IsInstructionType(instruction, yadiff::INST_TYPE_WRITE);
res |= MipsArch::IsInstructionType(instruction, yadiff::INST_TYPE_WRITE);
res |= CheckMap(insn_id, yadiff::INST_TYPE_MOV);
return res;
// OK
case yadiff::INST_TYPE_CALL:
for (auto i : instruction.detail->groups)
if (i == CS_GRP_CALL)
return true;
return false;
// NO
case yadiff::INST_TYPE_STRING:
return true;
// TODO add instruction for double ?
case yadiff::INST_TYPE_FLOAT:
return CheckMap(insn_id, yadiff::INST_TYPE_FLOAT);
// ..: Just branch coond
case yadiff::INST_TYPE_CONDITIONAL:
return CheckMap(insn_id, yadiff::INST_TYPE_CONDITIONAL);
// NO
case yadiff::INST_TYPE_TEST:
return true;
// OK
case yadiff::INST_TYPE_ARITHMETIC:
return CheckMap(insn_id, yadiff::INST_TYPE_ARITHMETIC);
// OK
case yadiff::INST_TYPE_LOGICAL:
return CheckMap(insn_id, yadiff::INST_TYPE_LOGICAL);
// OK
case yadiff::INST_TYPE_SHIFT:
return CheckMap(insn_id, yadiff::INST_TYPE_SHIFT);
// OK: MOVE pseudo code -> ADDI reg, $zero, 0
case yadiff::INST_TYPE_CLEAR:
res = (insn_id == MIPS_INS_ADDI);
res &= (instruction.detail->mips.op_count == 3);
res &= instruction.detail->mips.operands[0].type == MIPS_OP_REG;
res &= instruction.detail->mips.operands[1].type == MIPS_OP_REG;
res &= instruction.detail->mips.operands[1].reg == MIPS_REG_ZERO;
res &= instruction.detail->mips.operands[2].type == MIPS_OP_IMM;
res &= instruction.detail->mips.operands[2].imm == 0;
return res;
// NO
case yadiff::INST_TYPE_INDEX:
return true;
// ..
case yadiff::INST_TYPE_REG_MOVE:
return CheckMap(insn_id, yadiff::INST_TYPE_MOV);
// NO
case yadiff::INST_TYPE_COUNT:
return true;
break;
}
return false;
}
std::shared_ptr<yadiff::IArch> yadiff::MakeMipsArch()
{
return std::make_shared<MipsArch>();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchMips.hpp
================================================
#pragma once
#include "IArch.hpp"
namespace yadiff
{
std::shared_ptr<IArch> MakeMipsArch();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchPpc.cpp
================================================
#include "ArchPpc.hpp"
#include "Helpers.h"
#include "IArch.hpp"
#include "VectorTypes.hpp"
#include <map>
#include <vector>
#include <memory>
// Must init
namespace
{
struct PpcArch : public yadiff::IArch
{
PpcArch();
bool IsInstructionType(const cs_insn&, yadiff::InstructionType_e) const override;
};
}
PpcArch::PpcArch()
{
}
bool PpcArch::IsInstructionType(const cs_insn& instruction, yadiff::InstructionType_e type) const
{
const cs_detail* detail = instruction.detail;
const ppc_insn insn_id = static_cast<ppc_insn>(instruction.id);
UNUSED(detail);
UNUSED(insn_id);
switch (type)
{
// OK
case yadiff::INST_TYPE_ANY:
return true;
// NO
case yadiff::INST_TYPE_READ:
return true;
// NO
case yadiff::INST_TYPE_WRITE:
return true;
// NO
case yadiff::INST_TYPE_MOV:
return true;
// NO
case yadiff::INST_TYPE_CALL:
return true;
// NO
case yadiff::INST_TYPE_STRING:
return true;
// NO
case yadiff::INST_TYPE_FLOAT:
return true;
// NO
case yadiff::INST_TYPE_CONDITIONAL:
return true;
// NO
case yadiff::INST_TYPE_TEST:
return true;
// NO
case yadiff::INST_TYPE_ARITHMETIC:
return true;
// NO
case yadiff::INST_TYPE_LOGICAL:
return true;
// NO
case yadiff::INST_TYPE_SHIFT:
return true;
// NO
case yadiff::INST_TYPE_CLEAR:
return true;
// NO
case yadiff::INST_TYPE_INDEX:
return true;
// NO
case yadiff::INST_TYPE_REG_MOVE:
return true;
// NO
case yadiff::INST_TYPE_COUNT:
return true;
break;
}
return false;
}
std::shared_ptr<yadiff::IArch> yadiff::MakePpcArch()
{
return std::make_shared<PpcArch>();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchPpc.hpp
================================================
#pragma once
#include "IArch.hpp"
namespace yadiff
{
std::shared_ptr<IArch> MakePpcArch();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchX86.cpp
================================================
#include "ArchX86.hpp"
#include "Helpers.h"
#include "IArch.hpp"
#include "VectorTypes.hpp"
#include <map>
#include <vector>
#include <memory>
// Must init
namespace
{
typedef std::map<x86_insn, std::vector<yadiff::InstructionType_e>> InsMap_t;
struct X86Arch : public yadiff::IArch
{
X86Arch();
bool IsInstructionType(const cs_insn&, yadiff::InstructionType_e) const override;
private:
bool CheckMap(x86_insn instructionId, yadiff::InstructionType_e instructionTypeA) const;
InsMap_t insmap;
};
}
X86Arch::X86Arch()
{
static const x86_insn fpuList[] =
{
// Data Transfer
X86_INS_FLD, X86_INS_FST, X86_INS_FSTP, X86_INS_FILD, X86_INS_FIST, X86_INS_FISTP, X86_INS_FISTTP, X86_INS_FBLD,
X86_INS_FBSTP, X86_INS_FXCH, X86_INS_FCMOVE, X86_INS_FCMOVNE, X86_INS_FCMOVB, X86_INS_FCMOVBE, X86_INS_FCMOVNB,
X86_INS_FCMOVNBE, X86_INS_FCMOVU, X86_INS_FCMOVNU,
// Basic Arithmetic
X86_INS_FADD, X86_INS_FADDP, X86_INS_FIADD, X86_INS_FSUB, X86_INS_FSUBP, X86_INS_FISUB, X86_INS_FSUBR, X86_INS_FSUBRP,
X86_INS_FISUBR, X86_INS_FMUL, X86_INS_FMULP, X86_INS_FIMUL, X86_INS_FDIV, X86_INS_FDIVP, X86_INS_FIDIV, X86_INS_FDIVR,
X86_INS_FDIVRP, X86_INS_FIDIVR, X86_INS_FPREM, X86_INS_FPREM1, X86_INS_FABS, X86_INS_FCHS, X86_INS_FRNDINT, X86_INS_FSCALE, X86_INS_FSQRT, X86_INS_FXTRACT,
// Comparison (missing FUCOMIP)
X86_INS_FCOM, X86_INS_FCOMP, X86_INS_FCOMPP, X86_INS_FUCOM, X86_INS_FUCOMP, X86_INS_FUCOMPP, X86_INS_FICOM, X86_INS_FICOMP, X86_INS_FCOMI, X86_INS_FUCOMI, X86_INS_FTST, X86_INS_FXAM,
// Transcendental
X86_INS_FSIN, X86_INS_FCOS, X86_INS_FSINCOS, X86_INS_FPTAN, X86_INS_FPATAN, X86_INS_F2XM1, X86_INS_FYL2X, X86_INS_FYL2XP1,
// Load constant
X86_INS_FLD1, X86_INS_FLDZ, X86_INS_FLDPI, X86_INS_FLDL2E, X86_INS_FLDLN2, X86_INS_FLDL2T, X86_INS_FLDLG2,
// Control (missing FINIT, FCLEX, FSTCW, FSTENV, FSAVE, FSTSW but I got them with N [for non check error])
X86_INS_FINCSTP, X86_INS_FDECSTP, X86_INS_FFREE, X86_INS_FNINIT, X86_INS_FNCLEX, X86_INS_FNSTCW, X86_INS_FLDCW, X86_INS_FNSTENV,
X86_INS_FLDENV, X86_INS_FNSAVE, X86_INS_FRSTOR, X86_INS_FNSTSW, X86_INS_WAIT, X86_INS_FNOP
};
for(x86_insn i : fpuList)
insmap[i].push_back(yadiff::INST_TYPE_SHIFT);
// Data transfer TODO remove push pop .. Spek with void.
// TODO add the other instruction (after / in intel doc)
static const x86_insn movList[] =
{
// Missing (CMOVC, CMOVNC, PUSHA, POPA);
// I removed dataX86_INS_XCHG, X86_INS_BSWAP, X86_INS_XADD, X86_INS_CMPXCHG, X86_INS_CMPXCHG8B, X86_INS_PUSH, X86_INS_POP
X86_INS_MOV, X86_INS_CMOVE, X86_INS_CMOVNE, X86_INS_CMOVA, X86_INS_CMOVAE, X86_INS_CMOVB, X86_INS_CMOVBE, X86_INS_CMOVG, X86_INS_CMOVGE,
X86_INS_CMOVL, X86_INS_CMOVLE, X86_INS_CMOVO, X86_INS_CMOVNO, X86_INS_CMOVS, X86_INS_CMOVNS, X86_INS_CMOVP, X86_INS_CMOVNP
};
for(x86_insn i : movList)
insmap[i].push_back(yadiff::INST_TYPE_MOV);
static const x86_insn arithmeticList[] =
{
// Just removed CMP
X86_INS_ADD, X86_INS_ADC, X86_INS_SUB, X86_INS_SBB, X86_INS_IMUL, X86_INS_MUL, X86_INS_IDIV, X86_INS_DIV, X86_INS_INC, X86_INS_DEC, X86_INS_NEG
};
for(x86_insn i : arithmeticList)
insmap[i].push_back(yadiff::INST_TYPE_ARITHMETIC);
static const x86_insn logicalList[] =
{
// Yes just 4 like Ninja Turtles.
X86_INS_AND, X86_INS_OR, X86_INS_XOR, X86_INS_NOT
};
for(x86_insn i : logicalList)
insmap[i].push_back(yadiff::INST_TYPE_LOGICAL);
static const x86_insn shiftList[] =
{
X86_INS_SAR, X86_INS_SHR, X86_INS_SAL, X86_INS_SHL, X86_INS_SHRD, X86_INS_SHLD, X86_INS_ROR, X86_INS_ROL, X86_INS_RCR, X86_INS_RCL
};
for(x86_insn i : shiftList)
insmap[i].push_back(yadiff::INST_TYPE_SHIFT);
}
bool X86Arch::CheckMap(x86_insn instructionId, yadiff::InstructionType_e instructionTypeA) const
{
const auto it = insmap.find(instructionId);
if(it == insmap.end())
return false;
for(const auto instructionType : it->second)
if(instructionType == instructionTypeA)
return true;
return false;
}
bool X86Arch::IsInstructionType(const cs_insn& instruction, yadiff::InstructionType_e type) const
{
const cs_detail* detail = instruction.detail;
const x86_insn insn_id = static_cast<x86_insn>(instruction.id);
switch (type)
{
case yadiff::INST_TYPE_ANY:
return true;
case yadiff::INST_TYPE_READ:
return detail->x86.op_count >= 2
&& detail->x86.operands[1].type == X86_OP_MEM;
case yadiff::INST_TYPE_WRITE:
return detail->x86.op_count >= 2
&& detail->x86.operands[0].type == X86_OP_MEM;
case yadiff::INST_TYPE_MOV:
return CheckMap(insn_id, yadiff::INST_TYPE_MOV);
case yadiff::INST_TYPE_CALL:
for (auto i : instruction.detail->groups)
if (i == CS_GRP_CALL)
return true;
return false;
case yadiff::INST_TYPE_STRING:
{
const auto prefix = (x86_prefix) instruction.detail->x86.prefix[0];
return prefix == X86_PREFIX_REP
|| prefix == X86_PREFIX_REPE
|| prefix == X86_PREFIX_REPNE;
}
case yadiff::INST_TYPE_FLOAT:
return CheckMap(insn_id, yadiff::INST_TYPE_FLOAT);
case yadiff::INST_TYPE_CONDITIONAL:
for (uint8_t i = 0; i < instruction.detail->regs_read_count; i++)
if (instruction.detail->regs_read[i] == X86_REG_EFLAGS)
return true;
return false;
case yadiff::INST_TYPE_TEST:
return instruction.detail->x86.eflags != 0;
case yadiff::INST_TYPE_ARITHMETIC:
return CheckMap(insn_id, yadiff::INST_TYPE_ARITHMETIC);
case yadiff::INST_TYPE_LOGICAL:
return CheckMap(insn_id, yadiff::INST_TYPE_LOGICAL);
case yadiff::INST_TYPE_SHIFT:
return CheckMap(insn_id, yadiff::INST_TYPE_SHIFT);
case yadiff::INST_TYPE_CLEAR:
return insn_id == X86_INS_XOR
&& instruction.detail->x86.op_count == 2
&& instruction.detail->x86.operands[0].type == X86_OP_REG
&& instruction.detail->x86.operands[1].type == X86_OP_REG
&& instruction.detail->x86.operands[0].reg == instruction.detail->x86.operands[1].reg;
// TODO mov reg, 0
case yadiff::INST_TYPE_INDEX:
return insn_id == X86_INS_INC
|| insn_id == X86_INS_DEC;
case yadiff::INST_TYPE_REG_MOVE:
// Is mov with 2 operand regs
if (!IsInstructionType(instruction, yadiff::INST_TYPE_MOV))
return false;
return instruction.detail->x86.op_count == 2
&& instruction.detail->x86.operands[0].type == X86_OP_REG
&& instruction.detail->x86.operands[1].type == X86_OP_REG;
case yadiff::INST_TYPE_COUNT:
break;
}
return false;
}
std::shared_ptr<yadiff::IArch> yadiff::MakeX86Arch()
{
return std::make_shared<X86Arch>();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/ArchX86.hpp
================================================
#pragma once
#include "IArch.hpp"
namespace yadiff
{
std::shared_ptr<IArch> MakeX86Arch();
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/IArch.cpp
================================================
#include "IArch.hpp"
#include "Helpers.h"
#include "ArchX86.hpp"
#include "ArchArm.hpp"
#include "ArchPpc.hpp"
#include "ArchMips.hpp"
#include <assert.h>
#include <memory>
#include <stdexcept>
const char* yadiff::InstTypeToString(yadiff::InstructionType_e inst_type)
{
switch(inst_type)
{
case yadiff::INST_TYPE_ANY: return "ANY";
case yadiff::INST_TYPE_READ: return "READ";
case yadiff::INST_TYPE_WRITE: return "WRITE";
case yadiff::INST_TYPE_MOV: return "MOV";
case yadiff::INST_TYPE_CALL: return "CALL";
case yadiff::INST_TYPE_STRING: return "STRING";
case yadiff::INST_TYPE_FLOAT: return "FLOAT";
case yadiff::INST_TYPE_CONDITIONAL: return "CONDITIONAL";
case yadiff::INST_TYPE_TEST: return "TEST";
case yadiff::INST_TYPE_ARITHMETIC: return "ARITHMETIC";
case yadiff::INST_TYPE_LOGICAL: return "LOGICAL";
case yadiff::INST_TYPE_SHIFT: return "SHIFT";
case yadiff::INST_TYPE_CLEAR: return "CLEAR";
case yadiff::INST_TYPE_INDEX: return "INDEX";
case yadiff::INST_TYPE_REG_MOVE: return "REG_MOVE";
case yadiff::INST_TYPE_COUNT: break;
}
throw std::runtime_error("unsupported instruction type");
}
std::shared_ptr<yadiff::IArch> yadiff::MakeArch(cs_arch architecture, cs_mode register_size)
{
UNUSED(register_size);
switch (architecture)
{
case CS_ARCH_X86: return MakeX86Arch();
case CS_ARCH_ARM: return MakeArmArch();
case CS_ARCH_ARM64: return MakeArmArch();
case CS_ARCH_PPC: return MakePpcArch();
case CS_ARCH_MIPS: return MakeMipsArch();
default: break;
}
throw std::runtime_error("unsupported arch");
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/IArch.hpp
================================================
#pragma once
#include <capstone/capstone.h>
#include <functional>
namespace std { template<typename T> class shared_ptr; }
namespace yadiff
{
//
enum InstructionType_e
{
INST_TYPE_ANY, // Any instruction tyep (always returns true)
INST_TYPE_READ, // Memory from RAM to CPU
INST_TYPE_WRITE, // Memory from CPU to RAM
INST_TYPE_MOV, // Any data movement
INST_TYPE_CALL, // Calling a function
INST_TYPE_STRING, // CString rep operations
INST_TYPE_FLOAT, // FPU Operations
INST_TYPE_CONDITIONAL, // Like mov if equal
INST_TYPE_TEST, // Change flags
INST_TYPE_ARITHMETIC, // Add, Mul
INST_TYPE_LOGICAL, // Neg, And, Or
INST_TYPE_SHIFT, // Bit shift, rotate
INST_TYPE_CLEAR, // Xor eax, eax && mov eax, 0
INST_TYPE_INDEX, // dec, add
INST_TYPE_REG_MOVE, // mov eax, ebx
INST_TYPE_COUNT,
};
const char* InstTypeToString(InstructionType_e inst_type);
struct IArch
{
virtual ~IArch() {}
virtual bool IsInstructionType(const cs_insn&, InstructionType_e) const = 0;
};
std::shared_ptr<IArch> MakeArch(cs_arch architecture, cs_mode register_size);
} // end namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/InstructionVector.cpp
================================================
/*
Using Capstone, I give a lib that gives some scalar according to the presence of certain instructions.
TODO : get the Arch and the mode in database.
*/
#include "InstructionVector.hpp"
#include "VectorTypes.hpp"
#include "VectorHelpers.hpp"
#include "IArch.hpp"
#include "../Algo.hpp"
#include "IModel.hpp"
#include "Helpers.h"
#include "HVersion.hpp"
#include <capstone/capstone.h>
#include <numeric>
#include <sstream>
#include <iostream>
#include <functional>
#include <math.h>
#include <functional>
#include <memory>
namespace
{
// used locally to remember my work thourght all lopps.
struct FunctionDisassembled_T
{
FunctionDisassembled_T(yadiff::InstructionType_e instructionType)
: instruction_type(instructionType)
{
}
void UpdateBBFields(const YaToolObjectId& bb_id, const std::vector<cs_insn>& bbInstructions, yadiff::IArch& iarch)
{
std::vector<bool> res;
res.reserve(bbInstructions.size());
for (const auto& insn : bbInstructions) {
res.push_back(iarch.IsInstructionType(insn, instruction_type));
}
bbFields[bb_id] = res;
}
std::vector<bool> GetBBVect(const YaToolObjectId& bb_id) const
{
// TODO bug fix for function with man's spreading (function that are father than their "size"
if (bbFields.find(bb_id) != bbFields.end())
return bbFields.at(bb_id);
else
return std::vector<bool>();
}
yadiff::InstructionType_e instruction_type = yadiff::INST_TYPE_COUNT;
yadiff::InstructionData_t instruction_data = {0, 0, 0, 0, 0, 0, 0};
// bbFields, a map from of the <offset, bb_inst_type_vector>
std::map<YaToolObjectId, std::vector<bool>> bbFields
= std::map<YaToolObjectId, std::vector<bool>>();
};
#if 0
std::string PrintPrettyInsn(const std::vector<cs_insn>& instructions)
{
std::stringstream ss;
for (cs_insn instruction : instructions)
{
// ADDR, Menmonic, operands,
ss << "0x" << std::hex << instruction.address;
ss << ":\t" << instruction.mnemonic;
ss << "\t\t" << instruction.op_str << "\n";
}
return ss.str();
}
#endif //0
/*@brief : Disassemble a array of byte
* @param : <code_int_array> pointer to the buffer containing the executable bytes
* <size> size fo this buffer
* <addr> address of the first byte offset (like 400000 in IDA)
* @return: insn_array : array of instruction
* @remark: The uint8_t_array is a perfect input structure here
*/
std::vector<cs_insn> Disass(const uint8_t* data, size_t size, const yadiff::BinaryInfo_t& binary_info)
{
if (binary_info.cs_error_val != CS_ERR_OK)
{
return std::vector<cs_insn>();
}
// Disass: handle, code, size of code, start point , end point, insn : are the instruction output, the return is the number of instruction
cs_insn* pointerOut;
size_t count = cs_disasm(binary_info.h_capstone, data, (int) size, 0x1000, 0, &pointerOut);
return std::vector<cs_insn>(pointerOut, pointerOut + count);
}
//
//
//
// _______________ _________________
// | | | |
// | BB1 | | B1 |
// |_____________| -> |________________|
// / \ |
// ________ ________ _________________
// | BB2 | | BB3 | | BB2 and BB3 |
// |______| | | | |
// | | | end at last offset of the last | |
// | |_______| |________________|
// | |
// | |
// _______ BB4
// | BB4 |
// |_____|
//
//
// So you flatten the CFG merging BB at the same distance from root. not SO easy..
//
//
//
//typedef std::map<int, std::vector<YaToolObjectId>> Pouet_T;
std::vector<double> FlattenFuction(const std::map<int, std::vector<YaToolObjectId>>& equiLevelMap, const FunctionDisassembled_T& dis)
{
std::vector<double> res;
size_t last_index = 0;
// For all distance to root (in BB);
for (const auto& it : equiLevelMap)
{
const auto& bbIds = it.second;
for (const auto& bbId : bbIds)
{
const std::vector<bool>& bbBoolVect = dis.GetBBVect(bbId);
for (size_t i = 0; i < bbBoolVect.size(); i++)
{
const double vd = (double) bbBoolVect[i];
if (last_index + i >= res.size())
{
res.insert(res.begin() + last_index + i, vd);
}
else
{
res[last_index + i] += vd;
}
}
}
if(res.size() > 0)
{
last_index = res.size() - 1;
}
}
return res;
}
} // End namespace null && begin of exported functions
// Entry point
void yadiff::SetDisassemblyFields(
yadiff::FunctionData_t& function_data,
const HVersion& fctVersion,
const std::map<int, std::vector<YaToolObjectId>>& equiLevelMap,
BinaryInfo_t& binary_info)
{
std::map<YaToolObjectId, offset_t> bbIdMap;
std::vector<FunctionDisassembled_T> structVector;
for (int i = 0; i < INST_TYPE_COUNT; i++)
{
structVector.push_back(FunctionDisassembled_T((yadiff::InstructionType_e) i));
}
// For all BB, fill the structures
fctVersion.walk_xrefs_from([&](offset_t /*offset2*/, operand_t /*operand2*/, const HVersion& bbVersion)
{
if (bbVersion.type() != OBJECT_TYPE_BASIC_BLOCK)
return WALK_CONTINUE;
// 1.1 Disassemble blob
size_t bbAddr = static_cast<size_t>(bbVersion.address() - binary_info.text_address);
size_t bbSize = static_cast<size_t>(bbVersion.size());
const uint8_t* bbBlob = &(binary_info.blob[bbAddr]);
const auto bbInstructions = Disass(bbBlob, bbSize, binary_info);
// 1.15 Increment inst number
function_data.cfg.inst_nb += static_cast<int>(bbInstructions.size());
// 1.2 For all callback store bb is_instruction as a map
for (FunctionDisassembled_T& disassStruct : structVector)
disassStruct.UpdateBBFields(bbVersion.id(), bbInstructions, *(binary_info.iarch_ptr));
return WALK_CONTINUE;
}); // end for all bbVersion
// For all inst type
for (int i = 0; i < INST_TYPE_COUNT; i++)
{
std::vector<int> fctInstVect;
auto& disassStruct = structVector[i];
auto& instruction_data = function_data.insts[i];
// Create vector on BB coordinates : for all BB
for (const auto& it : disassStruct.bbFields)
{
int number_of_inst = 0;
auto& bbBoolVect = it.second;
for (bool b : bbBoolVect)
{
if (b)
{
number_of_inst++;
}
}
fctInstVect.push_back(number_of_inst);
}
// Set the per BB statistic fieds.
instruction_data.total = std::accumulate(fctInstVect.begin(), fctInstVect.end(), 0);
instruction_data.mean_per_bb = instruction_data.total / function_data.cfg.bb_nb;
instruction_data.variance_per_bb = GetVariance(fctInstVect, instruction_data.mean_per_bb);
// Set the per (min) distance (in inst) to root statistic fields
const auto flattenFunctionInst = FlattenFuction(equiLevelMap, disassStruct);
function_data.cfg.flat_len = static_cast<int>(flattenFunctionInst.size());
// Set central moemnts
const auto centralMoments = GetCentralMomentByte(flattenFunctionInst, 5);
instruction_data.offset_mean_per_inst = centralMoments[1];
instruction_data.offset_variance_per_inst = centralMoments[2];
instruction_data.offset_skew_per_inst = centralMoments[3];
instruction_data.offset_kurt_per_inst = centralMoments[4];
}
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/InstructionVector.hpp
================================================
#pragma once
#include "VectorTypes.hpp"
#include <stdint.h>
#include <vector>
#include <map>
struct IModel;
struct HVersion;
typedef uint64_t YaToolObjectId;
namespace yadiff
{
/*@brief : Get the blob of the .text segment of the executable file mapped in memory
* @param : <db1> The database containing relevant informations on the executable file
* @return: std::vector containg the bytes of the text blob
* @remark: To be called just onces for a full database
*/
std::vector<uint8_t> GetBlobText(const IModel& db);
/*@brief : Get the disassembly Signature of the function
* @param : <objVersion> the function object version from yatools
<equiLevelMap> map:dist_to_root -> BB
<blob> byte blob of code (full segment)
<flatlen> some easy output.
* @return: std::vector with the characteristics, depending on the callbacks used (instruciton types).
* @remark: To be called for onces for each function version. The the output must be concatenated to get full function signature
*/
void SetDisassemblyFields(
yadiff::FunctionData_t& function_data,
const HVersion& fctVersion,
const std::map<int, std::vector<YaToolObjectId>>& equiLevelMap,
BinaryInfo_t& binary_info);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorDistance.cpp
================================================
/*
Inputs : Set of vectors // Representing the function characteristics
Unity ball // Representing the maximum allowed distance between 2 functions.
Outputs : Distance between each vector that is closer to the unity ball
Important : Currently I use the norm 1 : d(x,y) = |x1-y1| + |x2-y2|
With time and wisdom, I may include a more "tolerant" "distance".
Math lib for Nearest Neighbor Search in a space of double
Currently I use a dichotomic fragmentation of space. That is fine to begin with.
I may go on with a Voronoi diagram in the fragments or divide the space in an array , at least divide some dimension in more than 2 fragments.
The end of the algo is a peer to peer comparing. Hopefully not too many vectors are in the same case.
Maybe this will be replaced with an external library such as spotify/annoy@github (Approximate Nearest Neighbors Oh Yeah)
*/
#include "VectorDistance.hpp"
#include <cmath>
namespace yadiff
{
Vector gUnityVector;
Vector gVectorMean;
Vector gVectorMaxLow;
Vector gVectorMinHight;
void SetUnityVector(const Vector& vectUnity)
{
gUnityVector = vectUnity;
}
void SetDichotomicBorder(const VectorSignatureSet_t& vectSet)
{
// 0/ Allocate
gVectorMean.resize(gUnityVector.size());
gVectorMinHight.resize(gUnityVector.size());
gVectorMaxLow.resize(gUnityVector.size());
// 1/ Accumulate
for (const auto& it : vectSet)
{
const auto& crVect = it.second;
for (size_t i = 0; i < crVect.size(); i++)
{
gVectorMean[i] += crVect[i];
}
}
// 2/ Normalize
for (size_t i = 0; i < gVectorMean.size(); i++)
{
gVectorMean[i] /= vectSet.size();
}
// 3/ MinLow MaxHIgh
for (size_t i = 0; i < gUnityVector.size(); i++)
{
gVectorMaxLow[i] = gVectorMean[i] + gUnityVector[i] / 2;
gVectorMinHight[i] = gVectorMean[i] - gUnityVector[i] / 2;
}
}
void PutVectorInTree(VectorTree_t& vectorTree, VectorGroups_t& vectorGroups, const VectorSignatureSet_t& vectSet)
{
std::vector<Key_t> keys;
std::vector<Key_t> newKeys;
// For All vectors in db
for (const auto& it : vectSet)
{
const auto& crVect = it.second;
keys.clear();
keys.push_back(0);
for (size_t i = 0; i < crVect.size(); i++)
{
// check if I copy the keys
bool doCopy = false;
// insert in the low group (flag not setted) so just make a copy : one wit 0 and the other with 1
if (crVect[i] < gVectorMaxLow[i])
{
doCopy = true;
}
// insert in the high component group (flag setted)
if (crVect[i] > gVectorMinHight[i])
{
// If no copy, just add the flag to all keys
if (!doCopy)
{
for (int& j : keys)
{
j += (1 << i);
}
}
// If copy : add the flag to all copied fields
else
{
newKeys.clear();
for (int j : keys)
{
newKeys.push_back(j + (1 << i));
}
keys.insert(keys.end(), newKeys.begin(), newKeys.end());
}
}
}
for (int key : keys)
{
vectorTree[key].push_back(it.first);
vectorGroups[it.first].push_back(key);
}
}
}
double GetVectorDistance(const Vector& v1, const Vector& v2)
{
double distance = 0;
for (size_t i = 0; i < v1.size(); i++)
{
distance += std::abs(v1[i] - v2[i]) / gUnityVector[i];
}
return distance;
}
// TODO return the distance too
void GetClosestVectorIdNaive(uint64_t& idOut, double& closestDistanceOut, const Vector& vectToLocalize, const std::vector<uint64_t>& idInGroup, VectorSignatureSet_t& vectSet)
{
for (const uint64_t& id : idInGroup)
{
auto& crVect = vectSet[id];
double fctDist = GetVectorDistance(crVect, vectToLocalize);
if (fctDist < closestDistanceOut)
{
closestDistanceOut = fctDist;
idOut = id;
}
}
}
} // End namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorDistance.hpp
================================================
/*
Math lib for Nearest Neighbor Search in a space of double
All functions are exported
*/
#pragma once
#include <vector>
#include <map>
#include <cstdlib>
#include "VectorTypes.hpp"
namespace yadiff
{
// TODO change in tto a bitField.
typedef int Key_t;
typedef std::map<Key_t, std::vector<uint64_t>> VectorTree_t;
typedef std::map< uint64_t, Vector> VectorSignatureSet_t;
typedef std::map< uint64_t, std::vector< Key_t > > VectorGroups_t;
void SetDichotomicBorder(const VectorSignatureSet_t& vectSet);
void PutVectorInTree(VectorTree_t& vectorTree, VectorGroups_t& vectorGroups, const VectorSignatureSet_t& vectSet);
double GetVectorDistance(const Vector& v1, const Vector& v2);
void GetClosestVectorIdNaive(uint64_t& idOut, double& closestDistanceOut, const Vector& vectToLocalize, const std::vector<uint64_t>& idInDatabase, VectorSignatureSet_t& vectSet);
void SetUnityVector(const Vector& vectUnity);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorHelpers.cpp
================================================
#include "VectorHelpers.hpp"
#include <math.h>
#include <algorithm>
#include <numeric> // accumulate
namespace yadiff
{
/*@brief : Get a distribution central moment (like in physics)
* @param : <doubleVector> Ordered vector : the weight (number of instruction) at each instruction offset.
* <size> Size of the output.
* @return: Central moment list
* @remark: Mean is the instruction offset, starts at 0
*/
Vector GetCentralMomentByte(const Vector& byteVector, size_t size)
{
Vector res = Vector(size);
// -1: Check input
if (byteVector.empty())
{
return res;
}
// 0: Get Weight
res[0] = 0;
for (size_t i = 0; i < byteVector.size(); i++)
{
res[0] += byteVector[i];
}
if (res[0] == 0)
{
return res;
}
// 1: Get Mean
for (size_t i = 0; i < byteVector.size(); i++)
{
res[1] += byteVector[i] * (i + 0.5);
}
res[1] /= res[0];
// 2: Get Variance, skew, kurt
for (size_t i = 0; i < byteVector.size(); i++)
{
for (size_t moment = 2; moment < size; moment++)
{
res[moment] += byteVector[i] * pow((i + 0.5) - res[1], moment);
}
}
// 3: Root Variance, Skew, Kurt
for (size_t moment = 2; moment < size; moment++)
{
// 3.1: Divide by mass (not null)
res[moment] /= res[0];
// 3.2: Root
double sign = 1 - 2 * std::signbit(res[moment]);
res[moment] = sign * pow(sign * res[moment], 1. / moment);
}
// 4 : Normalize all for a 1 length vector
for (size_t i = 1; i < size; i++)
{
res[i] /= byteVector.size();
}
return res;
}
//
double GetMean(const Vector& doubleVector)
{
// Check
if (doubleVector.empty())
{
return DEFAULT_DOUBLE;
}
double sum = std::accumulate(doubleVector.begin(), doubleVector.end(), 0.0);
return sum / doubleVector.size();
}
//
double GetVariance(const Vector& doubleVector, double mean)
{
// Check
if (doubleVector.empty())
{
return DEFAULT_DOUBLE;
}
double res = 0;
std::for_each(doubleVector.begin(), doubleVector.end(), [&](const double d) {
res += (d - mean) * (d - mean);
});
return sqrt(res / doubleVector.size());
}
// TODO template function to mutualize
double GetVariance(const std::vector<int>& doubleVector, double mean)
{
// Check
if (doubleVector.empty())
{
return DEFAULT_DOUBLE;
}
double res = 0;
std::for_each(doubleVector.begin(), doubleVector.end(), [&](const double d) {
res += (d - mean) * (d - mean);
});
return sqrt(res / doubleVector.size());
}
//
double GetMedian(const Vector& doubleVector)
{
// Check
if (doubleVector.empty())
{
return DEFAULT_DOUBLE;
}
// Don't fully sort
Vector v = doubleVector;
size_t n = doubleVector.size() / 2;
std::nth_element(v.begin(), v.begin() + n, v.end());
return v[n];
}
} // End namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorHelpers.hpp
================================================
/*
Some (math) utils
*/
#pragma once
#include <stddef.h>
#include <vector>
#include "VectorTypes.hpp"
namespace yadiff
{
Vector GetCentralMomentByte(const Vector& byteVector, size_t size);
double GetMedian(const Vector& doubleVector);
double GetMean(const Vector& doubleVector);
double GetVariance(const Vector& doubleVector, double mean);
double GetVariance(const std::vector<int>& doubleVector, double mean);
} // End namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorTypes.cpp
================================================
#include <stddef.h>
#include "VectorTypes.hpp"
// To get Architecture
#include "IArch.hpp"
#include "IModel.hpp"
#include "HVersion.hpp"
#include "Helpers.h"
#include <assert.h>
#include <memory>
namespace yadiff
{
void TryPush(std::vector<std::string>* s_vector, std::string string)
{
// TODO make it a macor : too slow
if (s_vector != NULL)
{
s_vector->push_back(string);
}
}
std::vector<double> FunctionData2Vector(const FunctionData_t& function_data,
std::vector<std::string>* s_vector, std::string s_base)
{
std::vector<double> res = std::vector<double>();
// Control Flow Graph
res.push_back(static_cast<double>(function_data.cfg.bb_nb)); // 1
TryPush(s_vector, s_base + "bb_nb");
res.push_back(static_cast<double>(function_data.cfg.edge_nb)); // 2
TryPush(s_vector, s_base + "edge_nb");
res.push_back(static_cast<double>(function_data.cfg.ret_nb)); // 3
TryPush(s_vector, s_base + "ret_nb");
res.push_back(static_cast<double>(function_data.cfg.inst_nb)); // 4
TryPush(s_vector, s_base + "inst_nb");
res.push_back(static_cast<double>(function_data.cfg.jcc_nb)); // 5
TryPush(s_vector, s_base + "jcc_nb");
res.push_back(static_cast<double>(function_data.cfg.back_edge_nb)); // 6
TryPush(s_vector, s_base + "back_edge_nb");
res.push_back(static_cast<double>(function_data.cfg.diamond_nb)); // 7
TryPush(s_vector, s_base + "diamond_nb");
res.push_back(static_cast<double>(function_data.cfg.size)); // 8
TryPush(s_vector, s_base + "size");
res.push_back(static_cast<double>(function_data.cfg.size_disp)); // 9
TryPush(s_vector, s_base + "size_disp");
res.push_back(static_cast<double>(function_data.cfg.height)); // 10
TryPush(s_vector, s_base + "height");
res.push_back(static_cast<double>(function_data.cfg.height_disp)); // 11
TryPush(s_vector, s_base + "height_disp");
res.push_back(static_cast<double>(function_data.cfg.width)); // 12
TryPush(s_vector, s_base + "width");
res.push_back(static_cast<double>(function_data.cfg.width_disp)); // 13
TryPush(s_vector, s_base + "width_disp");
res.push_back(static_cast<double>(function_data.cfg.flat_len)); // 14
TryPush(s_vector, s_base + "flat_len");
// Call Graph
res.push_back(static_cast<double>(function_data.cg.in_degree)); // 1
TryPush(s_vector, s_base + "in_degree");
res.push_back(static_cast<double>(function_data.cg.out_degree)); // 2
TryPush(s_vector, s_base + "out_degree");
res.push_back(static_cast<double>(function_data.cg.dist_to_root)); // 3
TryPush(s_vector, s_base + "dist_to_root");
res.push_back(static_cast<double>(function_data.cg.dist_to_leave)); // 4
TryPush(s_vector, s_base + "dist_to_leave");
res.push_back(static_cast<double>(function_data.cg.arg_nb)); // 5
TryPush(s_vector, s_base + "arg_nb");
res.push_back(static_cast<double>(function_data.cg.lib_nb)); // 6
TryPush(s_vector, s_base + "lib_nb");
// Instruction Distribution
for (int i = 0; i < INST_TYPE_COUNT; i++)
{
InstructionType_e inst_type = static_cast<InstructionType_e>(i);
InstructionData_t instruction_data = function_data.insts[(InstructionType_e)i];
res.push_back(static_cast<double>(instruction_data.total));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_total");
res.push_back(static_cast<double>(instruction_data.mean_per_bb));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_mean_per_bb");
res.push_back(static_cast<double>(instruction_data.variance_per_bb));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_variance_per_bb");
res.push_back(static_cast<double>(instruction_data.offset_mean_per_inst));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_offset_mean_per_inst");
res.push_back(static_cast<double>(instruction_data.offset_variance_per_inst));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_offset_variance_per_inst");
res.push_back(static_cast<double>(instruction_data.offset_skew_per_inst));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_offset_skew_per_inst");
res.push_back(static_cast<double>(instruction_data.offset_kurt_per_inst));
TryPush(s_vector, s_base + "inst_" + InstTypeToString(inst_type) + "_offset_kurt_per_inst");
}
// Check Size
assert(res.size() == FunctionControlFlowGraphData_FIELD_COUNT
+ FunctionCallGraphData_FIELD_COUNT
+ INST_TYPE_COUNT * InstructionData_FIELD_COUNT);
return res;
}
#define DECLARE_REF(name, value)\
const char name ## _txt[] = value;\
const const_string_ref name = {name ## _txt, sizeof name ## _txt - 1};
DECLARE_REF(g_format, "format");
void SetBlobText(yadiff::BinaryInfo_t& binary_info, const IModel& db)
{
std::vector<uint8_t> vector_1000;
// Get the .text segment
db.walk([&](const HVersion& segmentVersion)
{
if (segmentVersion.type() != OBJECT_TYPE_SEGMENT)
return WALK_CONTINUE;
std::string segmentName = make_string(segmentVersion.username());
if (segmentName.find(".text") == std::string::npos)
return WALK_CONTINUE;
binary_info.text_address = segmentVersion.address();
segmentVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& chunkVersion)
{
if (chunkVersion.type() != OBJECT_TYPE_SEGMENT_CHUNK)
return WALK_CONTINUE;
//res.reserve(chunkVersion.get_size());
chunkVersion.walk_blobs([&](offset_t offset, const void* data, size_t len)
{
UNUSED(offset);
const uint8_t* pi8Data = (const uint8_t*)data;
vector_1000 = std::vector<uint8_t>(pi8Data, pi8Data + len);
binary_info.blob.insert(binary_info.blob.end(), vector_1000.begin(), vector_1000.end());
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
}
/*@brief : Init Capstone handle
*/
BinaryInfo_t::BinaryInfo_t(const IModel& db, const yadiff::AlgoCfg& /*config*/)
: base_address(0)
, text_address(0)
, h_capstone(0)
, cs_error_val(CS_ERR_OK)
, cs_arch_val(CS_ARCH_MAX)
, cs_mode_val(CS_MODE_LITTLE_ENDIAN)
{
// 1: Get architecture, base_addr from database
db.walk([&](const HVersion& binaryVersion)
{
if (binaryVersion.type() != OBJECT_TYPE_BINARY)
return WALK_CONTINUE;
base_address = binaryVersion.address();
binaryVersion.walk_attributes([&](const const_string_ref& key, const const_string_ref& val)
{
if (!(key == g_format))
return WALK_CONTINUE;
strncpy(format, val.value, FORMAT_MAX_SIZE);
format[sizeof(format)-1] = '\0';
return WALK_STOP;
});
return WALK_CONTINUE;
});
// 1.2: Set blob text
SetBlobText(*this, db);
// 2: Branch on arch
if (strstr(format, "80386") != NULL)
{
cs_arch_val = CS_ARCH_X86;
cs_mode_val = CS_MODE_32;
}
else if (strstr(format, "AMD64") != NULL)
{
cs_arch_val = CS_ARCH_X86;
cs_mode_val = CS_MODE_64;
}
else if (strstr(format, "ARM64") != NULL)
{
cs_arch_val = CS_ARCH_ARM64;
cs_mode_val = CS_MODE_THUMB;
}
else if (strstr(format, "ARM") != NULL)
{
cs_arch_val = CS_ARCH_ARM;
cs_mode_val = CS_MODE_THUMB;
}
else if (strstr(format, "PowerPC") != NULL)
{
cs_arch_val = CS_ARCH_PPC;
cs_mode_val = CS_MODE_32;
}
else if (strstr(format, "MIPS") != NULL)
{
cs_arch_val = CS_ARCH_MIPS;
cs_mode_val = CS_MODE_32;
}
// 3: instantiate IArch
iarch_ptr = MakeArch(cs_arch_val, cs_mode_val);
// 4: Initialize capstone, 3 arg : Hardware arch, hardware mode, pointer to handle which is the output
cs_error_val = cs_open(cs_arch_val, cs_mode_val, &h_capstone);
if (cs_error_val != CS_ERR_OK)
{
return;
}
cs_option(h_capstone, CS_OPT_DETAIL, CS_OPT_ON);
}
BinaryInfo_t::~BinaryInfo_t()
{
cs_close(&h_capstone);
}
} // End namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign/VectorTypes.hpp
================================================
#pragma once
#include "YaTypes.hpp"
// Get IArch callback
#include "IArch.hpp"
// Config, logger
#include "../Algo.hpp"
#include <capstone/capstone.h>
#include <memory>
#include <vector>
#include <string>
namespace yadiff
{
#define DEFAULT_DOUBLE -1
typedef std::vector<double> Vector;
typedef std::vector<Vector> Matrix;
//
struct FunctionControlFlowGraphData_t
{
int bb_nb; // 1 Number of Basic Blocks -1 for undefined (do not forget to increase that)
int edge_nb; // 2 Number of edges
int ret_nb; // 3 Number of return BB (or exit points)
int inst_nb; // 4 TODO Number of instructions
int jcc_nb; // 5 Number of BB with 2 BB Sons
int back_edge_nb; // 6 Number of edges visiting a yet visited location in the horizontal walk
int diamond_nb; // 7 Number of edges going to bb visited at this same horizontal level (distance to root). Like hybridization in bio.
int size; // 8 Size of the function (in bytes)
double size_disp; // 9 Size dispersion = Variance of the size distribution of my BB in byte (it is a square)
int height; // 10 Number (maximum without going back) of BB to cross from fct entry to fct ret.
double height_disp; // 11 Height dispersion, Variance of the distance to ret of my BB set (not a square)
int width; // 12 Number (maximum) of BB at the same distance from the BB entry.
double width_disp; // 13 Variance of the graph width, average on all dist_to_root levels.*
int flat_len; // 14 TODO Len (in instruction number) of the flatten vector (~ Min inst number from top to bottom°)
};
#define FunctionControlFlowGraphData_FIELD_COUNT 14
//
struct FunctionCallGraphData_t
{
int in_degree; // 1 The number of functions calling this one (if a function calls me twice, i count it twice)
int out_degree; // 2 The number of functions called by me (one function can be counted twice also)
int dist_to_root; // 3 The shortest distance from an entry point = a function without parents (a god function)
int dist_to_leave; // 4 The shortest distance to the leave = a function without children
// TODO Get the longest ??
int arg_nb; // 5 The number of arguments the function receives. Hopefully I get the from IDA.
int lib_nb; // 6 Number of calls to a library
};
#define FunctionCallGraphData_FIELD_COUNT 6
//
struct InstructionData_t
{
// TODO get the main frequencies (fft) per inst.
int total; // 1 Total number of inst
double mean_per_bb; // 2 The mean number of instruction
double variance_per_bb; // 3 The dispersion around the mean number of instruction per bb
double offset_mean_per_inst; // 4 The mean offset of inst
double offset_variance_per_inst; // 5 The mean disp of inst
double offset_skew_per_inst; // 6
double offset_kurt_per_inst; // 7
};
#define InstructionData_FIELD_COUNT 7
// 0: The function scalars
struct FunctionData_t
{
FunctionControlFlowGraphData_t cfg;
FunctionCallGraphData_t cg;
InstructionData_t insts[INST_TYPE_COUNT];
};
#define FORMAT_MAX_SIZE 256
class BinaryInfo_t
{
public:
offset_t base_address;
offset_t text_address;
char format[FORMAT_MAX_SIZE+1];
std::vector<uint8_t> blob;
csh h_capstone;
cs_err cs_error_val;
cs_arch cs_arch_val;
cs_mode cs_mode_val;
std::shared_ptr<IArch> iarch_ptr;
BinaryInfo_t(const IModel& db, const yadiff::AlgoCfg& config);
~BinaryInfo_t();
};
std::vector<double> FunctionData2Vector(const FunctionData_t& function_data,
std::vector<std::string>* s_vector, std::string s_base);
} // End of namespace yadiff
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign.cpp
================================================
/*
Signature comparing aims to match functions based on some quantificables data on these functions. Those data are gathered in a structure that we call a signature YaDiffVectorSign::FunctionSignature_T defined in YaDiffVectorSign.hpp
.....
*/
#include "VectorSign.hpp"
#include "VectorSign/VectorHelpers.hpp"
#include "VectorSign/VectorTypes.hpp"
#include "VectorSign/VectorDistance.hpp"
#include "VectorSign/InstructionVector.hpp"
#include "VectorSign/IArch.hpp"
#include "Algo.hpp"
#include "HVersion.hpp"
#include "VersionRelation.hpp"
#include "Helpers.h"
#include "Yatools.hpp"
#include <algorithm> // for max, transform (ie:add 2 vectors)
#include <sstream>
#include <limits.h>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <fstream>
#include <memory>
#ifdef UGLY_INCLUDE_IDA
#include "Ida.h" // for FUNC_LIB
#else
#define FUNC_LIB 0x00000004 ///< Library function
#endif
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("vector_sign", (FMT), ## __VA_ARGS__)
namespace
{
/* BB SIGN,
The minimum info I need to store for each BB to be able to get new data
for the fct CFG
*/
struct BasicBlockSignature_t
{
BasicBlockSignature_t()
: dist_to_root (INT_MAX)
, dist_to_leave(0)
, size (0)
, addr (0)
{
}
int dist_to_root; // Shortest distance to the fct first BB (0 for the first BB)
int dist_to_leave; // Shortest distance to the closest ret (0 for a ret BB).
int size; // Size in byte, to calculate size dispersion.
int addr; // The offset in the function for one matching system (the default for now)
};
/* FUNCTION SIGNATURE
Is a pool of quantifiable data on a function.
*/
struct FunctionSignature_t
{
const_string_ref name; // The user defined name
YaToolObjectId firstBBId; // The ID of its first basic block, to begin the horizontal walk.
YaToolObjectId fctId; // The ID of this function, to enable easy lookup
offset_t addr; // Addr (or offset) of the function in the binary as int (unsigned)
std::vector <YaToolObjectId> parents; // The pointers to the parents functions
std::vector <YaToolObjectId> children; // The pointers to the children functions
std::map<int, std::vector<YaToolObjectId>> equiLevelMap; // for joining BBs
yadiff::FunctionData_t function_data;
std::vector<double> vector;
std::vector<double> concatenated_vector;
};
// Basic Block Map
typedef std::map<YaToolObjectId, BasicBlockSignature_t> BasicBlockSignatureMap_t;
// Function Map : between a function ID and its signature
typedef std::map<YaToolObjectId, FunctionSignature_t> FunctionSignatureMap_t;
// TODO must be used uin vectordistance -> VectorDeterministicDistance
// Database stored info
struct VectorSignDatabase
{
FunctionSignatureMap_t functionSignatureMap;
yadiff::VectorTree_t idTree; // Used as a tree, same vector = same group
yadiff::VectorSignatureSet_t vectSet;
yadiff::VectorGroups_t vectorGroups;
const IModel* pDb;
};
struct VectorSignAlgo : public yadiff::IDiffAlgo
{
VectorSignAlgo(const yadiff::AlgoCfg& config);
bool Prepare(const IModel& db1, const IModel& db2) override;
bool Analyse(const yadiff::OnRelationFn& output, const yadiff::RelationWalkerfn& input) override;
const char* GetName() const override;
// Get width and height of the fctVersion, store in the map
bool ControlFlowGraphHorizontalWalk(const HVersion& fctVersion, const HVersion& firstBBVersion, FunctionSignatureMap_t& functionSignatureMap);
// Calculate the function parameters, used for signing it (BB nb, edge nb, call nb, ret nb ..)
void SetFunctionFields(const HVersion& fctVersion, FunctionSignatureMap_t& fsMap);
// The Main prepare function, create a signature for all function and store it in a map (now global)
void CreateFunctionSignatureMap(FunctionSignatureMap_t& functionSignatureMap, const IModel& db, const yadiff::AlgoCfg& config);
// TODO
// void MakeGroups(FunctionSignatureMap_t fsMap, VectorTree_t fctGroup);
// Calculate the distance to root or leave in the call Graph for all fcts.
void CalculateAllFunctionDistanceToLeave(FunctionSignatureMap_t& functionSignatureMap);
void CalculateAllFunctionDistanceToRoot(FunctionSignatureMap_t& functionSignatureMap, const IModel& db1);
// Print some data of the FunctionSIgnature or just the name of these data if bIsFirstLine
void PrintFunctionSignature(std::ostream& dst, const FunctionSignature_t& functionSignature, bool is_first_line, std::vector<std::string>* pconcatenated_string);
// Print the map, recursively calling PrintFunctionSign
void PrintFunctionSignatureMap(const FunctionSignatureMap_t& functionSignatureMap);
// TODO must return something, see YaDiff relations currently, just printing them
void GetAllFunctionRelation(const yadiff::OnRelationFn& output, const yadiff::VectorGroups_t& vectorGroups1, const yadiff::VectorTree_t& fctGroup2);
void LookupVersionFormId(HVersion& hObjectVersion, const YaToolObjectId& yaToolObjectId, const IModel& db);
private:
VectorSignDatabase vectorSignDatabase1;
VectorSignDatabase vectorSignDatabase2;
const yadiff::AlgoCfg& config_;
};
}
std::shared_ptr<yadiff::IDiffAlgo> yadiff::MakeVectorSignAlgo(const yadiff::AlgoCfg& config)
{
return std::make_shared<VectorSignAlgo>(config);
}
const char* VectorSignAlgo::GetName() const{
return "VectorSignAlgo";
}
VectorSignAlgo::VectorSignAlgo(const yadiff::AlgoCfg& config)
: config_(config)
{
}
// Entry Point 0
bool VectorSignAlgo::Prepare(const IModel& db1, const IModel& db2)
{
LOG(INFO, "Prepare : matching %zd objects version to %zd objects version\n", db1.size(), db2.size());
// Init class databases
vectorSignDatabase1.pDb = &db1;
vectorSignDatabase2.pDb = &db2;
LOG(INFO, "Treat First database\n");
CreateFunctionSignatureMap(vectorSignDatabase1.functionSignatureMap, db1, config_);
// Log when wait
if (config_.VectorSign.mapDestination != NULL)
{
LOG(INFO, "MaxLow then Min Hight \n");
PrintFunctionSignatureMap(vectorSignDatabase1.functionSignatureMap);
}
return true;
}
bool VectorSignAlgo::Analyse(const yadiff::OnRelationFn& output, const yadiff::RelationWalkerfn& input)
{
UNUSED(input);
LOG(INFO, "Analyse\n");
GetAllFunctionRelation(output, vectorSignDatabase1.vectorGroups, vectorSignDatabase1.idTree);
return true;
}
void VectorSignAlgo::LookupVersionFormId(HVersion& hObjectVersion, const YaToolObjectId& yaToolObjectId, const IModel& db)
{
hObjectVersion = db.get(yaToolObjectId);
}
// Currently just print, with one database.
void VectorSignAlgo::GetAllFunctionRelation(const yadiff::OnRelationFn& output, const yadiff::VectorGroups_t& vectorGroups1, const yadiff::VectorTree_t& fctGroup2)
{
Relation relation;
memset(&relation, 0, sizeof relation);
relation.confidence_ = RELATION_CONFIDENCE_MIN;
relation.type_ = RELATION_TYPE_VECTOR_SIGN;
relation.direction_ = RELATION_DIRECTION_BOTH;
// For all vectors in db1
for (const auto& it : vectorGroups1)
{
// distance to closest
double closestDistance = std::numeric_limits<double>::max();
YaToolObjectId closestId = 0;
auto& fctSign = vectorSignDatabase1.functionSignatureMap[it.first];
// For all groups in db2 containing this vector
for (const auto& groupId : it.second)
{
auto it2 = fctGroup2.find(groupId);
// If nobody in db2 group, forget it
if (it2 == fctGroup2.end())
continue;
// TODO vectorSign not existing so I commented. Put all that in distance.
// yadiff::GetClosestVectorIdNaive(closestId, closestDistance, fctSign.vectorSign, it2->second, vectorSignDatabase1.vectSet);
}
if (closestId == 0)
continue;
if (closestDistance == 0)
{
relation.confidence_ = RELATION_CONFIDENCE_MAX;
}
else if (closestDistance <= 2)
{
relation.confidence_ = RELATION_CONFIDENCE_MIN;
}
LookupVersionFormId(relation.version1_, fctSign.fctId, *vectorSignDatabase1.pDb);
LookupVersionFormId(relation.version2_, closestId , *vectorSignDatabase2.pDb);
output(relation);
} // End for all vectors in db1
}
#include <iostream>
// I create a equilevelMap, now I must use it. // Todo (Out, In)
bool VectorSignAlgo::ControlFlowGraphHorizontalWalk(const HVersion& fctVersion, const HVersion& firstBBVersion, FunctionSignatureMap_t& functionSignatureMap)
{
std::queue<HVersion> bb_to_visit_now;
std::map<int, std::vector<YaToolObjectId>> equiLevelMap;
std::vector<int> height_vector; // the dist_to_root of all leaves
std::vector<int> size_vector; // TODO not used : the size of all bb
BasicBlockSignatureMap_t bbsMap;
auto& fctSign = functionSignatureMap[fctVersion.id()];
auto& function_data = fctSign.function_data;
// 1/ Init basicBlocksMap for all BB set dist to root = infinity
fctVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& fctSonVersion)
{
if (fctSonVersion.type() == OBJECT_TYPE_BASIC_BLOCK)
bbsMap[fctSonVersion.id()].dist_to_root = std::numeric_limits<int>::max();
return WALK_CONTINUE;
});
// 2/ Init the queue
bbsMap[firstBBVersion.id()].dist_to_root = 0;
bb_to_visit_now.push(firstBBVersion);
// 3/ Recursively mark all BB (just onces)
// While there is no edge to visit:
while (!bb_to_visit_now.empty())
{
// Retrieve the bbVersion
const auto bbVersion = bb_to_visit_now.front();
bb_to_visit_now.pop();
const auto bbId = bbVersion.id();
int& iFatherDistToRoot = bbsMap[bbId].dist_to_root;
// Distribution information gathering
bool bDoBBRet = true;
size_vector.push_back((int) bbVersion.size());
equiLevelMap[iFatherDistToRoot].push_back(bbId);
// For all called (children) Basic_block
bbVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& bbSonVersion)
{
if (bbSonVersion.type() != OBJECT_TYPE_BASIC_BLOCK)
return WALK_CONTINUE;
// Forget far jumpers.
if (bbSonVersion.address() < fctVersion.address()
|| bbSonVersion.address() > fctVersion.address() + fctVersion.size())
return WALK_CONTINUE;
int& iSonDistToRoot = bbsMap[bbSonVersion.id()].dist_to_root;
if (iSonDistToRoot != std::numeric_limits<int>::max())
{
if (iSonDistToRoot == iFatherDistToRoot + 1)
function_data.cfg.diamond_nb++;
else
function_data.cfg.back_edge_nb++;
return WALK_CONTINUE;
}
bDoBBRet = false;
iSonDistToRoot = iFatherDistToRoot + 1;
bb_to_visit_now.push(bbSonVersion);
return WALK_CONTINUE;
});
if (bDoBBRet)
height_vector.push_back(iFatherDistToRoot);
}
// TODO Get height min
function_data.cfg.height = *std::max_element(height_vector.begin(), height_vector.end()) + 1;
double height_mean = static_cast<double>(function_data.cfg.height) / height_vector.size();
function_data.cfg.height_disp = yadiff::GetVariance(height_vector, height_mean);
// Get the max width and the mean width
int summedWidth = 0;
for (const auto& it : equiLevelMap)
{
int crWidth = static_cast<int>(it.second.size());
summedWidth += crWidth;
function_data.cfg.width = std::max(function_data.cfg.width, crWidth);
}
// Get the width dispersion
double meanWidth = static_cast<double>(summedWidth) / equiLevelMap.size();
double summedWidthDisp = 0;
for (const auto& it : equiLevelMap )
{
summedWidthDisp += std::pow(it.second.size() - meanWidth, 2);
}
summedWidthDisp = std::sqrt(summedWidthDisp);
summedWidthDisp /= equiLevelMap.size();
function_data.cfg.width_disp = summedWidthDisp;
fctSign.equiLevelMap = equiLevelMap;
return true;
}
void VectorSignAlgo::SetFunctionFields(const HVersion& fctVersion, FunctionSignatureMap_t& fsMap)
{
const auto functionId = fctVersion.id();
auto& functionSignature = fsMap[functionId];
auto& function_data = functionSignature.function_data;
std::vector<int> bbSizeVector;
// Init some (easy) parameters, the rest was null initiated before by my caller
functionSignature.addr = fctVersion.address();
functionSignature.fctId = functionId;
function_data.cfg.size = static_cast<int>(fctVersion.size());
function_data.cfg.bb_nb = 0;
// Init Argument number
std::string prototype(fctVersion.prototype().value, fctVersion.prototype().size);
if (prototype == "")
function_data.cg.arg_nb = DEFAULT_DOUBLE;
else
{
function_data.cg.arg_nb = 1;
size_t npos = prototype.find(',', 0);
while (npos != prototype.npos)
{
function_data.cg.arg_nb++;
npos = prototype.find(',', npos+1);
}
}
// For all BB
fctVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& fctSonVersion)
{
if (fctSonVersion.type() != OBJECT_TYPE_BASIC_BLOCK)
return WALK_CONTINUE;
// If first bb
// Set the first BB
// Set function Name that is wirtten in its first BB
if (fctVersion.address() == fctSonVersion.address())
{
functionSignature.firstBBId = fctSonVersion.id();
functionSignature.name = fctSonVersion.username();
if (functionSignature.name.size == 0 || functionSignature.name.value == NULL)
{
functionSignature.name.size = 7;
functionSignature.name.value = "noName";
}
}
// Increase BB number
function_data.cfg.bb_nb++;
// Add the size of current BB for the size dispersion
bbSizeVector.push_back((int) fctSonVersion.size());
// We suppose that this is a return BB, if we find him a son, we will set that to false
// We also suppose that it has no son. If it has one and I found an other, it will be a jcc block.
bool bDoBBRet = true;
bool bHasBBOneBBSon = false;
// For all son of BB
fctSonVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& bbSonVersion)
{
// This basic block calls
if (bbSonVersion.type() == OBJECT_TYPE_FUNCTION)
{
const auto childId = bbSonVersion.id();
auto& childFunctionSign = fsMap[childId];
// Add 1 to the out degree of current function
function_data.cg.out_degree++;
functionSignature.children.push_back(childId);
// Add 1 to the in degree of the called function
// And add current function to the parents of the called function
childFunctionSign.function_data.cg.in_degree++;
childFunctionSign.parents.push_back(functionId);
// Check if it is a library function (imported)
if (bbSonVersion.flags() & FUNC_LIB)
function_data.cg.lib_nb++;
}
// This basic block Jmp or Jcc to an other.
else if (bbSonVersion.type() == OBJECT_TYPE_BASIC_BLOCK)
{
// One more edge in a CFG
function_data.cfg.edge_nb++;
// This BB has a son, so it is not a ret BB
bDoBBRet = false;
// If it has one son yet, it is a JCC.
if (bHasBBOneBBSon)
function_data.cfg.jcc_nb++;
else
bHasBBOneBBSon = true;
}
return WALK_STOP;
}); // End of BB son xRef
if (bDoBBRet)
function_data.cfg.ret_nb++;
return WALK_STOP;
}); // End crfunction xRefs loop
// Calculate size_disp
double mean_size = function_data.cfg.size / function_data.cfg.bb_nb;
for (int i : bbSizeVector)
function_data.cfg.size_disp += std::pow(i - mean_size, 2);
function_data.cfg.size_disp /= function_data.cfg.bb_nb;
}
void VectorSignAlgo::CalculateAllFunctionDistanceToLeave(FunctionSignatureMap_t& functionSignatureMap)
{
std::vector<YaToolObjectId> fcts_to_visit_parent_now;
std::vector<YaToolObjectId> fcts_to_visit_parent_later;
// INIT: set 0 to leaves and infinity to the rest (infinity is supp to everything
for (auto& it : functionSignatureMap)
{
auto& crFunctionSign = it.second;
if (0 == crFunctionSign.function_data.cg.out_degree)
{
crFunctionSign.function_data.cg.dist_to_leave = 0;
fcts_to_visit_parent_now.push_back(crFunctionSign.fctId);
}
else
{
crFunctionSign.function_data.cg.dist_to_leave = 0xFFFF;
}
}
// LOOP
while (!fcts_to_visit_parent_now.empty())
{
const auto crFunctionId = fcts_to_visit_parent_now.back();
fcts_to_visit_parent_now.pop_back();
auto& crFunctionSign = functionSignatureMap[crFunctionId];
// for all parents
for (const auto parent_id : crFunctionSign.parents)
{
auto& parentFunctionSign = functionSignatureMap[parent_id];
if (parentFunctionSign.function_data.cg.dist_to_leave > crFunctionSign.function_data.cg.dist_to_leave + 1)
{
parentFunctionSign.function_data.cg.dist_to_leave = crFunctionSign.function_data.cg.dist_to_leave + 1;
fcts_to_visit_parent_later.push_back(parent_id);
}
} // End for all parents
if (fcts_to_visit_parent_now.empty())
{
fcts_to_visit_parent_now = fcts_to_visit_parent_later;
fcts_to_visit_parent_later.clear();
}
} // End while the known_vector is not null
}
void VectorSignAlgo::CalculateAllFunctionDistanceToRoot(FunctionSignatureMap_t& functionSignatureMap, const IModel& db1)
{
std::vector<YaToolObjectId> fcts_to_visit_children_now = {};
std::vector<YaToolObjectId> fcts_to_visit_children_later = {};
// INIT: Give the roots a dist_to_root = 0 and infinity to the rest
for (auto& it : functionSignatureMap)
{
auto& crFunctionSign = it.second;
if (0 == crFunctionSign.function_data.cg.in_degree)
{
crFunctionSign.function_data.cg.dist_to_root = 0;
fcts_to_visit_children_now.push_back(crFunctionSign.fctId);
}
else
{
crFunctionSign.function_data.cg.dist_to_root = 0xFFFF;
}
}
// LOOP
while (!fcts_to_visit_children_now.empty())
{
const auto crFunctionId = fcts_to_visit_children_now.back();
fcts_to_visit_children_now.pop_back();
auto & crFunctionSign2 = functionSignatureMap[crFunctionId];
const auto crFctVersion = db1.get(crFunctionId);
// For all BB
crFctVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& fctSonVersion)
{
if (fctSonVersion.type() != OBJECT_TYPE_BASIC_BLOCK)
return WALK_CONTINUE;
// For all called (children) function
fctSonVersion.walk_xrefs_from([&](offset_t /*offset*/, operand_t /*operand*/, const HVersion& bbSonVersion)
{
if (bbSonVersion.type() != OBJECT_TYPE_FUNCTION)
return WALK_CONTINUE;
const auto child_id = bbSonVersion.id();
auto& childFunctionSign = functionSignatureMap[child_id];
// Change the dist_to_root (to lower)
if (childFunctionSign.function_data.cg.dist_to_root > crFunctionSign2.function_data.cg.dist_to_root + 1)
{
childFunctionSign.function_data.cg.dist_to_root = crFunctionSign2.function_data.cg.dist_to_root + 1;
fcts_to_visit_children_later.push_back(child_id);
}
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
// Set the fcts to visit to the next level
if (fcts_to_visit_children_now.empty())
{
fcts_to_visit_children_now = fcts_to_visit_children_later;
fcts_to_visit_children_later.clear();
}
} // End while the known_vector is not null
// Correct default value
for (auto& it : functionSignatureMap)
{
auto& crFunctionSign = it.second;
if (crFunctionSign.function_data.cg.dist_to_root == 0xFFFF)
crFunctionSign.function_data.cg.dist_to_root = DEFAULT_DOUBLE;
}
}
void VectorSignAlgo::PrintFunctionSignature(std::ostream& dst, const FunctionSignature_t& functionSignature, bool is_first_line, std::vector<std::string>* pconcatenated_string)
{
// 0: Name of the function
if (is_first_line)
dst << "#Name: ";
else
dst << functionSignature.name.value << ": ";
// 0.1 Addr of the function
if (is_first_line)
dst << "addr, ";
else
dst << "0x" << std::hex << functionSignature.addr << ", ";
// 2: Global Scalars
if (is_first_line)
{
for (std::string s : *pconcatenated_string)
{
dst << s << ",";
}
}
else
{
for (double d : functionSignature.concatenated_vector)
{
dst << d << ",";
}
}
dst << std::endl;
}
void CreateConcatenatedString(std::vector<std::string>* concatenated_string);
void VectorSignAlgo::PrintFunctionSignatureMap(const FunctionSignatureMap_t& functionSignatureMap)
{
std::ofstream output;
FunctionSignature_t function_signature;
std::vector<std::string> concatenated_string;
CreateConcatenatedString(&concatenated_string);
output.open(config_.VectorSign.mapDestination);
PrintFunctionSignature(output, function_signature, true, &concatenated_string);
for (const auto& it : functionSignatureMap)
{
PrintFunctionSignature(output, it.second, false, NULL);
}
}
// return matrix_col[col][line] = matrix_line[line][col]
yadiff::Matrix InvertMatrix(yadiff::Matrix matrix_line)
{
yadiff::Matrix matrix_col = yadiff::Matrix();
// TODO escape if null
// Create a vector for each col
int line_size = static_cast<int>(matrix_line[0].size());
int col_size = static_cast<int>(matrix_line.size());
for (auto& coord1 : matrix_line[0])
{
UNUSED(coord1);
matrix_col.push_back(yadiff::Vector(col_size, 0));
}
// Fill
for (int line = 0; line < line_size; line++)
{
for (int col = 0; col < col_size; col++)
{
matrix_col[line][col] = matrix_line[col][line];
}
}
return matrix_col;
}
void ConcatenateFamilly(FunctionSignature_t& function_signature,
yadiff::Matrix& matrix_line)
{
int size = static_cast<int>(function_signature.vector.size());
// 1.15: If I have no parents make a null
// TODO make an other branch ?,
if (matrix_line.size() == 0)
{
matrix_line.push_back(yadiff::Vector(size, 0));
}
std::vector<double> mean = std::vector<double>();
mean.reserve(size);
std::vector<double> median = std::vector<double>();
median.reserve(size);
std::vector<double> disp = std::vector<double>();
disp.reserve(size);
// 1.2: Invert matrix
yadiff::Matrix matrix_col = InvertMatrix(matrix_line);
// 1.3: Fill median mean, disp vectors
for (const yadiff::Vector col_vector : matrix_col)
{
median.push_back(yadiff::GetMedian(col_vector));
double coordinate_mean = yadiff::GetMean(col_vector);
mean.push_back(coordinate_mean);
disp.push_back(yadiff::GetVariance(col_vector, coordinate_mean));
}
// 1.4 Concatenate
function_signature.concatenated_vector.insert(function_signature.concatenated_vector.end(),
median.begin(), median.end());
function_signature.concatenated_vector.insert(function_signature.concatenated_vector.end(),
mean.begin(), mean.end());
function_signature.concatenated_vector.insert(function_signature.concatenated_vector.end(),
disp.begin(), disp.end());
}
void CreateConcatenatedVector(FunctionSignatureMap_t& functionSignatureMap)
{
// Get all vector
for (auto& it : functionSignatureMap)
{
FunctionSignature_t& function_signature = it.second;
function_signature.vector = FunctionData2Vector(function_signature.function_data, NULL, "");
}
// For all function
for (auto& it: functionSignatureMap)
{
FunctionSignature_t& function_signature = it.second;
// 0: Me
function_signature.concatenated_vector = function_signature.vector;
// 1: Father
// 1.1: Get matrix
yadiff::Matrix matrix_line = std::vector<std::vector<double>>();
for (auto& parent_id : function_signature.parents)
{
std::vector<double> parent_vector = functionSignatureMap[parent_id].vector;
matrix_line.push_back(parent_vector);
}
// 1.2 Conc
ConcatenateFamilly(function_signature, matrix_line);
// 2: Child
// 2.1: Get matrix
matrix_line = std::vector<std::vector<double>>();
for (auto& child_id : function_signature.children)
{
std::vector<double> child_vector = functionSignatureMap[child_id].vector;
matrix_line.push_back(child_vector);
}
// 2.2 Conc
ConcatenateFamilly(function_signature, matrix_line);
}
}
void CreateConcatenatedString(std::vector<std::string>* concatenated_string)
{
yadiff::FunctionData_t null_function_data;
FunctionData2Vector(null_function_data, concatenated_string, "");
FunctionData2Vector(null_function_data, concatenated_string, "father_median_");
FunctionData2Vector(null_function_data, concatenated_string, "father_mean_");
FunctionData2Vector(null_function_data, concatenated_string, "father_disp_");
FunctionData2Vector(null_function_data, concatenated_string, "child_median_");
FunctionData2Vector(null_function_data, concatenated_string, "child_mean_");
FunctionData2Vector(null_function_data, concatenated_string, "child_disp_");
}
void VectorSignAlgo::CreateFunctionSignatureMap(FunctionSignatureMap_t& functionSignatureMap, const IModel& db, const yadiff::AlgoCfg& config)
{
yadiff::BinaryInfo_t binary_info = yadiff::BinaryInfo_t(db, config);
// 1/ Create : For all functions : Create an entry in the signatureMap
db.walk([&](const HVersion& fctVersion)
{
if (fctVersion.type() == OBJECT_TYPE_FUNCTION)
functionSignatureMap[fctVersion.id()] = FunctionSignature_t();
return WALK_CONTINUE;
});
// 2/ Fill
db.walk([&](const HVersion& fctVersion)
{
if (fctVersion.type() != OBJECT_TYPE_FUNCTION)
return WALK_CONTINUE;
// TODO Log function
// 2.1/ Set the internal fields (global)
SetFunctionFields(fctVersion, functionSignatureMap);
// 2.2/ Walk horizontally the control flow.
const auto firstBBId = functionSignatureMap[fctVersion.id()].firstBBId;
ControlFlowGraphHorizontalWalk(fctVersion, db.get(firstBBId), functionSignatureMap);
// 2.3/ Set the disassembly fields (semantic)
// TODO remove functionSignature from here
auto& functionSignature = functionSignatureMap[fctVersion.id()];
LOG(INFO, "Treating function : %08x called: %s\n",
static_cast<unsigned int>(functionSignature.addr), functionSignature.name.value);
SetDisassemblyFields(functionSignature.function_data, fctVersion, functionSignature.equiLevelMap, binary_info);
return WALK_CONTINUE;
});
// 3/ Call graph
CalculateAllFunctionDistanceToLeave(functionSignatureMap);
CalculateAllFunctionDistanceToRoot(functionSignatureMap, db);
// 4/ Father and Son
CreateConcatenatedVector(functionSignatureMap);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/VectorSign.hpp
================================================
#pragma once
namespace std { template<typename T> class shared_ptr; }
namespace yadiff { struct IDiffAlgo; }
namespace yadiff { struct AlgoCfg; }
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeVectorSignAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/XRefOffsetMatch.cpp
================================================
#include "XRefOffsetMatch.hpp"
#include "Algo.hpp"
#include "Yatools.hpp"
#include "Helpers.h"
#include <Signature.hpp>
#include <VersionRelation.hpp>
#include <vector>
#include <memory>
#include <chrono>
#include <thread>
#if 0
#define LOG(LEVEL, FMT, ...) CONCAT(YALOG_, LEVEL)("xref", (FMT), ## __VA_ARGS__)
#else
#define LOG(LEVEL, FMT, ...) do {} while(0)
#endif
namespace yadiff
{
#define ASSOCIATE_DATA 1
class XRefOffsetMatchAlgo: public IDiffAlgo
{
public:
XRefOffsetMatchAlgo(const AlgoCfg& config);
/*
* prepares input signature databases
*/
bool Prepare(const IModel& db1, const IModel& db2) override;
/*
* uses previously registered signature databases and input version relations
* to compute a new version relation vector
*/
bool Analyse(const OnRelationFn& output, const RelationWalkerfn& input) override;
const char* GetName() const override;
private:
const IModel* pDb1_;
const IModel* pDb2_;
};
std::shared_ptr<IDiffAlgo> MakeXRefOffsetMatchAlgo(const AlgoCfg& config)
{
return std::make_shared<XRefOffsetMatchAlgo>(config);
}
const char* XRefOffsetMatchAlgo::GetName() const{
return "XRefOffsetMatchAlgo";
}
XRefOffsetMatchAlgo::XRefOffsetMatchAlgo(const AlgoCfg& config)
: pDb1_(nullptr)
, pDb2_(nullptr)
{
UNUSED(config);
}
bool XRefOffsetMatchAlgo::Prepare(const IModel& db1, const IModel& db2)
{
pDb1_ = &db1;
pDb2_ = &db2;
return true;
}
bool XRefOffsetMatchAlgo::Analyse(const OnRelationFn& output, const RelationWalkerfn& input)
{
/**
* *If offsets are available:
* Take XRefs from the local object
* for each XRef, use the offset and resolve the associated object
* for the object to associate, we take the version that matches the system of the parent (Xrefing) object
* If the signature of the resolved object does not match :
* If already associated, this means that the local function changed its call to another function : set the caller as RELATION_TYPE_DIFF_CALL
* otherwise, use RELATION_TYPE_DIFF (see later)
* for the resolved object, if the signature matches
* Use RELATION_TYPE_EXACT_MATCH (overwrite any other relation already set)
* If it has XRefs, add it to ObjectsToVisit
*
* TODO : if the signature of the called function do not match, set the association as a possibility, with a score of 1
* Anytime this potential association is found, increase the score
* If an exact match is found, use it as the real association
* At the end, if there is only one possibility, or if the score of one possibility is really higher than the other's, use it
* The first part (counting) is implemented. The end (choose between the possibilities) is not.
*
* *If offsets are not available:
* see what YaDiff did...
*/
if(pDb1_ == nullptr)
return false;
if(pDb2_ == nullptr)
return false;
Relation new_relation;
memset(&new_relation, 0, sizeof new_relation);
new_relation.confidence_ = RELATION_CONFIDENCE_MAX;
new_relation.type_ = RELATION_TYPE_EXACT_MATCH;
new_relation.direction_ = RELATION_DIRECTION_BOTH;
// iterate over all previously computed relation
input([&](const Relation& relation)
{
if(relation.flags_ & AF_XREF_OFFSET_DONE)
return true;
if(relation.type_ != RELATION_TYPE_EXACT_MATCH)
return true;
// set relation as treated
Relation tmp = relation;
tmp.flags_ |= AF_XREF_OFFSET_DONE;
output(tmp);
// use exact match only
if(relation.type_ != RELATION_TYPE_EXACT_MATCH)
return true;
if(!relation.version1_.has_xrefs())
return true;
// for each xref from obj1
relation.version1_.walk_xrefs_from([&](offset_t local_offset, operand_t local_operand, const HVersion& local_version)
{
relation.version2_.walk_xrefs_from([&](offset_t remote_offset, operand_t remote_operand, const HVersion& remote_version)
{
if(local_offset != remote_offset)
return WALK_CONTINUE;
if(local_operand != remote_operand)
return WALK_CONTINUE;
if(local_version.type() != remote_version.type())
return WALK_STOP;
if (local_version.match(remote_version))
{
LOG(INFO, "XROMA: from %llx(%s) <-> %llx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
LOG(INFO, "XROMA: --> associate %llx(%s) <-> %llx(%s)", localVer.address(), localVer.username().value, remoteVer.address(), remoteVer.username().value);
new_relation.version1_ = local_version;
new_relation.version2_ = remote_version;
output(new_relation);
}
else
{
#if ASSOCIATE_DATA
if(!local_version.has_signatures() && !remote_version.has_signatures())
{
LOG(INFO, "XROMA DATA: from %llx(%s) <-> %llx(%s)\n", relation.version1_.address(), relation.version1_.username().value, relation.version2_.address(), relation.version2_.username().value);
LOG(INFO, "XROMA DATA: --> associate %llx(%s) <-> %llx(%s)", localVer.address(), localVer.username().value, remoteVer.address(), remoteVer.username().value);
new_relation.version1_ = local_version;
new_relation.version2_ = remote_version;
output(new_relation);
}
#endif
}
return WALK_CONTINUE;
});
return WALK_CONTINUE;
});
return true;
});
return true;
}
}
================================================
FILE: YaDiff/YaDiffLib/Algo/XRefOffsetMatch.hpp
================================================
#pragma once
namespace std { template<typename T> class shared_ptr; }
class IDiffAlgo;
struct AlgoCfg;
namespace yadiff
{
std::shared_ptr<IDiffAlgo> MakeXRefOffsetMatchAlgo(const AlgoCfg& config);
}
================================================
FILE: YaDiff/YaDiffLib/Algo/json.hpp
================================================
/*
__ _____ _____ _____
__| | __| | | | JSON for Modern C++
| | |__ | | | | | | version 2.1.1
|_____|_____|_____|_|___| https://github.com/nlohmann/json
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
Copyright (c) 2013-2017 Niels Lohmann <http://nlohmann.me>.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef NLOHMANN_JSON_HPP
#define NLOHMANN_JSON_HPP
#include <algorithm> // all_of, copy, fill, find, for_each, generate_n, none_of, remove, reverse, transform
#include <array> // array
#include <cassert> // assert
#include <ciso646> // and, not, or
#include <clocale> // lconv, localeconv
#include <cmath> // isfinite, labs, ldexp, signbit
#include <cstddef> // nullptr_t, ptrdiff_t, size_t
#include <cstdint> // int64_t, uint64_t
#include <cstdlib> // abort, strtod, strtof, strtold, strtoul, strtoll, strtoull
#include <cstring> // memcpy, strlen
#include <forward_list> // forward_list
#include <functional> // function, hash, less
#include <initializer_list> // initializer_list
#include <iomanip> // hex
#include <iosfwd> // istream, ostream
#include <iterator> // advance, begin, back_inserter, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator
#include <limits> // numeric_limits
#include <locale> // locale
#include <map> // map
#include <memory> // addressof, allocator, allocator_traits, unique_ptr
#include <numeric> // accumulate
#include <sstream> // stringstream
#include <string> // getline, stoi, string, to_string
#include <type_traits> // add_pointer, conditional, decay, enable_if, false_type, integral_constant, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_default_constructible, is_enum, is_floating_point, is_integral, is_nothrow_move_assignable, is_nothrow_move_constructible, is_pointer, is_reference, is_same, is_scalar, is_signed, remove_const, remove_cv, remove_pointer, remove_reference, true_type, underlying_type
#include <utility> // declval, forward, make_pair, move, pair, swap
#include <valarray> // valarray
#include <vector> // vector
// exclude unsupported compilers
#if defined(__clang__)
#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
#endif
#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900
#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
#endif
#endif
// disable float-equal warnings on GCC/clang
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wfloat-equal"
#endif
// disable documentation warnings on clang
#if defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdocumentation"
#endif
// allow for portable deprecation warnings
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
#define JSON_DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define JSON_DEPRECATED __declspec(deprecated)
#else
#define JSON_DEPRECATED
#endif
// allow to disable exceptions
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && not defined(JSON_NOEXCEPTION)
#define JSON_THROW(exception) throw exception
#define JSON_TRY try
#define JSON_CATCH(exception) catch(exception)
#else
#define JSON_THROW(exception) std::abort()
#define JSON_TRY if(true)
#define JSON_CATCH(exception) if(false)
#endif
// manual branch prediction
#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
#define JSON_LIKELY(x) __builtin_expect(!!(x), 1)
#define JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define JSON_LIKELY(x) x
#define JSON_UNLIKELY(x) x
#endif
/*!
@brief namespace for Niels Lohmann
@see https://github.com/nlohmann
@since version 1.0.0
*/
namespace nlohmann
{
template<typename = void, typename = void>
struct adl_serializer;
// forward declaration of basic_json (required to split the class)
template<template<typename U, typename V, typename... Args> class ObjectType =
std::map,
template<typename U, typename... Args> class ArrayType = std::vector,
class StringType = std::string, class BooleanType = bool,
class NumberIntegerType = std::int64_t,
class NumberUnsignedType = std::uint64_t,
class NumberFloatType = double,
template<typename U> class AllocatorType = std::allocator,
template<typename T, typename SFINAE = void> class JSONSerializer =
adl_serializer>
class basic_json;
// Ugly macros to avoid uglier copy-paste when specializing basic_json
// This is only temporary and will be removed in 3.0
#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
template<template<typename, typename, typename...> class ObjectType, \
template<typename, typename...> class ArrayType, \
class StringType, class BooleanType, class NumberIntegerType, \
class NumberUnsignedType, class NumberFloatType, \
template<typename> class AllocatorType, \
template<typename, typename = void> class JSONSerializer>
#define NLOHMANN_BASIC_JSON_TPL \
basic_json<ObjectType, ArrayType, StringType, BooleanType, \
NumberIntegerType, NumberUnsignedType, NumberFloatType, \
AllocatorType, JSONSerializer>
/*!
@brief unnamed namespace with internal helper functions
This namespace collects some functions that could not be defined inside the
@ref basic_json class.
@since version 2.1.0
*/
namespace detail
{
////////////////
// exceptions //
////////////////
/*!
@brief general exception of the @ref basic_json class
This class is an extension of `std::exception` objects with a member @a id for
exception ids. It is used as the base class for all exceptions thrown by the
@ref basic_json class. This class can hence be used as "wildcard" to catch
exceptions.
Subclasses:
- @ref parse_error for exceptions indicating a parse error
- @ref invalid_iterator for exceptions indicating errors with iterators
- @ref type_error for exceptions indicating executing a member function with
a wrong type
- @ref out_of_range for exceptions indicating access out of the defined range
- @ref other_error for exceptions indicating other library errors
@internal
@note To have nothrow-copy-constructible exceptions, we internally use
`std::runtime_error` which can cope with arbitrary-length error messages.
Intermediate strings are built with static functions and then passed to
the actual constructor.
@endinternal
@liveexample{The following code shows how arbitrary library exceptions can be
caught.,exception}
@since version 3.0.0
*/
class exception : public std::exception
{
public:
/// returns the explanatory string
const char* what() const noexcept override
{
return m.what();
}
/// the id of the exception
const int id;
protected:
exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}
static std::string name(const std::string& ename, int id)
{
return "[json.exception." + ename + "." + std::to_string(id) + "] ";
}
private:
/// an exception object as storage for error messages
std::runtime_error m;
};
/*!
@brief exception indicating a parse error
This excpetion is thrown by the library when a parse error occurs. Parse errors
can occur during the deserialization of JSON text, CBOR, MessagePack, as well
as when using JSON Patch.
Member @a byte holds the byte index of the last read character in the input
file.
Exceptions have ids 1xx.
name / id | example message | description
------------------------------ | --------------- | -------------------------
json.exception.parse_error.101 | parse error at 2: unexpected end of input; expected string literal | This error indicates a syntax error while deserializing a JSON text. The error message describes that an unexpected token (character) was encountered, and the member @a byte indicates the error position.
json.exception.parse_error.102 | parse error at 14: missing or wrong low surrogate | JSON uses the `\uxxxx` format to describe Unicode characters. Code points above above 0xFFFF are split into two `\uxxxx` entries ("surrogate pairs"). This error indicates that the surrogate pair is incomplete or contains an invalid code point.
json.exception.parse_error.103 | parse error: code points above 0x10FFFF are invalid | Unicode supports code points up to 0x10FFFF. Code points above 0x10FFFF are invalid.
json.exception.parse_error.104 | parse error: JSON patch must be an array of objects | [RFC 6902](https://tools.ietf.org/html/rfc6902) requires a JSON Patch document to be a JSON document that represents an array of objects.
json.exception.parse_error.105 | parse error: operation must have string member 'op' | An operation of a JSON Patch document must contain exactly one "op" member, whose value indicates the operation to perform. Its value must be one of "add", "remove", "replace", "move", "copy", or "test"; other values are errors.
json.exception.parse_error.106 | parse error: array index '01' must not begin with '0' | An array index in a JSON Pointer ([RFC 6901](https://tools.ietf.org/html/rfc6901)) may be `0` or any number wihtout a leading `0`.
json.exception.parse_error.107 | parse error: JSON pointer must be empty or begin with '/' - was: 'foo' | A JSON Pointer must be a Unicode string containing a sequence of zero or more reference tokens, each prefixed by a `/` character.
json.exception.parse_error.108 | parse error: escape character '~' must be followed with '0' or '1' | In a JSON Pointer, only `~0` and `~1` are valid escape sequences.
json.exception.parse_error.109 | parse error: array index 'one' is not a number | A JSON Pointer array index must be a number.
json.exception.parse_error.110 | parse error at 1: cannot read 2 bytes from vector | When parsing CBOR or MessagePack, the byte vector ends before the complete value has been read.
json.exception.parse_error.112 | parse error at 1: error reading CBOR; last byte: 0xf8 | Not all types of CBOR or MessagePack are supported. This exception occurs if an unsupported byte was read.
json.exception.parse_error.113 | parse error at 2: expected a CBOR string; last byte: 0x98 | While parsing a map key, a value that is not a string has been read.
@note For an input with n bytes, 1 is the index of the first character and n+1
is the index of the terminating null byte or the end of file. This also
holds true when reading a byte vector (CBOR or MessagePack).
@liveexample{The following code shows how a `parse_error` exception can be
caught.,parse_error}
@sa @ref exception for the base class of the library exceptions
@sa @ref invalid_iterator for exceptions indicating errors with iterators
@sa @ref type_error for exceptions indicating executing a member function with
a wrong type
@sa @ref out_of_range for exceptions indicating access out of the defined range
@sa @ref other_error for exceptions indicating other library errors
@since version 3.0.0
*/
class parse_error : public exception
{
public:
/*!
@brief create a parse error exception
@param[in] id the id of the exception
@param[in] byte_ the byte index where the error occurred (or 0 if the
position cannot be determined)
@param[in] what_arg the explanatory string
@return parse_error object
*/
static parse_error create(int id, std::size_t byte_, const std::string& what_arg)
{
std::string w = exception::name("parse_error", id) + "parse error" +
(byte_ != 0 ? (" at " + std::to_string(byte_)) : "") +
": " + what_arg;
return parse_error(id, byte_, w.c_str());
}
/*!
@brief byte index of the parse error
The byte index of the last read character in the input file.
@note For an input with n bytes, 1 is the index of the first character and
n+1 is the index of the terminating null byte or the end of file.
This also holds true when reading a byte vector (CBOR or MessagePack).
*/
const std::size_t byte;
private:
parse_error(int id_, std::size_t byte_, const char* what_arg)
: exception(id_, what_arg), byte(byte_) {}
};
/*!
@brief exception indicating errors with iterators
This exception is thrown if iterators passed to a library function do not match
the expected semantics.
Exceptions have ids 2xx.
name / id | example message | description
----------------------------------- | --------------- | -------------------------
json.exception.invalid_iterator.201 | iterators are not compatible | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.
json.exception.invalid_iterator.202 | iterator does not fit current value | In an erase or insert function, the passed iterator @a pos does not belong to the JSON value for which the function was called. It hence does not define a valid position for the deletion/insertion.
json.exception.invalid_iterator.203 | iterators do not fit current value | Either iterator passed to function @ref erase(IteratorType first, IteratorType last) does not belong to the JSON value from which values shall be erased. It hence does not define a valid range to delete values from.
json.exception.invalid_iterator.204 | iterators out of range | When an iterator range for a primitive type (number, boolean, or string) is passed to a constructor or an erase function, this range has to be exactly (@ref begin(), @ref end()), because this is the only way the single stored value is expressed. All other ranges are invalid.
json.exception.invalid_iterator.205 | iterator out of range | When an iterator for a primitive type (number, boolean, or string) is passed to an erase function, the iterator has to be the @ref begin() iterator, because it is the only way to address the stored value. All other iterators are invalid.
json.exception.invalid_iterator.206 | cannot construct with iterators from null | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) belong to a JSON null value and hence to not define a valid range.
json.exception.invalid_iterator.207 | cannot use key() for non-object iterators | The key() member function can only be used on iterators belonging to a JSON object, because other types do not have a concept of a key.
json.exception.invalid_iterator.208 | cannot use operator[] for object iterators | The operator[] to specify a concrete offset cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.
json.exception.invalid_iterator.209 | cannot use offsets with object iterators | The offset operators (+, -, +=, -=) cannot be used on iterators belonging to a JSON object, because JSON objects are unordered.
json.exception.invalid_iterator.210 | iterators do not fit | The iterator range passed to the insert function are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid.
json.exception.invalid_iterator.211 | passed iterators may not belong to container | The iterator range passed to the insert function must not be a subrange of the container to insert to.
json.exception.invalid_iterator.212 | cannot compare iterators of different containers | When two iterators are compared, they must belong to the same container.
json.exception.invalid_iterator.213 | cannot compare order of object iterators | The order of object iterators cannot be compared, because JSON objects are unordered.
json.exception.invalid_iterator.214 | cannot get value | Cannot get value for iterator: Either the iterator belongs to a null value or it is an iterator to a primitive type (number, boolean, or string), but the iterator is different to @ref begin().
@liveexample{The following code shows how an `invalid_iterator` exception can be
caught.,invalid_iterator}
@sa @ref exception for the base class of the library exceptions
@sa @ref parse_error for exceptions indicating a parse error
@sa @ref type_error for exceptions indicating executing a member function with
a wrong type
@sa @ref out_of_range for exceptions indicating access out of the defined range
@sa @ref other_error for exceptions indicating other library errors
@since version 3.0.0
*/
class invalid_iterator : public exception
{
public:
static invalid_iterator create(int id, const std::string& what_arg)
{
std::string w = exception::name("invalid_iterator", id) + what_arg;
return invalid_iterator(id, w.c_str());
}
private:
invalid_iterator(int id_, const char* what_arg)
: exception(id_, what_arg) {}
};
/*!
@brief exception indicating executing a member function with a wrong type
This exception is thrown in case of a type error; that is, a library function is
executed on a JSON value whose type does not match the expected semantics.
Exceptions have ids 3xx.
name / id | example message | description
----------------------------- | --------------- | -------------------------
json.exception.type_error.301 | cannot create object from initializer list | To create an object from an initializer list, the initializer list must consist only of a list of pairs whose first element is a string. When this constraint is violated, an array is created instead.
json.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types.
json.exception.type_error.303 | incompatible ReferenceType for get_ref, actual type is object | To retrieve a reference to a value stored in a @ref basic_json object with @ref get_ref, the type of the reference must match the value type. For instance, for a JSON array, the @a ReferenceType must be @ref array_t&.
json.exception.type_error.304 | cannot use at() with string | The @ref at() member functions can only be executed for certain JSON types.
json.exception.type_error.305 | cannot use operator[] with string | The @ref operator[] member functions can only be executed for certain JSON types.
json.exception.type_error.306 | cannot use value() with string | The @ref value() member functions can only be executed for certain JSON types.
json.exception.type_error.307 | cannot use erase() with string | The @ref erase() member functions can only be executed for certain JSON types.
json.exception.type_error.308 | cannot use push_back() with string | The @ref push_back() and @ref operator+= member functions can only be executed for certain JSON types.
json.exception.type_error.309 | cannot use insert() with | The @ref insert() member functions can only be executed for certain JSON types.
json.exception.type_error.310 | cannot use swap() with number | The @ref swap() member functions can only be executed for certain JSON types.
json.exception.type_error.311 | cannot use emplace_back() with string | The @ref emplace_back() member function can only be executed for certain JSON types.
json.exception.type_error.312 | cannot use update() with string | The @ref update() member functions can only be executed for certain JSON types.
json.exception.type_error.313 | invalid value to unflatten | The @ref unflatten function converts an object whose keys are JSON Pointers back into an arbitrary nested JSON value. The JSON Pointers must not overlap, because then the resulting value would not be well defined.
json.exception.type_error.314 | only objects can be unflattened | The @ref unflatten function only works for an object whose keys are JSON Pointers.
json.exception.type_error.315 | values in object must be primitive | The @ref unflatten function only works for an object whose keys are JSON Pointers and whose values are primitive.
@liveexample{The following code shows how a `type_error` exception can be
caught.,type_error}
@sa @ref exception for the base class of the library exceptions
@sa @ref parse_error for exceptions indicating a parse error
@sa @ref invalid_iterator for exceptions indicating errors with iterators
@sa @ref out_of_range for exceptions indicating access out of the defined range
@sa @ref other_error for exceptions indicating other library errors
@since version 3.0.0
*/
class type_error : public exception
{
public:
static type_error create(int id, const std::string& what_arg)
{
std::string w = exception::name("type_error", id) + what_arg;
return type_error(id, w.c_str());
}
private:
type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
/*!
@brief exception indicating access out of the defined range
This exception is thrown in case a library function is called on an input
parameter that exceeds the expected range, for instance in case of array
indices or nonexisting object keys.
Exceptions have ids 4xx.
name / id | example message | description
------------------------------- | --------------- | -------------------------
json.exception.out_of_range.401 | array index 3 is out of range | The provided array index @a i is larger than @a size-1.
json.exception.out_of_range.402 | array index '-' (3) is out of range | The special array index `-` in a JSON Pointer never describes a valid element of the array, but the index past the end. That is, it can only be used to add elements at this position, but not to read it.
json.exception.out_of_range.403 | key 'foo' not found | The provided key was not found in the JSON object.
json.exception.out_of_range.404 | unresolved reference token 'foo' | A reference token in a JSON Pointer could not be resolved.
json.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch operations 'remove' and 'add' can not be applied to the root element of the JSON value.
json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF.
@liveexample{The following code shows how an `out_of_range` exception can be
caught.,out_of_range}
@sa @ref exception for the base class of the library exceptions
@sa @ref parse_error for exceptions indicating a parse error
@sa @ref invalid_iterator for exceptions indicating errors with iterators
@sa @ref type_error for exceptions indicating executing a member function with
a wrong type
@sa @ref other_error for exceptions indicating other library errors
@since version 3.0.0
*/
class out_of_range : public exception
{
public:
static out_of_range create(int id, const std::string& what_arg)
{
std::string w = exception::name("out_of_range", id) + what_arg;
return out_of_range(id, w.c_str());
}
private:
out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
/*!
@brief exception indicating other library errors
This exception is thrown in case of errors that cannot be classified with the
other exception types.
Exceptions have ids 5xx.
name / id | example message | description
------------------------------ | --------------- | -------------------------
json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed.
json.exception.other_error.502 | invalid object size for conversion | Some conversions to user-defined types impose constraints on the object size (e.g. std::pair)
@sa @ref exception for the base class of the library exceptions
@sa @ref parse_error for exceptions indicating a parse error
@sa @ref invalid_iterator for exceptions indicating errors with iterators
@sa @ref type_error for exceptions indicating executing a member function with
a wrong type
@sa @ref out_of_range for exceptions indicating access out of the defined range
@liveexample{The following code shows how an `other_error` exception can be
caught.,other_error}
@since version 3.0.0
*/
class other_error : public exception
{
public:
static other_error create(int id, const std::string& what_arg)
{
std::string w = exception::name("other_error", id) + what_arg;
return other_error(id, w.c_str());
}
private:
other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
///////////////////////////
// JSON type enumeration //
///////////////////////////
/*!
@brief the JSON type enumeration
This enumeration collects the different JSON types. It is internally used to
distinguish the stored values, and the functions @ref basic_json::is_null(),
@ref basic_json::is_object(), @ref basic_json::is_array(),
@ref basic_json::is_string(), @ref basic_json::is_boolean(),
@ref basic_json::is_number() (with @ref basic_json::is_number_integer(),
@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()),
@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and
@ref basic_json::is_structured() rely on it.
@note There are three enumeration entries (number_integer, number_unsigned, and
number_float), because the library distinguishes these three types for numbers:
@ref basic_json::number_unsigned_t is used for unsigned integers,
@ref basic_json::number_integer_t is used for signed integers, and
@ref basic_json::number_float_t is used for floating-point numbers or to
approximate integers which do not fit in the limits of their respective type.
@sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON
value with the default value for a given type
@since version 1.0.0
*/
enum class value_t : uint8_t
{
null, ///< null value
object, ///< object (unordered set of name/value pairs)
array, ///< array (ordered collection of values)
string, ///< string value
boolean, ///< boolean value
number_integer, ///< number value (signed integer)
number_unsigned, ///< number value (unsigned integer)
number_float, ///< number value (floating-point)
discarded ///< discarded by the the parser callback function
};
/*!
@brief comparison operator for JSON types
Returns an ordering that is similar to Python:
- order: null < boolean < number < object < array < string
- furthermore, each type is not smaller than itself
@since version 1.0.0
*/
inline bool operator<(const value_t lhs, const value_t rhs) noexcept
{
static constexpr std::array<uint8_t, 8> order = {{
0, // null
3, // object
4, // array
5, // string
1, // boolean
2, // integer
2, // unsigned
2, // float
}
};
// discarded values are not comparable
return lhs != value_t::discarded and rhs != value_t::discarded and
order[static_cast<std::size_t>(lhs)] < order[static_cast<std::size_t>(rhs)];
}
/////////////
// helpers //
/////////////
template<typename> struct is_basic_json : std::false_type {};
NLOHMANN_BASIC_JSON_TPL_DECLARATION
struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};
// alias templates to reduce boilerplate
template<bool B, typename T = void>
Showing preview only (1,159K chars total). Download the full file or copy to clipboard to get everything.
gitextract_092dub5g/ ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── YaCo/ │ ├── exec_ida.py │ ├── export_all.py │ ├── load_yadb.py │ └── yaco_plugin.py ├── YaDiff/ │ ├── MergeYaDB.cpp │ ├── YaDiffLib/ │ │ ├── Algo/ │ │ │ ├── Algo.cpp │ │ │ ├── Algo.hpp │ │ │ ├── CallerXRefMatch.cpp │ │ │ ├── CallerXRefMatch.hpp │ │ │ ├── ExactMatch.cpp │ │ │ ├── ExactMatch.hpp │ │ │ ├── ExternalMappingMatch.cpp │ │ │ ├── ExternalMappingMatch.hpp │ │ │ ├── VectorSign/ │ │ │ │ ├── ArchArm.cpp │ │ │ │ ├── ArchArm.hpp │ │ │ │ ├── ArchMips.cpp │ │ │ │ ├── ArchMips.hpp │ │ │ │ ├── ArchPpc.cpp │ │ │ │ ├── ArchPpc.hpp │ │ │ │ ├── ArchX86.cpp │ │ │ │ ├── ArchX86.hpp │ │ │ │ ├── IArch.cpp │ │ │ │ ├── IArch.hpp │ │ │ │ ├── InstructionVector.cpp │ │ │ │ ├── InstructionVector.hpp │ │ │ │ ├── VectorDistance.cpp │ │ │ │ ├── VectorDistance.hpp │ │ │ │ ├── VectorHelpers.cpp │ │ │ │ ├── VectorHelpers.hpp │ │ │ │ ├── VectorTypes.cpp │ │ │ │ └── VectorTypes.hpp │ │ │ ├── VectorSign.cpp │ │ │ ├── VectorSign.hpp │ │ │ ├── XRefOffsetMatch.cpp │ │ │ ├── XRefOffsetMatch.hpp │ │ │ └── json.hpp │ │ ├── Matching.cpp │ │ ├── Matching.hpp │ │ ├── Propagate.cpp │ │ ├── Propagate.hpp │ │ ├── VersionRelation.cpp │ │ ├── VersionRelation.hpp │ │ ├── YaDiff.cpp │ │ └── YaDiff.hpp │ ├── merge_idb.py │ └── tests/ │ └── YaDiffLib_test/ │ ├── data/ │ │ ├── TestExternalMappingMatch1.xml │ │ ├── TestExternalMappingMatch2.xml │ │ ├── TestExternalMappingMatchAlgo.json │ │ ├── TestMatchBasicBlock1.xml │ │ ├── TestMatchBasicBlock2.xml │ │ ├── TestMatchStruct1.xml │ │ ├── TestMatchStruct2.xml │ │ ├── TestParentXrefOfDataMatch1.xml │ │ ├── TestParentXrefOfDataMatch2.xml │ │ ├── TestSigComp1.xml │ │ ├── TestSigComp2.xml │ │ ├── TestXrefOfDataMatch1.xml │ │ ├── TestXrefOfDataMatch2.xml │ │ ├── config.xml │ │ ├── diff/ │ │ │ └── tbf_small_c.xml │ │ └── merge/ │ │ ├── TestMergeAttribute1.xml │ │ ├── TestMergeAttribute2.xml │ │ ├── TestMergeAttributeResult1.xml │ │ ├── TestMergeAttributeResult2.xml │ │ ├── TestMergeComment1.xml │ │ ├── TestMergeComment2.xml │ │ ├── TestMergeCommentResult1.xml │ │ ├── TestMergeCommentResult2.xml │ │ ├── TestMergeMultiStrucXrefs1.xml │ │ ├── TestMergeMultiStrucXrefs2.xml │ │ ├── TestMergeMultiStrucXrefsResult1.xml │ │ ├── TestMergeMultiStrucXrefsResult2.xml │ │ ├── TestMergeName1.xml │ │ ├── TestMergeName2.xml │ │ ├── TestMergeName2Result.xml │ │ ├── TestMergeParentExport1.xml │ │ ├── TestMergeParentExport2.xml │ │ ├── TestMergeParentExportFunction11Result2.xml │ │ ├── TestMergeParentExportFunction2Result2.xml │ │ ├── TestMergeXrefs1.xml │ │ ├── TestMergeXrefs2.xml │ │ ├── TestMergeXrefsLoop1.xml │ │ ├── TestMergeXrefsLoop2.xml │ │ ├── TestMergeXrefsLoopResult11.xml │ │ ├── TestMergeXrefsLoopResult111.xml │ │ ├── TestMergeXrefsLoopResult2.xml │ │ ├── TestMergeXrefsMissing1.xml │ │ ├── TestMergeXrefsMissing2.xml │ │ ├── TestMergeXrefsMissingResult1.xml │ │ ├── TestMergeXrefsMissingResult2.xml │ │ ├── TestMergeXrefsMissingResult41.xml │ │ ├── TestMergeXrefsResult1.xml │ │ └── TestMergeXrefsResult2.xml │ ├── test_Algo.cpp │ ├── test_VersionRelation.cpp │ └── test_YaDiffLib.cpp ├── YaLibs/ │ ├── YaToolsIDALib/ │ │ ├── Events.cpp │ │ ├── Events.hpp │ │ ├── Hash.cpp │ │ ├── Hash.hpp │ │ ├── Hooks.cpp │ │ ├── Hooks.hpp │ │ ├── Ida.h │ │ ├── IdaDeleter.cpp │ │ ├── IdaDeleter.hpp │ │ ├── IdaModel.cpp │ │ ├── IdaModel.hpp │ │ ├── IdaVisitor.cpp │ │ ├── IdaVisitor.hpp │ │ ├── PluginArm.cpp │ │ ├── Plugins.hpp │ │ ├── Pool.hpp │ │ ├── Repository.cpp │ │ ├── Repository.hpp │ │ ├── Strucs.cpp │ │ ├── Strucs.hpp │ │ ├── YaCo.cpp │ │ ├── YaCo.hpp │ │ ├── YaHelpers.cpp │ │ └── YaHelpers.hpp │ ├── YaToolsLib/ │ │ ├── Bench.h │ │ ├── BinHex.cpp │ │ ├── BinHex.hpp │ │ ├── Configuration.cpp │ │ ├── Configuration.hpp │ │ ├── FileUtils.cpp │ │ ├── FileUtils.hpp │ │ ├── FlatBufferModel.cpp │ │ ├── FlatBufferModel.hpp │ │ ├── FlatBufferVisitor.cpp │ │ ├── FlatBufferVisitor.hpp │ │ ├── Git.cpp │ │ ├── Git.hpp │ │ ├── GitAsync.cpp │ │ ├── HSignature.cpp │ │ ├── HSignature.hpp │ │ ├── HVersion.cpp │ │ ├── HVersion.hpp │ │ ├── Helpers.h │ │ ├── IModel.hpp │ │ ├── IModelSink.hpp │ │ ├── IModelVisitor.hpp │ │ ├── LibGit.h │ │ ├── Logger.cpp │ │ ├── Logger.hpp │ │ ├── MemoryModel.cpp │ │ ├── MemoryModel.hpp │ │ ├── Merger.cpp │ │ ├── Merger.hpp │ │ ├── ModelIndex.hpp │ │ ├── Random.cpp │ │ ├── Random.hpp │ │ ├── Relation.hpp │ │ ├── Signature.cpp │ │ ├── Signature.hpp │ │ ├── Utils.cpp │ │ ├── Utils.hpp │ │ ├── XmlAccept.cpp │ │ ├── XmlAccept.hpp │ │ ├── XmlVisitor.cpp │ │ ├── XmlVisitor.hpp │ │ ├── YaEnums.hpp │ │ ├── YaTypes.cpp │ │ ├── YaTypes.hpp │ │ ├── Yatools.cpp │ │ ├── Yatools.hpp │ │ └── yadb.fbs │ ├── YaToolsPy/ │ │ ├── YaSwig.cpp │ │ ├── YaSwig.hpp │ │ ├── YaToolsPy.h │ │ ├── YaToolsPy32.i │ │ └── YaToolsPy64.i │ └── tests/ │ ├── YaToolsLib_test/ │ │ ├── ExporterValidatorVisitor.cpp │ │ ├── ExporterValidatorVisitor.hpp │ │ ├── test_DatabaseModel.cpp │ │ ├── test_XMLDatabaseModel.cpp │ │ ├── test_common.hpp │ │ ├── test_configuration.cpp │ │ ├── test_git.cpp │ │ ├── test_model.hpp │ │ └── test_yatools.cpp │ ├── data/ │ │ └── test_configuration.xml │ └── integration/ │ └── integration.cpp ├── YaToolsUtils/ │ ├── YaToolsBinToVect/ │ │ └── bintovect.py │ ├── YaToolsCacheMerger/ │ │ └── CacheMerger.cpp │ ├── YaToolsFBToXML/ │ │ └── FBToXML.cpp │ ├── YaToolsXMLToFB/ │ │ └── XMLToFB.cpp │ └── YaToolsYaDBToVectors/ │ └── yadbtovectors.cpp ├── build/ │ ├── CMakeLists.txt │ ├── capstone.cmake │ ├── common.cmake │ ├── configure.sh │ ├── configure_2017.cmd │ ├── deploy.cmd │ ├── deploy.sh │ ├── deploy_debug.cmd │ ├── deploy_dev.sh │ ├── files/ │ │ ├── capstone.linux.files.cmake │ │ ├── capstone.nt.files.cmake │ │ ├── charset.linux.files.cmake │ │ ├── charset.nt.files.cmake │ │ ├── farmhash.linux.files.cmake │ │ ├── farmhash.nt.files.cmake │ │ ├── flatbuffers.linux.files.cmake │ │ ├── flatbuffers.nt.files.cmake │ │ ├── flatc.linux.files.cmake │ │ ├── flatc.nt.files.cmake │ │ ├── git2.linux.files.cmake │ │ ├── git2.nt.files.cmake │ │ ├── gtest.linux.files.cmake │ │ ├── gtest.nt.files.cmake │ │ ├── http_parser.linux.files.cmake │ │ ├── http_parser.nt.files.cmake │ │ ├── iconv.linux.files.cmake │ │ ├── iconv.nt.files.cmake │ │ ├── integration_tests.linux.files.cmake │ │ ├── integration_tests.nt.files.cmake │ │ ├── libxml2.linux.files.cmake │ │ ├── libxml2.nt.files.cmake │ │ ├── mbedtls.linux.files.cmake │ │ ├── mbedtls.nt.files.cmake │ │ ├── regex.linux.files.cmake │ │ ├── regex.nt.files.cmake │ │ ├── ssh2.linux.files.cmake │ │ ├── ssh2.nt.files.cmake │ │ ├── swig.linux.files.cmake │ │ ├── swig.nt.files.cmake │ │ ├── yacachemerger.linux.files.cmake │ │ ├── yacachemerger.nt.files.cmake │ │ ├── yadbtovector.linux.files.cmake │ │ ├── yadbtovector.nt.files.cmake │ │ ├── yadiff.linux.files.cmake │ │ ├── yadiff.nt.files.cmake │ │ ├── yadifflib.linux.files.cmake │ │ ├── yadifflib.nt.files.cmake │ │ ├── yadifflib_tests.linux.files.cmake │ │ ├── yadifflib_tests.nt.files.cmake │ │ ├── yafb2xml.linux.files.cmake │ │ ├── yafb2xml.nt.files.cmake │ │ ├── yaida32.linux.files.cmake │ │ ├── yaida32.nt.files.cmake │ │ ├── yaida64.linux.files.cmake │ │ ├── yaida64.nt.files.cmake │ │ ├── yatools.linux.files.cmake │ │ ├── yatools.nt.files.cmake │ │ ├── yatools_tests.linux.files.cmake │ │ ├── yatools_tests.nt.files.cmake │ │ ├── yaxml2fb.linux.files.cmake │ │ ├── yaxml2fb.nt.files.cmake │ │ ├── zlib.linux.files.cmake │ │ └── zlib.nt.files.cmake │ ├── flatbuffer.cmake │ ├── package.py │ ├── undeploy.cmd │ ├── yadeps.cmake │ └── yatools.cmake ├── deps/ │ ├── capstone-3.0.4/ │ │ ├── LEB128.h │ │ ├── MCDisassembler.h │ │ ├── MCFixedLenDisassembler.h │ │ ├── MCInst.c │ │ ├── MCInst.h │ │ ├── MCInstrDesc.c │ │ ├── MCInstrDesc.h │ │ ├── MCRegisterInfo.c │ │ ├── MCRegisterInfo.h │ │ ├── MathExtras.h │ │ ├── SStream.c │ │ ├── SStream.h │ │ ├── arch/ │ │ │ ├── AArch64/ │ │ │ │ ├── AArch64AddressingModes.h │ │ │ │ ├── AArch64BaseInfo.c │ │ │ │ ├── AArch64BaseInfo.h │ │ │ │ ├── AArch64Disassembler.c │ │ │ │ ├── AArch64Disassembler.h │ │ │ │ ├── AArch64GenAsmWriter.inc │ │ │ │ ├── AArch64GenDisassemblerTables.inc │ │ │ │ ├── AArch64GenInstrInfo.inc │ │ │ │ ├── AArch64GenRegisterInfo.inc │ │ │ │ ├── AArch64GenSubtargetInfo.inc │ │ │ │ ├── AArch64InstPrinter.c │ │ │ │ ├── AArch64InstPrinter.h │ │ │ │ ├── AArch64Mapping.c │ │ │ │ ├── AArch64Mapping.h │ │ │ │ ├── AArch64MappingInsn.inc │ │ │ │ ├── AArch64MappingInsnOp.inc │ │ │ │ ├── AArch64Module.c │ │ │ │ └── ARMMappingInsnOp.inc │ │ │ ├── ARM/ │ │ │ │ ├── ARMAddressingModes.h │ │ │ │ ├── ARMBaseInfo.h │ │ │ │ ├── ARMDisassembler.c │ │ │ │ ├── ARMDisassembler.h │ │ │ │ ├── ARMGenAsmWriter.inc │ │ │ │ ├── ARMGenDisassemblerTables.inc │ │ │ │ ├── ARMGenInstrInfo.inc │ │ │ │ ├── ARMGenRegisterInfo.inc │ │ │ │ ├── ARMGenSubtargetInfo.inc │ │ │ │ ├── ARMInstPrinter.c │ │ │ │ ├── ARMInstPrinter.h │ │ │ │ ├── ARMMapping.c │ │ │ │ ├── ARMMapping.h │ │ │ │ ├── ARMMappingInsn.inc │ │ │ │ ├── ARMMappingInsnOp.inc │ │ │ │ └── ARMModule.c │ │ │ ├── M68K/ │ │ │ │ ├── M68KDisassembler.c │ │ │ │ ├── M68KDisassembler.h │ │ │ │ ├── M68KInstPrinter.c │ │ │ │ ├── M68KInstPrinter.h │ │ │ │ └── M68KModule.c │ │ │ ├── Mips/ │ │ │ │ ├── MipsDisassembler.c │ │ │ │ ├── MipsDisassembler.h │ │ │ │ ├── MipsGenAsmWriter.inc │ │ │ │ ├── MipsGenDisassemblerTables.inc │ │ │ │ ├── MipsGenInstrInfo.inc │ │ │ │ ├── MipsGenRegisterInfo.inc │ │ │ │ ├── MipsGenSubtargetInfo.inc │ │ │ │ ├── MipsInstPrinter.c │ │ │ │ ├── MipsInstPrinter.h │ │ │ │ ├── MipsMapping.c │ │ │ │ ├── MipsMapping.h │ │ │ │ ├── MipsMappingInsn.inc │ │ │ │ └── MipsModule.c │ │ │ ├── PowerPC/ │ │ │ │ ├── PPCDisassembler.c │ │ │ │ ├── PPCDisassembler.h │ │ │ │ ├── PPCGenAsmWriter.inc │ │ │ │ ├── PPCGenDisassemblerTables.inc │ │ │ │ ├── PPCGenInstrInfo.inc │ │ │ │ ├── PPCGenRegisterInfo.inc │ │ │ │ ├── PPCGenSubtargetInfo.inc │ │ │ │ ├── PPCInstPrinter.c │ │ │ │ ├── PPCInstPrinter.h │ │ │ │ ├── PPCMapping.c │ │ │ │ ├── PPCMapping.h │ │ │ │ ├── PPCMappingInsn.inc │ │ │ │ ├── PPCModule.c │ │ │ │ └── PPCPredicates.h │ │ │ ├── Sparc/ │ │ │ │ ├── Sparc.h │ │ │ │ ├── SparcDisassembler.c │ │ │ │ ├── SparcDisassembler.h │ │ │ │ ├── SparcGenAsmWriter.inc │ │ │ │ ├── SparcGenDisassemblerTables.inc │ │ │ │ ├── SparcGenInstrInfo.inc │ │ │ │ ├── SparcGenRegisterInfo.inc │ │ │ │ ├── SparcGenSubtargetInfo.inc │ │ │ │ ├── SparcInstPrinter.c │ │ │ │ ├── SparcInstPrinter.h │ │ │ │ ├── SparcMapping.c │ │ │ │ ├── SparcMapping.h │ │ │ │ ├── SparcMappingInsn.inc │ │ │ │ └── SparcModule.c │ │ │ ├── SystemZ/ │ │ │ │ ├── SystemZDisassembler.c │ │ │ │ ├── SystemZDisassembler.h │ │ │ │ ├── SystemZGenAsmWriter.inc │ │ │ │ ├── SystemZGenDisassemblerTables.inc │ │ │ │ ├── SystemZGenInstrInfo.inc │ │ │ │ ├── SystemZGenRegisterInfo.inc │ │ │ │ ├── SystemZGenSubtargetInfo.inc │ │ │ │ ├── SystemZInstPrinter.c │ │ │ │ ├── SystemZInstPrinter.h │ │ │ │ ├── SystemZMCTargetDesc.c │ │ │ │ ├── SystemZMCTargetDesc.h │ │ │ │ ├── SystemZMapping.c │ │ │ │ ├── SystemZMapping.h │ │ │ │ ├── SystemZMappingInsn.inc │ │ │ │ └── SystemZModule.c │ │ │ ├── X86/ │ │ │ │ ├── X86ATTInstPrinter.c │ │ │ │ ├── X86BaseInfo.h │ │ │ │ ├── X86Disassembler.c │ │ │ │ ├── X86Disassembler.h │ │ │ │ ├── X86DisassemblerDecoder.c │ │ │ │ ├── X86DisassemblerDecoder.h │ │ │ │ ├── X86DisassemblerDecoderCommon.h │ │ │ │ ├── X86GenAsmWriter.inc │ │ │ │ ├── X86GenAsmWriter1.inc │ │ │ │ ├── X86GenAsmWriter1_reduce.inc │ │ │ │ ├── X86GenAsmWriter_reduce.inc │ │ │ │ ├── X86GenDisassemblerTables.inc │ │ │ │ ├── X86GenDisassemblerTables_reduce.inc │ │ │ │ ├── X86GenInstrInfo.inc │ │ │ │ ├── X86GenInstrInfo_reduce.inc │ │ │ │ ├── X86GenRegisterInfo.inc │ │ │ │ ├── X86ImmSize.inc │ │ │ │ ├── X86InstPrinter.h │ │ │ │ ├── X86IntelInstPrinter.c │ │ │ │ ├── X86Mapping.c │ │ │ │ ├── X86Mapping.h │ │ │ │ ├── X86MappingInsn.inc │ │ │ │ ├── X86MappingInsnOp.inc │ │ │ │ ├── X86MappingInsnOp_reduce.inc │ │ │ │ ├── X86MappingInsn_reduce.inc │ │ │ │ └── X86Module.c │ │ │ └── XCore/ │ │ │ ├── XCoreDisassembler.c │ │ │ ├── XCoreDisassembler.h │ │ │ ├── XCoreGenAsmWriter.inc │ │ │ ├── XCoreGenDisassemblerTables.inc │ │ │ ├── XCoreGenInstrInfo.inc │ │ │ ├── XCoreGenRegisterInfo.inc │ │ │ ├── XCoreInstPrinter.c │ │ │ ├── XCoreInstPrinter.h │ │ │ ├── XCoreMapping.c │ │ │ ├── XCoreMapping.h │ │ │ ├── XCoreMappingInsn.inc │ │ │ └── XCoreModule.c │ │ ├── bindings/ │ │ │ └── python/ │ │ │ ├── build/ │ │ │ │ └── lib/ │ │ │ │ └── capstone/ │ │ │ │ ├── __init__.py │ │ │ │ ├── arm.py │ │ │ │ ├── arm64.py │ │ │ │ ├── arm64_const.py │ │ │ │ ├── arm_const.py │ │ │ │ ├── m68k.py │ │ │ │ ├── m68k_const.py │ │ │ │ ├── mips.py │ │ │ │ ├── mips_const.py │ │ │ │ ├── ppc.py │ │ │ │ ├── ppc_const.py │ │ │ │ ├── sparc.py │ │ │ │ ├── sparc_const.py │ │ │ │ ├── systemz.py │ │ │ │ ├── sysz_const.py │ │ │ │ ├── x86.py │ │ │ │ ├── x86_const.py │ │ │ │ ├── xcore.py │ │ │ │ └── xcore_const.py │ │ │ ├── capstone/ │ │ │ │ ├── __init__.py │ │ │ │ ├── arm.py │ │ │ │ ├── arm64.py │ │ │ │ ├── arm64_const.py │ │ │ │ ├── arm_const.py │ │ │ │ ├── m68k.py │ │ │ │ ├── m68k_const.py │ │ │ │ ├── mips.py │ │ │ │ ├── mips_const.py │ │ │ │ ├── ppc.py │ │ │ │ ├── ppc_const.py │ │ │ │ ├── sparc.py │ │ │ │ ├── sparc_const.py │ │ │ │ ├── systemz.py │ │ │ │ ├── sysz_const.py │ │ │ │ ├── x86.py │ │ │ │ ├── x86_const.py │ │ │ │ ├── xcore.py │ │ │ │ └── xcore_const.py │ │ │ └── setup.py │ │ ├── cs.c │ │ ├── cs_priv.h │ │ ├── include/ │ │ │ └── capstone/ │ │ │ ├── arm.h │ │ │ ├── arm64.h │ │ │ ├── capstone.h │ │ │ ├── m68k.h │ │ │ ├── mips.h │ │ │ ├── platform.h │ │ │ ├── ppc.h │ │ │ ├── sparc.h │ │ │ ├── systemz.h │ │ │ ├── x86.h │ │ │ └── xcore.h │ │ ├── myinttypes.h │ │ ├── utils.c │ │ └── utils.h │ ├── farmhash-1.1/ │ │ ├── COPYING │ │ ├── Makefile.am │ │ ├── Makefile.in │ │ ├── NEWS │ │ ├── README │ │ ├── Understanding_Hash_Functions │ │ ├── aclocal.m4 │ │ ├── compile │ │ ├── config.guess │ │ ├── config.h.in │ │ ├── config.sub │ │ ├── configure │ │ ├── configure.ac │ │ ├── depcomp │ │ ├── dev/ │ │ │ ├── INSTRUCTIONS │ │ │ ├── PATCH │ │ │ ├── SELFTESTCityHash128WithSeed │ │ │ ├── SELFTESTFingerprint128 │ │ │ ├── SELFTESTHash32 │ │ │ ├── SELFTESTHash32WithSeed │ │ │ ├── SELFTESTHash64 │ │ │ ├── SELFTESTHash64WithSeed │ │ │ ├── SELFTESTHash64WithSeeds │ │ │ ├── TESTBOILERPLATEHash32 │ │ │ ├── TESTBOILERPLATEHash32WithSeed │ │ │ ├── TESTBOILERPLATEHash64 │ │ │ ├── TESTBOILERPLATEHash64WithSeed │ │ │ ├── TESTBOILERPLATEHash64WithSeeds │ │ │ ├── WRAPPERuint32tconstcharssizetlen │ │ │ ├── WRAPPERuint32tconstcharssizetlenuint32tseed │ │ │ ├── WRAPPERuint32tconstcharssizetlenuint64tseed │ │ │ ├── WRAPPERuint32tconstcharssizetlenuint64tseed0uint64tseed1 │ │ │ ├── WRAPPERuint64tconstcharssizetlen │ │ │ ├── WRAPPERuint64tconstcharssizetlenuint64tseed │ │ │ ├── WRAPPERuint64tconstcharssizetlenuint64tseed0uint64tseed1 │ │ │ ├── basics.cc │ │ │ ├── builder.cc │ │ │ ├── cmake_m32 │ │ │ ├── create-self-test │ │ │ ├── do-in-parallel │ │ │ ├── f.cc │ │ │ ├── farmhash.h │ │ │ ├── farmhashcc.cc │ │ │ ├── farmhashmk.cc │ │ │ ├── farmhashna.cc │ │ │ ├── farmhashns.cc │ │ │ ├── farmhashnt.cc │ │ │ ├── farmhashsa.cc │ │ │ ├── farmhashsu.cc │ │ │ ├── farmhashte.cc │ │ │ ├── farmhashuo.cc │ │ │ ├── farmhashxo.cc │ │ │ ├── fix-copyright │ │ │ ├── platform.cc │ │ │ ├── remove-from-to │ │ │ └── self-test-skeleton.cc │ │ ├── install-sh │ │ ├── ltmain.sh │ │ ├── m4/ │ │ │ ├── libtool.m4 │ │ │ ├── ltoptions.m4 │ │ │ ├── ltsugar.m4 │ │ │ ├── ltversion.m4 │ │ │ └── lt~obsolete.m4 │ │ ├── missing │ │ ├── src/ │ │ │ ├── Makefile.am │ │ │ ├── Makefile.in │ │ │ ├── farm-test.cc │ │ │ ├── farmhash.cc │ │ │ └── farmhash.h │ │ └── test-driver │ ├── flatbuffers-1.8.0/ │ │ ├── .gitattributes │ │ ├── .github/ │ │ │ ├── ISSUE_TEMPLATE.md │ │ │ └── PULL_REQUEST_TEMPLATE.md │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CMake/ │ │ │ ├── BuildFlatBuffers.cmake │ │ │ ├── FindFlatBuffers.cmake │ │ │ ├── FlatbuffersConfig.cmake │ │ │ └── PackageDebian.cmake │ │ ├── CMakeLists.txt │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE.txt │ │ ├── android/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── build.gradle │ │ │ ├── gradle/ │ │ │ │ └── wrapper/ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ ├── jni/ │ │ │ │ ├── Android.mk │ │ │ │ ├── Application.mk │ │ │ │ ├── build_flatc.bat │ │ │ │ ├── include.mk │ │ │ │ ├── main.cpp │ │ │ │ ├── msbuild.py │ │ │ │ └── run_flatc.py │ │ │ └── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ ├── appveyor.yml │ │ ├── biicode/ │ │ │ ├── README.md │ │ │ ├── cmake/ │ │ │ │ └── biicode.cmake │ │ │ └── support/ │ │ │ └── bii-travis.sh │ │ ├── biicode.conf │ │ ├── composer.json │ │ ├── docs/ │ │ │ ├── footer.html │ │ │ ├── header.html │ │ │ └── source/ │ │ │ ├── Benchmarks.md │ │ │ ├── Building.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── CUsage.md │ │ │ ├── Compiler.md │ │ │ ├── CppUsage.md │ │ │ ├── FlatBuffers.md │ │ │ ├── FlexBuffers.md │ │ │ ├── GoApi.md │ │ │ ├── GoApi_generated.txt │ │ │ ├── GoUsage.md │ │ │ ├── Grammar.md │ │ │ ├── Internals.md │ │ │ ├── JavaCsharpUsage.md │ │ │ ├── JavaScriptUsage.md │ │ │ ├── PHPUsage.md │ │ │ ├── PythonUsage.md │ │ │ ├── README_TO_GENERATE_DOCS.md │ │ │ ├── Schemas.md │ │ │ ├── Support.md │ │ │ ├── Tutorial.md │ │ │ ├── WhitePaper.md │ │ │ ├── doxyfile │ │ │ ├── doxygen_layout.xml │ │ │ ├── gRPC/ │ │ │ │ └── CppUsage.md │ │ │ ├── groups │ │ │ └── style.css │ │ ├── go/ │ │ │ ├── builder.go │ │ │ ├── doc.go │ │ │ ├── encode.go │ │ │ ├── grpc.go │ │ │ ├── lib.go │ │ │ ├── sizes.go │ │ │ ├── struct.go │ │ │ └── table.go │ │ ├── grpc/ │ │ │ ├── README.md │ │ │ ├── samples/ │ │ │ │ └── greeter/ │ │ │ │ ├── client.cpp │ │ │ │ ├── greeter.fbs │ │ │ │ └── server.cpp │ │ │ ├── src/ │ │ │ │ └── compiler/ │ │ │ │ ├── config.h │ │ │ │ ├── cpp_generator.cc │ │ │ │ ├── cpp_generator.h │ │ │ │ ├── go_generator.cc │ │ │ │ ├── go_generator.h │ │ │ │ └── schema_interface.h │ │ │ └── tests/ │ │ │ ├── go_test.go │ │ │ └── grpctest.cpp │ │ ├── include/ │ │ │ └── flatbuffers/ │ │ │ ├── base.h │ │ │ ├── code_generators.h │ │ │ ├── flatbuffers.h │ │ │ ├── flatc.h │ │ │ ├── flexbuffers.h │ │ │ ├── grpc.h │ │ │ ├── hash.h │ │ │ ├── idl.h │ │ │ ├── minireflect.h │ │ │ ├── reflection.h │ │ │ ├── reflection_generated.h │ │ │ ├── registry.h │ │ │ ├── stl_emulation.h │ │ │ └── util.h │ │ ├── java/ │ │ │ └── com/ │ │ │ └── google/ │ │ │ └── flatbuffers/ │ │ │ ├── Constants.java │ │ │ ├── FlatBufferBuilder.java │ │ │ ├── Struct.java │ │ │ └── Table.java │ │ ├── js/ │ │ │ └── flatbuffers.js │ │ ├── net/ │ │ │ └── FlatBuffers/ │ │ │ ├── ByteBuffer.cs │ │ │ ├── FlatBufferBuilder.cs │ │ │ ├── FlatBufferConstants.cs │ │ │ ├── FlatBuffers.csproj │ │ │ ├── IFlatbufferObject.cs │ │ │ ├── Offset.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Struct.cs │ │ │ └── Table.cs │ │ ├── package.json │ │ ├── php/ │ │ │ ├── ByteBuffer.php │ │ │ ├── Constants.php │ │ │ ├── FlatbufferBuilder.php │ │ │ ├── Struct.php │ │ │ └── Table.php │ │ ├── pom.xml │ │ ├── python/ │ │ │ ├── __init__.py │ │ │ ├── flatbuffers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── builder.py │ │ │ │ ├── compat.py │ │ │ │ ├── encode.py │ │ │ │ ├── number_types.py │ │ │ │ ├── packer.py │ │ │ │ └── table.py │ │ │ └── setup.py │ │ ├── readme.md │ │ ├── reflection/ │ │ │ ├── generate_code.sh │ │ │ └── reflection.fbs │ │ ├── samples/ │ │ │ ├── SampleBinary.cs │ │ │ ├── SampleBinary.java │ │ │ ├── SampleBinary.php │ │ │ ├── android/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── build.gradle │ │ │ │ ├── gradle/ │ │ │ │ │ └── wrapper/ │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ ├── gradlew │ │ │ │ ├── gradlew.bat │ │ │ │ ├── jni/ │ │ │ │ │ ├── Android.mk │ │ │ │ │ ├── Application.mk │ │ │ │ │ ├── main.cpp │ │ │ │ │ └── schemas/ │ │ │ │ │ └── animal.fbs │ │ │ │ └── res/ │ │ │ │ └── values/ │ │ │ │ └── strings.xml │ │ │ ├── android_sample.sh │ │ │ ├── csharp_sample.sh │ │ │ ├── go_sample.sh │ │ │ ├── java_sample.sh │ │ │ ├── javascript_sample.sh │ │ │ ├── monster.fbs │ │ │ ├── monster_generated.h │ │ │ ├── monsterdata.json │ │ │ ├── php_sample.sh │ │ │ ├── python_sample.sh │ │ │ ├── sample_binary.cpp │ │ │ ├── sample_binary.go │ │ │ ├── sample_binary.py │ │ │ ├── sample_text.cpp │ │ │ └── samplebinary.js │ │ ├── src/ │ │ │ ├── code_generators.cpp │ │ │ ├── flatc.cpp │ │ │ ├── flatc_main.cpp │ │ │ ├── flathash.cpp │ │ │ ├── idl_gen_cpp.cpp │ │ │ ├── idl_gen_fbs.cpp │ │ │ ├── idl_gen_general.cpp │ │ │ ├── idl_gen_go.cpp │ │ │ ├── idl_gen_grpc.cpp │ │ │ ├── idl_gen_js.cpp │ │ │ ├── idl_gen_json_schema.cpp │ │ │ ├── idl_gen_php.cpp │ │ │ ├── idl_gen_python.cpp │ │ │ ├── idl_gen_text.cpp │ │ │ ├── idl_parser.cpp │ │ │ ├── reflection.cpp │ │ │ └── util.cpp │ │ └── tests/ │ │ ├── FlatBuffers.Test/ │ │ │ ├── Assert.cs │ │ │ ├── ByteBufferTests.cs │ │ │ ├── FlatBufferBuilderTests.cs │ │ │ ├── FlatBuffers.Test.csproj │ │ │ ├── FlatBuffersExampleTests.cs │ │ │ ├── FlatBuffersFuzzTests.cs │ │ │ ├── FlatBuffersTestClassAttribute.cs │ │ │ ├── FlatBuffersTestMethodAttribute.cs │ │ │ ├── FuzzTestData.cs │ │ │ ├── Lcg.cs │ │ │ ├── NetTest.sh │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── AssemblyInfo.cs │ │ │ ├── Resources/ │ │ │ │ └── monsterdata_test.mon │ │ │ └── TestTable.cs │ │ ├── GoTest.sh │ │ ├── JavaScriptTest.js │ │ ├── JavaScriptTest.sh │ │ ├── JavaScriptUnionVectorTest.js │ │ ├── JavaTest.bat │ │ ├── JavaTest.java │ │ ├── JavaTest.sh │ │ ├── MyGame/ │ │ │ ├── Example/ │ │ │ │ ├── Ability.cs │ │ │ │ ├── Ability.go │ │ │ │ ├── Ability.java │ │ │ │ ├── Ability.php │ │ │ │ ├── Ability.py │ │ │ │ ├── Any.cs │ │ │ │ ├── Any.go │ │ │ │ ├── Any.java │ │ │ │ ├── Any.php │ │ │ │ ├── Any.py │ │ │ │ ├── Color.cs │ │ │ │ ├── Color.go │ │ │ │ ├── Color.java │ │ │ │ ├── Color.php │ │ │ │ ├── Color.py │ │ │ │ ├── Monster.cs │ │ │ │ ├── Monster.go │ │ │ │ ├── Monster.java │ │ │ │ ├── Monster.php │ │ │ │ ├── Monster.py │ │ │ │ ├── MonsterStorage_grpc.go │ │ │ │ ├── Stat.cs │ │ │ │ ├── Stat.go │ │ │ │ ├── Stat.java │ │ │ │ ├── Stat.php │ │ │ │ ├── Stat.py │ │ │ │ ├── Test.cs │ │ │ │ ├── Test.go │ │ │ │ ├── Test.java │ │ │ │ ├── Test.php │ │ │ │ ├── Test.py │ │ │ │ ├── TestSimpleTableWithEnum.cs │ │ │ │ ├── TestSimpleTableWithEnum.go │ │ │ │ ├── TestSimpleTableWithEnum.java │ │ │ │ ├── TestSimpleTableWithEnum.php │ │ │ │ ├── TestSimpleTableWithEnum.py │ │ │ │ ├── TypeAliases.cs │ │ │ │ ├── TypeAliases.go │ │ │ │ ├── TypeAliases.java │ │ │ │ ├── TypeAliases.php │ │ │ │ ├── TypeAliases.py │ │ │ │ ├── Vec3.cs │ │ │ │ ├── Vec3.go │ │ │ │ ├── Vec3.java │ │ │ │ ├── Vec3.php │ │ │ │ ├── Vec3.py │ │ │ │ └── __init__.py │ │ │ ├── Example2/ │ │ │ │ ├── Monster.cs │ │ │ │ ├── Monster.go │ │ │ │ ├── Monster.java │ │ │ │ ├── Monster.php │ │ │ │ ├── Monster.py │ │ │ │ └── __init__.py │ │ │ ├── InParentNamespace.cs │ │ │ ├── InParentNamespace.go │ │ │ ├── InParentNamespace.java │ │ │ ├── InParentNamespace.php │ │ │ ├── InParentNamespace.py │ │ │ └── __init__.py │ │ ├── PythonTest.sh │ │ ├── TestAll.sh │ │ ├── TypeScriptTest.sh │ │ ├── fuzzer/ │ │ │ ├── build_fuzzer.sh │ │ │ ├── build_run_parser_test.sh │ │ │ ├── build_run_verifier_test.sh │ │ │ ├── flatbuffers_parser_fuzzer.cc │ │ │ └── flatbuffers_verifier_fuzzer.cc │ │ ├── generate_code.bat │ │ ├── generate_code.sh │ │ ├── go_test.go │ │ ├── include_test/ │ │ │ ├── include_test1.fbs │ │ │ └── sub/ │ │ │ └── include_test2.fbs │ │ ├── monster_test.bfbs │ │ ├── monster_test.fbs │ │ ├── monster_test.grpc.fb.cc │ │ ├── monster_test.grpc.fb.h │ │ ├── monster_test.schema.json │ │ ├── monster_test_generated.h │ │ ├── monster_test_generated.js │ │ ├── monster_test_generated.ts │ │ ├── monsterdata_python_wire.mon │ │ ├── monsterdata_test.golden │ │ ├── monsterdata_test.json │ │ ├── monsterdata_test.mon │ │ ├── namespace_test/ │ │ │ ├── NamespaceA/ │ │ │ │ ├── NamespaceB/ │ │ │ │ │ ├── EnumInNestedNS.cs │ │ │ │ │ ├── EnumInNestedNS.go │ │ │ │ │ ├── EnumInNestedNS.java │ │ │ │ │ ├── EnumInNestedNS.php │ │ │ │ │ ├── EnumInNestedNS.py │ │ │ │ │ ├── StructInNestedNS.cs │ │ │ │ │ ├── StructInNestedNS.go │ │ │ │ │ ├── StructInNestedNS.java │ │ │ │ │ ├── StructInNestedNS.php │ │ │ │ │ ├── StructInNestedNS.py │ │ │ │ │ ├── TableInNestedNS.cs │ │ │ │ │ ├── TableInNestedNS.go │ │ │ │ │ ├── TableInNestedNS.java │ │ │ │ │ ├── TableInNestedNS.php │ │ │ │ │ ├── TableInNestedNS.py │ │ │ │ │ └── __init__.py │ │ │ │ ├── SecondTableInA.cs │ │ │ │ ├── SecondTableInA.go │ │ │ │ ├── SecondTableInA.java │ │ │ │ ├── SecondTableInA.php │ │ │ │ ├── SecondTableInA.py │ │ │ │ ├── TableInC.cs │ │ │ │ ├── TableInC.go │ │ │ │ ├── TableInC.java │ │ │ │ ├── TableInC.php │ │ │ │ ├── TableInC.py │ │ │ │ ├── TableInFirstNS.cs │ │ │ │ ├── TableInFirstNS.go │ │ │ │ ├── TableInFirstNS.java │ │ │ │ ├── TableInFirstNS.php │ │ │ │ ├── TableInFirstNS.py │ │ │ │ └── __init__.py │ │ │ ├── NamespaceC/ │ │ │ │ ├── TableInC.cs │ │ │ │ ├── TableInC.go │ │ │ │ ├── TableInC.java │ │ │ │ ├── TableInC.php │ │ │ │ ├── TableInC.py │ │ │ │ └── __init__.py │ │ │ ├── namespace_test1.fbs │ │ │ ├── namespace_test1_generated.h │ │ │ ├── namespace_test1_generated.js │ │ │ ├── namespace_test1_generated.ts │ │ │ ├── namespace_test2.fbs │ │ │ ├── namespace_test2_generated.h │ │ │ ├── namespace_test2_generated.js │ │ │ └── namespace_test2_generated.ts │ │ ├── phpTest.php │ │ ├── phpUnionVectorTest.php │ │ ├── phpUnionVectorTest.sh │ │ ├── prototest/ │ │ │ ├── imported.proto │ │ │ ├── test.golden │ │ │ └── test.proto │ │ ├── py_test.py │ │ ├── test.cpp │ │ ├── unicode_test.json │ │ └── union_vector/ │ │ ├── Attacker.php │ │ ├── BookReader.php │ │ ├── Character.php │ │ ├── Movie.php │ │ ├── Rapunzel.php │ │ ├── union_vector.fbs │ │ ├── union_vector_generated.h │ │ ├── union_vector_generated.js │ │ └── union_vector_generated.ts │ ├── gtest-1.7.0/ │ │ ├── CHANGES │ │ ├── CMakeLists.txt │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── Makefile.am │ │ ├── Makefile.in │ │ ├── README │ │ ├── aclocal.m4 │ │ ├── build-aux/ │ │ │ ├── config.guess │ │ │ ├── config.h.in │ │ │ ├── config.sub │ │ │ ├── depcomp │ │ │ ├── install-sh │ │ │ ├── ltmain.sh │ │ │ └── missing │ │ ├── cmake/ │ │ │ └── internal_utils.cmake │ │ ├── codegear/ │ │ │ ├── gtest.cbproj │ │ │ ├── gtest.groupproj │ │ │ ├── gtest_all.cc │ │ │ ├── gtest_link.cc │ │ │ ├── gtest_main.cbproj │ │ │ └── gtest_unittest.cbproj │ │ ├── configure │ │ ├── configure.ac │ │ ├── fused-src/ │ │ │ └── gtest/ │ │ │ ├── gtest-all.cc │ │ │ ├── gtest.h │ │ │ └── gtest_main.cc │ │ ├── include/ │ │ │ └── gtest/ │ │ │ ├── gtest-death-test.h │ │ │ ├── gtest-message.h │ │ │ ├── gtest-param-test.h │ │ │ ├── gtest-param-test.h.pump │ │ │ ├── gtest-printers.h │ │ │ ├── gtest-spi.h │ │ │ ├── gtest-test-part.h │ │ │ ├── gtest-typed-test.h │ │ │ ├── gtest.h │ │ │ ├── gtest_pred_impl.h │ │ │ ├── gtest_prod.h │ │ │ └── internal/ │ │ │ ├── gtest-death-test-internal.h │ │ │ ├── gtest-filepath.h │ │ │ ├── gtest-internal.h │ │ │ ├── gtest-linked_ptr.h │ │ │ ├── gtest-param-util-generated.h │ │ │ ├── gtest-param-util-generated.h.pump │ │ │ ├── gtest-param-util.h │ │ │ ├── gtest-port.h │ │ │ ├── gtest-string.h │ │ │ ├── gtest-tuple.h │ │ │ ├── gtest-tuple.h.pump │ │ │ ├── gtest-type-util.h │ │ │ └── gtest-type-util.h.pump │ │ ├── m4/ │ │ │ ├── acx_pthread.m4 │ │ │ ├── gtest.m4 │ │ │ ├── libtool.m4 │ │ │ ├── ltoptions.m4 │ │ │ ├── ltsugar.m4 │ │ │ ├── ltversion.m4 │ │ │ └── lt~obsolete.m4 │ │ ├── make/ │ │ │ └── Makefile │ │ ├── msvc/ │ │ │ ├── gtest-md.sln │ │ │ ├── gtest-md.vcproj │ │ │ ├── gtest.sln │ │ │ ├── gtest.vcproj │ │ │ ├── gtest_main-md.vcproj │ │ │ ├── gtest_main.vcproj │ │ │ ├── gtest_prod_test-md.vcproj │ │ │ ├── gtest_prod_test.vcproj │ │ │ ├── gtest_unittest-md.vcproj │ │ │ └── gtest_unittest.vcproj │ │ ├── samples/ │ │ │ ├── prime_tables.h │ │ │ ├── sample1.cc │ │ │ ├── sample1.h │ │ │ ├── sample10_unittest.cc │ │ │ ├── sample1_unittest.cc │ │ │ ├── sample2.cc │ │ │ ├── sample2.h │ │ │ ├── sample2_unittest.cc │ │ │ ├── sample3-inl.h │ │ │ ├── sample3_unittest.cc │ │ │ ├── sample4.cc │ │ │ ├── sample4.h │ │ │ ├── sample4_unittest.cc │ │ │ ├── sample5_unittest.cc │ │ │ ├── sample6_unittest.cc │ │ │ ├── sample7_unittest.cc │ │ │ ├── sample8_unittest.cc │ │ │ └── sample9_unittest.cc │ │ ├── scripts/ │ │ │ ├── fuse_gtest_files.py │ │ │ ├── gen_gtest_pred_impl.py │ │ │ ├── gtest-config.in │ │ │ ├── pump.py │ │ │ └── test/ │ │ │ └── Makefile │ │ ├── src/ │ │ │ ├── gtest-all.cc │ │ │ ├── gtest-death-test.cc │ │ │ ├── gtest-filepath.cc │ │ │ ├── gtest-internal-inl.h │ │ │ ├── gtest-port.cc │ │ │ ├── gtest-printers.cc │ │ │ ├── gtest-test-part.cc │ │ │ ├── gtest-typed-test.cc │ │ │ ├── gtest.cc │ │ │ └── gtest_main.cc │ │ ├── test/ │ │ │ ├── gtest-death-test_ex_test.cc │ │ │ ├── gtest-death-test_test.cc │ │ │ ├── gtest-filepath_test.cc │ │ │ ├── gtest-linked_ptr_test.cc │ │ │ ├── gtest-listener_test.cc │ │ │ ├── gtest-message_test.cc │ │ │ ├── gtest-options_test.cc │ │ │ ├── gtest-param-test2_test.cc │ │ │ ├── gtest-param-test_test.cc │ │ │ ├── gtest-param-test_test.h │ │ │ ├── gtest-port_test.cc │ │ │ ├── gtest-printers_test.cc │ │ │ ├── gtest-test-part_test.cc │ │ │ ├── gtest-tuple_test.cc │ │ │ ├── gtest-typed-test2_test.cc │ │ │ ├── gtest-typed-test_test.cc │ │ │ ├── gtest-typed-test_test.h │ │ │ ├── gtest-unittest-api_test.cc │ │ │ ├── gtest_all_test.cc │ │ │ ├── gtest_break_on_failure_unittest.py │ │ │ ├── gtest_break_on_failure_unittest_.cc │ │ │ ├── gtest_catch_exceptions_test.py │ │ │ ├── gtest_catch_exceptions_test_.cc │ │ │ ├── gtest_color_test.py │ │ │ ├── gtest_color_test_.cc │ │ │ ├── gtest_env_var_test.py │ │ │ ├── gtest_env_var_test_.cc │ │ │ ├── gtest_environment_test.cc │ │ │ ├── gtest_filter_unittest.py │ │ │ ├── gtest_filter_unittest_.cc │ │ │ ├── gtest_help_test.py │ │ │ ├── gtest_help_test_.cc │ │ │ ├── gtest_list_tests_unittest.py │ │ │ ├── gtest_list_tests_unittest_.cc │ │ │ ├── gtest_main_unittest.cc │ │ │ ├── gtest_no_test_unittest.cc │ │ │ ├── gtest_output_test.py │ │ │ ├── gtest_output_test_.cc │ │ │ ├── gtest_output_test_golden_lin.txt │ │ │ ├── gtest_pred_impl_unittest.cc │ │ │ ├── gtest_premature_exit_test.cc │ │ │ ├── gtest_prod_test.cc │ │ │ ├── gtest_repeat_test.cc │ │ │ ├── gtest_shuffle_test.py │ │ │ ├── gtest_shuffle_test_.cc │ │ │ ├── gtest_sole_header_test.cc │ │ │ ├── gtest_stress_test.cc │ │ │ ├── gtest_test_utils.py │ │ │ ├── gtest_throw_on_failure_ex_test.cc │ │ │ ├── gtest_throw_on_failure_test.py │ │ │ ├── gtest_throw_on_failure_test_.cc │ │ │ ├── gtest_uninitialized_test.py │ │ │ ├── gtest_uninitialized_test_.cc │ │ │ ├── gtest_unittest.cc │ │ │ ├── gtest_xml_outfile1_test_.cc │ │ │ ├── gtest_xml_outfile2_test_.cc │ │ │ ├── gtest_xml_outfiles_test.py │ │ │ ├── gtest_xml_output_unittest.py │ │ │ ├── gtest_xml_output_unittest_.cc │ │ │ ├── gtest_xml_test_utils.py │ │ │ ├── production.cc │ │ │ └── production.h │ │ └── xcode/ │ │ ├── Config/ │ │ │ ├── DebugProject.xcconfig │ │ │ ├── FrameworkTarget.xcconfig │ │ │ ├── General.xcconfig │ │ │ ├── ReleaseProject.xcconfig │ │ │ ├── StaticLibraryTarget.xcconfig │ │ │ └── TestTarget.xcconfig │ │ ├── Resources/ │ │ │ └── Info.plist │ │ ├── Samples/ │ │ │ └── FrameworkSample/ │ │ │ ├── Info.plist │ │ │ ├── WidgetFramework.xcodeproj/ │ │ │ │ └── project.pbxproj │ │ │ ├── runtests.sh │ │ │ ├── widget.cc │ │ │ ├── widget.h │ │ │ └── widget_test.cc │ │ ├── Scripts/ │ │ │ ├── runtests.sh │ │ │ └── versiongenerate.py │ │ └── gtest.xcodeproj/ │ │ └── project.pbxproj │ ├── libgit2-0.27.2/ │ │ ├── .HEADER │ │ ├── .editorconfig │ │ ├── .gitattributes │ │ ├── .github/ │ │ │ └── ISSUE_TEMPLATE │ │ ├── .gitignore │ │ ├── .mailmap │ │ ├── .travis.yml │ │ ├── AUTHORS │ │ ├── CHANGELOG.md │ │ ├── CMakeLists.txt │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── CONVENTIONS.md │ │ ├── COPYING │ │ ├── PROJECTS.md │ │ ├── README.md │ │ ├── THREADING.md │ │ ├── TROUBLESHOOTING.md │ │ ├── api.docurium │ │ ├── appveyor.yml │ │ ├── deps/ │ │ │ ├── http-parser/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── LICENSE-MIT │ │ │ │ ├── http_parser.c │ │ │ │ └── http_parser.h │ │ │ ├── regex/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── config.h │ │ │ │ ├── regcomp.c │ │ │ │ ├── regex.c │ │ │ │ ├── regex.h │ │ │ │ ├── regex_internal.c │ │ │ │ ├── regex_internal.h │ │ │ │ └── regexec.c │ │ │ ├── winhttp/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── urlmon.h │ │ │ │ ├── winhttp.def │ │ │ │ ├── winhttp.h │ │ │ │ └── winhttp64.def │ │ │ └── zlib/ │ │ │ ├── CMakeLists.txt │ │ │ ├── adler32.c │ │ │ ├── crc32.c │ │ │ ├── crc32.h │ │ │ ├── deflate.c │ │ │ ├── deflate.h │ │ │ ├── gzguts.h │ │ │ ├── infback.c │ │ │ ├── inffast.c │ │ │ ├── inffast.h │ │ │ ├── inffixed.h │ │ │ ├── inflate.c │ │ │ ├── inflate.h │ │ │ ├── inftrees.c │ │ │ ├── inftrees.h │ │ │ ├── trees.c │ │ │ ├── trees.h │ │ │ ├── zconf.h │ │ │ ├── zlib.h │ │ │ ├── zutil.c │ │ │ └── zutil.h │ │ ├── docs/ │ │ │ ├── checkout-internals.md │ │ │ ├── diff-internals.md │ │ │ ├── error-handling.md │ │ │ ├── merge-df_conflicts.txt │ │ │ └── release.md │ │ ├── examples/ │ │ │ ├── CMakeLists.txt │ │ │ ├── COPYING │ │ │ ├── README.md │ │ │ ├── add.c │ │ │ ├── blame.c │ │ │ ├── cat-file.c │ │ │ ├── common.c │ │ │ ├── common.h │ │ │ ├── describe.c │ │ │ ├── diff.c │ │ │ ├── for-each-ref.c │ │ │ ├── general.c │ │ │ ├── init.c │ │ │ ├── log.c │ │ │ ├── merge.c │ │ │ ├── network/ │ │ │ │ ├── .gitignore │ │ │ │ ├── Makefile │ │ │ │ ├── clone.c │ │ │ │ ├── common.c │ │ │ │ ├── common.h │ │ │ │ ├── fetch.c │ │ │ │ ├── git2.c │ │ │ │ ├── index-pack.c │ │ │ │ └── ls-remote.c │ │ │ ├── remote.c │ │ │ ├── rev-list.c │ │ │ ├── rev-parse.c │ │ │ ├── showindex.c │ │ │ ├── status.c │ │ │ ├── tag.c │ │ │ └── test/ │ │ │ └── test-rev-list.sh │ │ ├── git.git-authors │ │ ├── include/ │ │ │ ├── git2/ │ │ │ │ ├── annotated_commit.h │ │ │ │ ├── attr.h │ │ │ │ ├── blame.h │ │ │ │ ├── blob.h │ │ │ │ ├── branch.h │ │ │ │ ├── buffer.h │ │ │ │ ├── checkout.h │ │ │ │ ├── cherrypick.h │ │ │ │ ├── clone.h │ │ │ │ ├── commit.h │ │ │ │ ├── common.h │ │ │ │ ├── config.h │ │ │ │ ├── cred_helpers.h │ │ │ │ ├── describe.h │ │ │ │ ├── diff.h │ │ │ │ ├── errors.h │ │ │ │ ├── filter.h │ │ │ │ ├── global.h │ │ │ │ ├── graph.h │ │ │ │ ├── ignore.h │ │ │ │ ├── index.h │ │ │ │ ├── indexer.h │ │ │ │ ├── inttypes.h │ │ │ │ ├── merge.h │ │ │ │ ├── message.h │ │ │ │ ├── net.h │ │ │ │ ├── notes.h │ │ │ │ ├── object.h │ │ │ │ ├── odb.h │ │ │ │ ├── odb_backend.h │ │ │ │ ├── oid.h │ │ │ │ ├── oidarray.h │ │ │ │ ├── pack.h │ │ │ │ ├── patch.h │ │ │ │ ├── pathspec.h │ │ │ │ ├── proxy.h │ │ │ │ ├── rebase.h │ │ │ │ ├── refdb.h │ │ │ │ ├── reflog.h │ │ │ │ ├── refs.h │ │ │ │ ├── refspec.h │ │ │ │ ├── remote.h │ │ │ │ ├── repository.h │ │ │ │ ├── reset.h │ │ │ │ ├── revert.h │ │ │ │ ├── revparse.h │ │ │ │ ├── revwalk.h │ │ │ │ ├── signature.h │ │ │ │ ├── stash.h │ │ │ │ ├── status.h │ │ │ │ ├── stdint.h │ │ │ │ ├── strarray.h │ │ │ │ ├── submodule.h │ │ │ │ ├── sys/ │ │ │ │ │ ├── commit.h │ │ │ │ │ ├── config.h │ │ │ │ │ ├── diff.h │ │ │ │ │ ├── filter.h │ │ │ │ │ ├── hashsig.h │ │ │ │ │ ├── index.h │ │ │ │ │ ├── mempack.h │ │ │ │ │ ├── merge.h │ │ │ │ │ ├── odb_backend.h │ │ │ │ │ ├── openssl.h │ │ │ │ │ ├── refdb_backend.h │ │ │ │ │ ├── reflog.h │ │ │ │ │ ├── refs.h │ │ │ │ │ ├── repository.h │ │ │ │ │ ├── stream.h │ │ │ │ │ ├── time.h │ │ │ │ │ └── transport.h │ │ │ │ ├── tag.h │ │ │ │ ├── trace.h │ │ │ │ ├── transaction.h │ │ │ │ ├── transport.h │ │ │ │ ├── tree.h │ │ │ │ ├── types.h │ │ │ │ ├── version.h │ │ │ │ └── worktree.h │ │ │ └── git2.h │ │ ├── libgit2.pc.in │ │ ├── libgit2_clar.supp │ │ ├── script/ │ │ │ ├── appveyor-mingw.sh │ │ │ ├── cibuild.sh │ │ │ ├── coverity.sh │ │ │ ├── install-deps-osx.sh │ │ │ ├── user_model.c │ │ │ └── user_nodefs.h │ │ ├── src/ │ │ │ ├── CMakeLists.txt │ │ │ ├── annotated_commit.c │ │ │ ├── annotated_commit.h │ │ │ ├── apply.c │ │ │ ├── apply.h │ │ │ ├── array.h │ │ │ ├── attr.c │ │ │ ├── attr.h │ │ │ ├── attr_file.c │ │ │ ├── attr_file.h │ │ │ ├── attrcache.c │ │ │ ├── attrcache.h │ │ │ ├── bitvec.h │ │ │ ├── blame.c │ │ │ ├── blame.h │ │ │ ├── blame_git.c │ │ │ ├── blame_git.h │ │ │ ├── blob.c │ │ │ ├── blob.h │ │ │ ├── branch.c │ │ │ ├── branch.h │ │ │ ├── buf_text.c │ │ │ ├── buf_text.h │ │ │ ├── buffer.c │ │ │ ├── buffer.h │ │ │ ├── cache.c │ │ │ ├── cache.h │ │ │ ├── cc-compat.h │ │ │ ├── checkout.c │ │ │ ├── checkout.h │ │ │ ├── cherrypick.c │ │ │ ├── clone.c │ │ │ ├── clone.h │ │ │ ├── commit.c │ │ │ ├── commit.h │ │ │ ├── commit_list.c │ │ │ ├── commit_list.h │ │ │ ├── common.h │ │ │ ├── config.c │ │ │ ├── config.h │ │ │ ├── config_cache.c │ │ │ ├── config_file.c │ │ │ ├── config_file.h │ │ │ ├── config_parse.c │ │ │ ├── config_parse.h │ │ │ ├── crlf.c │ │ │ ├── date.c │ │ │ ├── delta.c │ │ │ ├── delta.h │ │ │ ├── describe.c │ │ │ ├── diff.c │ │ │ ├── diff.h │ │ │ ├── diff_driver.c │ │ │ ├── diff_driver.h │ │ │ ├── diff_file.c │ │ │ ├── diff_file.h │ │ │ ├── diff_generate.c │ │ │ ├── diff_generate.h │ │ │ ├── diff_parse.c │ │ │ ├── diff_parse.h │ │ │ ├── diff_print.c │ │ │ ├── diff_stats.c │ │ │ ├── diff_tform.c │ │ │ ├── diff_tform.h │ │ │ ├── diff_xdiff.c │ │ │ ├── diff_xdiff.h │ │ │ ├── errors.c │ │ │ ├── features.h.in │ │ │ ├── fetch.c │ │ │ ├── fetch.h │ │ │ ├── fetchhead.c │ │ │ ├── fetchhead.h │ │ │ ├── filebuf.c │ │ │ ├── filebuf.h │ │ │ ├── fileops.c │ │ │ ├── fileops.h │ │ │ ├── filter.c │ │ │ ├── filter.h │ │ │ ├── fnmatch.c │ │ │ ├── fnmatch.h │ │ │ ├── global.c │ │ │ ├── global.h │ │ │ ├── graph.c │ │ │ ├── hash/ │ │ │ │ ├── hash_collisiondetect.h │ │ │ │ ├── hash_common_crypto.h │ │ │ │ ├── hash_generic.c │ │ │ │ ├── hash_generic.h │ │ │ │ ├── hash_openssl.h │ │ │ │ ├── hash_win32.c │ │ │ │ ├── hash_win32.h │ │ │ │ └── sha1dc/ │ │ │ │ ├── sha1.c │ │ │ │ ├── sha1.h │ │ │ │ ├── ubc_check.c │ │ │ │ └── ubc_check.h │ │ │ ├── hash.c │ │ │ ├── hash.h │ │ │ ├── hashsig.c │ │ │ ├── ident.c │ │ │ ├── idxmap.c │ │ │ ├── idxmap.h │ │ │ ├── ignore.c │ │ │ ├── ignore.h │ │ │ ├── index.c │ │ │ ├── index.h │ │ │ ├── indexer.c │ │ │ ├── indexer.h │ │ │ ├── integer.h │ │ │ ├── iterator.c │ │ │ ├── iterator.h │ │ │ ├── khash.h │ │ │ ├── map.h │ │ │ ├── merge.c │ │ │ ├── merge.h │ │ │ ├── merge_driver.c │ │ │ ├── merge_driver.h │ │ │ ├── merge_file.c │ │ │ ├── message.c │ │ │ ├── message.h │ │ │ ├── mwindow.c │ │ │ ├── mwindow.h │ │ │ ├── netops.c │ │ │ ├── netops.h │ │ │ ├── notes.c │ │ │ ├── notes.h │ │ │ ├── object.c │ │ │ ├── object.h │ │ │ ├── object_api.c │ │ │ ├── odb.c │ │ │ ├── odb.h │ │ │ ├── odb_loose.c │ │ │ ├── odb_mempack.c │ │ │ ├── odb_pack.c │ │ │ ├── offmap.c │ │ │ ├── offmap.h │ │ │ ├── oid.c │ │ │ ├── oid.h │ │ │ ├── oidarray.c │ │ │ ├── oidarray.h │ │ │ ├── oidmap.c │ │ │ ├── oidmap.h │ │ │ ├── pack-objects.c │ │ │ ├── pack-objects.h │ │ │ ├── pack.c │ │ │ ├── pack.h │ │ │ ├── parse.c │ │ │ ├── parse.h │ │ │ ├── patch.c │ │ │ ├── patch.h │ │ │ ├── patch_generate.c │ │ │ ├── patch_generate.h │ │ │ ├── patch_parse.c │ │ │ ├── patch_parse.h │ │ │ ├── path.c │ │ │ ├── path.h │ │ │ ├── pathspec.c │ │ │ ├── pathspec.h │ │ │ ├── pool.c │ │ │ ├── pool.h │ │ │ ├── posix.c │ │ │ ├── posix.h │ │ │ ├── pqueue.c │ │ │ ├── pqueue.h │ │ │ ├── proxy.c │ │ │ ├── proxy.h │ │ │ ├── push.c │ │ │ ├── push.h │ │ │ ├── rebase.c │ │ │ ├── refdb.c │ │ │ ├── refdb.h │ │ │ ├── refdb_fs.c │ │ │ ├── refdb_fs.h │ │ │ ├── reflog.c │ │ │ ├── reflog.h │ │ │ ├── refs.c │ │ │ ├── refs.h │ │ │ ├── refspec.c │ │ │ ├── refspec.h │ │ │ ├── remote.c │ │ │ ├── remote.h │ │ │ ├── repo_template.h │ │ │ ├── repository.c │ │ │ ├── repository.h │ │ │ ├── reset.c │ │ │ ├── revert.c │ │ │ ├── revparse.c │ │ │ ├── revwalk.c │ │ │ ├── revwalk.h │ │ │ ├── settings.c │ │ │ ├── sha1_lookup.c │ │ │ ├── sha1_lookup.h │ │ │ ├── signature.c │ │ │ ├── signature.h │ │ │ ├── sortedcache.c │ │ │ ├── sortedcache.h │ │ │ ├── stash.c │ │ │ ├── status.c │ │ │ ├── status.h │ │ │ ├── stream.h │ │ │ ├── streams/ │ │ │ │ ├── curl.c │ │ │ │ ├── curl.h │ │ │ │ ├── openssl.c │ │ │ │ ├── openssl.h │ │ │ │ ├── socket.c │ │ │ │ ├── socket.h │ │ │ │ ├── stransport.c │ │ │ │ ├── stransport.h │ │ │ │ ├── tls.c │ │ │ │ └── tls.h │ │ │ ├── strmap.c │ │ │ ├── strmap.h │ │ │ ├── strnlen.h │ │ │ ├── submodule.c │ │ │ ├── submodule.h │ │ │ ├── sysdir.c │ │ │ ├── sysdir.h │ │ │ ├── tag.c │ │ │ ├── tag.h │ │ │ ├── thread-utils.c │ │ │ ├── thread-utils.h │ │ │ ├── trace.c │ │ │ ├── trace.h │ │ │ ├── trailer.c │ │ │ ├── transaction.c │ │ │ ├── transaction.h │ │ │ ├── transport.c │ │ │ ├── transports/ │ │ │ │ ├── auth.c │ │ │ │ ├── auth.h │ │ │ │ ├── auth_negotiate.c │ │ │ │ ├── auth_negotiate.h │ │ │ │ ├── cred.c │ │ │ │ ├── cred.h │ │ │ │ ├── cred_helpers.c │ │ │ │ ├── git.c │ │ │ │ ├── http.c │ │ │ │ ├── http.h │ │ │ │ ├── local.c │ │ │ │ ├── smart.c │ │ │ │ ├── smart.h │ │ │ │ ├── smart_pkt.c │ │ │ │ ├── smart_protocol.c │ │ │ │ ├── ssh.c │ │ │ │ ├── ssh.h │ │ │ │ └── winhttp.c │ │ │ ├── tree-cache.c │ │ │ ├── tree-cache.h │ │ │ ├── tree.c │ │ │ ├── tree.h │ │ │ ├── tsort.c │ │ │ ├── unix/ │ │ │ │ ├── map.c │ │ │ │ ├── posix.h │ │ │ │ ├── pthread.h │ │ │ │ └── realpath.c │ │ │ ├── userdiff.h │ │ │ ├── util.c │ │ │ ├── util.h │ │ │ ├── varint.c │ │ │ ├── varint.h │ │ │ ├── vector.c │ │ │ ├── vector.h │ │ │ ├── win32/ │ │ │ │ ├── dir.c │ │ │ │ ├── dir.h │ │ │ │ ├── error.c │ │ │ │ ├── error.h │ │ │ │ ├── findfile.c │ │ │ │ ├── findfile.h │ │ │ │ ├── git2.rc │ │ │ │ ├── map.c │ │ │ │ ├── mingw-compat.h │ │ │ │ ├── msvc-compat.h │ │ │ │ ├── path_w32.c │ │ │ │ ├── path_w32.h │ │ │ │ ├── posix.h │ │ │ │ ├── posix_w32.c │ │ │ │ ├── precompiled.c │ │ │ │ ├── precompiled.h │ │ │ │ ├── reparse.h │ │ │ │ ├── thread.c │ │ │ │ ├── thread.h │ │ │ │ ├── utf-conv.c │ │ │ │ ├── utf-conv.h │ │ │ │ ├── version.h │ │ │ │ ├── w32_buffer.c │ │ │ │ ├── w32_buffer.h │ │ │ │ ├── w32_crtdbg_stacktrace.c │ │ │ │ ├── w32_crtdbg_stacktrace.h │ │ │ │ ├── w32_stack.c │ │ │ │ ├── w32_stack.h │ │ │ │ ├── w32_util.c │ │ │ │ ├── w32_util.h │ │ │ │ └── win32-compat.h │ │ │ ├── worktree.c │ │ │ ├── worktree.h │ │ │ ├── xdiff/ │ │ │ │ ├── xdiff.h │ │ │ │ ├── xdiffi.c │ │ │ │ ├── xdiffi.h │ │ │ │ ├── xemit.c │ │ │ │ ├── xemit.h │ │ │ │ ├── xhistogram.c │ │ │ │ ├── xinclude.h │ │ │ │ ├── xmacros.h │ │ │ │ ├── xmerge.c │ │ │ │ ├── xpatience.c │ │ │ │ ├── xprepare.c │ │ │ │ ├── xprepare.h │ │ │ │ ├── xtypes.h │ │ │ │ ├── xutils.c │ │ │ │ └── xutils.h │ │ │ ├── zstream.c │ │ │ └── zstream.h │ │ └── tests/ │ │ ├── CMakeLists.txt │ │ ├── README.md │ │ ├── apply/ │ │ │ ├── fromdiff.c │ │ │ └── fromfile.c │ │ ├── attr/ │ │ │ ├── attr_expect.h │ │ │ ├── file.c │ │ │ ├── flags.c │ │ │ ├── ignore.c │ │ │ ├── lookup.c │ │ │ └── repo.c │ │ ├── blame/ │ │ │ ├── blame_helpers.c │ │ │ ├── blame_helpers.h │ │ │ ├── buffer.c │ │ │ ├── getters.c │ │ │ ├── harder.c │ │ │ └── simple.c │ │ ├── buf/ │ │ │ ├── basic.c │ │ │ ├── oom.c │ │ │ ├── percent.c │ │ │ ├── quote.c │ │ │ └── splice.c │ │ ├── checkout/ │ │ │ ├── binaryunicode.c │ │ │ ├── checkout_helpers.c │ │ │ ├── checkout_helpers.h │ │ │ ├── conflict.c │ │ │ ├── crlf.c │ │ │ ├── head.c │ │ │ ├── icase.c │ │ │ ├── index.c │ │ │ ├── nasty.c │ │ │ ├── tree.c │ │ │ └── typechange.c │ │ ├── cherrypick/ │ │ │ ├── bare.c │ │ │ └── workdir.c │ │ ├── clar/ │ │ │ ├── fixtures.h │ │ │ ├── fs.h │ │ │ ├── print.h │ │ │ └── sandbox.h │ │ ├── clar.c │ │ ├── clar.h │ │ ├── clar_libgit2.c │ │ ├── clar_libgit2.h │ │ ├── clar_libgit2_timer.c │ │ ├── clar_libgit2_timer.h │ │ ├── clar_libgit2_trace.c │ │ ├── clar_libgit2_trace.h │ │ ├── clone/ │ │ │ ├── empty.c │ │ │ ├── local.c │ │ │ ├── nonetwork.c │ │ │ └── transport.c │ │ ├── commit/ │ │ │ ├── commit.c │ │ │ ├── parent.c │ │ │ ├── parse.c │ │ │ ├── signature.c │ │ │ └── write.c │ │ ├── config/ │ │ │ ├── add.c │ │ │ ├── backend.c │ │ │ ├── conditionals.c │ │ │ ├── config_helpers.c │ │ │ ├── config_helpers.h │ │ │ ├── configlevel.c │ │ │ ├── global.c │ │ │ ├── include.c │ │ │ ├── multivar.c │ │ │ ├── new.c │ │ │ ├── read.c │ │ │ ├── readonly.c │ │ │ ├── rename.c │ │ │ ├── snapshot.c │ │ │ ├── stress.c │ │ │ ├── validkeyname.c │ │ │ └── write.c │ │ ├── core/ │ │ │ ├── array.c │ │ │ ├── bitvec.c │ │ │ ├── buffer.c │ │ │ ├── copy.c │ │ │ ├── dirent.c │ │ │ ├── encoding.c │ │ │ ├── env.c │ │ │ ├── errors.c │ │ │ ├── features.c │ │ │ ├── filebuf.c │ │ │ ├── ftruncate.c │ │ │ ├── futils.c │ │ │ ├── hex.c │ │ │ ├── iconv.c │ │ │ ├── init.c │ │ │ ├── link.c │ │ │ ├── mkdir.c │ │ │ ├── oid.c │ │ │ ├── oidmap.c │ │ │ ├── opts.c │ │ │ ├── path.c │ │ │ ├── pool.c │ │ │ ├── posix.c │ │ │ ├── pqueue.c │ │ │ ├── rmdir.c │ │ │ ├── sha1.c │ │ │ ├── sortedcache.c │ │ │ ├── stat.c │ │ │ ├── stream.c │ │ │ ├── string.c │ │ │ ├── strmap.c │ │ │ ├── strtol.c │ │ │ ├── structinit.c │ │ │ ├── useragent.c │ │ │ ├── vector.c │ │ │ └── zstream.c │ │ ├── date/ │ │ │ ├── date.c │ │ │ └── rfc2822.c │ │ ├── describe/ │ │ │ ├── describe.c │ │ │ ├── describe_helpers.c │ │ │ ├── describe_helpers.h │ │ │ └── t6120.c │ │ ├── diff/ │ │ │ ├── binary.c │ │ │ ├── blob.c │ │ │ ├── diff_helpers.c │ │ │ ├── diff_helpers.h │ │ │ ├── diffiter.c │ │ │ ├── drivers.c │ │ │ ├── format_email.c │ │ │ ├── index.c │ │ │ ├── notify.c │ │ │ ├── parse.c │ │ │ ├── patch.c │ │ │ ├── patchid.c │ │ │ ├── pathspec.c │ │ │ ├── racediffiter.c │ │ │ ├── rename.c │ │ │ ├── stats.c │ │ │ ├── submodules.c │ │ │ ├── tree.c │ │ │ └── workdir.c │ │ ├── fetchhead/ │ │ │ ├── fetchhead_data.h │ │ │ └── nonetwork.c │ │ ├── filter/ │ │ │ ├── blob.c │ │ │ ├── crlf.c │ │ │ ├── crlf.h │ │ │ ├── custom.c │ │ │ ├── custom_helpers.c │ │ │ ├── custom_helpers.h │ │ │ ├── file.c │ │ │ ├── ident.c │ │ │ ├── query.c │ │ │ ├── stream.c │ │ │ └── wildcard.c │ │ ├── generate.py │ │ ├── generate_crlf.sh │ │ ├── graph/ │ │ │ └── descendant_of.c │ │ ├── index/ │ │ │ ├── add.c │ │ │ ├── addall.c │ │ │ ├── bypath.c │ │ │ ├── cache.c │ │ │ ├── collision.c │ │ │ ├── conflicts.c │ │ │ ├── conflicts.h │ │ │ ├── crlf.c │ │ │ ├── filemodes.c │ │ │ ├── inmemory.c │ │ │ ├── names.c │ │ │ ├── nsec.c │ │ │ ├── racy.c │ │ │ ├── read_index.c │ │ │ ├── read_tree.c │ │ │ ├── rename.c │ │ │ ├── reuc.c │ │ │ ├── stage.c │ │ │ ├── tests.c │ │ │ └── version.c │ │ ├── iterator/ │ │ │ ├── index.c │ │ │ ├── iterator_helpers.c │ │ │ ├── iterator_helpers.h │ │ │ ├── tree.c │ │ │ └── workdir.c │ │ ├── main.c │ │ ├── merge/ │ │ │ ├── conflict_data.h │ │ │ ├── driver.c │ │ │ ├── files.c │ │ │ ├── merge_helpers.c │ │ │ ├── merge_helpers.h │ │ │ ├── trees/ │ │ │ │ ├── automerge.c │ │ │ │ ├── commits.c │ │ │ │ ├── modeconflict.c │ │ │ │ ├── recursive.c │ │ │ │ ├── renames.c │ │ │ │ ├── treediff.c │ │ │ │ ├── trivial.c │ │ │ │ └── whitespace.c │ │ │ └── workdir/ │ │ │ ├── analysis.c │ │ │ ├── dirty.c │ │ │ ├── recursive.c │ │ │ ├── renames.c │ │ │ ├── setup.c │ │ │ ├── simple.c │ │ │ ├── submodules.c │ │ │ └── trivial.c │ │ ├── message/ │ │ │ └── trailer.c │ │ ├── network/ │ │ │ ├── cred.c │ │ │ ├── fetchlocal.c │ │ │ ├── matchhost.c │ │ │ ├── refspecs.c │ │ │ ├── remote/ │ │ │ │ ├── createthenload.c │ │ │ │ ├── defaultbranch.c │ │ │ │ ├── delete.c │ │ │ │ ├── isvalidname.c │ │ │ │ ├── local.c │ │ │ │ ├── push.c │ │ │ │ ├── remotes.c │ │ │ │ └── rename.c │ │ │ └── urlparse.c │ │ ├── notes/ │ │ │ ├── notes.c │ │ │ └── notesref.c │ │ ├── object/ │ │ │ ├── blob/ │ │ │ │ ├── filter.c │ │ │ │ ├── fromstream.c │ │ │ │ └── write.c │ │ │ ├── cache.c │ │ │ ├── commit/ │ │ │ │ └── commitstagedfile.c │ │ │ ├── lookup.c │ │ │ ├── lookupbypath.c │ │ │ ├── message.c │ │ │ ├── peel.c │ │ │ ├── raw/ │ │ │ │ ├── chars.c │ │ │ │ ├── compare.c │ │ │ │ ├── convert.c │ │ │ │ ├── data.h │ │ │ │ ├── fromstr.c │ │ │ │ ├── hash.c │ │ │ │ ├── short.c │ │ │ │ ├── size.c │ │ │ │ ├── type2string.c │ │ │ │ └── write.c │ │ │ ├── shortid.c │ │ │ ├── tag/ │ │ │ │ ├── list.c │ │ │ │ ├── peel.c │ │ │ │ ├── read.c │ │ │ │ └── write.c │ │ │ └── tree/ │ │ │ ├── attributes.c │ │ │ ├── duplicateentries.c │ │ │ ├── frompath.c │ │ │ ├── read.c │ │ │ ├── update.c │ │ │ ├── walk.c │ │ │ └── write.c │ │ ├── odb/ │ │ │ ├── alternates.c │ │ │ ├── backend/ │ │ │ │ ├── backend_helpers.c │ │ │ │ ├── backend_helpers.h │ │ │ │ ├── mempack.c │ │ │ │ ├── multiple.c │ │ │ │ ├── nobackend.c │ │ │ │ ├── nonrefreshing.c │ │ │ │ └── simple.c │ │ │ ├── emptyobjects.c │ │ │ ├── foreach.c │ │ │ ├── freshen.c │ │ │ ├── largefiles.c │ │ │ ├── loose.c │ │ │ ├── loose_data.h │ │ │ ├── mixed.c │ │ │ ├── pack_data.h │ │ │ ├── pack_data_one.h │ │ │ ├── packed.c │ │ │ ├── packed_one.c │ │ │ ├── sorting.c │ │ │ └── streamwrite.c │ │ ├── online/ │ │ │ ├── badssl.c │ │ │ ├── clone.c │ │ │ ├── fetch.c │ │ │ ├── fetchhead.c │ │ │ ├── push.c │ │ │ ├── push_util.c │ │ │ ├── push_util.h │ │ │ └── remotes.c │ │ ├── pack/ │ │ │ ├── indexer.c │ │ │ ├── packbuilder.c │ │ │ └── sharing.c │ │ ├── patch/ │ │ │ ├── parse.c │ │ │ ├── patch_common.h │ │ │ └── print.c │ │ ├── path/ │ │ │ ├── core.c │ │ │ ├── dotgit.c │ │ │ └── win32.c │ │ ├── perf/ │ │ │ ├── helper__perf__do_merge.c │ │ │ ├── helper__perf__do_merge.h │ │ │ ├── helper__perf__timer.c │ │ │ ├── helper__perf__timer.h │ │ │ └── merge.c │ │ ├── precompiled.c │ │ ├── precompiled.h │ │ ├── rebase/ │ │ │ ├── abort.c │ │ │ ├── inmemory.c │ │ │ ├── iterator.c │ │ │ ├── merge.c │ │ │ ├── setup.c │ │ │ └── submodule.c │ │ ├── refs/ │ │ │ ├── branches/ │ │ │ │ ├── create.c │ │ │ │ ├── delete.c │ │ │ │ ├── ishead.c │ │ │ │ ├── iterator.c │ │ │ │ ├── lookup.c │ │ │ │ ├── move.c │ │ │ │ ├── name.c │ │ │ │ ├── remote.c │ │ │ │ ├── upstream.c │ │ │ │ └── upstreamname.c │ │ │ ├── crashes.c │ │ │ ├── create.c │ │ │ ├── delete.c │ │ │ ├── dup.c │ │ │ ├── foreachglob.c │ │ │ ├── isvalidname.c │ │ │ ├── iterator.c │ │ │ ├── list.c │ │ │ ├── listall.c │ │ │ ├── lookup.c │ │ │ ├── namespaces.c │ │ │ ├── normalize.c │ │ │ ├── overwrite.c │ │ │ ├── pack.c │ │ │ ├── peel.c │ │ │ ├── races.c │ │ │ ├── read.c │ │ │ ├── ref_helpers.c │ │ │ ├── ref_helpers.h │ │ │ ├── reflog/ │ │ │ │ ├── drop.c │ │ │ │ ├── messages.c │ │ │ │ ├── reflog.c │ │ │ │ ├── reflog_helpers.c │ │ │ │ └── reflog_helpers.h │ │ │ ├── rename.c │ │ │ ├── revparse.c │ │ │ ├── setter.c │ │ │ ├── shorthand.c │ │ │ ├── transactions.c │ │ │ ├── unicode.c │ │ │ └── update.c │ │ ├── remote/ │ │ │ └── insteadof.c │ │ ├── repo/ │ │ │ ├── config.c │ │ │ ├── discover.c │ │ │ ├── env.c │ │ │ ├── getters.c │ │ │ ├── hashfile.c │ │ │ ├── head.c │ │ │ ├── headtree.c │ │ │ ├── init.c │ │ │ ├── message.c │ │ │ ├── new.c │ │ │ ├── open.c │ │ │ ├── pathspec.c │ │ │ ├── repo_helpers.c │ │ │ ├── repo_helpers.h │ │ │ ├── reservedname.c │ │ │ ├── setters.c │ │ │ ├── shallow.c │ │ │ └── state.c │ │ ├── reset/ │ │ │ ├── default.c │ │ │ ├── hard.c │ │ │ ├── mixed.c │ │ │ ├── reset_helpers.c │ │ │ ├── reset_helpers.h │ │ │ └── soft.c │ │ ├── resources/ │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── attr/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ ├── attributes │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 10/ │ │ │ │ │ │ │ └── 8bb4e7fd7b16490dc33ff7d972151e73d7166e │ │ │ │ │ │ ├── 16/ │ │ │ │ │ │ │ └── 983da6643656bb44c43965ecb6855c6d574512 │ │ │ │ │ │ ├── 21/ │ │ │ │ │ │ │ └── 7878ab49e1314388ea2e32dc6fdb58a1b969e0 │ │ │ │ │ │ ├── 24/ │ │ │ │ │ │ │ └── fa9a9fc4e202313e24b648087495441dab432b │ │ │ │ │ │ ├── 29/ │ │ │ │ │ │ │ └── 29de282ce999e95183aedac6451d3384559c4b │ │ │ │ │ │ ├── 2b/ │ │ │ │ │ │ │ └── 40c5aca159b04ea8d20ffe36cdf8b09369b14a │ │ │ │ │ │ ├── 2c/ │ │ │ │ │ │ │ └── 66e14f77196ea763fb1e41612c1aa2bc2d8ed2 │ │ │ │ │ │ ├── 2d/ │ │ │ │ │ │ │ └── e7dfe3588f3c7e9ad59e7d50ba90e3329df9d9 │ │ │ │ │ │ ├── 37/ │ │ │ │ │ │ │ └── 0fe9ec224ce33e71f9e5ec2bd1142ce9937a6a │ │ │ │ │ │ ├── 3a/ │ │ │ │ │ │ │ └── 6df026462ebafe455af9867d27eda20a9e0974 │ │ │ │ │ │ ├── 3b/ │ │ │ │ │ │ │ └── 74db7ab381105dc0d28f8295a77f6a82989292 │ │ │ │ │ │ ├── 3e/ │ │ │ │ │ │ │ └── 42ffc54a663f9401cc25843d6c0e71a33e4249 │ │ │ │ │ │ ├── 45/ │ │ │ │ │ │ │ ├── 141a79a77842c59a63229403220a4e4be74e3d │ │ │ │ │ │ │ ├── 5a314fa848d52ae1f11d254da4f60858fc97f4 │ │ │ │ │ │ │ └── b983be36b73c0788dc9cbcb76cbb80fc7bb057 │ │ │ │ │ │ ├── 4d/ │ │ │ │ │ │ │ └── 713dc48e6b1bd75b0d61ad078ba9ca3a56745d │ │ │ │ │ │ ├── 4e/ │ │ │ │ │ │ │ └── 49ba8c5b6c32ff28cd9dcb60be34df50fcc485 │ │ │ │ │ │ ├── 55/ │ │ │ │ │ │ │ └── 6f8c827b8e4a02ad5cab77dca2bcb3e226b0b3 │ │ │ │ │ │ ├── 58/ │ │ │ │ │ │ │ └── 19a185d77b03325aaf87cafc771db36f6ddca7 │ │ │ │ │ │ ├── 60/ │ │ │ │ │ │ │ └── 5812ab7fe421fdd325a935d35cb06a9234a7d7 │ │ │ │ │ │ ├── 6b/ │ │ │ │ │ │ │ └── ab5c79cd5140d0f800917f550eb2a3dc32b0da │ │ │ │ │ │ ├── 6d/ │ │ │ │ │ │ │ └── 968d62c89c7d9ea23a4c9a7b665d017c3d8ffd │ │ │ │ │ │ ├── 71/ │ │ │ │ │ │ │ └── 7fc31f6b84f9d6fc3a4edbca259d7fc92beee2 │ │ │ │ │ │ ├── 8d/ │ │ │ │ │ │ │ └── 0b9df9bd30be7910ddda60548d485bc302b911 │ │ │ │ │ │ ├── 93/ │ │ │ │ │ │ │ └── 61f40bb97239cf55811892e14de2e344168ba1 │ │ │ │ │ │ ├── 94/ │ │ │ │ │ │ │ └── da4faa0a6bfb8ee6ccf7153801a69202b31857 │ │ │ │ │ │ ├── 96/ │ │ │ │ │ │ │ └── 089fd31ce1d3ee2afb0ba09ba063066932f027 │ │ │ │ │ │ ├── 99/ │ │ │ │ │ │ │ └── eae476896f4907224978b88e5ecaa6c5bb67a9 │ │ │ │ │ │ ├── 9e/ │ │ │ │ │ │ │ └── 5bdc47d6a80f2be0ea3049ad74231b94609242 │ │ │ │ │ │ ├── 9f/ │ │ │ │ │ │ │ └── b40b6675dde60b5697afceae91b66d908c02d9 │ │ │ │ │ │ ├── a0/ │ │ │ │ │ │ │ └── f7217ae99f5ac3e88534f5cea267febc5fa85b │ │ │ │ │ │ ├── a5/ │ │ │ │ │ │ │ ├── 6bbcecaeac760cc26239384d2d4c614e7e4320 │ │ │ │ │ │ │ └── d76cad53f66f1312bd995909a5bab3c0820770 │ │ │ │ │ │ ├── a9/ │ │ │ │ │ │ │ └── 7cc019851d401a4f1d091cb91a15890a0dd1ba │ │ │ │ │ │ ├── b4/ │ │ │ │ │ │ │ └── 35cd5689a0fb54afbeda4ac20368aa480e8f04 │ │ │ │ │ │ ├── c0/ │ │ │ │ │ │ │ └── 091889c0c77142b87a1fa5123a6398a61d33e7 │ │ │ │ │ │ ├── c4/ │ │ │ │ │ │ │ └── 85abe35abd4aa6fd83b076a78bbea9e2e7e06c │ │ │ │ │ │ ├── c7/ │ │ │ │ │ │ │ └── aadd770d5907a8475c29e9ee21a27b88bf675d │ │ │ │ │ │ ├── c9/ │ │ │ │ │ │ │ └── 6bbb2c2557a8325ae1559e3ba79cdcecb23076 │ │ │ │ │ │ ├── ce/ │ │ │ │ │ │ │ └── 39a97a7fb1fa90bcf5e711249c1e507476ae0e │ │ │ │ │ │ ├── d5/ │ │ │ │ │ │ │ └── 7da33c16b14326ecb05d19bbea908f5e4c47d9 │ │ │ │ │ │ ├── d8/ │ │ │ │ │ │ │ └── 00886d9c86731ae5c4a62b0b77c437015e00d2 │ │ │ │ │ │ ├── dc/ │ │ │ │ │ │ │ └── cada462d3df8ac6de596fb8c896aba9344f941 │ │ │ │ │ │ ├── de/ │ │ │ │ │ │ │ └── 863bff4976c9ed7e17a4da0fd524908dc84049 │ │ │ │ │ │ ├── e5/ │ │ │ │ │ │ │ └── 63cf4758f0d646f1b14b76016aa17fa9e549a4 │ │ │ │ │ │ ├── ec/ │ │ │ │ │ │ │ └── b97df2a174987475ac816e3847fc8e9f6c596b │ │ │ │ │ │ ├── ed/ │ │ │ │ │ │ │ └── f3dcee4003d71f139777898882ccd097e34c53 │ │ │ │ │ │ ├── f2/ │ │ │ │ │ │ │ └── c6d717cf4a5a3e6b02684155ab07b766982165 │ │ │ │ │ │ ├── f5/ │ │ │ │ │ │ │ └── b0af1fb4f5c0cd7aad880711d368a07333c307 │ │ │ │ │ │ ├── fb/ │ │ │ │ │ │ │ └── 5067b1aef3ac1ada4b379dbcb7d17255df7d78 │ │ │ │ │ │ ├── fe/ │ │ │ │ │ │ │ └── 773770c5a6cc7185580c9204b1ff18a33ff3fc │ │ │ │ │ │ └── ff/ │ │ │ │ │ │ └── 69f8639ce2e6010b3f33a74160aad98b48da2b │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── attr0 │ │ │ │ ├── attr1 │ │ │ │ ├── attr2 │ │ │ │ ├── attr3 │ │ │ │ ├── binfile │ │ │ │ ├── dir/ │ │ │ │ │ └── file │ │ │ │ ├── file │ │ │ │ ├── gitattributes │ │ │ │ ├── gitignore │ │ │ │ ├── ign │ │ │ │ ├── macro_bad │ │ │ │ ├── macro_test │ │ │ │ ├── root_test1 │ │ │ │ ├── root_test2 │ │ │ │ ├── root_test3 │ │ │ │ ├── root_test4.txt │ │ │ │ └── sub/ │ │ │ │ ├── .gitattributes │ │ │ │ ├── abc │ │ │ │ ├── dir/ │ │ │ │ │ └── file │ │ │ │ ├── file │ │ │ │ ├── ign/ │ │ │ │ │ ├── file │ │ │ │ │ └── sub/ │ │ │ │ │ └── file │ │ │ │ ├── sub/ │ │ │ │ │ ├── .gitattributes │ │ │ │ │ ├── dir │ │ │ │ │ ├── file │ │ │ │ │ └── subsub.txt │ │ │ │ ├── subdir_test1 │ │ │ │ └── subdir_test2.txt │ │ │ ├── attr_index/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ ├── exclude │ │ │ │ │ │ └── refs │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 38/ │ │ │ │ │ │ │ └── 12cfef36615db1788d4e63f90028007e17a348 │ │ │ │ │ │ ├── 59/ │ │ │ │ │ │ │ └── d942b8be2784bc96db9b22202c10815c9a077b │ │ │ │ │ │ ├── cd/ │ │ │ │ │ │ │ └── f17ea3fe625ef812f4dce7f423f4f299287505 │ │ │ │ │ │ ├── f7/ │ │ │ │ │ │ │ └── 2502ddd01412bb20796ff812af56fd53b82b52 │ │ │ │ │ │ ├── info/ │ │ │ │ │ │ │ └── packs │ │ │ │ │ │ └── pack/ │ │ │ │ │ │ ├── pack-4e6438607204ce78827e3885594b2c0bb4f13895.idx │ │ │ │ │ │ └── pack-4e6438607204ce78827e3885594b2c0bb4f13895.pack │ │ │ │ │ ├── packed-refs │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── README.md │ │ │ │ ├── README.txt │ │ │ │ ├── gitattributes │ │ │ │ └── sub/ │ │ │ │ └── sub/ │ │ │ │ ├── .gitattributes │ │ │ │ ├── README.md │ │ │ │ └── README.txt │ │ │ ├── bad.index │ │ │ ├── bad_tag.git/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── objects/ │ │ │ │ │ └── pack/ │ │ │ │ │ ├── pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.idx │ │ │ │ │ └── pack-7a28f4e000a17f49a41d7a79fc2f762a8a7d9164.pack │ │ │ │ ├── packed-refs │ │ │ │ └── refs/ │ │ │ │ └── dummy-marker.txt │ │ │ ├── big.index │ │ │ ├── binaryunicode/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ ├── exclude │ │ │ │ │ │ └── refs │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── info/ │ │ │ │ │ │ │ └── packs │ │ │ │ │ │ └── pack/ │ │ │ │ │ │ ├── pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.idx │ │ │ │ │ │ └── pack-c5bfca875b4995d7aba6e5abf36241f3c397327d.pack │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ ├── branch1 │ │ │ │ │ ├── branch2 │ │ │ │ │ └── master │ │ │ │ └── file.txt │ │ │ ├── blametest.git/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── description │ │ │ │ ├── objects/ │ │ │ │ │ ├── 0c/ │ │ │ │ │ │ └── bab4d45fd61e55a1c9697f9f9cb07a12e15448 │ │ │ │ │ ├── 1a/ │ │ │ │ │ │ └── ac69ae5d96461afc4d81d0066cb12f5b05a35b │ │ │ │ │ ├── 1b/ │ │ │ │ │ │ └── 5f0775af166331c854bd8d1bca3450eaf2532a │ │ │ │ │ ├── 37/ │ │ │ │ │ │ └── 681a80ca21064efd5c3bf2ef41eb3d05a1428b │ │ │ │ │ ├── 48/ │ │ │ │ │ │ └── 2f2c370e35c2c314fc1f96db2beb33f955a26a │ │ │ │ │ ├── 4e/ │ │ │ │ │ │ └── ecfea484f8005d101e547f6bfb07c99e2b114e │ │ │ │ │ ├── 5a/ │ │ │ │ │ │ └── 572e2e94825f54b95417eacaa089d560c5a5e9 │ │ │ │ │ ├── 63/ │ │ │ │ │ │ ├── d671eb32d250e4a83766ebbc60e818c1e1e93a │ │ │ │ │ │ └── eb57322e363e18d460da5ea8284f3cd2340b36 │ │ │ │ │ ├── 66/ │ │ │ │ │ │ └── 53ff42313eb5c82806f145391b18a9699800c7 │ │ │ │ │ ├── 8b/ │ │ │ │ │ │ └── 137891791fe96927ad78e64b0aad7bded08bdc │ │ │ │ │ ├── 96/ │ │ │ │ │ │ └── 679d59cf9f74d69b3c920f258559b5e8c9a18a │ │ │ │ │ ├── 98/ │ │ │ │ │ │ └── 89d6e5557761aa8e3607e80c874a6dc51ada7c │ │ │ │ │ ├── aa/ │ │ │ │ │ │ └── 06ecca6c4ad6432ab9313e556ca92ba4bcf9e9 │ │ │ │ │ ├── ad/ │ │ │ │ │ │ └── 9cb4eac23df2fe5e1264287a5872ea2a1ff8b2 │ │ │ │ │ ├── b1/ │ │ │ │ │ │ └── 76dfc3a4dc8734e4c579f77236a9c8d0a965d2 │ │ │ │ │ ├── b9/ │ │ │ │ │ │ ├── 0bb887b7c03750ae6b352ffe76ab9d2e86ee7d │ │ │ │ │ │ └── 9f7ac0b88909253d829554c14af488c3b0f3a5 │ │ │ │ │ ├── bc/ │ │ │ │ │ │ └── 7c5ac2bafe828a68e9d1d460343718d6fbe136 │ │ │ │ │ ├── cf/ │ │ │ │ │ │ └── e0e1e1e3ba18f149fd47f5e1aef6016b2260c3 │ │ │ │ │ ├── d0/ │ │ │ │ │ │ └── 67729932057cdb7527a833d6799c4ddc520640 │ │ │ │ │ ├── da/ │ │ │ │ │ │ └── 237394e6132d20d30f175b9b73c8638fddddda │ │ │ │ │ ├── de/ │ │ │ │ │ │ └── 9fe35f9906e1994e083cc59c87232bf418795b │ │ │ │ │ ├── e5/ │ │ │ │ │ │ └── b41c1ea533f87388ab69b13baf0b5a562d6243 │ │ │ │ │ └── ef/ │ │ │ │ │ └── 32df4d259143933715c74951f932d9892364d1 │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ └── master │ │ │ ├── cherrypick/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 01/ │ │ │ │ │ │ │ └── a2b453c2647c71ccfefc285f2266d1f00b8253 │ │ │ │ │ │ ├── 02/ │ │ │ │ │ │ │ └── 67838e09bbc5969bba035be2d27c8a6de694d8 │ │ │ │ │ │ ├── 06/ │ │ │ │ │ │ │ └── 3fc9f01e6e9ec2a8d8f749885e931875e50d37 │ │ │ │ │ │ ├── 08/ │ │ │ │ │ │ │ └── 9ac03f76058b5ba0b44bb268f317f9242481e9 │ │ │ │ │ │ ├── 0d/ │ │ │ │ │ │ │ └── 447a6c2528b06616cde3b209a4b4ea3dcb8d65 │ │ │ │ │ │ ├── 11/ │ │ │ │ │ │ │ └── 24c2c1ae07b26fded662d6c3f3631d9dc16f88 │ │ │ │ │ │ ├── 12/ │ │ │ │ │ │ │ └── 905f4ea5b76f9d3fdcfe73e462201c06ae632a │ │ │ │ │ │ ├── 19/ │ │ │ │ │ │ │ └── c5c7207054604b69c84d08a7571ef9672bb5c2 │ │ │ │ │ │ ├── 1c/ │ │ │ │ │ │ │ ├── 2116845780455ecf916538c1cc27c4222452af │ │ │ │ │ │ │ └── c85eb4ff0a8438fde1b14274c6f87f891b36a0 │ │ │ │ │ │ ├── 1e/ │ │ │ │ │ │ │ └── 1cb7391d25dcd8daba88f1f627f3045982286c │ │ │ │ │ │ ├── 20/ │ │ │ │ │ │ │ └── fc1a4c9d994021f43d33ab75e4252e27ca661d │ │ │ │ │ │ ├── 28/ │ │ │ │ │ │ │ └── d9eb4208074ad1cc84e71ccc908b34573f05d2 │ │ │ │ │ │ ├── 2a/ │ │ │ │ │ │ │ ├── 26c7e88b285613b302ba76712bc998863f3cbc │ │ │ │ │ │ │ └── c3b376093de405b0a951bff578655b1c2b7fa1 │ │ │ │ │ │ ├── 2c/ │ │ │ │ │ │ │ └── acbcaabf785f1ac231e8519849d4ad38692f2c │ │ │ │ │ │ ├── 35/ │ │ │ │ │ │ │ └── cb210149022c7379b0a67b0dec13cc628ff87d │ │ │ │ │ │ ├── 38/ │ │ │ │ │ │ │ └── c05a857e831a7e759d83778bfc85d003e21c45 │ │ │ │ │ │ ├── 3f/ │ │ │ │ │ │ │ └── 9eed8946df9e2c737d3b8dc0b8e78959aacd92 │ │ │ │ │ │ ├── 40/ │ │ │ │ │ │ │ └── 9a1bec58bf35348e8b62b72bb9c1f45cf5a587 │ │ │ │ │ │ ├── 44/ │ │ │ │ │ │ │ └── cd2ed2052c9c68f9a439d208e9614dc2a55c70 │ │ │ │ │ │ ├── 48/ │ │ │ │ │ │ │ └── 7434cace79238a7091e2220611d4f20a765690 │ │ │ │ │ │ ├── 49/ │ │ │ │ │ │ │ └── 20ad2f17162dcc8823ad491444dcb87f5899c9 │ │ │ │ │ │ ├── 4b/ │ │ │ │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904 │ │ │ │ │ │ ├── 4c/ │ │ │ │ │ │ │ └── 532774cc1fea37f6efc2256763a64d38c8cdde │ │ │ │ │ │ ├── 51/ │ │ │ │ │ │ │ └── 145af30d411a50195b66517d825e69bf57ed22 │ │ │ │ │ │ ├── 54/ │ │ │ │ │ │ │ ├── 61de53ffadbf15be4dd6345997c15689573209 │ │ │ │ │ │ │ └── 784f10955e92ab27e4fa832e40cb2baf1edbdc │ │ │ │ │ │ ├── 56/ │ │ │ │ │ │ │ └── 3f6473a3858f99b80e5f93c660512ed38e1e6f │ │ │ │ │ │ ├── 58/ │ │ │ │ │ │ │ └── a957ef0061c1a8ef995c855dfab4f5da8d6617 │ │ │ │ │ │ ├── 5d/ │ │ │ │ │ │ │ └── c7e1f440ce74d5503a0dfbc6c30e091475f774 │ │ │ │ │ │ ├── 5e/ │ │ │ │ │ │ │ └── 2206cda1c56430ad107a6866a829c159e0b9ea │ │ │ │ │ │ ├── 5f/ │ │ │ │ │ │ │ └── 77a2a13935ac62a629553f8944ad57b1ed8b4a │ │ │ │ │ │ ├── 63/ │ │ │ │ │ │ │ └── c0d92b95253c4a40d3883f423a54be47d2c4c8 │ │ │ │ │ │ ├── 6c/ │ │ │ │ │ │ │ └── e83eb5f0fd34a10c3d25c6b36d2ed7ec0d6ce7 │ │ │ │ │ │ ├── 6d/ │ │ │ │ │ │ │ └── 1c2afe5eeb9e497528e2780ac468a5465cbc96 │ │ │ │ │ │ ├── 74/ │ │ │ │ │ │ │ └── f06b5bfec6d33d7264f73606b57a7c0b963819 │ │ │ │ │ │ ├── 82/ │ │ │ │ │ │ │ └── 8b08c52d2cba30952e0e008f60b25b5ba0d41a │ │ │ │ │ │ ├── 85/ │ │ │ │ │ │ │ ├── 36dd6f0ec3ddecb9f9b6c8c64c6d322cd01211 │ │ │ │ │ │ │ └── a4a1d791973644f24c72f5e89420d3064cc452 │ │ │ │ │ │ ├── 8b/ │ │ │ │ │ │ │ └── 5c30499a71001189b647f4d5b57fa8f04897ce │ │ │ │ │ │ ├── 96/ │ │ │ │ │ │ │ └── 4ea3da044d9083181a88ba6701de9e35778bf4 │ │ │ │ │ │ ├── 9c/ │ │ │ │ │ │ │ ├── c39fca3765a2facbe31157f7d60c2602193f36 │ │ │ │ │ │ │ └── cb9bf50c011fd58dcbaa65df917bf79539717f │ │ │ │ │ │ ├── a1/ │ │ │ │ │ │ │ └── 0b59f4280491afe6e430c30654a7acc67d4a33 │ │ │ │ │ │ ├── a2/ │ │ │ │ │ │ │ └── 1b4bfe7a04ab18024fb57f4ae9a52a1acef394 │ │ │ │ │ │ ├── a4/ │ │ │ │ │ │ │ └── 3a050c588d4e92f11a6b139680923e9728477d │ │ │ │ │ │ ├── a5/ │ │ │ │ │ │ │ └── 8ca3fee5eb68b11adc2703e5843f968c9dad1e │ │ │ │ │ │ ├── a6/ │ │ │ │ │ │ │ ├── 61b5dec1004e2c62654ded3762370c27cf266b │ │ │ │ │ │ │ └── 9ef8fcbb9a2c509a7dbf4f23d257eb551d5610 │ │ │ │ │ │ ├── a8/ │ │ │ │ │ │ │ └── 3c6f70297b805dedc549e6583582966f6ebcab │ │ │ │ │ │ ├── a9/ │ │ │ │ │ │ │ └── 020cd240774e4d672732bcb82d516d9685da76 │ │ │ │ │ │ ├── ab/ │ │ │ │ │ │ │ ├── 4115f808bc585b60f822da7020af86d20f62c8 │ │ │ │ │ │ │ └── e4603bc7cd5b8167a267e0e2418fd2348f8cff │ │ │ │ │ │ ├── b8/ │ │ │ │ │ │ │ └── 26e9b36e22e949ec885e7a1f3db496bbab6cd0 │ │ │ │ │ │ ├── ba/ │ │ │ │ │ │ │ └── fbf6912c09505ac60575cd43d3f2aba3bd84d8 │ │ │ │ │ │ ├── bb/ │ │ │ │ │ │ │ └── 14296ffa9dfbf935ec9ce2f9ed7808d952226b │ │ │ │ │ │ ├── bc/ │ │ │ │ │ │ │ └── 4dd0744364d1db380a9811bd264c101065231e │ │ │ │ │ │ ├── bd/ │ │ │ │ │ │ │ ├── 65d4083845ed5ed4e1fe5feb85ac395d0760c8 │ │ │ │ │ │ │ ├── 6ffc8c6c41f0f85ff9e3d61c9479516bac0024 │ │ │ │ │ │ │ └── a51965cb36c0c5731c8cb50b80a36cac81018e │ │ │ │ │ │ ├── ce/ │ │ │ │ │ │ │ └── d8fb81b6ec534d5deaf2a48b4b96c799712507 │ │ │ │ │ │ ├── cf/ │ │ │ │ │ │ │ └── c4f0999a8367568e049af4f72e452d40828a15 │ │ │ │ │ │ ├── d0/ │ │ │ │ │ │ │ └── f21e17beb5b9d953b1d8349049818a4f2edd1e │ │ │ │ │ │ ├── d3/ │ │ │ │ │ │ │ └── d77487660ee3c0194ee01dc5eaf478782b1c7e │ │ │ │ │ │ ├── e2/ │ │ │ │ │ │ │ └── 33b9ed408a95e9d4b65fec7fc34943a556deb2 │ │ │ │ │ │ ├── e5/ │ │ │ │ │ │ │ └── 183bfd18e3a0a691fadde2f0d5610b73282d31 │ │ │ │ │ │ ├── e6/ │ │ │ │ │ │ │ └── ae8889c40c77d7be02758235b5b3f7a4f2a129 │ │ │ │ │ │ ├── e7/ │ │ │ │ │ │ │ └── 811a2bc55635f182750f0420da5ad232c1af91 │ │ │ │ │ │ ├── e9/ │ │ │ │ │ │ │ └── b63f3655b2ad80c0ff587389b5a9589a3a7110 │ │ │ │ │ │ ├── eb/ │ │ │ │ │ │ │ └── da71fe44dcb60c53b8fbd53208a1204d32e959 │ │ │ │ │ │ ├── f0/ │ │ │ │ │ │ │ ├── 5ed049854c1596a7cc0e957fab34961077f3ae │ │ │ │ │ │ │ └── a4e1c66bb548cd2b22eebefda703872e969775 │ │ │ │ │ │ ├── f2/ │ │ │ │ │ │ │ └── ec8c8cf1a9fb7aa047a25a4308bfe860237ad4 │ │ │ │ │ │ ├── f5/ │ │ │ │ │ │ │ └── 684c96bf40c709877b56404cd8a5dd2d2a7978 │ │ │ │ │ │ └── f9/ │ │ │ │ │ │ └── 0f9dcbdac2cce5cc166346160e19cb693ef4e8 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ ├── automerge-branch │ │ │ │ │ ├── master │ │ │ │ │ ├── merge-branch │ │ │ │ │ ├── merge-conflicts │ │ │ │ │ ├── merge-mainline │ │ │ │ │ ├── orphan │ │ │ │ │ └── renames │ │ │ │ ├── file1.txt │ │ │ │ ├── file2.txt │ │ │ │ └── file3.txt │ │ │ ├── config/ │ │ │ │ ├── .gitconfig │ │ │ │ ├── config-include │ │ │ │ ├── config-included │ │ │ │ ├── config0 │ │ │ │ ├── config1 │ │ │ │ ├── config10 │ │ │ │ ├── config11 │ │ │ │ ├── config12 │ │ │ │ ├── config13 │ │ │ │ ├── config14 │ │ │ │ ├── config15 │ │ │ │ ├── config16 │ │ │ │ ├── config17 │ │ │ │ ├── config18 │ │ │ │ ├── config19 │ │ │ │ ├── config2 │ │ │ │ ├── config20 │ │ │ │ ├── config3 │ │ │ │ ├── config4 │ │ │ │ ├── config5 │ │ │ │ ├── config6 │ │ │ │ ├── config7 │ │ │ │ ├── config8 │ │ │ │ └── config9 │ │ │ ├── crlf/ │ │ │ │ └── .gitted/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── index │ │ │ │ ├── objects/ │ │ │ │ │ ├── 04/ │ │ │ │ │ │ ├── 4bcd5c9bf5ebdd51e514a9a36457018f06f6e1 │ │ │ │ │ │ └── de00b358f13389948756732158eaaaefa1448c │ │ │ │ │ ├── 09/ │ │ │ │ │ │ └── 7722be9b67b48dfe3b19396d02fd535300ee46 │ │ │ │ │ ├── 0a/ │ │ │ │ │ │ └── a76e474d259bd7c13eb726a1396c381db55c88 │ │ │ │ │ ├── 0d/ │ │ │ │ │ │ └── 06894e14df22e066763ae906e0ed3eb79c205f │ │ │ │ │ ├── 0e/ │ │ │ │ │ │ └── 052888828a954ca17e5882638e3c6a083e75c0 │ │ │ │ │ ├── 0f/ │ │ │ │ │ │ └── f5a53f19bfd2b5eea1ba550295c47515678987 │ │ │ │ │ ├── 16/ │ │ │ │ │ │ ├── 78031ee023a23bd3515e4e1693b661a69f0a73 │ │ │ │ │ │ └── c72b67861f8524a5bebc05cd20472d3fca00da │ │ │ │ │ ├── 18/ │ │ │ │ │ │ └── c637c5d9aba6eed226ee1840cd1ca2e6c4e4c5 │ │ │ │ │ ├── 20/ │ │ │ │ │ │ └── 3555c5676d75cd80d69b50beb1f4b588c59ceb │ │ │ │ │ ├── 23/ │ │ │ │ │ │ └── f4582779e60bfa7f14750ad507399a58876611 │ │ │ │ │ ├── 2a/ │ │ │ │ │ │ └── d3df895f68f4dda6a0a815c620b909bdd27c05 │ │ │ │ │ ├── 2b/ │ │ │ │ │ │ ├── 55b4b94f655c857635b6a9005c056aa7de3532 │ │ │ │ │ │ └── d9d81b51a867352bab307b89cbb5b4a69adfe1 │ │ │ │ │ ├── 2c/ │ │ │ │ │ │ └── 03f9f407b576eae80327864bab572e282a33ea │ │ │ │ │ ├── 33/ │ │ │ │ │ │ └── cdead44e1c3ec178e39a4a69085280dbacf01b │ │ │ │ │ ├── 38/ │ │ │ │ │ │ └── 1cfe630df902bc29271a202d3277981180e4a6 │ │ │ │ │ ├── 3f/ │ │ │ │ │ │ └── 96bdca0e37616026afaa325c148cec4aa62d04 │ │ │ │ │ ├── 41/ │ │ │ │ │ │ └── 7786fc35b3c71aa546e3f95eb5da3c8dad8c41 │ │ │ │ │ ├── 47/ │ │ │ │ │ │ └── fbc2c28a18df0dc773276a253eb85c7516ca50 │ │ │ │ │ ├── 4b/ │ │ │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904 │ │ │ │ │ ├── 5a/ │ │ │ │ │ │ └── fb6a14a864e30787857dd92af837e8cdd2cb1b │ │ │ │ │ ├── 68/ │ │ │ │ │ │ └── 03c385642cebc8103fddd526ef395d75678a7e │ │ │ │ │ ├── 69/ │ │ │ │ │ │ └── 597764abeaa1a403ebf589d2ea579c6a8f877e │ │ │ │ │ ├── 6a/ │ │ │ │ │ │ └── e3e9c11a51f0aabebcffcbd5c00f4beed143c9 │ │ │ │ │ ├── 6c/ │ │ │ │ │ │ └── 589757f65a970a6cc07c71c3f3d2528c611cbc │ │ │ │ │ ├── 77/ │ │ │ │ │ │ └── afe26d93c49279ca90604c125496920753fede │ │ │ │ │ ├── 78/ │ │ │ │ │ │ └── db270c1841841f75a8157321bdcb50ab12e6c3 │ │ │ │ │ ├── 79/ │ │ │ │ │ │ └── 9770d1cff46753a57db7a066159b5610da6e3a │ │ │ │ │ ├── 7c/ │ │ │ │ │ │ └── ce67e58173e2b01f7db124ceaabe3183d19c49 │ │ │ │ │ ├── 85/ │ │ │ │ │ │ └── 340755cfe5e28c2835781978bb1cece91b3d0f │ │ │ │ │ ├── 92/ │ │ │ │ │ │ └── 0e90a663bea5d740989d5f935f6dfb473a0c5d │ │ │ │ │ ├── 96/ │ │ │ │ │ │ └── 87e444bcbb85645cb496080434c292f1b57182 │ │ │ │ │ ├── 97/ │ │ │ │ │ │ └── 449da2d225557c558ac244384d487e66c3e591 │ │ │ │ │ ├── 9a/ │ │ │ │ │ │ └── 6c3533fef19abd6eec8e61206b5c51982b80d9 │ │ │ │ │ ├── 9d/ │ │ │ │ │ │ └── 29b5bb165bf65637ffcb5ededb82ddd7c3fd13 │ │ │ │ │ ├── a2/ │ │ │ │ │ │ └── 34455d62297f1856c4603686150c59fcb0aafe │ │ │ │ │ ├── a9/ │ │ │ │ │ │ └── a2e8913c1dbe2812fac5e6b4e0a4bd5d0d5966 │ │ │ │ │ ├── aa/ │ │ │ │ │ │ └── f083a9cb53dac3669dcfa0e48921580d629ec7 │ │ │ │ │ ├── af/ │ │ │ │ │ │ └── 6fcf6da196f615d7cda269b55b5c4ecfb4a5b3 │ │ │ │ │ ├── bb/ │ │ │ │ │ │ └── 29a7b46b5d4ba3ea17b238ae561b81d59dc818 │ │ │ │ │ ├── c3/ │ │ │ │ │ │ └── e11722855ff260bd27418988ac1467c4e9e73a │ │ │ │ │ ├── c8/ │ │ │ │ │ │ └── d0b1ebcaccdd8f968c4aae3c2175e7fed651fe │ │ │ │ │ ├── cd/ │ │ │ │ │ │ ├── 574f5a2baa4c79504f8837b730fa0b11defe99 │ │ │ │ │ │ └── d3dacc5c0501d5ea57bbdf90e3d80176606139 │ │ │ │ │ ├── d1/ │ │ │ │ │ │ └── 1e7ef63ba7db1db3b1b99cdbafc57a8549f8a4 │ │ │ │ │ ├── dc/ │ │ │ │ │ │ └── 88e3b917de821e25962bea7ec1f55c4ce2112c │ │ │ │ │ ├── de/ │ │ │ │ │ │ └── 5bfa165999d9d6c6dbafad2a7e709f93ec30fd │ │ │ │ │ ├── e5/ │ │ │ │ │ │ └── 062da7d7802cf492975eda580f09ac4876bd88 │ │ │ │ │ ├── e6/ │ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ │ │ │ ├── ea/ │ │ │ │ │ │ └── 030d3c6cec212069eca698cabaa5b4550f1511 │ │ │ │ │ ├── ef/ │ │ │ │ │ │ └── 0dcd356d77221e9c27f4f3928ad28e80b87ceb │ │ │ │ │ ├── f2/ │ │ │ │ │ │ └── b745d7f47d114a3a6b31a7b628e61e804d1a58 │ │ │ │ │ ├── f4/ │ │ │ │ │ │ └── d25b796d86387205a5498175d66e91d1e5006a │ │ │ │ │ └── fe/ │ │ │ │ │ ├── 085d9ace90cc675b87df15e1aeed0c3a31407f │ │ │ │ │ └── ab3713c4659bb22700042b3c55b8d60d0a952b │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ ├── empty-files │ │ │ │ └── master │ │ │ ├── crlf_data/ │ │ │ │ ├── .gitattributes │ │ │ │ ├── posix/ │ │ │ │ │ ├── autocrlf_false/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,-crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,-text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text_auto/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text_auto,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_false,text_auto,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,-crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,-text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text_auto/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text_auto,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_input,text_auto,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,-crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,-text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,text/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,text,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,text,eol_lf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,text_auto/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ ├── autocrlf_true,text_auto,eol_crlf/ │ │ │ │ │ │ ├── all-crlf │ │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ │ ├── all-lf │ │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ │ ├── more-crlf │ │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ │ ├── more-lf │ │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ │ └── zero-byte │ │ │ │ │ └── autocrlf_true,text_auto,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ └── windows/ │ │ │ │ ├── autocrlf_false/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,-crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,-text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text_auto/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text_auto,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_false,text_auto,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,-crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,-text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text_auto/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text_auto,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_input,text_auto,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,-crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,-text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,text/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,text,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,text,eol_lf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,text_auto/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ ├── autocrlf_true,text_auto,eol_crlf/ │ │ │ │ │ ├── all-crlf │ │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ │ ├── all-lf │ │ │ │ │ ├── all-lf-utf8bom │ │ │ │ │ ├── binary-all-crlf │ │ │ │ │ ├── binary-all-lf │ │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ │ ├── mixed-lf-cr │ │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ │ ├── more-crlf │ │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ │ ├── more-lf │ │ │ │ │ ├── more-lf-utf8bom │ │ │ │ │ └── zero-byte │ │ │ │ └── autocrlf_true,text_auto,eol_lf/ │ │ │ │ ├── all-crlf │ │ │ │ ├── all-crlf-utf8bom │ │ │ │ ├── all-lf │ │ │ │ ├── all-lf-utf8bom │ │ │ │ ├── binary-all-crlf │ │ │ │ ├── binary-all-lf │ │ │ │ ├── binary-mixed-lf-cr │ │ │ │ ├── binary-mixed-lf-cr-crlf │ │ │ │ ├── few-utf8-chars-crlf │ │ │ │ ├── few-utf8-chars-lf │ │ │ │ ├── many-utf8-chars-crlf │ │ │ │ ├── many-utf8-chars-lf │ │ │ │ ├── mixed-lf-cr │ │ │ │ ├── mixed-lf-cr-crlf │ │ │ │ ├── more-crlf │ │ │ │ ├── more-crlf-utf8bom │ │ │ │ ├── more-lf │ │ │ │ ├── more-lf-utf8bom │ │ │ │ └── zero-byte │ │ │ ├── deprecated-mode.git/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── description │ │ │ │ ├── index │ │ │ │ ├── info/ │ │ │ │ │ └── exclude │ │ │ │ ├── objects/ │ │ │ │ │ ├── 06/ │ │ │ │ │ │ └── 262edc257418e9987caf999f9a7a3e1547adff │ │ │ │ │ ├── 08/ │ │ │ │ │ │ └── 10fb7818088ff5ac41ee49199b51473b1bd6c7 │ │ │ │ │ ├── 1b/ │ │ │ │ │ │ └── 05fdaa881ee45b48cbaa5e9b037d667a47745e │ │ │ │ │ └── 3d/ │ │ │ │ │ └── 0970ec547fc41ef8a5882dde99c6adce65b021 │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ └── master │ │ │ ├── describe/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 03/ │ │ │ │ │ │ │ └── 00021985931292d0611b9232e757035fefc04d │ │ │ │ │ │ ├── 10/ │ │ │ │ │ │ │ ├── 8b485d8268ea595df8ffea74f0f4b186577d32 │ │ │ │ │ │ │ └── bd08b099ecb79184c60183f5c94ca915f427ad │ │ │ │ │ │ ├── 17/ │ │ │ │ │ │ │ └── 8481050188cf00d7d9cd5a11e43ab8fab9294f │ │ │ │ │ │ ├── 19/ │ │ │ │ │ │ │ └── 1faf88a5826a99f475baaf8b13652c4e40bfe6 │ │ │ │ │ │ ├── 1e/ │ │ │ │ │ │ │ └── 016431ec7b22dd3e23f3e6f5f68f358f9227cf │ │ │ │ │ │ ├── 22/ │ │ │ │ │ │ │ └── 3b7836fb19fdf64ba2d3cd6173c6a283141f78 │ │ │ │ │ │ ├── 25/ │ │ │ │ │ │ │ └── d5edf8c0ef17e8a13b8da75913dcec4ea7afc1 │ │ │ │ │ │ ├── 2b/ │ │ │ │ │ │ │ └── df67abb163a4ffb2d7f3f0880c9fe5068ce782 │ │ │ │ │ │ ├── 31/ │ │ │ │ │ │ │ └── fc9136820b507e938a9c6b88bf2c567a9f6f4b │ │ │ │ │ │ ├── 42/ │ │ │ │ │ │ │ └── 8f9554a2eec22de29898819b579466af7c1583 │ │ │ │ │ │ ├── 4d/ │ │ │ │ │ │ │ └── 6558b8fa764baeb0f19c1e857df91e0eda5a0f │ │ │ │ │ │ ├── 4f/ │ │ │ │ │ │ │ └── 2d9ce01ad5249cabdc6565366af8aff85b1525 │ │ │ │ │ │ ├── 52/ │ │ │ │ │ │ │ └── 912fbab0715dec53d43053966e78ad213ba359 │ │ │ │ │ │ ├── 56/ │ │ │ │ │ │ │ └── 26abf0f72e58d7a153368ba57db4c673c0e171 │ │ │ │ │ │ ├── 61/ │ │ │ │ │ │ │ └── 26a5f9c57ebc81e64370ec3095184ad92dab1c │ │ │ │ │ │ ├── 62/ │ │ │ │ │ │ │ └── d8fe9f6db631bd3a19140699101c9e281c9f9d │ │ │ │ │ │ ├── 65/ │ │ │ │ │ │ │ └── a91bc2262480dce4c5979519aae6668368eb4e │ │ │ │ │ │ ├── 68/ │ │ │ │ │ │ │ └── 0166b6cd31f76354fee2572618e6b0142d05e6 │ │ │ │ │ │ ├── 69/ │ │ │ │ │ │ │ └── 3a3de402bb23897ed5c931273e53c78eff0495 │ │ │ │ │ │ ├── 6a/ │ │ │ │ │ │ │ └── 12b56088706aa6c39ccd23b7c7ce60f3a0b9a1 │ │ │ │ │ │ ├── 6d/ │ │ │ │ │ │ │ └── 218e42592043041c4da016ff298cf241b86c3c │ │ │ │ │ │ ├── 75/ │ │ │ │ │ │ │ └── bb152c600647586c226d98411b1d2f9861af5a │ │ │ │ │ │ ├── 81/ │ │ │ │ │ │ │ └── f4b1aac643e6983fab370eae8aefccecbf3a4c │ │ │ │ │ │ ├── 8e/ │ │ │ │ │ │ │ └── c1d96451ff05451720e4e8968812c46b35e5e4 │ │ │ │ │ │ ├── 94/ │ │ │ │ │ │ │ └── 9b98e208015bfc0e2f573debc34ae2f97a7f0e │ │ │ │ │ │ ├── 9c/ │ │ │ │ │ │ │ └── 06d71b8406ab97537e3acdc39a2c4ade7a9411 │ │ │ │ │ │ ├── a6/ │ │ │ │ │ │ │ └── 095f816e81f64651595d488badc42399837d6a │ │ │ │ │ │ ├── a9/ │ │ │ │ │ │ │ ├── e3325a07117aa5381e044a8d96c26eb30d729d │ │ │ │ │ │ │ └── eb02af13df030159e39f70330d5c8a47655691 │ │ │ │ │ │ ├── aa/ │ │ │ │ │ │ │ ├── d8d5cef3915ab78b3227abaaac99b62db9eb54 │ │ │ │ │ │ │ └── ddd4f14847e0e323924ec262c2343249a84f8b │ │ │ │ │ │ ├── b2/ │ │ │ │ │ │ │ └── 40c0fb88c5a629e00ebc1275fa1f33e364a705 │ │ │ │ │ │ ├── ce/ │ │ │ │ │ │ │ └── 1c4f8b6120122e23d4442925d98c56c41917d8 │ │ │ │ │ │ ├── d5/ │ │ │ │ │ │ │ └── aab219a814ddbe4b3aaedf03cdea491b218ec4 │ │ │ │ │ │ ├── f2/ │ │ │ │ │ │ │ └── ad6c76f0115a6ba5b00456a849810e7ec0af20 │ │ │ │ │ │ └── f7/ │ │ │ │ │ │ ├── 0f10e4db19068f79bc43844b49f3eece45c4e8 │ │ │ │ │ │ └── 19efd430d52bcfc8566a43b2eb655688d38871 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── another │ │ │ │ ├── file │ │ │ │ └── side │ │ │ ├── diff/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 29/ │ │ │ │ │ │ │ └── ab7053bb4dde0298e03e2c179e890b7dd465a7 │ │ │ │ │ │ ├── 3e/ │ │ │ │ │ │ │ └── 5bcbad2a68e5bc60a53b8388eea53a1a7ab847 │ │ │ │ │ │ ├── 54/ │ │ │ │ │ │ │ └── 6c735f16a3b44d9784075c2c0dab2ac9bf1989 │ │ │ │ │ │ ├── 7a/ │ │ │ │ │ │ │ └── 9e0b02e63179929fed24f0a3e0f19168114d10 │ │ │ │ │ │ ├── 7b/ │ │ │ │ │ │ │ └── 808f723a8ca90df319682c221187235af76693 │ │ │ │ │ │ ├── 88/ │ │ │ │ │ │ │ └── 789109439c1e1c3cd45224001edee5304ed53c │ │ │ │ │ │ ├── cb/ │ │ │ │ │ │ │ └── 8294e696339863df760b2ff5d1e275bee72455 │ │ │ │ │ │ └── d7/ │ │ │ │ │ │ └── 0d245ed97ed2aa596dd1af6536e4bfdb047b69 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── another.txt │ │ │ │ └── readme.txt │ │ │ ├── diff_format_email/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 06/ │ │ │ │ │ │ │ └── b7b69a62cbd1e53c6c4e0c3f16473dcfdb4af6 │ │ │ │ │ │ ├── 0a/ │ │ │ │ │ │ │ └── 37045ca6d8503e9bcf06a12abbbc8e92664cce │ │ │ │ │ │ ├── 10/ │ │ │ │ │ │ │ └── 808fe9c9be5a190c0ba68d1a002233fb363508 │ │ │ │ │ │ ├── 13/ │ │ │ │ │ │ │ └── ecf3d572dbc5e5b32c8ba067d1d1e0939572e8 │ │ │ │ │ │ ├── 17/ │ │ │ │ │ │ │ └── cfad36e93db7706b16bef5ef842ba1e5ca06ab │ │ │ │ │ │ ├── 1a/ │ │ │ │ │ │ │ ├── 9932083f96b0db42552103d40076f62fa8235e │ │ │ │ │ │ │ └── e3be57f869687d983066a0f5d2aaea1b82ddc5 │ │ │ │ │ │ ├── 1b/ │ │ │ │ │ │ │ └── 525b0a6c5218b069b601ce91fce8eaf0a54e20 │ │ │ │ │ │ ├── 1e/ │ │ │ │ │ │ │ ├── 82c3b234e37da82e5b23e0e2a70bca68ee12c6 │ │ │ │ │ │ │ └── 875da9b1e67f853b2eec3e202c21c867097234 │ │ │ │ │ │ ├── 20/ │ │ │ │ │ │ │ └── 609dbbc32bbfc827528eec3fcea2d024e6dd8a │ │ │ │ │ │ ├── 23/ │ │ │ │ │ │ │ └── f92946d3f38bd090f700d3e8e7b728ffc58264 │ │ │ │ │ │ ├── 24/ │ │ │ │ │ │ │ ├── 97c5249408494e66e25070a8c74e49eaeeb6c3 │ │ │ │ │ │ │ └── 9a4263be23b4d1c02484cb840b6eca4c6cf74d │ │ │ │ │ │ ├── 25/ │ │ │ │ │ │ │ └── 2a3e19fd2c6fb7b20c111142c5bd5fb9ea6b8e │ │ │ │ │ │ ├── 27/ │ │ │ │ │ │ │ └── 93544db9060bab4f9169e5b89c82f9fa7c7fa6 │ │ │ │ │ │ ├── 29/ │ │ │ │ │ │ │ └── 1f1ff3cbb9a6f153678d9657679e3d4bf257df │ │ │ │ │ │ ├── 2f/ │ │ │ │ │ │ │ └── f7b811eee62a73959350b1f7349f6f4d0c882d │ │ │ │ │ │ ├── 39/ │ │ │ │ │ │ │ └── 91dce9e71a0641ca49a6a4eea6c9e7ff402ed4 │ │ │ │ │ │ ├── 45/ │ │ │ │ │ │ │ └── eef2a9317e179984649de247269e38cd5d99cf │ │ │ │ │ │ ├── 4a/ │ │ │ │ │ │ │ └── 076277b884c519a932be67e346db2ac80a98fa │ │ │ │ │ │ ├── 4c/ │ │ │ │ │ │ │ ├── 3bd7182ad66ea7aa20ba47ae82812b710d169c │ │ │ │ │ │ │ └── a10087e696d2ba78d07b146a118e9a7096ed4f │ │ │ │ │ │ ├── 4d/ │ │ │ │ │ │ │ └── de2b17d1c982cd988f21d24350a214401e4a1e │ │ │ │ │ │ ├── 4f/ │ │ │ │ │ │ │ └── 31e0248ac800a1edc78b74f74e86f5eba90e87 │ │ │ │ │ │ ├── 50/ │ │ │ │ │ │ │ ├── 17c9456d013b2c7712d29aab73b681c880f509 │ │ │ │ │ │ │ └── 438cfa585c1d15cf3650ed1bf641da937cc261 │ │ │ │ │ │ ├── 52/ │ │ │ │ │ │ │ ├── 19b9784f9a92d7bd7cb567a6d6a21bfb86697e │ │ │ │ │ │ │ └── c3cd1ff6234b95fecbaf9ef13624da17697b8d │ │ │ │ │ │ ├── 53/ │ │ │ │ │ │ │ └── 525d4cc3ef3ba4a5cbf69492fdffb4e4a74558 │ │ │ │ │ │ ├── 55/ │ │ │ │ │ │ │ └── 0d730ba1b8c4937ea170b37c7ba91d792c0aaa │ │ │ │ │ │ ├── 62/ │ │ │ │ │ │ │ └── 7e7e12d87e07a83fad5b6bfa25e86ead4a5270 │ │ │ │ │ │ ├── 66/ │ │ │ │ │ │ │ └── 81f1844dc677e5ff07ffd993461f5c441e6af5 │ │ │ │ │ │ ├── 69/ │ │ │ │ │ │ │ └── ddefb5c245e2f9ee62bd4cabd8ebe60a01e448 │ │ │ │ │ │ ├── 6b/ │ │ │ │ │ │ │ ├── 6c2067c6d968f9bddb9b900ee1ab7e5b067430 │ │ │ │ │ │ │ └── ef49b206b29d9c46456e075722cd1a48b41e4c │ │ │ │ │ │ ├── 6c/ │ │ │ │ │ │ │ └── 15659c036377aebf3b4569959ca1f5bedb551f │ │ │ │ │ │ ├── 6e/ │ │ │ │ │ │ │ └── 05acc5a5dab507d91a0a0cc0fb05a3dd98892d │ │ │ │ │ │ ├── 73/ │ │ │ │ │ │ │ └── 09653445ecf038d3e3dd9ed55edb6cb541a4ba │ │ │ │ │ │ ├── 74/ │ │ │ │ │ │ │ ├── 6d514eae0c330261d37940cab33aa97fefbd93 │ │ │ │ │ │ │ └── a4d5394ebcfa7e9f445680897dfbc96586bc86 │ │ │ │ │ │ ├── 77/ │ │ │ │ │ │ │ └── d0a3ed37236a7941d564f08d68d3b36462d231 │ │ │ │ │ │ ├── 7a/ │ │ │ │ │ │ │ ├── de76dd34bba4733cf9878079f9fd4a456a9189 │ │ │ │ │ │ │ └── ff11da95ca2be0bfb74b06e7cc1c480559dbe7 │ │ │ │ │ │ ├── 7f/ │ │ │ │ │ │ │ └── 854619451620f7fbcec7ea171675e615ce92b6 │ │ │ │ │ │ ├── 87/ │ │ │ │ │ │ │ └── 3806f6f27e631eb0b23e4b56bea2bfac14a373 │ │ │ │ │ │ ├── 89/ │ │ │ │ │ │ │ ├── 47a46e2097638ca6040ad4877246f4186ec3bd │ │ │ │ │ │ │ └── 7d3af16ca9e420cd071b1c4541bd2b91d04c8c │ │ │ │ │ │ ├── 8d/ │ │ │ │ │ │ │ ├── 7523f6fcb2404257889abe0d96f093d9f524f9 │ │ │ │ │ │ │ └── fa038554d5b682a51bda8ee3038cee6c63be76 │ │ │ │ │ │ ├── 92/ │ │ │ │ │ │ │ └── 64b96c6d104d0e07ae33d3007b6a48246c6f92 │ │ │ │ │ │ ├── 94/ │ │ │ │ │ │ │ ├── 350226b3aa14efac831c803a51f7a09f3fc31a │ │ │ │ │ │ │ ├── 75e21dcbc515af8f641576400e4b450e5f4c03 │ │ │ │ │ │ │ └── aaae8954e8bb613de636071da663a621695911 │ │ │ │ │ │ ├── 9a/ │ │ │ │ │ │ │ ├── 2d780ac2ea0aeabdb9d2a876e6bbfff17b2c44 │ │ │ │ │ │ │ ├── c0329b8b7a4046210d8b8b02ac02055667de63 │ │ │ │ │ │ │ └── c35ff15cd8864aeafd889e4826a3150f0b06c4 │ │ │ │ │ │ ├── 9b/ │ │ │ │ │ │ │ └── 997daca2a0beb5cc44b32c64f100a9a26d4d4b │ │ │ │ │ │ ├── a3/ │ │ │ │ │ │ │ └── ac918e3a6604294b239cb956363e83d71abb3b │ │ │ │ │ │ ├── a5/ │ │ │ │ │ │ │ └── ac978d4f2a1784f847f41223a34c3e78934238 │ │ │ │ │ │ ├── a7/ │ │ │ │ │ │ │ ├── 29eab45c84563135e8631d4010230bc0479f1f │ │ │ │ │ │ │ └── a65f98355b5a7567bcc395f6f7936c9252cf57 │ │ │ │ │ │ ├── a9/ │ │ │ │ │ │ │ └── 7157a0d0571698728b6f2f7675b456c98c5961 │ │ │ │ │ │ ├── af/ │ │ │ │ │ │ │ └── 8f41d0cb7a3079a8f8e231ea2ab8b97837ce13 │ │ │ │ │ │ ├── b0/ │ │ │ │ │ │ │ └── 5cecf1949d192b6df852b3f71853ef820ee235 │ │ │ │ │ │ ├── b4/ │ │ │ │ │ │ │ └── f457c219dbb3517be908d4e70f0ada2fd8b8f9 │ │ │ │ │ │ ├── bd/ │ │ │ │ │ │ │ ├── 474b2519cc15eab801ff851cc7d50f0dee49a1 │ │ │ │ │ │ │ └── f7ba6bc5c4e57ca6595928dcbe6753c8a663ff │ │ │ │ │ │ ├── c7/ │ │ │ │ │ │ │ └── 1a05d36025c806496a74d46d7d596eb23295c4 │ │ │ │ │ │ ├── cb/ │ │ │ │ │ │ │ └── a89408dc016f4caddb6dc886fcb58f587a78df │ │ │ │ │ │ ├── cd/ │ │ │ │ │ │ │ ├── 471f0d8770371e1bc78bcbb38db4c7e4106bd2 │ │ │ │ │ │ │ └── ed722d05305c6b181f188c118d2d9810f39bb8 │ │ │ │ │ │ ├── ce/ │ │ │ │ │ │ │ └── 2792fcae8d704a56901754a0583a7418a21d8a │ │ │ │ │ │ ├── d1/ │ │ │ │ │ │ │ └── 4aa252e52a709d03a3d3d0d965e177eb0a674e │ │ │ │ │ │ ├── d3/ │ │ │ │ │ │ │ └── b6b38486f620b5b532a8cc6e0198ab7c3f52e4 │ │ │ │ │ │ ├── d5/ │ │ │ │ │ │ │ └── ff67764c82f729b13c26a09576570d884d9687 │ │ │ │ │ │ ├── d7/ │ │ │ │ │ │ │ └── bb447df12c6a8aba8727005482fb211f11297a │ │ │ │ │ │ ├── db/ │ │ │ │ │ │ │ └── e8727e4806ae88ccc3f0755cae8f8cb7efa2cc │ │ │ │ │ │ ├── e1/ │ │ │ │ │ │ │ └── 2af77c510e8ce4c261a3758736109c2c2dd1f0 │ │ │ │ │ │ ├── e6/ │ │ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ │ │ │ │ ├── e9/ │ │ │ │ │ │ │ └── 091231467304a5ef112de02361d795ef051ee1 │ │ │ │ │ │ ├── ee/ │ │ │ │ │ │ │ └── 251372f131d82e575f16fe51c778406d88f8c2 │ │ │ │ │ │ ├── f3/ │ │ │ │ │ │ │ └── d35bd592fefd8280fc0c302fa9f27dbdd721a3 │ │ │ │ │ │ ├── f4/ │ │ │ │ │ │ │ └── 07be01334e07bfb8f57cd2078f0ee3eb61e085 │ │ │ │ │ │ ├── f9/ │ │ │ │ │ │ │ └── e215d309644e24fa50d6bd6e6eedba166e56bc │ │ │ │ │ │ ├── fc/ │ │ │ │ │ │ │ └── a0c10eb9f1af6494a448d5733d283f5232a514 │ │ │ │ │ │ └── ff/ │ │ │ │ │ │ └── 8d35b41494f7f0dc92f95d67f54fff274d3fcb │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ ├── binary │ │ │ │ │ ├── master │ │ │ │ │ ├── multihunk │ │ │ │ │ └── rename │ │ │ │ ├── file1.txt.renamed │ │ │ │ ├── file2.txt │ │ │ │ └── file3.txt │ │ │ ├── duplicate.git/ │ │ │ │ ├── COMMIT_EDITMSG │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── description │ │ │ │ ├── index │ │ │ │ ├── info/ │ │ │ │ │ ├── exclude │ │ │ │ │ └── refs │ │ │ │ ├── logs/ │ │ │ │ │ ├── HEAD │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── objects/ │ │ │ │ │ ├── 03/ │ │ │ │ │ │ └── 8d718da6a1ebbc6a7780a96ed75a70cc2ad6e2 │ │ │ │ │ ├── 0d/ │ │ │ │ │ │ └── deadede9e6d6ccddce0ee1e5749eed0485e5ea │ │ │ │ │ ├── ce/ │ │ │ │ │ │ └── 013625030ba8dba906f756967f9e9ca394464a │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── packs │ │ │ │ │ └── pack/ │ │ │ │ │ ├── pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.idx │ │ │ │ │ ├── pack-29a4896f0a0b9c9947b0927c57a5c03dcae052e3.pack │ │ │ │ │ ├── pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.idx │ │ │ │ │ ├── pack-b18eeacbd65cbd30a365d7564b45a468e8bd43d6.pack │ │ │ │ │ ├── pack-e87994ad581c9af946de0eb890175c08cd005f38.idx │ │ │ │ │ ├── pack-e87994ad581c9af946de0eb890175c08cd005f38.pack │ │ │ │ │ ├── pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.idx │ │ │ │ │ └── pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack │ │ │ │ ├── packed-refs │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ └── dummy-marker.txt │ │ │ ├── empty_bare.git/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── description │ │ │ │ ├── info/ │ │ │ │ │ └── exclude │ │ │ │ ├── objects/ │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── dummy-marker.txt │ │ │ │ │ └── pack/ │ │ │ │ │ └── dummy-marker.txt │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ └── dummy-marker.txt │ │ │ ├── empty_standard_repo/ │ │ │ │ └── .gitted/ │ │ │ │ ├── HEAD │ │ │ │ ├── config │ │ │ │ ├── description │ │ │ │ ├── info/ │ │ │ │ │ └── exclude │ │ │ │ ├── objects/ │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── dummy-marker.txt │ │ │ │ │ └── pack/ │ │ │ │ │ └── dummy-marker.txt │ │ │ │ └── refs/ │ │ │ │ └── heads/ │ │ │ │ └── dummy-marker.txt │ │ │ ├── filemodes/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 99/ │ │ │ │ │ │ │ └── 62c8453ba6f0cf8dac7c5dcc2fa2897fa9964a │ │ │ │ │ │ ├── a5/ │ │ │ │ │ │ │ └── c5dd0fc6c313159a69b1d19d7f61a9f978e8f1 │ │ │ │ │ │ └── e7/ │ │ │ │ │ │ └── 48d196331bcb20267eaaee4ff3326cb73b8182 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── exec_off │ │ │ │ ├── exec_off2on_staged │ │ │ │ ├── exec_off2on_workdir │ │ │ │ ├── exec_off_untracked │ │ │ │ ├── exec_on │ │ │ │ ├── exec_on2off_staged │ │ │ │ ├── exec_on2off_workdir │ │ │ │ └── exec_on_untracked │ │ │ ├── gitgit.index │ │ │ ├── icase/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 3e/ │ │ │ │ │ │ │ └── 257c57f136a1cb8f2b8e9a2e5bc8ec0258bdce │ │ │ │ │ │ ├── 4d/ │ │ │ │ │ │ │ └── d6027d083575c7431396dc2a3174afeb393c93 │ │ │ │ │ │ ├── 62/ │ │ │ │ │ │ │ └── e0af52c199ec731fe4ad230041cd3286192d49 │ │ │ │ │ │ ├── 76/ │ │ │ │ │ │ │ └── d6e1d231b1085fcce151427e9899335de74be6 │ │ │ │ │ │ └── d4/ │ │ │ │ │ │ └── 4e18fb93b7107b5cd1b95d601591d77869a1b6 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── B │ │ │ │ ├── D │ │ │ │ ├── F │ │ │ │ ├── H │ │ │ │ ├── J │ │ │ │ ├── L/ │ │ │ │ │ ├── 1 │ │ │ │ │ ├── B │ │ │ │ │ ├── D │ │ │ │ │ ├── a │ │ │ │ │ └── c │ │ │ │ ├── a │ │ │ │ ├── c │ │ │ │ ├── e │ │ │ │ ├── g │ │ │ │ ├── i │ │ │ │ └── k/ │ │ │ │ ├── 1 │ │ │ │ ├── B │ │ │ │ ├── D │ │ │ │ ├── a │ │ │ │ └── c │ │ │ ├── indexv4/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 4c/ │ │ │ │ │ │ │ └── 9109b3e671d851eec87e0e72f6305b582e7e99 │ │ │ │ │ │ ├── b0/ │ │ │ │ │ │ │ └── 952dbb50bed5f01e03e31b296184cb183e54a7 │ │ │ │ │ │ └── e6/ │ │ │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── file.tx │ │ │ │ ├── file.txt │ │ │ │ ├── file.txz │ │ │ │ ├── foo │ │ │ │ └── zzz │ │ │ ├── issue_1397/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 7f/ │ │ │ │ │ │ │ └── 483a738f867e5b21c8f377d70311f011eb48b5 │ │ │ │ │ │ ├── 83/ │ │ │ │ │ │ │ └── 12e0889a9cbab77c732b6bc39b51a683e3a318 │ │ │ │ │ │ ├── 8a/ │ │ │ │ │ │ │ └── 7ef047fc933edb62e84e7977b0612ec3f6f283 │ │ │ │ │ │ ├── 8e/ │ │ │ │ │ │ │ └── 8f80088a9274fd23584992f587083ca1bcbbac │ │ │ │ │ │ ├── f2/ │ │ │ │ │ │ │ └── c62dea0372a0578e053697d5c1ba1ac05e774a │ │ │ │ │ │ └── ff/ │ │ │ │ │ │ └── 3578d64d199d5b48d92bbb569e0a273e411741 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── crlf_file.txt │ │ │ │ └── some_other_crlf_file.txt │ │ │ ├── issue_592/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── COMMIT_EDITMSG │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 06/ │ │ │ │ │ │ │ └── 07ee9d4ccce8e4c4fa13c2c7d727e7faba4e0e │ │ │ │ │ │ ├── 49/ │ │ │ │ │ │ │ └── 363a72a90d9424240258cd3759f23788ecf1d8 │ │ │ │ │ │ ├── 4d/ │ │ │ │ │ │ │ └── 383e87f0371ba8fa353f3912db6862b2625e85 │ │ │ │ │ │ ├── 71/ │ │ │ │ │ │ │ └── 44be264b61825fbff68046fe999bdfe96a1792 │ │ │ │ │ │ ├── be/ │ │ │ │ │ │ │ └── de83ee10b5b3f00239660b00acec2d55fd0b84 │ │ │ │ │ │ ├── e3/ │ │ │ │ │ │ │ └── 8fcc7a6060f5eb5b876e836b52ae4769363f21 │ │ │ │ │ │ └── f1/ │ │ │ │ │ │ └── adef63cb08891a0942b76fc4b9c50c6c494bc7 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── a.txt │ │ │ │ ├── c/ │ │ │ │ │ └── a.txt │ │ │ │ ├── l.txt │ │ │ │ └── t/ │ │ │ │ ├── a.txt │ │ │ │ └── b.txt │ │ │ ├── issue_592b/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── description │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── exclude │ │ │ │ │ ├── logs/ │ │ │ │ │ │ ├── HEAD │ │ │ │ │ │ └── refs/ │ │ │ │ │ │ └── heads/ │ │ │ │ │ │ └── master │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 3f/ │ │ │ │ │ │ │ └── bf1852f72fd268e36457b13a18cdd9a4c9ea35 │ │ │ │ │ │ ├── 6f/ │ │ │ │ │ │ │ └── a891d3e578c83e1c03bdb9e0fdd8e6e934157f │ │ │ │ │ │ ├── 80/ │ │ │ │ │ │ │ └── 07d41d5794e6ce4d4d2c97e370d5a9aa6d5213 │ │ │ │ │ │ ├── a6/ │ │ │ │ │ │ │ └── 5fb6583a7c425284142f285bc359a2d6565513 │ │ │ │ │ │ ├── ae/ │ │ │ │ │ │ │ └── be7a55922c7097ef91ca3a7bc327a901d87c2c │ │ │ │ │ │ ├── b3/ │ │ │ │ │ │ │ └── 44b055867fcdc1f01eaa75056a43e868eb4fbc │ │ │ │ │ │ └── f7/ │ │ │ │ │ │ └── d75fbfad8b1d2e307ced287ea78aad403cdce3 │ │ │ │ │ └── refs/ │ │ │ │ │ └── heads/ │ │ │ │ │ └── master │ │ │ │ ├── gitignore │ │ │ │ ├── ignored/ │ │ │ │ │ ├── contained/ │ │ │ │ │ │ ├── ignored3.txt │ │ │ │ │ │ └── tracked3.txt │ │ │ │ │ ├── ignored2.txt │ │ │ │ │ └── tracked2.txt │ │ │ │ ├── ignored1.txt │ │ │ │ └── tracked1.txt │ │ │ ├── merge-recursive/ │ │ │ │ ├── .gitted/ │ │ │ │ │ ├── HEAD │ │ │ │ │ ├── config │ │ │ │ │ ├── index │ │ │ │ │ ├── info/ │ │ │ │ │ │ └── refs │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── 00/ │ │ │ │ │ │ │ ├── 6b298c5702b04c00370d0414959765b82fd722 │ │ │ │ │ │ │ └── 7f1ee2af8e5d99906867c4237510e1790a89b8 │ │ │ │ │ │ ├── 01/ │ │ │ │ │ │ │ └── 6eef4a6fefd36bdcaa93ad773449ddc5c73cbb │ │ │ │ │ │ ├── 03/ │ │ │ │ │ │ │ └── 9d0da126f24b819a5a38186249c7f96be3824c │ │ │ │ │ │ ├── 05/ │ │ │ │ │ │ │ ├── 63b7706dcdcf94bc0c02cd96c137940278eca9 │ │ │ │ │ │ │ └── c6a04ac101ab1a9836a95d5ec8d16b6f6304fd │ │ │ │ │ │ ├── 06/ │ │ │ │ │ │ │ └── db153c36829fc656e05cdf5a3bf7183f3c10aa │ │ │ │ │ │ ├── 07/ │ │ │ │ │ │ │ ├── 10c3c796e0704361472ecb904413fca0107a25 │ │ │ │ │ │ │ └── 2d89dcf3a7671ac34a8e875bb72fb39bcf14d7 │ │ │ │ │ │ ├── 08/ │ │ │ │ │ │ │ └── f01e1bff7e442d574eb221913515b4bd27ccd6 │ │ │ │ │ │ ├── 0b/ │ │ │ │ │ │ │ ├── b7ed583d7e9ad507e8b902594f5c9126ea456b │ │ │ │ │ │ │ └── beee1982b493330e375a85bbfddaba3d561556 │ │ │ │ │ │ ├── 0c/ │ │ │ │ │ │ │ └── e202f64fa8356c1a32835fce4058ca76b0c7ed │ │ │ │ │ │ ├── 0e/ │ │ │ │ │ │ │ ├── 8126647ec607f0a14122cec4b15315d790c8ff │ │ │ │ │ │ │ └── c39d71c1b074905350ce20ce3f0629f737a2a9 │ │ │ │ │ │ ├── 0f/ │ │ │ │ │ │ │ └── a6ead2731b9d138afe38c336c9727ea05027a7 │ │ │ │ │ │ ├── 12/ │ │ │ │ │ │ │ └── 4d4fe29d3433fdaa2f0f455d226f2c79d89cf3 │ │ │ │ │ │ ├── 15/ │ │ │ │ │ │ │ ├── 311229e70fa62653f73dde1d4deef1a8e47a11 │ │ │ │ │ │ │ └── faa0c9991f2d65686e844651faa2ff9827887b │ │ │ │ │ │ ├── 16/ │ │ │ │ │ │ │ └── 895aa5e13f8907d4adab81285557d938fad342 │ │ │ │ │ │ ├── 17/ │ │ │ │ │ │ │ └── 946ad3088f931102e5d81f94cf2825fc188953 │ │ │ │ │ │ ├── 18/ │ │ │ │ │ │ │ └── 2d0d250d1d7adcc60c178be5be98358b3a2fd1 │ │ │ │ │ │ ├── 1b/ │ │ │ │ │ │ │ ├── c7bcccf4bbdc8bfba2331a37ad5e9cf1dd321c │ │ │ │ │ │ │ └── de1883de4977ea3e664b315da951d1f614c3b1 │ │ │ │ │ │ ├── 1c/ │ │ │ │ │ │ │ └── 1bdb80c04233d1a9b9755913ee233987be6175 │ │ │ │ │ │ ├── 1e/ │ │ │ │ │ │ │ └── 8dff96faaaa24f84943d2d9601dde61cb0398a │ │ │ │ │ │ ├── 21/ │ │ │ │ │ │ │ └── 950d5e4e4d1a871b4dfcf72ecb6b9c162c434e │ │ │ │ │ │ ├── 23/ │ │ │ │ │ │ │ ├── b427bf6278724433e64ef4cf6dc166c4f2e246 │ │ │ │ │ │ │ └── cf2687a9327d55abbbd788ff04fa932072aebc │ │ │ │ │ │ ├── 26/ │ │ │ │ │ │ │ └── d3c94459b4faa08f009b15867993ca34153592 │ │ │ │ │ │ ├── 2c/ │ │ │ │ │ │ │ └── ba583804a4a6fad1baf97c959be447238d1489 │ │ │ │ │ │ ├── 2e/ │ │ │ │ │ │ │ └── 7ae0d42fb7b6126f6a08ac6314ac07833a52f6 │ │ │ │ │ │ ├── 30/ │ │ │ │ │ │ │ └── 39c07db695c8c99d0a7c7e32f0afe40eae0be0 │ │ │ │ │ │ ├── 34/ │ │ │ │ │ │ │ └── 8f16ffaeb73f319a75cec5b16a0a47d2d5e27c │ │ │ │ │ │ ├── 35/ │ │ │ │ │ │ │ ├── 8efd6f589384fa8baf92234db9c7899a53916e │ │ │ │ │ │ │ └── dda4f3f9b3794d92a46d908790e550ed100eae │ │ │ │ │ │ ├── 36/ │ │ │ │ │ │ │ └── 71e42c8c8302d1a71c0ed7bf2b0a938e9e20f9 │ │ │ │ │ │ ├── 37/ │ │ │ │ │ │ │ ├── 185b25a204309bf74817da1a607518f13ca3ed │ │ │ │ │ │ │ └── a5054a9f9b4628e3924c5cb8f2147c6e2a3efc │ │ │ │ │ │ ├── 38/ │ │ │ │ │ │ │ └── 55170cef875708da06ab9ad7fc6a73b531cda1 │ │ │ │ │ │ ├── 39/ │ │ │ │ │ │ │ └── 78944e4cd53edcc10a170ab2ff142f7295b958 │ │ │ │ │ │ ├── 3a/ │ │ │ │ │ │ │ ├── 0dc89a8bd20e74fae69d2e038b47360fafb02e │ │ │ │ │ │ │ ├── 3f5a6ec1c968d1d2d5d20dee0d161a4351f279 │ │ │ │ │ │ │ └── 8c70144d0334721154b1e0529716b368483d6f │ │ │ │ │ │ ├── 3b/ │ │ │ │ │ │ │ └── 919b6e8a575b4779c8243ebea3e3beb436e88f │ │ │ │ │ │ ├── 3e/ │ │ │ │ │ │ │ └── eff81b57a0ac15a5ab6bb3a8e92511a01a429c │ │ │ │ │ │ ├── 3f/ │ │ │ │ │ │ │ └── d41804a7906db846af5e868444782e546af46a │ │ │ │ │ │ ├── 40/ │ │ │ │ │ │ │ └── 9f5d072decec684331672f2d6c0a9bc3640adb │ │ │ │ │ │ ├── 41/ │ │ │ │ │ │ │ └── 71bb8d40e9fc830d79b757dc06ec6c14548b78 │ │ │ │ │ │ ├── 42/ │ │ │ │ │ │ │ ├── 1b392106e079df6d412babd5636697938269ec │ │ │ │ │ │ │ ├── 44d13e2bbc38510320443bbb003f3967d12436 │ │ │ │ │ │ │ └── cdad903aef3e7b614675e6584a8be417941911 │ │ │ │ │ │ ├── 43/ │ │ │ │ │ │ │ ├── 2faca0c62dc556ad71a22f23e541a46a8b0f6f │ │ │ │ │ │ │ ├── 5424798e5e1b21dd4588d1c291ba4eb179a838 │ │ │ │ │ │ │ └── 6ea75c99f527e4b42fddb46abedf7726eb719d │ │ │ │ │ │ ├── 44/ │ │ │ │ │ │ │ └── faf5fba1af850dae54f8b2345938d3c7ae479f │ │ │ │ │ │ ├── 48/ │ │ │ │ │ │ │ └── 3065df53c0f4a02cdc6b2910b05d388fc17ffb │ │ │ │ │ │ ├── 4a/ │ │ │ │ │ │ │ └── 06b258fed8a4d15967ec4253ae7366b70f727d │ │ │ │ │ │ ├── 4b/ │ │ │ │ │ │ │ ├── 7c5650008b2e747fe1809eeb5a1dde0e80850a │ │ │ │ │ │ │ └── 825dc642cb6eb9a060e54bf8d69288fbee4904 │ │ │
Copy disabled (too large)
Download .json
Condensed preview — 17644 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (112,164K chars).
[
{
"path": ".gitattributes",
"chars": 8,
"preview": "* -text\n"
},
{
"path": ".gitignore",
"chars": 74,
"preview": "*.pyc\r\n.cproject\r\n.idea\r\n.project\r\nbin/\r\ngmon.out\r\nout/\r\ntestdata/\r\ntmp*\r\n"
},
{
"path": "LICENSE",
"chars": 35823,
"preview": " GNU GENERAL PUBLIC LICENSE\r\n Version 3, 29 June 2007\r\n\r\n Copyright (C) 2007 Fr"
},
{
"path": "README.md",
"chars": 5437,
"preview": "# YaCo - Collaborative Reverse-Engineering for IDA\n# YaDiff - Symbols Propagation between IDA databases\n\n## [Latest Rele"
},
{
"path": "YaCo/exec_ida.py",
"chars": 3043,
"preview": "# Copyright (C) 2017 The YaCo Authors\n#\n# This program is free software: you can redistribute it and/or modify\n# i"
},
{
"path": "YaCo/export_all.py",
"chars": 1548,
"preview": "# Copyright (C) 2017 The YaCo Authors\n#\n# This program is free software: you can redistribute it and/or modify\n# i"
},
{
"path": "YaCo/load_yadb.py",
"chars": 1741,
"preview": "# Copyright (C) 2017 The YaCo Authors\n#\n# This program is free software: you can redistribute it and/or modify\n# i"
},
{
"path": "YaCo/yaco_plugin.py",
"chars": 2615,
"preview": "# Copyright (C) 2017 The YaCo Authors\n#\n# This program is free software: you can redistribute it and/or modify\n# i"
},
{
"path": "YaDiff/MergeYaDB.cpp",
"chars": 1017,
"preview": "\n#include \"Yatools.hpp\"\n#include \"YaDiff.hpp\"\n#include \"Propagate.hpp\"\n#include \"Configuration.hpp\"\n#include \"FlatBuffer"
},
{
"path": "YaDiff/YaDiffLib/Algo/Algo.cpp",
"chars": 806,
"preview": "#include \"Algo.hpp\"\n\n#include \"ExactMatch.hpp\"\n#include \"XRefOffsetMatch.hpp\"\n#include \"CallerXRefMatch.hpp\"\n#include \"E"
},
{
"path": "YaDiff/YaDiffLib/Algo/Algo.hpp",
"chars": 2391,
"preview": "#pragma once\n\n#include <functional>\n\nnamespace std { template<typename T> class shared_ptr; }\nstruct IModel;\nstruct Rela"
},
{
"path": "YaDiff/YaDiffLib/Algo/CallerXRefMatch.cpp",
"chars": 9514,
"preview": "#include \"XRefOffsetMatch.hpp\"\n\n#include \"Algo.hpp\"\n#include \"Helpers.h\"\n#include \"Yatools.hpp\"\n#include <Signature.hpp>"
},
{
"path": "YaDiff/YaDiffLib/Algo/CallerXRefMatch.hpp",
"chars": 250,
"preview": "#pragma once\n\n\nnamespace std { template<typename T> class shared_ptr; }\n\nnamespace yadiff { struct IDiffAlgo; }\nnamespac"
},
{
"path": "YaDiff/YaDiffLib/Algo/ExactMatch.cpp",
"chars": 3496,
"preview": "#include \"ExactMatch.hpp\"\n#include \"Algo.hpp\"\n\n#include \"Helpers.h\"\n#include \"Yatools.hpp\"\n#include \"IModel.hpp\"\n#includ"
},
{
"path": "YaDiff/YaDiffLib/Algo/ExactMatch.hpp",
"chars": 200,
"preview": "#pragma once\n\nnamespace std { template<typename T> class shared_ptr; }\nclass IDiffAlgo;\nstruct AlgoCfg;\n\nnamespace yadif"
},
{
"path": "YaDiff/YaDiffLib/Algo/ExternalMappingMatch.cpp",
"chars": 5450,
"preview": "#include \"ExternalMappingMatch.hpp\"\n#include \"Algo.hpp\"\n\n#include \"IModel.hpp\"\n#include \"VersionRelation.hpp\"\n#include \""
},
{
"path": "YaDiff/YaDiffLib/Algo/ExternalMappingMatch.hpp",
"chars": 210,
"preview": "#pragma once\n\nnamespace std { template<typename T> class shared_ptr; }\nclass IDiffAlgo;\nstruct AlgoCfg;\n\nnamespace yadif"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchArm.cpp",
"chars": 4043,
"preview": "#include \"ArchArm.hpp\"\n\n#include \"Helpers.h\"\n#include \"IArch.hpp\"\n#include \"VectorTypes.hpp\"\n\n#include <map>\n#include <v"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchArm.hpp",
"chars": 99,
"preview": "#pragma once\n\n#include \"IArch.hpp\"\n\nnamespace yadiff\n{\n std::shared_ptr<IArch> MakeArmArch();\n}\n"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchMips.cpp",
"chars": 7142,
"preview": "#include \"ArchMips.hpp\"\n\n#include \"Helpers.h\"\n#include \"IArch.hpp\"\n#include \"VectorTypes.hpp\"\n\n#include <map>\n#include <"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchMips.hpp",
"chars": 100,
"preview": "#pragma once\n\n#include \"IArch.hpp\"\n\nnamespace yadiff\n{\n std::shared_ptr<IArch> MakeMipsArch();\n}\n"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchPpc.cpp",
"chars": 1834,
"preview": "#include \"ArchPpc.hpp\"\n\n#include \"Helpers.h\"\n#include \"IArch.hpp\"\n#include \"VectorTypes.hpp\"\n\n#include <map>\n#include <v"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchPpc.hpp",
"chars": 99,
"preview": "#pragma once\n\n#include \"IArch.hpp\"\n\nnamespace yadiff\n{\n std::shared_ptr<IArch> MakePpcArch();\n}\n"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchX86.cpp",
"chars": 7084,
"preview": "#include \"ArchX86.hpp\"\n\n#include \"Helpers.h\"\n#include \"IArch.hpp\"\n#include \"VectorTypes.hpp\"\n\n#include <map>\n#include <v"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/ArchX86.hpp",
"chars": 98,
"preview": "#pragma once\n\n#include \"IArch.hpp\"\n\nnamespace yadiff\n{\n std::shared_ptr<IArch> MakeX86Arch();\n}"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/IArch.cpp",
"chars": 1849,
"preview": "#include \"IArch.hpp\"\n\n#include \"Helpers.h\"\n#include \"ArchX86.hpp\"\n#include \"ArchArm.hpp\"\n#include \"ArchPpc.hpp\"\n#include"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/IArch.hpp",
"chars": 1460,
"preview": "#pragma once\r\n\r\n#include <capstone/capstone.h>\r\n#include <functional>\r\n\r\n\r\n\r\nnamespace std { template<typename T> class "
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/InstructionVector.cpp",
"chars": 8724,
"preview": "/*\nUsing Capstone, I give a lib that gives some scalar according to the presence of certain instructions.\nTODO : get the"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/InstructionVector.hpp",
"chars": 1250,
"preview": "#pragma once\n\n#include \"VectorTypes.hpp\"\n\n#include <stdint.h>\n#include <vector>\n#include <map>\n\nstruct IModel;\nstruct HV"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorDistance.cpp",
"chars": 4374,
"preview": "/*\n Inputs : Set of vectors // Representing the function characteristics\n Unity ball // Represent"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorDistance.hpp",
"chars": 1051,
"preview": "/*\n Math lib for Nearest Neighbor Search in a space of double\n All functions are exported \n*/\n#pragma once\n#includ"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorHelpers.cpp",
"chars": 3046,
"preview": "\r\n#include \"VectorHelpers.hpp\"\r\n\n#include <math.h>\r\n#include <algorithm>\r\n#include <numeric> // accumul"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorHelpers.hpp",
"chars": 462,
"preview": "/*\r\n\r\n Some (math) utils\r\n\r\n*/\r\n#pragma once\r\n#include <stddef.h>\n#include <vector>\r\n#include \"VectorTypes.hpp\"\r\n\r\n\r\n"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorTypes.cpp",
"chars": 8483,
"preview": "#include <stddef.h>\n#include \"VectorTypes.hpp\"\n\n// To get Architecture\n#include \"IArch.hpp\"\n#include \"IModel.hpp\"\n#inclu"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign/VectorTypes.hpp",
"chars": 4507,
"preview": "#pragma once\n\n#include \"YaTypes.hpp\"\n\n// Get IArch callback\n#include \"IArch.hpp\"\n\n// Config, logger\n#include \"../Algo.hp"
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign.cpp",
"chars": 29569,
"preview": "/*\n Signature comparing aims to match functions based on some quantificables data on these functions. Those data are "
},
{
"path": "YaDiff/YaDiffLib/Algo/VectorSign.hpp",
"chars": 244,
"preview": "#pragma once\n\nnamespace std { template<typename T> class shared_ptr; }\n\nnamespace yadiff { struct IDiffAlgo; }\nnamespace"
},
{
"path": "YaDiff/YaDiffLib/Algo/XRefOffsetMatch.cpp",
"chars": 5953,
"preview": "#include \"XRefOffsetMatch.hpp\"\n\n#include \"Algo.hpp\"\n#include \"Yatools.hpp\"\n#include \"Helpers.h\"\n\n#include <Signature.hpp"
},
{
"path": "YaDiff/YaDiffLib/Algo/XRefOffsetMatch.hpp",
"chars": 205,
"preview": "#pragma once\n\nnamespace std { template<typename T> class shared_ptr; }\nclass IDiffAlgo;\nstruct AlgoCfg;\n\nnamespace yadif"
},
{
"path": "YaDiff/YaDiffLib/Algo/json.hpp",
"chars": 504682,
"preview": "/*\n __ _____ _____ _____\n __| | __| | | | JSON for Modern C++\n| | |__ | | | | | | version 2.1.1\n|___"
},
{
"path": "YaDiff/YaDiffLib/Matching.cpp",
"chars": 10840,
"preview": "#include \"Matching.hpp\"\n\n\n#include <Algo/Algo.hpp>\n#include \"Configuration.hpp\"\n#include \"VersionRelation.hpp\"\n#include "
},
{
"path": "YaDiff/YaDiffLib/Matching.hpp",
"chars": 443,
"preview": "#pragma once\n\n#include <vector>\n\nnamespace std { template<typename T> class shared_ptr; }\nclass Configuration;\nstruct IM"
},
{
"path": "YaDiff/YaDiffLib/Propagate.cpp",
"chars": 6255,
"preview": "#include \"Propagate.hpp\"\n\n#include \"IModelVisitor.hpp\"\n#include \"Configuration.hpp\"\n\n#include \"Yatools.hpp\"\n#include \"He"
},
{
"path": "YaDiff/YaDiffLib/Propagate.hpp",
"chars": 575,
"preview": "#pragma once\n\n#include <YaTypes.hpp>\n#include <Merger.hpp>\n#include <Algo/Algo.hpp>\n\nclass Configuration;\n\nnamespace yad"
},
{
"path": "YaDiff/YaDiffLib/VersionRelation.cpp",
"chars": 1602,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaDiff/YaDiffLib/VersionRelation.hpp",
"chars": 1394,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaDiff/YaDiffLib/YaDiff.cpp",
"chars": 2663,
"preview": "#include \"YaDiff.hpp\"\n\n#include \"Helpers.h\"\n#include \"Yatools.hpp\"\n\n#include <Matching.hpp>\n#include <Configuration.hpp>"
},
{
"path": "YaDiff/YaDiffLib/YaDiff.hpp",
"chars": 611,
"preview": "#pragma once\n\n#include <string>\n#include <vector>\n\nstruct Relation;\n\nclass Configuration;\nstruct IModel;\n\nnamespace yadi"
},
{
"path": "YaDiff/merge_idb.py",
"chars": 7227,
"preview": "#!/usr/bin/env python2.7\n# we want to use python from ida\n\nimport argparse\nimport inspect\nimport logging\nimport os\nimpor"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestExternalMappingMatch1.xml",
"chars": 3160,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<basic_block>\n <id>12345678</id>\n <version>\n <address>0xbc614e"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestExternalMappingMatch2.xml",
"chars": 3160,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<basic_block>\n <id>12345688</id>\n <version>\n <size>0x0000000"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestExternalMappingMatchAlgo.json",
"chars": 399,
"preview": "[\n {\n \"src\": 12345678,\n \"dst\": 12345688,\n \"comment\": \"test comment 1\"\n },\n {\n \"src\""
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestMatchBasicBlock1.xml",
"chars": 667,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<basic_block>\n <id>0000000000000010</id>\n <version>\n <size>0"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestMatchBasicBlock2.xml",
"chars": 667,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<basic_block>\n <id>0000000000000020</id>\n <version>\n <size>0"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestMatchStruct1.xml",
"chars": 578,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<struc>\n <id>0000000000000010</id>\n <version>\n <size>0x00000"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestMatchStruct2.xml",
"chars": 628,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<struc>\n <id>0000000000000011</id>\n <version>\n <size>0x00000"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestParentXrefOfDataMatch1.xml",
"chars": 2058,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<segment_chunk>\n <id>0000000000000030</id>\n <version>\n <size"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestParentXrefOfDataMatch2.xml",
"chars": 2058,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<segment_chunk>\n <id>0000000000000030</id>\n <version>\n <size"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestSigComp1.xml",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<function>\n <id>0000000000000001</id>\n <version>\n <size>0x00"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestSigComp2.xml",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<function>\n <id>0000000000000002</id>\n <version>\n <size>0x00"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestXrefOfDataMatch1.xml",
"chars": 1307,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<segment_chunk>\n <id>0000000000000030</id>\n <version>\n <size"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/TestXrefOfDataMatch2.xml",
"chars": 1308,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n<segment_chunk>\n <id>0000000000000031</id>\n <version>\n <size"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/config.xml",
"chars": 263,
"preview": "<yadiff>\n\t<Matching>\n\t\t<option XRefOffsetMatch=\"true\"/>\n\t\t<option CallerXRefMatch=\"true\"/>\n\t\t<option CallerXRefMatch_Tru"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/diff/tbf_small_c.xml",
"chars": 11933,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\r\n<sigfile>\r\n<binary>\r\n <id>91D3629D74B9EF90</id>\r\n <version>\r\n <size>0"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeAttribute1.xml",
"chars": 505,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeAttribute2.xml",
"chars": 330,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeAttributeResult1.xml",
"chars": 505,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeAttributeResult2.xml",
"chars": 505,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeComment1.xml",
"chars": 485,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeComment2.xml",
"chars": 485,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeCommentResult1.xml",
"chars": 559,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeCommentResult2.xml",
"chars": 559,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeMultiStrucXrefs1.xml",
"chars": 1229,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeMultiStrucXrefs2.xml",
"chars": 355,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeMultiStrucXrefsResult1.xml",
"chars": 611,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeMultiStrucXrefsResult2.xml",
"chars": 611,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeName1.xml",
"chars": 482,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeName2.xml",
"chars": 410,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeName2Result.xml",
"chars": 457,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeParentExport1.xml",
"chars": 754,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeParentExport2.xml",
"chars": 707,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeParentExportFunction11Result2.xml",
"chars": 443,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000011</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeParentExportFunction2Result2.xml",
"chars": 377,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefs1.xml",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefs2.xml",
"chars": 757,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsLoop1.xml",
"chars": 1236,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsLoop2.xml",
"chars": 343,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsLoopResult11.xml",
"chars": 437,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <struc>\n <id>0000000000000011</id>\n <version>\n <size"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsLoopResult111.xml",
"chars": 449,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <strucmember>\n <id>0000000000000111</id>\n <version>\n "
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsLoopResult2.xml",
"chars": 443,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsMissing1.xml",
"chars": 846,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsMissing2.xml",
"chars": 456,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsMissingResult1.xml",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsMissingResult2.xml",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsMissingResult41.xml",
"chars": 443,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000041</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsResult1.xml",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000001</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/data/merge/TestMergeXrefsResult2.xml",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"iso-8859-15\"?>\n<sigfile>\n <function>\n <id>0000000000000002</id>\n <version>\n <s"
},
{
"path": "YaDiff/tests/YaDiffLib_test/test_Algo.cpp",
"chars": 1965,
"preview": "#include \"YaTypes.hpp\"\n#include \"BinHex.hpp\"\n#include \"Configuration.hpp\"\n#include \"FileUtils.hpp\"\n#include \"FlatBufferM"
},
{
"path": "YaDiff/tests/YaDiffLib_test/test_VersionRelation.cpp",
"chars": 1778,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaDiff/tests/YaDiffLib_test/test_YaDiffLib.cpp",
"chars": 31985,
"preview": "#include \"XmlAccept.hpp\"\n#include \"XmlVisitor.hpp\"\n#include \"MemoryModel.hpp\"\n#include \"FlatBufferVisitor.hpp\"\n#include "
},
{
"path": "YaLibs/YaToolsIDALib/Events.cpp",
"chars": 31552,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Events.hpp",
"chars": 1307,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Hash.cpp",
"chars": 3627,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Hash.hpp",
"chars": 1535,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Hooks.cpp",
"chars": 58448,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Hooks.hpp",
"chars": 974,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Ida.h",
"chars": 1492,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaDeleter.cpp",
"chars": 5503,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaDeleter.hpp",
"chars": 802,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaModel.cpp",
"chars": 65492,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaModel.hpp",
"chars": 1710,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaVisitor.cpp",
"chars": 78204,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/IdaVisitor.hpp",
"chars": 1017,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/PluginArm.cpp",
"chars": 4279,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Plugins.hpp",
"chars": 1491,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Pool.hpp",
"chars": 2052,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Repository.cpp",
"chars": 24510,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Repository.hpp",
"chars": 1813,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Strucs.cpp",
"chars": 12340,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/Strucs.hpp",
"chars": 2419,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/YaCo.cpp",
"chars": 7831,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/YaCo.hpp",
"chars": 1020,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/YaHelpers.cpp",
"chars": 18815,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsIDALib/YaHelpers.hpp",
"chars": 6967,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Bench.h",
"chars": 1498,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/BinHex.cpp",
"chars": 1851,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/BinHex.hpp",
"chars": 3274,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Configuration.cpp",
"chars": 2627,
"preview": "#include \"Configuration.hpp\"\n\n#include \"Helpers.h\"\n#include \"Yatools.hpp\"\n\n#include <memory>\n#include <string.h>\n#includ"
},
{
"path": "YaLibs/YaToolsLib/Configuration.hpp",
"chars": 536,
"preview": "#pragma once\n\n#include <string>\n#include <functional>\nnamespace std { template<typename T> class shared_ptr;}\n\n\n\ntypedef"
},
{
"path": "YaLibs/YaToolsLib/FileUtils.cpp",
"chars": 4477,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/FileUtils.hpp",
"chars": 1064,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/FlatBufferModel.cpp",
"chars": 29243,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/FlatBufferModel.hpp",
"chars": 1055,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/FlatBufferVisitor.cpp",
"chars": 19519,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/FlatBufferVisitor.hpp",
"chars": 1176,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Git.cpp",
"chars": 36437,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Git.hpp",
"chars": 4003,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/GitAsync.cpp",
"chars": 8436,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/HSignature.cpp",
"chars": 814,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/HSignature.hpp",
"chars": 1283,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/HVersion.cpp",
"chars": 9308,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/HVersion.hpp",
"chars": 4129,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Helpers.h",
"chars": 1077,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/IModel.hpp",
"chars": 5685,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/IModelSink.hpp",
"chars": 915,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/IModelVisitor.hpp",
"chars": 3043,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/LibGit.h",
"chars": 864,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Logger.cpp",
"chars": 3723,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Logger.hpp",
"chars": 2371,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/MemoryModel.cpp",
"chars": 28057,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/MemoryModel.hpp",
"chars": 995,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Merger.cpp",
"chars": 17062,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Merger.hpp",
"chars": 2104,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/ModelIndex.hpp",
"chars": 5277,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Random.cpp",
"chars": 1373,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Random.hpp",
"chars": 797,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Relation.hpp",
"chars": 2807,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Signature.cpp",
"chars": 2845,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Signature.hpp",
"chars": 1804,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Utils.cpp",
"chars": 4198,
"preview": "#include \"Utils.hpp\"\n\n#include \"YaTypes.hpp\"\n#include \"git_version.h\"\n\n#include <regex>\n\n#ifdef _MSC_VER\n# include <op"
},
{
"path": "YaLibs/YaToolsLib/Utils.hpp",
"chars": 1230,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/XmlAccept.cpp",
"chars": 19545,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/XmlAccept.hpp",
"chars": 1121,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/XmlVisitor.cpp",
"chars": 18676,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/XmlVisitor.hpp",
"chars": 1003,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/YaEnums.hpp",
"chars": 1863,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/YaTypes.cpp",
"chars": 3482,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/YaTypes.hpp",
"chars": 2742,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Yatools.cpp",
"chars": 2069,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/Yatools.hpp",
"chars": 1510,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsLib/yadb.fbs",
"chars": 2642,
"preview": "namespace yadb;\n\nfile_identifier \"YADB\";\nfile_extension \"yadb\";\n\nenum HashType : byte {\n Unknown = 0,\n None,\n "
},
{
"path": "YaLibs/YaToolsPy/YaSwig.cpp",
"chars": 2363,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsPy/YaSwig.hpp",
"chars": 1906,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsPy/YaToolsPy.h",
"chars": 2070,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsPy/YaToolsPy32.i",
"chars": 815,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/YaToolsPy/YaToolsPy64.i",
"chars": 891,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/ExporterValidatorVisitor.cpp",
"chars": 12304,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/ExporterValidatorVisitor.hpp",
"chars": 819,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_DatabaseModel.cpp",
"chars": 26399,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_XMLDatabaseModel.cpp",
"chars": 53322,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_common.hpp",
"chars": 6152,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_configuration.cpp",
"chars": 838,
"preview": "#include \"Configuration.hpp\"\n\n\n#ifndef YALIB_TEST\n# define YALIB_TEST\n#endif\n\n#include \"gtest/gtest.h\"\n#ifdef _MSC_VER"
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_git.cpp",
"chars": 13613,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_model.hpp",
"chars": 2789,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/YaToolsLib_test/test_yatools.cpp",
"chars": 5320,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaLibs/tests/data/test_configuration.xml",
"chars": 204,
"preview": "<yadiff>\n\t<section1>\n\t\t<option value1=\"value1_value\"/>\n\t</section1>\n\t<section2>\n\t\t<option test=\"test\" value2=\"value2_val"
},
{
"path": "YaLibs/tests/integration/integration.cpp",
"chars": 6300,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaToolsUtils/YaToolsBinToVect/bintovect.py",
"chars": 9888,
"preview": "#!/usr/bin/env python2.7\n# we want to use python from ida\n\nimport argparse\nimport logging\nimport os\nimport re\nimport shu"
},
{
"path": "YaToolsUtils/YaToolsCacheMerger/CacheMerger.cpp",
"chars": 1730,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaToolsUtils/YaToolsFBToXML/FBToXML.cpp",
"chars": 1872,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaToolsUtils/YaToolsXMLToFB/XMLToFB.cpp",
"chars": 1029,
"preview": "// Copyright (C) 2017 The YaCo Authors\n//\n// This program is free software: you can redistribute it and/or modify\n// "
},
{
"path": "YaToolsUtils/YaToolsYaDBToVectors/yadbtovectors.cpp",
"chars": 685,
"preview": "#include <Yatools.hpp>\n#include <IModel.hpp>\n#include <FlatBufferModel.hpp>\n#include <Algo/Algo.hpp>\n\n\n#include <string."
},
{
"path": "build/CMakeLists.txt",
"chars": 767,
"preview": "cmake_minimum_required(VERSION 3.1.0)\nproject(yatools)\n\nenable_testing()\n\ninclude(common.cmake)\n\nif(NOT \"${ARCH}\" STREQU"
},
{
"path": "build/capstone.cmake",
"chars": 772,
"preview": "# capstone directories\nget_filename_component(cap_dir \"${root_dir}/deps/capstone-3.0.4\" REALPATH)\n\n# capstone\nget_files("
},
{
"path": "build/common.cmake",
"chars": 28107,
"preview": "# Copyright (C) 2017 The YaCo Authors\n#\n# This program is free software: you can redistribute it and/or modify\n# i"
},
{
"path": "build/configure.sh",
"chars": 526,
"preview": "#!/bin/sh\n\nif [ -z \"$TARGET\" ]\nthen\n TARGET=\"Unix Makefiles\"\nfi\necho TARGET=$TARGET [Unix Makefiles, Ninja]\n\nif [ -z "
},
{
"path": "build/configure_2017.cmd",
"chars": 206,
"preview": "@echo off\nset OUT=..\\out\\x64\nmkdir %OUT% 2>NUL\nset TARGET=\"Visual Studio 15 2017 Win64\"\nset CFGS=Debug;RelWithDebInfo\ncm"
},
{
"path": "build/deploy.cmd",
"chars": 242,
"preview": "@echo off\n\nset ROOT_DIR=%~dp0..\necho %ROOT_DIR%\n\nrem plugins\nmklink /H yaco_plugin.py %ROOT_DIR%\\YaCo\\yaco_plugin.py\n\nre"
},
{
"path": "build/deploy.sh",
"chars": 137,
"preview": "#!/bin/sh\n\nexport ROOT_DIR=`dirname $0`/..\n\n# plugin\nln -s $ROOT_DIR/YaCo/yaco_plugin.py\n\n# yatools\nln -s $ROOT_DIR/bin/"
},
{
"path": "build/deploy_debug.cmd",
"chars": 185,
"preview": "@echo off\n\nset ROOT_DIR=%~dp0..\necho %ROOT_DIR%\n\nrem plugins\nmklink /H yaco_plugin.py %ROOT_DIR%\\YaCo\\yaco_plugin.py\n\nre"
}
]
// ... and 17444 more files (download for full content)
About this extraction
This page contains the full source code of the DGA-MI-SSI/YaCo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 17644 files (121.5 MB), approximately 27.3M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.