Description: Use kallisto to quantify A. pulchra RNAseq transcript abundances

Inputs:

Trimmed RNAseq reads (e.g. *.fastq.gz). A. pulchra reads found here.

Transcripts FASTA (e.g. rna.fna) – note we are using transcripts from A. millepora, not A. pulchra. Downloaded from NCBI. Kallisto will also accept a gzipped reference fasta (e.g. *.fna.gz)

Outputs:

kalisto counts matrix (kallisto.isoform.counts.matrix)


1 Create a Bash variables file

This allows usage of Bash variables (e.g. paths to common directories) across R Markdown chunks.

{
echo "#### Assign Variables ####"
echo ""

echo "# Data directories"
echo 'export Apul_dir=/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul'
echo 'export output_dir_top=${Apul_dir}/output/14-Apul-RNAseq-kallisto'
echo 'export trimmed_reads_dir=${output_dir_top}/trimmed-reads'
echo 'export kallisto_output_dir=${output_dir_top}/kallisto'
echo ""

echo "# Input/Output files"
echo 'export Amil_ncbi_downloads_dir=${Apul_dir}/data/Amil'
echo 'export transcriptome_fasta_dir=${Amil_ncbi_downloads_dir}/ncbi_dataset/data/GCF_013753865.1'
echo 'export transcriptome_fasta_name="rna.fna"'
echo 'export transcriptome_fasta="${transcriptome_fasta_dir}/${transcriptome_fasta_name}"'
echo 'export kallisto_index_name="Amil_kallisto_index.idx"'

echo "# External data URLs"
echo 'export trimmed_reads_url="https://gannet.fish.washington.edu/Atumefaciens/20230519-E5_coral-fastqc-fastp-multiqc-RNAseq/A_pulchra/trimmed/"'
echo 'export transcriptome_fasta_url="https://api.ncbi.nlm.nih.gov/datasets/v2alpha/genome/accession/GCF_013753865.1/download?include_annotation_type=GENOME_FASTA,GENOME_GFF,RNA_FASTA,CDS_FASTA,PROT_FASTA,SEQUENCE_REPORT&filename=GCF_013753865.1.zip"'
echo ""

echo "# Set filename patterns"
echo "export ncbi_accession='GCF_013753865.1'"
echo "export fastq_pattern='*.fastq.gz'"
echo "export R1_fastq_pattern='*_R1.fastq.gz'"
echo "export R2_fastq_pattern='*_R2.fastq.gz'"
echo ""

echo "# Paths to programs"
echo 'export kallisto=/home/shared/kallisto_linux-v0.50.1/kallisto'
echo 'export trinity_abund_to_matrix=/home/shared/trinityrnaseq-v2.12.0/util/abundance_estimates_to_matrix.pl'
echo ""

echo "# Set number of CPUs to use"
echo 'export threads=20'
echo ""

echo "# Programs associative array"
echo "declare -A programs_array"
echo "programs_array=("
echo '[kallisto]="${kallisto}" \'
echo '[trinity_abund_to_matrix]="${trinity_abund_to_matrix}" \'
echo ")"

} > .bashvars

cat .bashvars
#### Assign Variables ####

# Data directories
export Apul_dir=/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul
export output_dir_top=${Apul_dir}/output/14-Apul-RNAseq-kallisto
export trimmed_reads_dir=${output_dir_top}/trimmed-reads
export kallisto_output_dir=${output_dir_top}/kallisto

# Input/Output files
export Amil_ncbi_downloads_dir=${Apul_dir}/data/Amil
export transcriptome_fasta_dir=${Amil_ncbi_downloads_dir}/ncbi_dataset/data/GCF_013753865.1
export transcriptome_fasta_name="rna.fna"
export transcriptome_fasta="${transcriptome_fasta_dir}/${transcriptome_fasta_name}"
export kallisto_index_name="Amil_kallisto_index.idx"
# External data URLs
export trimmed_reads_url="https://gannet.fish.washington.edu/Atumefaciens/20230519-E5_coral-fastqc-fastp-multiqc-RNAseq/A_pulchra/trimmed/"
export transcriptome_fasta_url="https://api.ncbi.nlm.nih.gov/datasets/v2alpha/genome/accession/GCF_013753865.1/download?include_annotation_type=GENOME_FASTA,GENOME_GFF,RNA_FASTA,CDS_FASTA,PROT_FASTA,SEQUENCE_REPORT&filename=GCF_013753865.1.zip"

# Set filename patterns
export ncbi_accession='GCF_013753865.1'
export fastq_pattern='*.fastq.gz'
export R1_fastq_pattern='*_R1.fastq.gz'
export R2_fastq_pattern='*_R2.fastq.gz'

# Paths to programs
export kallisto=/home/shared/kallisto_linux-v0.50.1/kallisto
export trinity_abund_to_matrix=/home/shared/trinityrnaseq-v2.12.0/util/abundance_estimates_to_matrix.pl

# Set number of CPUs to use
export threads=20

# Programs associative array
declare -A programs_array
programs_array=(
[kallisto]="${kallisto}" \
[trinity_abund_to_matrix]="${trinity_abund_to_matrix}" \
)

2 Download trimmed RNAseq reads

Reads are downloaded from: https://gannet.fish.washington.edu/Atumefaciens/20230519-E5_coral-fastqc-fastp-multiqc-RNAseq/A_pulchra/trimmed/

