#1118526 tests: kallistro: corrupted size vs. prev_size

#1118526#5
Date:
2025-10-21 15:50:31 UTC
From:
To:
Following up with analysis after the test failure was mentioned by
Andreas in Matrix "Debian Tiny Tasks".

I do not have time to attack it and not familiar with the code-base but
this analysis should help.

Referring to the failed build log:

https://salsa.debian.org/med-team/kallisto/-/jobs/8480324#L2345

"corrupted size vs. prev_size" :- The direct cause is out-of-bounds writes into malloc control structure fields.

E.g: given `A = calloc(1, 16); B = calloc(1,16)` and A contiguous with B.
If `struct *S = A` and `sizeof(A) == sizeof(*S)` then S[0] is valid but S[1] is out-of-bounds and a
write may trample on the control structure preamble of B.

From what I can deduce it occurs in `ext/bifrost/src/CompactDBG.tcc::CompactDBG::construct()` template after line 3323 and before line 3331.
Most likely the reference to `size()` in line 3329.

if (opt.verbose) cout << "CompactedDBG::construct(): After join tips using mercy k-mers: " << size() << " unitigs" << endl;

https://salsa.debian.org/med-team/kallisto/-/blob/72ff60faebbab43eba75e55fe393d88de42116a5/ext/bifrost/src/CompactedDBG.tcc#L3323

Disabling `opt.verbose` would be an easy way to (dis)prove that.

#1118526#10
Date:
2025-10-21 18:48:14 UTC
From:
To:
Additional information after using gdb in the sbuild container when it
fails. Unfortunately it is proving difficult/impossible to add a
breakpoint just after the last successful opt.verbose message since it
is in the template, even though a breakpoint on the function entry point
does work.

root@sbuild:/build/reproducible-path/kallisto-0.51.1+dfsg/obj-x86_64-linux-gnu# gdb --args ./src/kallisto index -i ./func_tests/basic7.idx -k 7 ./func_tests/simple.fasta
...
CompactedDBG::construct(): Joined 0 unitigs                                                                                                                                                                                                                                                                   18:41:42 [45/4583]
corrupted size vs. prev_size

Thread 1 "kallisto" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff787bbc0 (LWP 5545)]
0x00007ffff79a695c in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt full
#0  0x00007ffff79a695c in ?? () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#1  0x00007ffff7951cc2 in raise () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#2  0x00007ffff793a4ac in abort () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#3  0x00007ffff793b291 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#4  0x00007ffff79b0465 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#5  0x00007ffff79b0e7e in ?? () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#6  0x00007ffff79b3e3a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#7  0x00007ffff79b4c4e in malloc () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#8  0x00007ffff7ce093c in operator new(unsigned long) () from /lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#9  0x00005555555b4b07 in KmerHashTable<CompressedCoverage_t<Node> >::init_tables (this=<optimized out>, sz=<optimized out>) at ./ext/bifrost/src/KmerHashTable.hpp:218
No locals.
#10 KmerHashTable<CompressedCoverage_t<Node> >::KmerHashTable (this=<optimized out>, sz=<optimized out>) at ./ext/bifrost/src/KmerHashTable.hpp:98
        sz_with_empty = <optimized out>
        rdnup_sz = <optimized out>
#11 CompactedDBG<Node, void>::toDataGraph (this=this@entry=0x7fffffffdc40, o=..., nb_threads=<optimized out>) at ./ext/bifrost/src/CompactedDBG.tcc:141
        moveUnitigs = {__this = 0x7fffffffdc40, __o = @0x7fffffff9140}
        it_s = {<std::iterator<std::forward_iterator_tag, CompressedCoverage_t<void>, long, CompressedCoverage_t<void>*, CompressedCoverage_t<void>&>> = {<No data fields>}, ht = <optimized out>, h = 0}
        it_e = <optimized out>