The --cut-dirs 4 command cuts the preceding directory structure (i.e. Atumefaciens/20230519-E5_coral-fastqc-fastp-multiqc-RNAseq/A_pulchra/trimmed/) so that we just end up with the reads.

# Load bash variables into memory
source .bashvars

wget \
--directory-prefix ${trimmed_reads_dir} \
--recursive \
--no-check-certificate \
--continue \
--cut-dirs 4 \
--no-host-directories \
--no-parent \
--quiet \
--accept "RNA-*.fastq.gz" ${trimmed_reads_url}

ls -lh "${trimmed_reads_dir}"

4 Retrieve the reference transcriptome

# Load bash variables into memory
source .bashvars

# Download NCBI data zip file
curl \
-JX GET ${transcriptome_fasta_url} \
-H "Accept: application/zip" \
-o ${Amil_ncbi_downloads_dir}/${ncbi_accession}.zip

# Unzip
unzip ${Amil_ncbi_downloads_dir}/${ncbi_accession}.zip -d ${Amil_ncbi_downloads_dir}

# Delete the (now superfluous) zip file
rm ${Amil_ncbi_downloads_dir}/${ncbi_accession}.zip

ls -lh ${Amil_ncbi_downloads_dir}

4.1 Verify transcriptome FastA MD5 checksum

No checksum file(s) provided with ncbi download, so skippping this step

5 Align to reference transcriptome (Kallisto pseudoalignment)

5.1 Building Index

# Load bash variables into memory
source .bashvars

cd "${kallisto_output_dir}"

${programs_array[kallisto]} index \
--threads=${threads} \
--index="${kallisto_index_name}" \
"${transcriptome_fasta}"

ls -lh ${kallisto_output_dir}

[build] loading fasta file /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/data/Amil/ncbi_dataset/data/GCF_013753865.1/rna.fna
[build] k-mer length: 31
[build] warning: clipped off poly-A tail (longer than 10)
        from 49 target sequences
[build] warning: replaced 806 non-ACGUT characters in the input sequence
        with pseudorandom nucleotides
KmerStream::KmerStream(): Start computing k-mer cardinality estimations (1/2)
KmerStream::KmerStream(): Start computing k-mer cardinality estimations (1/2)
KmerStream::KmerStream(): Finished
CompactedDBG::build(): Estimated number of k-mers occurring at least once: 63409924
CompactedDBG::build(): Estimated number of minimizer occurring at least once: 15547313
CompactedDBG::filter(): Processed 110666638 k-mers in 50570 reads
CompactedDBG::filter(): Found 63496221 unique k-mers
CompactedDBG::filter(): Number of blocks in Bloom filter is 433468
CompactedDBG::construct(): Extract approximate unitigs (1/2)
CompactedDBG::construct(): Extract approximate unitigs (2/2)
CompactedDBG::construct(): Closed all input files

CompactedDBG::construct(): Splitting unitigs (1/2)

CompactedDBG::construct(): Splitting unitigs (2/2)
CompactedDBG::construct(): Before split: 626678 unitigs
CompactedDBG::construct(): After split (1/1): 626678 unitigs
CompactedDBG::construct(): Unitigs split: 855
CompactedDBG::construct(): Unitigs deleted: 0

CompactedDBG::construct(): Joining unitigs
CompactedDBG::construct(): After join: 596827 unitigs
CompactedDBG::construct(): Joined 30174 unitigs
[build] building MPHF
[build] creating equivalence classes ... 
[build] target de Bruijn graph has k-mer length 31 and minimizer length 23
[build] target de Bruijn graph has 596827 contigs and contains 63551545 k-mers 

total 123M
-rw-r--r-- 1 shedurkin labmembers 118M Jan 31 16:21 Amil_kallisto_index.idx
-rw-r--r-- 1 shedurkin labmembers 2.0M Jan 31 16:19 kallisto.isoform.counts.matrix
-rw-r--r-- 1 shedurkin labmembers    0 Jan 31 16:19 kallisto.isoform.TMM.EXPR.matrix
-rw-r--r-- 1 shedurkin labmembers 2.4M Jan 31 16:19 kallisto.isoform.TPM.not_cross_norm
-rw-r--r-- 1 shedurkin labmembers  532 Jan 31 16:19 kallisto.isoform.TPM.not_cross_norm.runTMM.R
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:26 kallisto_quant_sample140
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:29 kallisto_quant_sample145
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:33 kallisto_quant_sample150
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:36 kallisto_quant_sample173
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:39 kallisto_quant_sample178

5.2 Sample Quantification

Kallisto can run quantification on either single- or paired-end reads. The default option is paired-end, which requires the input of an even number of paired fastq files (e.g., pairA_R1.fastq, pairA_R2.fastq). To use single-end mode, include the –single flag, as well as -l (–fragment-length=DOUBLE, estimated avg. fragment length) and -s (–sd=DOUBLE, estimates stand. dev. of fragment length), and a number of fastq files. Again, gzipped files are acceptable.

Kallisto quant is rather finicky about how you input sets of paired reads, and you can only input a single pair at a time. To circumvent, I’ll create symlinks to each of the input files with simplified names, create a quantification function, and apply it iteratively to each pair using a loop.

# Load bash variables into memory
source .bashvars

# Create sym links to each of the trimmed read files with simplified names