#12 0x00005555555c08ba in CompactedDBG<Node, void>::build (this=0x7fffffffdc40, opt=...) at ./ext/bifrost/src/CompactedDBG.tcc:648
        graph = {_vptr.CompactedDBG = 0x5555556db120 <vtable for CompactedDBG<void, void>+16>, k_ = 7, g_ = 5, invalid = false, static min_abundance_lim = 15, static max_abundance_lim = 15, v_unitigs = std::vector of length 0, capacity 0, km_unitigs = {static block_sz = 1024, static cov_full = 1, shift_div = 10,
            mask_mod = 1023, sz = 0, v_blocks = std::vector of length 0, capacity 1}, h_kmers_ccov = {size_ = 1024, pop = 26, num_empty = 998, table_keys = 0x555555785d70, table_values = 0x555555787d88}, hmap_min_unitigs = {is_static = false, size_ = 0, pop = 0, num_empty = 0, table_keys = 0x0, table_tinyv = 0x0,
            table_tinyv_sz = 0x0, mphf = 0x0, lck_min = std::vector of length 0, capacity 0, lck_edit_table = {_bits = std::atomic<unsigned int> = { 0 }, padding = {0 <repeats 15 times>}}, pop_p = std::atomic<unsigned long> = { 93824994399712 }, num_empty_p = std::atomic<unsigned long> = { 140737488327776 }},
          data = {<No data fields>}}
        max_threads = <optimized out>
        construct_finished = <optimized out>
        k_cpy = 7
        g_cpy = 5
        invalid_cpy = false
        reference_mode = <optimized out>
        nb_unique_kmers = <optimized out>
        nb_unique_minimizers = <optimized out>
        nb_non_unique_kmers = <optimized out>
        nb_non_unique_minimizers = <optimized out>
        bf = <optimized out>
        r = <optimized out>
        v_files = <optimized out>
        kms_opt = <optimized out>
        kms = <optimized out>
        s = <optimized out>
        __for_range = <optimized out>
        __for_begin = <optimized out>
        __for_end = <optimized out>
        filter_out = <optimized out>
#13 KmerIndex::BuildDeBruijnGraph (this=this@entry=0x7fffffffdc30, opt=..., tmp_file="tmp/kallisto.4g0ULG4xKK4oaaSv2Mpvj8S", out=...) at ./src/KmerIndex.cpp:595
        c_opt = {verbose = true, nb_threads = 1, min_count_km = 1, nb_bits_kmers_bf = 14, inFilenameBBF = "", outFilenameBBF = "", filename_seq_in = std::vector of length 0, capacity 0, filename_ref_in = std::vector of length 1, capacity 1 = {"tmp/kallisto.4g0ULG4xKK4oaaSv2Mpvj8S"}, k = 7, g = 5, build = true,
          update = false, query = false, clipTips = false, deleteIsolated = false, useMercyKmers = false, outputGFA = true, outputFASTA = false, outputBFG = false, compressOutput = true, inexact_search = false, writeIndexFile = true, ratio_kmers = 0.80000000000000004, prefixFilenameOut = "", filename_graph_in = "",
          filename_index_in = "", filename_query_in = std::vector of length 0, capacity 0}
        dfks = {<ankerl::unordered_dense::v3_1_1::detail::base_table_type_set> = {<No data fields>}, m_values = std::vector of length 0, capacity 0, m_buckets = 0x0, m_num_buckets = 0, m_max_bucket_capacity = 0, m_max_load_factor = 0, m_hash = {<No data fields>},
          m_equal = {<std::binary_function<Kmer, Kmer, bool>> = {<No data fields>}, <No data fields>}, m_shifts = 0 '\000'}
        pos1 = <optimized out>
        tmp_size = 0
        res = <optimized out>
        pos2 = <optimized out>
        minz = std::vector of length 0, capacity 0
        mphf = <optimized out>
        dfks_size = 0
        dlist_overhang = 0
        infile = <incomplete type>
        in = <incomplete type>
        running_id = <optimized out>
#14 0x00005555555c3afe in KmerIndex::BuildTranscripts (this=<optimized out>, opt=..., out=...) at ./src/KmerIndex.cpp:407
        unique_names = {<ankerl::unordered_dense::v3_1_1::detail::base_table_type_set> = {<No data fields>}, m_values = std::vector of length 5, capacity 8 = {"t1", "t2", "t3", "t4", "t5"}, m_buckets = 0x5555557654d0, m_num_buckets = 16, m_max_bucket_capacity = 12, m_max_load_factor = 0.800000012,
--Type <RET> for more, q to quit, c to continue without paging--
          m_hash = {<No data fields>}, m_equal = {<std::binary_function<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, m_shifts = 60 '<'}
        tmp_file = "tmp/kallisto.4g0ULG4xKK4oaaSv2Mpvj8S"
        of = <incomplete type>
        fp = 0x0
        seq = <optimized out>
        l = <optimized out>
        gen = {static state_size = 624, _M_x = {42, 3107752595, 1895908407, 3900362577, 3030691166, 4081230161, 2732361568, 1361238961, 3961642104, 867618704, 2837705690, 3281374275, 3928479052, 3691474744, 3088217429, 1769265762, 3769508895, 2731227933, 2930436685, 486258750, 1452990090, 3321835500, 3520974945,
            2343938241, 928051207, 2811458012, 3391994544, 3688461242, 1372039449, 3706424981, 1717012300, 1728812672, 1688496645, 1203107765, 1648758310, 440890502, 1396092674, 626042708, 3853121610, 669844980, 2992565612, 310741647, 3820958101, 3474052697, 305511342, 2053450195, 705225224, 3836704087, 3293527636,
            1140926340, 2738734251, 574359520, 1493564308, 269614846, 427919468, 2903547603, 2957214125, 181522756, 4137743374, 2557886044, 3399018834, 1348953650, 1575066973, 3837612427, 705360616, 4138204617, 1604205300, 1605197804, 590851525, 2371419134, 2530821810, 4183626679, 2872056396, 3895467791, 1156426758,
            184917518, 2502875602, 2730245981, 3251099593, 2228829441, 2591075711, 3048691618, 3030004338, 1726207619, 993866654, 823585707, 936803789, 3180156728, 1191670842, 348221088, 988038522, 3281236861, 1153842962, 4152167900, 98291801, 816305276, 575746380, 1719541597, 2584648622, 1791391551, 3234806234,
            413529090, 219961136, 4180088407, 1135264652, 3923811338, 2304598263, 762142228, 1980420688, 1225347938, 3657621885, 3762382117, 1157119598, 2556627260, 2276905960, 3857700293, 1903185298, 4258743924, 2078637161, 4160077183, 3569294948, 2138906140, 1346725611, 1473959117, 2798330104, 3785346335,
            4103334026, 3448442764, 1142532843, 4278036691, 3071994514, 3474299731, 1121195796, 1536841934, 2132070705, 1064908919, 2840327803, 992870214, 2041326888, 2906112696, 4182466030, 1031463950, 703166484, 854266995, 4157971695, 4071962029, 2600094776, 2770410869, 3776335751, 2599879593, 2451043853,
            2223709058, 2098813464, 4008111478, 2959232195, 3072496064, 2498909222, 4020139729, 785990520, 958060279, 4183949075, 2392404465, 533774465, 4092066952, 3967420027, 1726137853, 2907699474, 3158758391, 1460845905, 1323598137, 2446717890, 3004885867, 3447263769, 1378488047, 3172418196, 652839901,
            1695052769, 226007057, 778836071, 1216725078, 655651335, 1850195064, 427367795, 800074262, 2241880422, 1713434925, 339981078, 1730571881, 672610244, 1952245009, 2729177102, 3516932475, 4032720152, 3177283432, 411893652, 2440235559, 3587427933, 43170267, 39225133, 3904203400...}, _M_p = 624}
        countNonNucl = <optimized out>
        countUNuc = <optimized out>
        polyAcount = <optimized out>
#15 0x0000555555572675 in main (argc=<optimized out>, argv=0x7fffffffeb18) at ./src/main.cpp:2317
        index = {k = 7, num_trans = 5, skip = 1, dbg = {_vptr.CompactedDBG = 0x5555556db0b0 <vtable for CompactedDBG<Node, void>+16>, k_ = 7, g_ = 5, invalid = false, v_unitigs = std::vector of length 0, capacity 0, km_unitigs = {static block_sz = 1024, shift_div = 10, mask_mod = 1023, sz = 0,
              v_blocks = std::vector of length 0, capacity 0}, h_kmers_ccov = {size_ = 1024, pop = 0, num_empty = 1024, table_keys = 0x555555757560, table_values = 0x555555765928}, hmap_min_unitigs = {is_static = false, size_ = 64, pop = 2, num_empty = 62, table_keys = 0x555555754e50, table_tinyv = 0x55555578baa0,
              table_tinyv_sz = 0x555555757330 "", mphf = 0x0, lck_min = std::vector of length 0, capacity 0, lck_edit_table = {_bits = std::atomic<unsigned int> = { 0 }, padding = {0 <repeats 15 times>}}, pop_p = std::atomic<unsigned long> = { 4096 }, num_empty_p = std::atomic<unsigned long> = { 25769803778 }},
            data = {<No data fields>}}, ecmapinv = {<ankerl::unordered_dense::v3_1_1::detail::base_table_type_map<int>> = {<No data fields>}, m_values = std::vector of length 0, capacity 0, m_buckets = 0x0, m_num_buckets = 0, m_max_bucket_capacity = 0, m_max_load_factor = 0.800000012, m_hash = {<No data fields>},
            m_equal = {<std::binary_function<Roaring, Roaring, bool>> = {<No data fields>}, <No data fields>}, m_shifts = 61 '='}, INDEX_VERSION = 13, target_lens_ = std::vector of length 5, capacity 8 = {19, 23, 17, 10, 10}, target_names_ = std::vector of length 5, capacity 8 = {"t1", "t2", "t3", "t4", "t5"},
          target_seqs_ = std::vector of length 0, capacity 0, dfk_onlist = false, do_union = false, no_jump = false, target_seqs_loaded = false, load_positional_info = true, onlist_sequences = {roaring = {high_low_container = {size = 0, allocation_size = 4, containers = 0x555555724d80, keys = 0x555555724da0,
                typecodes = 0x555555724da8 ""}, copy_on_write = false}}, d_list = {<ankerl::unordered_dense::v3_1_1::detail::base_table_type_set> = {<No data fields>}, m_values = std::vector of length 0, capacity 0, m_buckets = 0x0, m_num_buckets = 0, m_max_bucket_capacity = 0, m_max_load_factor = 0.800000012,
            m_hash = {<No data fields>}, m_equal = {<std::binary_function<Kmer, Kmer, bool>> = {<No data fields>}, <No data fields>}, m_shifts = 61 '='}, dummy_dfk = {static MAX_K = 32, {bytes = "0\004\000\000\000\000\000", longs = {1072}}}, um_dummy = {<UnitigMapBase> = {dist = 0, len = 1, size = 0, strand = true,
              isEmpty = true}, pos_unitig = 0, isShort = false, isAbundant = false, cdbg = 0x0}, shadeToColorTranscriptMap = std::unordered_map with 0 elements, shade_sequences = {roaring = {high_low_container = {size = 0, allocation_size = 4, containers = 0x555555755260, keys = 0x555555755280,
                typecodes = 0x555555755288 ""}, copy_on_write = false}}, use_shade = false}
        out = <incomplete type>
        start_time = "Tue Oct 21 18:40:00 2025"
        opt = {verbose = false, aa = false, distinguish = false, threads = 1, index = "./func_tests/basic7.idx", k = 7, g = 0, max_ec_size = -1, iterations = 500, output = "", skip = 1, seed = 42, error_rate = 0, threshold = 0.80000000000000004, fld = 0, sd = 0, min_range = 1, bootstrap = 0, max_num_reads = 0,
          transfasta = std::vector of length 1, capacity 1 = {"./func_tests/simple.fasta"}, batch_mode = false, bus_mode = false, busOptions = {nfiles = 0, keep_fastq_comments = false, umi = std::vector of length 0, capacity 0, bc = std::vector of length 0, capacity 0, seq = std::vector of length 0, capacity 0,
            paired = false, long_read = false, unmapped = false, error_rate = 0, threshold = 0, aa = false}, bam = false, num = false, batch_file_name = "", batch_files = std::vector of length 0, capacity 0, batch_ids = std::vector of length 0, capacity 0, files = std::vector of length 0, capacity 0,
          d_list = std::vector of length 0, capacity 0, d_list_overhang = 1, plaintext = false, write_index = false, single_end = false, long_read = false, unmapped = false, strand_specific = false, peek = false, bias = false, pseudobam = false, genomebam = false, make_unique = false, fusion = false,
          dfk_onlist = false, do_union = false, no_jump = false, strand = ProgramOptions::StrandType::None, gfa = "", inspect_thorough = false, single_overhang = false, record_batch_bus_barcode = false, matrix_to_files = false, matrix_to_directories = false, input_interleaved_nfiles = 0, gtfFile = "", chromFile = "",
          bedFile = "", technology = "", platform = "", tagsequence = "", tccFile = "", ecFile = "", fldFile = "", transcriptsFile = "", genemap = "", priors = "", tmp_dir = "tmp"}
        cmd = "index"

#1118526#15
Date:
2025-10-21 19:03:00 UTC
From:
To:
Single-stepping got to the abort point:

3828            cout << "CompactedDBG::construct(): Before split: " << unitigsBefore << " unitigs" << endl;
(gdb) n
CompactedDBG::construct(): Before split: 41 unitigs
3829            cout << "CompactedDBG::construct(): After split (1/" << (reference_mode ? "1" : "2" ) << "): " << unitigsAfter1 << " unitigs" <<  endl;
(gdb) n
CompactedDBG::construct(): After split (1/1): 26 unitigs
3831            cout << "CompactedDBG::construct(): Unitigs split: " << unitigSplit.first << endl;
(gdb) n
CompactedDBG::construct(): Unitigs split: 0
3832            cout << "CompactedDBG::construct(): Unitigs deleted: " << unitigSplit.second << endl;
(gdb) n
CompactedDBG::construct(): Unitigs deleted: 15
3834            cout << endl << "CompactedDBG::construct(): Joining unitigs" << endl;
(gdb) n

CompactedDBG::construct(): Joining unitigs
CompactedDBG<void, void>::construct (this=this@entry=0x7fffffff9140, opt=..., bf=..., r=..., nb_unique_minimizers=nb_unique_minimizers@entry=22, nb_non_unique_minimizers=<optimized out>) at ./ext/bifrost/src/KmerHashTable.hpp:170
170         inline size_t size() const {
(gdb) n
CompactedDBG<void, void>::construct (this=this@entry=0x7fffffff9140, opt=..., bf=..., r=..., nb_unique_minimizers=nb_unique_minimizers@entry=22, nb_non_unique_minimizers=<optimized out>) at ./ext/bifrost/src/CompactedDBG.tcc:3839
3839        const int unitigsAfter3 = size();
(gdb) n
3843            cout << "CompactedDBG::construct(): After join: " << unitigsAfter3 << " unitigs" << endl;
(gdb) n
3839        const int unitigsAfter3 = size();
(gdb) n
3843            cout << "CompactedDBG::construct(): After join: " << unitigsAfter3 << " unitigs" << endl;
(gdb) n
CompactedDBG::construct(): After join: 26 unitigs
3844            cout << "CompactedDBG::construct(): Joined " << joined << " unitigs" << endl;
(gdb) n
CompactedDBG::construct(): Joined 0 unitigs
3862    }
(gdb) n
CompactedDBG<void, void>::construct (this=this@entry=0x7fffffff9140, opt=..., bf=..., r=..., nb_unique_minimizers=nb_unique_minimizers@entry=22, nb_non_unique_minimizers=<optimized out>) at /usr/include/c++/15/bits/new_allocator.h:104
104           ~__new_allocator() _GLIBCXX_USE_NOEXCEPT { }
(gdb) n
CompactedDBG<void, void>::build (this=this@entry=0x7fffffff9140, opt=...) at ./ext/bifrost/src/CompactedDBG.tcc:709
709                     r.clear();
(gdb) n
711             }
(gdb) n
corrupted size vs. prev_size