for file in "${trimmed_reads_dir}"/*.fastp-trim.20230519.fastq.gz; do
    # Extract sample ID and read number from the file name
    sample_id=$(echo "$file" | grep -oP 'RNA-ACR-\K\d+')
    read_number=$(echo "$file" | grep -oP '_R\K\d+')

    # Create the shortened name
    shortened_name="sample${sample_id}_R${read_number}.fastq.gz"

    # Create symbolic link
    ln -s "$file" "${trimmed_reads_dir}/${shortened_name}"

    echo "Created link: ${shortened_name}"
done

ls -lh ${trimmed_reads_dir}
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample140_R1.fastq.gz': File exists
Created link: sample140_R1.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample140_R2.fastq.gz': File exists
Created link: sample140_R2.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample145_R1.fastq.gz': File exists
Created link: sample145_R1.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample145_R2.fastq.gz': File exists
Created link: sample145_R2.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample150_R1.fastq.gz': File exists
Created link: sample150_R1.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample150_R2.fastq.gz': File exists
Created link: sample150_R2.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample173_R1.fastq.gz': File exists
Created link: sample173_R1.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample173_R2.fastq.gz': File exists
Created link: sample173_R2.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample178_R1.fastq.gz': File exists
Created link: sample178_R1.fastq.gz
ln: failed to create symbolic link '/home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/sample178_R2.fastq.gz': File exists
Created link: sample178_R2.fastq.gz
total 27G
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 30 18:09 multiqc_data
-rw-r--r-- 1 shedurkin labmembers 2.9G May 19  2023 RNA-ACR-140-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 3.0G May 19  2023 RNA-ACR-140-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.6G May 19  2023 RNA-ACR-145-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.6G May 19  2023 RNA-ACR-145-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.6G May 19  2023 RNA-ACR-150-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.7G May 19  2023 RNA-ACR-150-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.9G May 19  2023 RNA-ACR-173-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 3.0G May 19  2023 RNA-ACR-173-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.6G May 19  2023 RNA-ACR-178-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
-rw-r--r-- 1 shedurkin labmembers 2.7G May 19  2023 RNA-ACR-178-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample140_R1.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-140-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample140_R2.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-140-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample145_R1.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-145-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample145_R2.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-145-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample150_R1.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-150-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample150_R2.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-150-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample173_R1.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-173-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample173_R2.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-173-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample178_R1.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-178-S1-TP2_R1_001.fastp-trim.20230519.fastq.gz
lrwxrwxrwx 1 shedurkin labmembers  150 Jan 25 11:46 sample178_R2.fastq.gz -> /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/trimmed-reads/RNA-ACR-178-S1-TP2_R2_001.fastp-trim.20230519.fastq.gz
# Load bash variables into memory
source .bashvars

# Function to run kallisto quant. Takes two (paired) reads as input, outputs to sample-associated directory
run_kallisto_quant() {
    source .bashvars  # Source .bashvars inside the function to make its variables accessible
    local R1_fastq=${1}
    local R2_fastq=${2}
    
    cd ${kallisto_output_dir}
    sample_num=$(basename "${R1_fastq}" "_R1.fastq.gz")
    mkdir kallisto_quant_${sample_num}

    ${programs_array[kallisto]} quant \
        --threads=${threads} \
        --index="${kallisto_output_dir}/${kallisto_index_name}" \
        --output-dir="${kallisto_output_dir}/kallisto_quant_${sample_num}" \
        --bootstrap-samples=100 \
        ${trimmed_reads_dir}/${R1_fastq} ${trimmed_reads_dir}/${R2_fastq}
}



# Iteratively apply run_kallisto_quant on each pair of input reads
for file_r1 in "${trimmed_reads_dir}"/*_R1.fastq.gz; do
    # Extract the sample name from the file name
    sample_name=$(basename "${file_r1}" "_R1.fastq.gz")

    # Form the file names (function takes input file names, not paths)
    file_r1_name="${sample_name}_R1.fastq.gz"
    file_r2_name="${sample_name}_R2.fastq.gz"

    # Check that the sample hasn't already been quantified
    if [ ! -d "${kallisto_output_dir}/kallisto_quant_${sample_name}" ]; then
    
        # Check if the corresponding R2 file exists
        if [ -e "${trimmed_reads_dir}/${file_r2}" ]; then
            # Run kallisto quant on the file pair
            run_kallisto_quant "${file_r1_name}" "${file_r2_name}" 

            echo "Processed sample: ${sample_name}"
        fi
    else
        echo "Sample already processed: ${sample_name}"
    fi
done

5.3 Trinity Matrix with Kallisto Output

# Load bash variables into memory
source .bashvars

cd ${kallisto_output_dir}

${programs_array[trinity_abund_to_matrix]} \
--est_method 'kallisto' \
--gene_trans_map 'none' \
--out_prefix 'kallisto' \
--name_sample_by_basedir ${kallisto_output_dir}/kallisto_quant_*/abundance.tsv

ls -lh ${kallisto_output_dir}
-reading file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/kallisto/kallisto_quant_sample140/abundance.tsv
-reading file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/kallisto/kallisto_quant_sample145/abundance.tsv
-reading file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/kallisto/kallisto_quant_sample150/abundance.tsv
-reading file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/kallisto/kallisto_quant_sample173/abundance.tsv
-reading file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/D-Apul/output/14-Apul-RNAseq-kallisto/kallisto/kallisto_quant_sample178/abundance.tsv


* Outputting combined matrix.