Thread 1 "kallisto" received signal SIGABRT, Aborted.

#1118526#20
Date:
2025-10-22 11:00:58 UTC
From:
To:
#1118526#25
Date:
2025-10-22 12:05:38 UTC
From:
To:

#1118526#34
Date:
2026-10-20 18:22:18 UTC
From:
To:
Hello,

Bug #1118526 in kallisto reported by you has been fixed in the
Git repository and is awaiting an upload. You can see the commit
message below and you can check the diff of the fix at:

https://salsa.debian.org/med-team/kallisto/-/commit/b26882be0a0fa119c1442a1d0c15e8765f6cfa36
------------------------------------------------------------------------
Build bundled bifrost with the same MAX_KMER_SIZE as kallisto

Compiling bifrost with MAX_KMER_SIZE=31 and kallisto with 32 corrupts
the heap and makes the test suite crash.  Pass kallisto's k-mer size to
the bundled bifrost build and drop the patch that forced the wrong
default.

Closes: #1118526
------------------------------------------------------------------------

(this message was generated automatically)
-- 
Greetings

https://bugs.debian.org/1118526

#1118526#41
Date:
2026-10-20 18:49:34 UTC
From:
To:
We believe that the bug you reported is fixed in the latest version of
kallisto, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 1118526@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Andreas Tille <tille@debian.org> (supplier of updated kallisto package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing ftpmaster@ftp-master.debian.org)
Format: 1.8
Date: Tue, 20 Oct 2026 19:44:13 +0200
Source: kallisto
Architecture: source
Version: 0.52.0+dfsg-1
Distribution: unstable
Urgency: medium
Maintainer: Debian Med Packaging Team <debian-med-packaging@lists.alioth.debian.org>
Changed-By: Andreas Tille <tille@debian.org>
Closes: 1118526
Changes:
 kallisto (0.52.0+dfsg-1) unstable; urgency=medium
 .
   * New upstream version
   * Adapt patches to new upstream version
   * Build the bundled bifrost with the same MAX_KMER_SIZE as kallisto instead
     of compiling it with MAX_KMER_SIZE=31.  The mismatched k-mer size caused
     heap corruption and test failures.
     Closes: #1118526
   * Drop 'Rules-Requires-Root: no' from d/control (routine-update)
   * Reformat the Last-Update date as ISO YYYY-MM-DD.
   * Remove unused patch to use Debian packaged bifrost
Checksums-Sha1:
 489575a4aef3fbf6482cbf9efffd378b7461860c 2181 kallisto_0.52.0+dfsg-1.dsc
 629e2a15bdfb9eca2b69f6d22077f16d3cc11c5c 3469176 kallisto_0.52.0+dfsg.orig.tar.xz
 c2b2f47c5aade22a8051d50ec642feff1b9e1d21 8908 kallisto_0.52.0+dfsg-1.debian.tar.xz
 886ccd6176b260b9c139ca80df1e26f549c241d5 11731 kallisto_0.52.0+dfsg-1_amd64.buildinfo
Checksums-Sha256:
 8be38f258c0aa40bf40199ced7aa50c19fc007f0b44d77900b363233a3e411bd 2181 kallisto_0.52.0+dfsg-1.dsc
 ca13d7265a0bcf23c0035a8b2d25e88be4231f253fd1685f800d8ed5a802a757 3469176 kallisto_0.52.0+dfsg.orig.tar.xz
 db373cdd908b2070061b5783fa27d395def0190931bfef505b0564b7a8a58093 8908 kallisto_0.52.0+dfsg-1.debian.tar.xz
 d326e8ce35e47b918fafcd8d49de782a44269b2385f4cac9e4397502795457db 11731 kallisto_0.52.0+dfsg-1_amd64.buildinfo