/home/shared/trinityrnaseq-v2.12.0/util/support_scripts/run_TMM_scale_matrix.pl --matrix kallisto.isoform.TPM.not_cross_norm > kallisto.isoform.TMM.EXPR.matrixCMD: R --no-save --no-restore --no-site-file --no-init-file -q < kallisto.isoform.TPM.not_cross_norm.runTMM.R 1>&2 
sh: 1: R: not found
Error, cmd: R --no-save --no-restore --no-site-file --no-init-file -q < kallisto.isoform.TPM.not_cross_norm.runTMM.R 1>&2  died with ret (32512)  at /home/shared/trinityrnaseq-v2.12.0/util/support_scripts/run_TMM_scale_matrix.pl line 105.
Error, CMD: /home/shared/trinityrnaseq-v2.12.0/util/support_scripts/run_TMM_scale_matrix.pl --matrix kallisto.isoform.TPM.not_cross_norm > kallisto.isoform.TMM.EXPR.matrix died with ret 6400 at /home/shared/trinityrnaseq-v2.12.0/util/abundance_estimates_to_matrix.pl line 385.
total 123M
-rw-r--r-- 1 shedurkin labmembers 118M Jan 31 16:21 Amil_kallisto_index.idx
-rw-r--r-- 1 shedurkin labmembers 2.0M Jan 31 16:21 kallisto.isoform.counts.matrix
-rw-r--r-- 1 shedurkin labmembers    0 Jan 31 16:21 kallisto.isoform.TMM.EXPR.matrix
-rw-r--r-- 1 shedurkin labmembers 2.4M Jan 31 16:21 kallisto.isoform.TPM.not_cross_norm
-rw-r--r-- 1 shedurkin labmembers  532 Jan 31 16:21 kallisto.isoform.TPM.not_cross_norm.runTMM.R
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:26 kallisto_quant_sample140
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:29 kallisto_quant_sample145
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:33 kallisto_quant_sample150
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:36 kallisto_quant_sample173
drwxr-xr-x 2 shedurkin labmembers 4.0K Jan 25 13:39 kallisto_quant_sample178

6 Summary

LS0tCnRpdGxlOiAiMTQtQXB1bC1STkFzZXEta2FsbGlzdG8iCmF1dGhvcjogIkthdGhsZWVuIER1cmtpbiIKZGF0ZTogIjIwMjQtMDEtMjQiCmFsd2F5c19hbGxvd19odG1sOiB0cnVlCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBodG1sX3ByZXZpZXc6IHRydWUgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwgICAgICAgICAjIERpc3BsYXkgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgICAjIEV2YWx1YXRlIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAgIyBIaWRlIHdhcm5pbmdzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAgIyBIaWRlIG1lc3NhZ2VzCiAgY29tbWVudCA9ICIiICAgICAgICAgIyBQcmV2ZW50cyBhcHBlbmRpbmcgJyMjJyB0byBiZWdpbm5pbmcgb2YgbGluZXMgaW4gY29kZSBvdXRwdXQKKQpgYGAKCioqRGVzY3JpcHRpb246KioKVXNlIGthbGxpc3RvIHRvIHF1YW50aWZ5ICpBLiBwdWxjaHJhKiBSTkFzZXEgdHJhbnNjcmlwdCBhYnVuZGFuY2VzCgoqKklucHV0czoqKgoKVHJpbW1lZCBSTkFzZXEgcmVhZHMgKGUuZy4gYCouZmFzdHEuZ3pgKS4gICpBLiBwdWxjaHJhKiByZWFkcyBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9nYW5uZXQuZmlzaC53YXNoaW5ndG9uLmVkdS9BdHVtZWZhY2llbnMvMjAyMzA1MTktRTVfY29yYWwtZmFzdHFjLWZhc3RwLW11bHRpcWMtUk5Bc2VxL0FfcHVsY2hyYS90cmltbWVkLykuCgpUcmFuc2NyaXB0cyBGQVNUQSAoZS5nLiBgcm5hLmZuYWApIC0tIG5vdGUgd2UgYXJlIHVzaW5nIHRyYW5zY3JpcHRzIGZyb20gKkEuIG1pbGxlcG9yYSosIG5vdCAqQS4gcHVsY2hyYSouIERvd25sb2FkZWQgZnJvbSBbTkNCSV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9kYXRhc2V0cy9nZW5vbWUvR0NGXzAxMzc1Mzg2NS4xLykuIEthbGxpc3RvIHdpbGwgYWxzbyBhY2NlcHQgYSBnemlwcGVkIHJlZmVyZW5jZSBmYXN0YSAoZS5nLiBgKi5mbmEuZ3pgKQoKKipPdXRwdXRzOioqCgprYWxpc3RvIGNvdW50cyBtYXRyaXggKGBrYWxsaXN0by5pc29mb3JtLmNvdW50cy5tYXRyaXhgKQoKLS0tCgoKIyBDcmVhdGUgYSBCYXNoIHZhcmlhYmxlcyBmaWxlCgpUaGlzIGFsbG93cyB1c2FnZSBvZiBCYXNoIHZhcmlhYmxlcyAoZS5nLiBwYXRocyB0byBjb21tb24gZGlyZWN0b3JpZXMpIGFjcm9zcyBSIE1hcmtkb3duIGNodW5rcy4KYGBge3Igc2F2ZS1iYXNoLXZhcmlhYmxlcy10by1ydmFycy1maWxlLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CnsKZWNobyAiIyMjIyBBc3NpZ24gVmFyaWFibGVzICMjIyMiCmVjaG8gIiIKCmVjaG8gIiMgRGF0YSBkaXJlY3RvcmllcyIKZWNobyAnZXhwb3J0IEFwdWxfZGlyPS9ob21lL3NoYXJlZC84VEJfSEREXzAyL3NoZWR1cmtpbi9kZWVwLWRpdmUvRC1BcHVsJwplY2hvICdleHBvcnQgb3V0cHV0X2Rpcl90b3A9JHtBcHVsX2Rpcn0vb3V0cHV0LzE0LUFwdWwtUk5Bc2VxLWthbGxpc3RvJwplY2hvICdleHBvcnQgdHJpbW1lZF9yZWFkc19kaXI9JHtvdXRwdXRfZGlyX3RvcH0vdHJpbW1lZC1yZWFkcycKZWNobyAnZXhwb3J0IGthbGxpc3RvX291dHB1dF9kaXI9JHtvdXRwdXRfZGlyX3RvcH0va2FsbGlzdG8nCmVjaG8gIiIKCmVjaG8gIiMgSW5wdXQvT3V0cHV0IGZpbGVzIgplY2hvICdleHBvcnQgQW1pbF9uY2JpX2Rvd25sb2Fkc19kaXI9JHtBcHVsX2Rpcn0vZGF0YS9BbWlsJwplY2hvICdleHBvcnQgdHJhbnNjcmlwdG9tZV9mYXN0YV9kaXI9JHtBbWlsX25jYmlfZG93bmxvYWRzX2Rpcn0vbmNiaV9kYXRhc2V0L2RhdGEvR0NGXzAxMzc1Mzg2NS4xJwplY2hvICdleHBvcnQgdHJhbnNjcmlwdG9tZV9mYXN0YV9uYW1lPSJybmEuZm5hIicKZWNobyAnZXhwb3J0IHRyYW5zY3JpcHRvbWVfZmFzdGE9IiR7dHJhbnNjcmlwdG9tZV9mYXN0YV9kaXJ9LyR7dHJhbnNjcmlwdG9tZV9mYXN0YV9uYW1lfSInCmVjaG8gJ2V4cG9ydCBrYWxsaXN0b19pbmRleF9uYW1lPSJBbWlsX2thbGxpc3RvX2luZGV4LmlkeCInCgplY2hvICIjIEV4dGVybmFsIGRhdGEgVVJMcyIKZWNobyAnZXhwb3J0IHRyaW1tZWRfcmVhZHNfdXJsPSJodHRwczovL2dhbm5ldC5maXNoLndhc2hpbmd0b24uZWR1L0F0dW1lZmFjaWVucy8yMDIzMDUxOS1FNV9jb3JhbC1mYXN0cWMtZmFzdHAtbXVsdGlxYy1STkFzZXEvQV9wdWxjaHJhL3RyaW1tZWQvIicKZWNobyAnZXhwb3J0IHRyYW5zY3JpcHRvbWVfZmFzdGFfdXJsPSJodHRwczovL2FwaS5uY2JpLm5sbS5uaWguZ292L2RhdGFzZXRzL3YyYWxwaGEvZ2Vub21lL2FjY2Vzc2lvbi9HQ0ZfMDEzNzUzODY1LjEvZG93bmxvYWQ/aW5jbHVkZV9hbm5vdGF0aW9uX3R5cGU9R0VOT01FX0ZBU1RBLEdFTk9NRV9HRkYsUk5BX0ZBU1RBLENEU19GQVNUQSxQUk9UX0ZBU1RBLFNFUVVFTkNFX1JFUE9SVCZmaWxlbmFtZT1HQ0ZfMDEzNzUzODY1LjEuemlwIicKZWNobyAiIgoKZWNobyAiIyBTZXQgZmlsZW5hbWUgcGF0dGVybnMiCmVjaG8gImV4cG9ydCBuY2JpX2FjY2Vzc2lvbj0nR0NGXzAxMzc1Mzg2NS4xJyIKZWNobyAiZXhwb3J0IGZhc3RxX3BhdHRlcm49JyouZmFzdHEuZ3onIgplY2hvICJleHBvcnQgUjFfZmFzdHFfcGF0dGVybj0nKl9SMS5mYXN0cS5neiciCmVjaG8gImV4cG9ydCBSMl9mYXN0cV9wYXR0ZXJuPScqX1IyLmZhc3RxLmd6JyIKZWNobyAiIgoKZWNobyAiIyBQYXRocyB0byBwcm9ncmFtcyIKZWNobyAnZXhwb3J0IGthbGxpc3RvPS9ob21lL3NoYXJlZC9rYWxsaXN0b19saW51eC12MC41MC4xL2thbGxpc3RvJwplY2hvICdleHBvcnQgdHJpbml0eV9hYnVuZF90b19tYXRyaXg9L2hvbWUvc2hhcmVkL3RyaW5pdHlybmFzZXEtdjIuMTIuMC91dGlsL2FidW5kYW5jZV9lc3RpbWF0ZXNfdG9fbWF0cml4LnBsJwplY2hvICIiCgplY2hvICIjIFNldCBudW1iZXIgb2YgQ1BVcyB0byB1c2UiCmVjaG8gJ2V4cG9ydCB0aHJlYWRzPTIwJwplY2hvICIiCgplY2hvICIjIFByb2dyYW1zIGFzc29jaWF0aXZlIGFycmF5IgplY2hvICJkZWNsYXJlIC1BIHByb2dyYW1zX2FycmF5IgplY2hvICJwcm9ncmFtc19hcnJheT0oIgplY2hvICdba2FsbGlzdG9dPSIke2thbGxpc3RvfSIgXCcKZWNobyAnW3RyaW5pdHlfYWJ1bmRfdG9fbWF0cml4XT0iJHt0cmluaXR5X2FidW5kX3RvX21hdHJpeH0iIFwnCmVjaG8gIikiCgp9ID4gLmJhc2h2YXJzCgpjYXQgLmJhc2h2YXJzCmBgYAoKCiMgRG93bmxvYWQgdHJpbW1lZCBSTkFzZXEgcmVhZHMKClJlYWRzIGFyZSBkb3dubG9hZGVkIGZyb206IGh0dHBzOi8vZ2FubmV0LmZpc2gud2FzaGluZ3Rvbi5lZHUvQXR1bWVmYWNpZW5zLzIwMjMwNTE5LUU1X2NvcmFsLWZhc3RxYy1mYXN0cC1tdWx0aXFjLVJOQXNlcS9BX3B1bGNocmEvdHJpbW1lZC8KClRoZSBgLS1jdXQtZGlycyA0YCBjb21tYW5kIGN1dHMgdGhlIHByZWNlZGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlIChpLmUuIGBBdHVtZWZhY2llbnMvMjAyMzA1MTktRTVfY29yYWwtZmFzdHFjLWZhc3RwLW11bHRpcWMtUk5Bc2VxL0FfcHVsY2hyYS90cmltbWVkL2ApIHNvIHRoYXQgd2UganVzdCBlbmQgdXAgd2l0aCB0aGUgcmVhZHMuCgpgYGB7YmFzaCBkb3dubG9hZC10cmltbWVkLXJlYWRzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKd2dldCBcCi0tZGlyZWN0b3J5LXByZWZpeCAke3RyaW1tZWRfcmVhZHNfZGlyfSBcCi0tcmVjdXJzaXZlIFwKLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSBcCi0tY29udGludWUgXAotLWN1dC1kaXJzIDQgXAotLW5vLWhvc3QtZGlyZWN0b3JpZXMgXAotLW5vLXBhcmVudCBcCi0tcXVpZXQgXAotLWFjY2VwdCAiUk5BLSouZmFzdHEuZ3oiICR7dHJpbW1lZF9yZWFkc191cmx9CgpscyAtbGggIiR7dHJpbW1lZF9yZWFkc19kaXJ9IgpgYGAKCiMgRmFzdFFDL011bHRpUUMgb24gdHJpbW1lZCByZWFkcwoKQWxyZWFkeSBwZXJmb3JtZWQsIGNhbiB2aWV3IG11bHRpcWMgcmVwb3J0IGF0IGh0dHBzOi8vZ2FubmV0LmZpc2gud2FzaGluZ3Rvbi5lZHUvQXR1bWVmYWNpZW5zLzIwMjMwNTE5LUU1X2NvcmFsLWZhc3RxYy1mYXN0cC1tdWx0aXFjLVJOQXNlcS9BX3B1bGNocmEvdHJpbW1lZC9tdWx0aXFjX3JlcG9ydC5odG1sCgojIFJldHJpZXZlIHRoZSByZWZlcmVuY2UgdHJhbnNjcmlwdG9tZQoKYGBge3IgZG93bmxvYWQtdHJhbnNjcmlwdG9tZS1mYXN0YS1uY2JpLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBEb3dubG9hZCBOQ0JJIGRhdGEgemlwIGZpbGUKY3VybCBcCi1KWCBHRVQgJHt0cmFuc2NyaXB0b21lX2Zhc3RhX3VybH0gXAotSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi96aXAiIFwKLW8gJHtBbWlsX25jYmlfZG93bmxvYWRzX2Rpcn0vJHtuY2JpX2FjY2Vzc2lvbn0uemlwCgojIFVuemlwCnVuemlwICR7QW1pbF9uY2JpX2Rvd25sb2Fkc19kaXJ9LyR7bmNiaV9hY2Nlc3Npb259LnppcCAtZCAke0FtaWxfbmNiaV9kb3dubG9hZHNfZGlyfQoKIyBEZWxldGUgdGhlIChub3cgc3VwZXJmbHVvdXMpIHppcCBmaWxlCnJtICR7QW1pbF9uY2JpX2Rvd25sb2Fkc19kaXJ9LyR7bmNiaV9hY2Nlc3Npb259LnppcAoKbHMgLWxoICR7QW1pbF9uY2JpX2Rvd25sb2Fkc19kaXJ9CmBgYAoKIyMgVmVyaWZ5IHRyYW5zY3JpcHRvbWUgRmFzdEEgTUQ1IGNoZWNrc3VtCgpObyBjaGVja3N1bSBmaWxlKHMpIHByb3ZpZGVkIHdpdGggbmNiaSBkb3dubG9hZCwgc28gc2tpcHBwaW5nIHRoaXMgc3RlcAoKIyBBbGlnbiB0byByZWZlcmVuY2UgdHJhbnNjcmlwdG9tZSAoS2FsbGlzdG8gcHNldWRvYWxpZ25tZW50KQoKIyMgQnVpbGRpbmcgSW5kZXgKCmBgYHtyIGthbGxpc3RvLWluZGV4aW5nLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpjZCAiJHtrYWxsaXN0b19vdXRwdXRfZGlyfSIKCiR7cHJvZ3JhbXNfYXJyYXlba2FsbGlzdG9dfSBpbmRleCBcCi0tdGhyZWFkcz0ke3RocmVhZHN9IFwKLS1pbmRleD0iJHtrYWxsaXN0b19pbmRleF9uYW1lfSIgXAoiJHt0cmFuc2NyaXB0b21lX2Zhc3RhfSIKCmxzIC1saCAke2thbGxpc3RvX291dHB1dF9kaXJ9CmBgYAoKCiMjIFNhbXBsZSBRdWFudGlmaWNhdGlvbgoKS2FsbGlzdG8gY2FuIHJ1biBxdWFudGlmaWNhdGlvbiBvbiBlaXRoZXIgc2luZ2xlLSBvciBwYWlyZWQtZW5kIHJlYWRzLiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgcGFpcmVkLWVuZCwgd2hpY2ggcmVxdWlyZXMgdGhlIGlucHV0IG9mIGFuIGV2ZW4gbnVtYmVyIG9mIHBhaXJlZCBmYXN0cSBmaWxlcyAoZS5nLiwgcGFpckFfUjEuZmFzdHEsIHBhaXJBX1IyLmZhc3RxKS4gClRvIHVzZSBzaW5nbGUtZW5kIG1vZGUsIGluY2x1ZGUgdGhlIC0tc2luZ2xlIGZsYWcsIGFzIHdlbGwgYXMgLWwgKC0tZnJhZ21lbnQtbGVuZ3RoPURPVUJMRSwgZXN0aW1hdGVkIGF2Zy4gZnJhZ21lbnQgbGVuZ3RoKSBhbmQgLXMgKC0tc2Q9RE9VQkxFLCBlc3RpbWF0ZXMgc3RhbmQuIGRldi4gb2YgZnJhZ21lbnQgbGVuZ3RoKSwgYW5kIGEgbnVtYmVyIG9mIGZhc3RxIGZpbGVzLgpBZ2FpbiwgZ3ppcHBlZCBmaWxlcyBhcmUgYWNjZXB0YWJsZS4KCkthbGxpc3RvIHF1YW50IGlzIHJhdGhlciBmaW5pY2t5IGFib3V0IGhvdyB5b3UgaW5wdXQgc2V0cyBvZiBwYWlyZWQgcmVhZHMsIGFuZCB5b3UgY2FuIG9ubHkgaW5wdXQgYSBzaW5nbGUgcGFpciBhdCBhIHRpbWUuIFRvIGNpcmN1bXZlbnQsIEknbGwgY3JlYXRlIHN5bWxpbmtzIHRvIGVhY2ggb2YgdGhlIGlucHV0IGZpbGVzIHdpdGggc2ltcGxpZmllZCBuYW1lcywgY3JlYXRlIGEgcXVhbnRpZmljYXRpb24gZnVuY3Rpb24sIGFuZCBhcHBseSBpdCBpdGVyYXRpdmVseSB0byBlYWNoIHBhaXIgdXNpbmcgYSBsb29wLgoKYGBge3IgcmVuYW1lLXRyaW1tZWQtcmVhZHMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgQ3JlYXRlIHN5bSBsaW5rcyB0byBlYWNoIG9mIHRoZSB0cmltbWVkIHJlYWQgZmlsZXMgd2l0aCBzaW1wbGlmaWVkIG5hbWVzCgpmb3IgZmlsZSBpbiAiJHt0cmltbWVkX3JlYWRzX2Rpcn0iLyouZmFzdHAtdHJpbS4yMDIzMDUxOS5mYXN0cS5nejsgZG8KICAgICMgRXh0cmFjdCBzYW1wbGUgSUQgYW5kIHJlYWQgbnVtYmVyIGZyb20gdGhlIGZpbGUgbmFtZQogICAgc2FtcGxlX2lkPSQoZWNobyAiJGZpbGUiIHwgZ3JlcCAtb1AgJ1JOQS1BQ1ItXEtcZCsnKQogICAgcmVhZF9udW1iZXI9JChlY2hvICIkZmlsZSIgfCBncmVwIC1vUCAnX1JcS1xkKycpCgogICAgIyBDcmVhdGUgdGhlIHNob3J0ZW5lZCBuYW1lCiAgICBzaG9ydGVuZWRfbmFtZT0ic2FtcGxlJHtzYW1wbGVfaWR9X1Ike3JlYWRfbnVtYmVyfS5mYXN0cS5neiIKCiAgICAjIENyZWF0ZSBzeW1ib2xpYyBsaW5rCiAgICBsbiAtcyAiJGZpbGUiICIke3RyaW1tZWRfcmVhZHNfZGlyfS8ke3Nob3J0ZW5lZF9uYW1lfSIKCiAgICBlY2hvICJDcmVhdGVkIGxpbms6ICR7c2hvcnRlbmVkX25hbWV9Igpkb25lCgpscyAtbGggJHt0cmltbWVkX3JlYWRzX2Rpcn0KYGBgCgpgYGB7ciBrYWxsaXN0by1xdWFudGlmaWNhdGlvbiwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCiMgRnVuY3Rpb24gdG8gcnVuIGthbGxpc3RvIHF1YW50LiBUYWtlcyB0d28gKHBhaXJlZCkgcmVhZHMgYXMgaW5wdXQsIG91dHB1dHMgdG8gc2FtcGxlLWFzc29jaWF0ZWQgZGlyZWN0b3J5CnJ1bl9rYWxsaXN0b19xdWFudCgpIHsKICAgIHNvdXJjZSAuYmFzaHZhcnMgICMgU291cmNlIC5iYXNodmFycyBpbnNpZGUgdGhlIGZ1bmN0aW9uIHRvIG1ha2UgaXRzIHZhcmlhYmxlcyBhY2Nlc3NpYmxlCiAgICBsb2NhbCBSMV9mYXN0cT0kezF9CiAgICBsb2NhbCBSMl9mYXN0cT0kezJ9CiAgICAKICAgIGNkICR7a2FsbGlzdG9fb3V0cHV0X2Rpcn0KICAgIHNhbXBsZV9udW09JChiYXNlbmFtZSAiJHtSMV9mYXN0cX0iICJfUjEuZmFzdHEuZ3oiKQogICAgbWtkaXIga2FsbGlzdG9fcXVhbnRfJHtzYW1wbGVfbnVtfQoKICAgICR7cHJvZ3JhbXNfYXJyYXlba2FsbGlzdG9dfSBxdWFudCBcCiAgICAgICAgLS10aHJlYWRzPSR7dGhyZWFkc30gXAogICAgICAgIC0taW5kZXg9IiR7a2FsbGlzdG9fb3V0cHV0X2Rpcn0vJHtrYWxsaXN0b19pbmRleF9uYW1lfSIgXAogICAgICAgIC0tb3V0cHV0LWRpcj0iJHtrYWxsaXN0b19vdXRwdXRfZGlyfS9rYWxsaXN0b19xdWFudF8ke3NhbXBsZV9udW19IiBcCiAgICAgICAgLS1ib290c3RyYXAtc2FtcGxlcz0xMDAgXAogICAgICAgICR7dHJpbW1lZF9yZWFkc19kaXJ9LyR7UjFfZmFzdHF9ICR7dHJpbW1lZF9yZWFkc19kaXJ9LyR7UjJfZmFzdHF9Cn0KCgoKIyBJdGVyYXRpdmVseSBhcHBseSBydW5fa2FsbGlzdG9fcXVhbnQgb24gZWFjaCBwYWlyIG9mIGlucHV0IHJlYWRzCmZvciBmaWxlX3IxIGluICIke3RyaW1tZWRfcmVhZHNfZGlyfSIvKl9SMS5mYXN0cS5nejsgZG8KICAgICMgRXh0cmFjdCB0aGUgc2FtcGxlIG5hbWUgZnJvbSB0aGUgZmlsZSBuYW1lCiAgICBzYW1wbGVfbmFtZT0kKGJhc2VuYW1lICIke2ZpbGVfcjF9IiAiX1IxLmZhc3RxLmd6IikKCiAgICAjIEZvcm0gdGhlIGZpbGUgbmFtZXMgKGZ1bmN0aW9uIHRha2VzIGlucHV0IGZpbGUgbmFtZXMsIG5vdCBwYXRocykKICAgIGZpbGVfcjFfbmFtZT0iJHtzYW1wbGVfbmFtZX1fUjEuZmFzdHEuZ3oiCiAgICBmaWxlX3IyX25hbWU9IiR7c2FtcGxlX25hbWV9X1IyLmZhc3RxLmd6IgoKICAgICMgQ2hlY2sgdGhhdCB0aGUgc2FtcGxlIGhhc24ndCBhbHJlYWR5IGJlZW4gcXVhbnRpZmllZAogICAgaWYgWyAhIC1kICIke2thbGxpc3RvX291dHB1dF9kaXJ9L2thbGxpc3RvX3F1YW50XyR7c2FtcGxlX25hbWV9IiBdOyB0aGVuCiAgICAKICAgICAgICAjIENoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIFIyIGZpbGUgZXhpc3RzCiAgICAgICAgaWYgWyAtZSAiJHt0cmltbWVkX3JlYWRzX2Rpcn0vJHtmaWxlX3IyfSIgXTsgdGhlbgogICAgICAgICAgICAjIFJ1biBrYWxsaXN0byBxdWFudCBvbiB0aGUgZmlsZSBwYWlyCiAgICAgICAgICAgIHJ1bl9rYWxsaXN0b19xdWFudCAiJHtmaWxlX3IxX25hbWV9IiAiJHtmaWxlX3IyX25hbWV9IiAKCiAgICAgICAgICAgIGVjaG8gIlByb2Nlc3NlZCBzYW1wbGU6ICR7c2FtcGxlX25hbWV9IgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAiU2FtcGxlIGFscmVhZHkgcHJvY2Vzc2VkOiAke3NhbXBsZV9uYW1lfSIKICAgIGZpCmRvbmUKYGBgCgoKIyMgVHJpbml0eSBNYXRyaXggd2l0aCBLYWxsaXN0byBPdXRwdXQKCmBgYHtyIGthbGxpc3RvLXRyaW5pdHktbWF0cml4LCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpjZCAke2thbGxpc3RvX291dHB1dF9kaXJ9Cgoke3Byb2dyYW1zX2FycmF5W3RyaW5pdHlfYWJ1bmRfdG9fbWF0cml4XX0gXAotLWVzdF9tZXRob2QgJ2thbGxpc3RvJyBcCi0tZ2VuZV90cmFuc19tYXAgJ25vbmUnIFwKLS1vdXRfcHJlZml4ICdrYWxsaXN0bycgXAotLW5hbWVfc2FtcGxlX2J5X2Jhc2VkaXIgJHtrYWxsaXN0b19vdXRwdXRfZGlyfS9rYWxsaXN0b19xdWFudF8qL2FidW5kYW5jZS50c3YKCmxzIC1saCAke2thbGxpc3RvX291dHB1dF9kaXJ9CmBgYAoKCiMgU3VtbWFyeQoK