Files:
 27b218b55750a6985fb3984ef4747e11 2181 science optional kallisto_0.52.0+dfsg-1.dsc
 1e6e5931da0ede9a1763868f07ceeece 3469176 science optional kallisto_0.52.0+dfsg.orig.tar.xz
 efa1ec2329e87eda74fcf83b0dc819cc 8908 science optional kallisto_0.52.0+dfsg-1.debian.tar.xz
 8c0e933bff9347de80b8b8888c84393d 11731 science optional kallisto_0.52.0+dfsg-1_amd64.buildinfo
-----BEGIN PGP SIGNATURE-----

iQJFBAEBCgAvFiEE8fAHMgoDVUHwpmPKV4oElNHGRtEFAmrXsaoRHHRpbGxlQGRl
Ymlhbi5vcmcACgkQV4oElNHGRtEhjA/+L6TMNFI2l104CcxfoSvYWsDovRScwn/Y
V4AlSkdJrf2mLCrVDTGMry1SRYkPdwKEwd1hG1cPA072O02PJoB1jewkJ1j36L3Z
RpJ8/UUXN95l1J1/B71jk40pr+7Rf+njcBh5k8v6pYOILZBqIiwcPDfRb2W7pgko
LYO+0VFq+z5MEKKAR68wByWLz5zSeyEErjvqgAfjVH3pGtDEcu8VXyH7+zG1yaCN
gc4+I4cv2vMwV3fO5bhqcMGqI++0qXniii98TeYT2iaf/Z+gYaWowWB2PI3qMfJc
QjJgPvFo9ypnyyoLkuc10fzatP0Opt25vAf37pNkf9klO8D0gs+TOiBqmHn//YNW
pvt3imtwA4WMUGggfEpa46OA/G1rWSio6zqlD6YaISLoGbIRI1Ut8Lj3Tmwa9RhO
lu1jc4y2QCEMV2hNgXwIuse3fkuM3R5H//xalNXFccL5sbuYYD2MYVOd4lSc+8Md
r8Bqzcfpx7kH1dU28xqDTFV+6cg7J0znUTnqMTvJ0OsM/9UyvPHsIW1DCEj+8/PY
qQGbMEYyoWR/PXsB3NrPARBc5PSJEKl0xs2Z7vedU17pxdnRxz/GQuGJPYKnwOzv
/b/P185NizJxq/JkFinot0TzRBxSLTkzuZ5mMaaxG0yMK5ira5N8/m5UFED7PSBw
TejvxIfkkAY=
=EM/w
-----END PGP SIGNATURE-----