Use MirMachine (Umu et al. 2022) to identify potential miRNA homologs in the Pevermanni genome.

Genome FastA originally downloaded from https://www.genoscope.cns.fr/corals/genomes.html on 20230629.


Inputs:

  • Genome FastA.

Outputs:

  • Confidence-filtered GFF of predicted miRNAs.
  • Unfiltered FastA of predicted miRNAs.
  • Unfiltered GFF of predicted miRNAs.

Software requirements:

  • Requires a MirMachine Conda/Mamba environment, per the installation instructions.

1 Set R variables

Replace with name of your MirMachine environment and the path to the corresponding conda installation (find this after you’ve activated the environment).

E.g.

# Activate environment
conda activate mirmachine_env

# Find conda path
which conda
mirmachine_conda_env_name <- c("mirmachine_env")
mirmachine_cond_path <- c("/home/sam/programs/mambaforge/condabin/conda")

2 Create a Bash variables file

This allows usage of Bash variables across R Markdown chunks.

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

echo "# Data directories"
echo 'export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive'
echo 'export output_dir_top=${deep_dive_dir}/E-Peve/output/07-Peve-sRNAseq-MirMachine'
echo ""

echo 'export mirmarchine_output_prefix="Peve-MirMachine"'

echo "# Input/Output files"
echo 'export genome_fasta_dir=${deep_dive_dir}/E-Peve/data'
echo 'export genome_fasta_name="Porites_evermanni_v1.fa"'
echo 'export genome_fasta="${genome_fasta_dir}/${genome_fasta_name}"'

echo ""

echo "# External data URLs"
echo 'export genome_fasta_url="https://gannet.fish.washington.edu/seashell/snaps/"'
echo ""

echo "# Set number of CPUs to use"
echo 'export threads=40'
echo ""
} > .bashvars

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

# Data directories
export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive
export output_dir_top=${deep_dive_dir}/E-Peve/output/07-Peve-sRNAseq-MirMachine

export mirmarchine_output_prefix="Peve-MirMachine"
# Input/Output files
export genome_fasta_dir=${deep_dive_dir}/E-Peve/data
export genome_fasta_name="Porites_evermanni_v1.fa"
export genome_fasta="${genome_fasta_dir}/${genome_fasta_name}"

# External data URLs
export genome_fasta_url="https://gannet.fish.washington.edu/seashell/snaps/"

# Set number of CPUs to use
export threads=40

3 Load MirMachine conda environment

If this is successful, the first line of output should show that the Python being used is the one in your MirMachine conda environment path.

E.g.

python: /home/sam/programs/mambaforge/envs/mirmachine_env/bin/python

use_condaenv(condaenv = mirmachine_conda_env_name, conda = mirmachine_cond_path)

# Check successful env loading
py_config()
python:         /home/sam/programs/mambaforge/envs/mirmachine_env/bin/python
libpython:      /home/sam/programs/mambaforge/envs/mirmachine_env/lib/libpython3.10.so
pythonhome:     /home/sam/programs/mambaforge/envs/mirmachine_env:/home/sam/programs/mambaforge/envs/mirmachine_env
version:        3.10.12 | packaged by conda-forge | (main, Jun 23 2023, 22:40:32) [GCC 12.3.0]
numpy:          /home/sam/programs/mambaforge/envs/mirmachine_env/lib/python3.10/site-packages/numpy
numpy_version:  1.25.2

NOTE: Python version was forced by use_python() function

4 Download P.evermanni genome from our server

# Load bash variables into memory
source .bashvars

wget \
--directory-prefix ${genome_fasta_dir} \
--recursive \
--no-check-certificate \
--continue \
--no-host-directories \
--no-directories \
--no-parent \
--quiet \
--execute robots=off \
--accept "${genome_fasta_name}" ${genome_fasta_url}

ls -lh "${genome_fasta_dir}"
total 625M
drwxr-xr-x 3 sam sam 4.0K Nov 15 13:50 06-Peve-sRNAseq-trimming
-rw-rw-r-- 1 sam sam  15M Oct 30 14:00 peve_bedtools_lncRNAs.fasta
-rw-r--r-- 1 sam sam  24M Nov  6 12:54 Porites_evermanni_v1.annot.gff
-rw-r--r-- 1 sam sam 586M Jun 30 09:21 Porites_evermanni_v1.fa
-rw-r--r-- 1 sam sam 422K Nov 15 16:29 Porites_evermanni_v1.fa.fai
-rw-rw-r-- 1 sam sam    0 Oct 30 14:00 README.md

5 Run MirMachine

The --species option specifies output naming structure

# Load bash variables into memory
source .bashvars

cd "${output_dir_top}"

time \
MirMachine.py \
--node Metazoa \
--species ${mirmarchine_output_prefix} \
--genome ${genome_fasta} \
--cpu 40 \
--add-all-nodes \
&> mirmachine.log

6 Results

6.1 View MirMachine output structure

# Load bash variables into memory
source .bashvars

tree -h ${output_dir_top}/results/predictions
/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/E-Peve/output/07-Peve-sRNAseq-MirMachine/results/predictions
├── [4.0K]  fasta
│   └── [109K]  Peve-MirMachine.PRE.fasta
├── [4.0K]  filtered_gff
│   └── [ 29K]  Peve-MirMachine.PRE.gff
├── [4.0K]  gff
│   └── [204K]  Peve-MirMachine.PRE.gff
└── [4.0K]  heatmap
    └── [ 30K]  Peve-MirMachine.heatmap.csv

4 directories, 4 files

6.2 Check FastA

# Load bash variables into memory
source .bashvars

echo "Total number of predicted miRNAs (high & low confidence):"
grep --count "^>" "${output_dir_top}/results/predictions/fasta/${mirmarchine_output_prefix}.PRE.fasta"
echo ""
echo "----------------------------------------------------------------------------------"
echo ""

head "${output_dir_top}/results/predictions/fasta/${mirmarchine_output_prefix}.PRE.fasta"
Total number of predicted miRNAs (high & low confidence):
794

----------------------------------------------------------------------------------

>Bantam.PRE_Porites_evermani_scaffold_956_127250_127374_(+)_LOWconf
CGGTTTTCGCATGATATCATGAATTATCAAAACCGAGGTCTGTGTTATCTGCCGAAGCCGAAGGCTGAGGCAGATAATACAGACACGAGGTTTTGATAATTCATGATATCATGCGAAAACCGAAT
>Bantam.PRE_Porites_evermani_scaffold_4467_1811_1935_(+)_LOWconf
CGGTTTTCGCATGATATCATGAATTATCAAAACCGAGGTCTGTGTTATCTGCCCAAGCCGAAGGCTGAGGCAGATAATACAGACACGAGGTTTTGATAATTCATGATATCATGCGAAAACCGAAT
>Iab-4.PRE_Porites_evermani_scaffold_246_107990_108039_(+)_LOWconf
AAGTATACTTGAAGTATACTTAATCGGAAGTATACCTCAAGTATACTTAA
>Mir-1.PRE_Porites_evermani_scaffold_238_275734_275815_(+)_LOWconf
GCATAATTCTTCGCATCTTAGGAGAGCCGAATTCAGAATAATTACTGAATTCAGCTCTCATAAGATGTGAAGAATTATGCAG
>Mir-10.PRE_Porites_evermani_scaffold_49_151611_151659_(-)_HIGHconf
CCGTAGATCCGAACTTGTGGGTATTTTCTCCACAGGTTGGGCTCTACGG

6.3 Check filtered GFF

Per MirMachine recommendations:

filtered_gff/ High confidence miRNA family predictions after bitscore filtering. (This file is what you need in most cases)

So, we’ll stick with that.

# Load bash variables into memory
source .bashvars

# Avoid 10th line - lengthy list of all miRNA families examined
head -n 9 "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff"

echo ""
# Pull out lines that do _not_ begin with a '#'.
grep "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff" \
| head
##gff-version 3
# MirMachine version: 0.2.12
# CM Models: Built using MirGeneDB 2.1(2022)
# Total families searched: 556
# Node: Metazoa
# Model: combined
# Genome file: /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/E-Peve/data/Porites_evermanni_v1.fa
# Species: Peve-MirMachine
# Params: /home/sam/programs/mambaforge/envs/mirmachine_env/bin/MirMachine.py --node Metazoa --species Peve-MirMachine --genome /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/E-Peve/data/Porites_evermanni_v1.fa --cpu 40 --add-all-nodes

Porites_evermani_scaffold_49    cmsearch    ncRNA   151611  151659  37.2    -   .   gene_id=Mir-10.PRE;E-value=0.0014;sequence_with_30nt=TGATTTAAAATTCTAGCAGCTCATGCGATCCCGTAGATCCGAACTTGTGGGTATTTTCTCCACAGGTTGGGCTCTACGGTCATATTTGCTGTAATATAACATGATGAGG
Porites_evermani_scaffold_102   cmsearch    ncRNA   285408  285466  36.9    -   .   gene_id=Mir-154.PRE;E-value=0.0005;sequence_with_30nt=ATTTGGAAAAAGAGACATTCTGATGCGATAGCGGTTTTCCATATAAAGTTTACTTCCTTTATATTAAAGATATATGATTTACCTCACCTAAACACGTTCAAATAAATTTATCACTTACG
Porites_evermani_scaffold_629   cmsearch    ncRNA   159499  159617  40.8    +   .   gene_id=Mir-216.PRE;E-value=3.7e-05;sequence_with_30nt=CTTTTAAACGCATGCGTCGCGTGAAATCGTTAATATCAGCAGATAATTCTGCCAAATTAATACGTTTAGGTGTGGTCCTCGCTCGCGGCTTAACCTTTTGCCCCACACCTAAACGTATTAATTTGGCAGAATGATCTGCTGATATTAAAACATATCTCCTTGCTCGTGGTTATAATTAT
Porites_evermani_scaffold_522   cmsearch    ncRNA   105208  105268  33.3    +   .   gene_id=Mir-2191.PRE;E-value=0.0073;sequence_with_30nt=GAAATTGTAGGATCACACTCATAAATATGCATGTATTTATGTATGTATGCGTGTATGTATGTACATACACGCATACATACATGGTTTTTATAGTATATCAACAATTTCCAAATCCATCCCC
Porites_evermani_scaffold_452   cmsearch    ncRNA   47661   47728   37.2    +   .   gene_id=Mir-303.PRE;E-value=0.0043;sequence_with_30nt=CCGTGTTAACTTTTGTGGTAGAAAAAATTTTTAGTTTTCCAAGGTGTCTAGTTTTTTTATAATAATTATAAAAAAACTAGACACCTTGGAAAACTAAAATTTTTTTTTTACGGTCTTTTTACATATAA
Porites_evermani_scaffold_1642  cmsearch    ncRNA   31391   31446   37.9    -   .   gene_id=Mir-303.PRE;E-value=0.0027;sequence_with_30nt=AGGTTAAGCCCTCTCCCGATCAACAAAATGCAAGTTATCAAATGTAAGAAGTTTCATCACAAAACTTCTTACATTTGATAACTTGCATTTTGTTCCCGCCACTACGACATTCTCGC
Porites_evermani_scaffold_79    cmsearch    ncRNA   110132  110208  42.2    +   .   gene_id=Mir-430.PRE;E-value=2.2e-05;sequence_with_30nt=AAATGCTTCTTACTTGTGTTTTTTTTAAACATCCCAACAGTGAAACACTTATTGTTGATTGTACAATTTTTGTACAATCAATAATAAGTGTTTCACTGTTAGGATGTTTAGAGCGATTTCGTATGACTTGAAATGAA
Porites_evermani_scaffold_1000  cmsearch    ncRNA   149006  149065  36.3    -   .   gene_id=Mir-430.PRE;E-value=0.0011;sequence_with_30nt=GACCAAAGATAAAGGGAATTCGCATATCAAGTTTTGGAAAAGAAGGCGCTTTCTTTCGTGAAAGAAAGAAAGTGCTTTCTTTTGGAAAAAACAAGCACTTATCACCGTTTCGAGGCTCTC
Porites_evermani_scaffold_132   cmsearch    ncRNA   263628  263697  47.8    -   .   gene_id=Mir-4983.PRE;E-value=1.4e-05;sequence_with_30nt=TTCATTTGCAGCATACTCTCATAACCGTCGCATTTGCTCGCTGGCATTTTTTATTGTTTTAAGCTCAAAAAACAATAAAAAATTCCAATGGGCAAATGCGACGCTTTTACGCGAATATTGCAAATGAATC
Porites_evermani_scaffold_846   cmsearch    ncRNA   27006   27073   36.6    -   .   gene_id=Mir-4983.PRE;E-value=0.0098;sequence_with_30nt=TTCATTTGCAACATACGCGTATAGCTGTCGCAATTGCCCGTTGGTATTTTTTTGTATTTAAACGTAAAAACAATAAACAATTCTAGTGGGCAAATGCGACAGCTACACGCGTATTTTTCAAATGAATC
grep: write error: Broken pipe

6.4 Counts of predicted high-confidence miRNAs

# Load bash variables into memory
source .bashvars

# Skip lines which begin with '#' (i.e. the header components)
echo "Predicted loci:"
grep -c "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff"

echo ""
echo "Unique miRNA families:"
grep "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff" \
| awk -F"[\t=;]" '{print $10}' \
| sort -u \
| wc -l
Predicted loci:
83

Unique miRNA families:
15

Citations

Umu, Sinan Uğur, Vanessa M. Paynter, Håvard Trondsen, Tilo Buschmann, Trine B. Rounge, Kevin J. Peterson, and Bastian Fromm. 2022. “Accurate microRNA Annotation of Animal Genomes Using Trained Covariance Models of Curated microRNA Complements in MirMachine.” http://dx.doi.org/10.1101/2022.11.23.517654.
LS0tCnRpdGxlOiAiMDctUGV2ZS1zUk5Bc2VxLU1pck1hY2hpbmUiCmF1dGhvcjogIlNhbSBXaGl0ZSIKZGF0ZTogIjIwMjMtMTEtMTUiCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCmxpbmstY2l0YXRpb25zOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShyZXRpY3VsYXRlKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsICAgICAgICAgIyBEaXNwbGF5IGNvZGUgY2h1bmtzCiAgZXZhbCA9IEZBTFNFLCAgICAgICAgIyBFdmFsdWF0ZSBjb2RlIGNodW5rcwogIHdhcm5pbmcgPSBGQUxTRSwgICAgICMgSGlkZSB3YXJuaW5ncwogIG1lc3NhZ2UgPSBGQUxTRSwgICAgICMgSGlkZSBtZXNzYWdlcwogIGNvbW1lbnQgPSAiIiAgICAgICAgICMgUHJldmVudHMgYXBwZW5kaW5nICcjIycgdG8gYmVnaW5uaW5nIG9mIGxpbmVzIGluIGNvZGUgb3V0cHV0CikKYGBgCgpVc2UgW01pck1hY2hpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5hbnVndXIvTWlyTWFjaGluZSkgW0B1bXUyMDIyXSB0byBpZGVudGlmeSBwb3RlbnRpYWwgbWlSTkEgaG9tb2xvZ3MgaW4gdGhlICpQZXZlcm1hbm5pKiBnZW5vbWUuCgpHZW5vbWUgRmFzdEEgb3JpZ2luYWxseSBkb3dubG9hZGVkIGZyb20gPGh0dHBzOi8vd3d3Lmdlbm9zY29wZS5jbnMuZnIvY29yYWxzL2dlbm9tZXMuaHRtbD4gb24gMjAyMzA2MjkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklucHV0czoKCi0gICBHZW5vbWUgRmFzdEEuCgpPdXRwdXRzOgoKLSAgIENvbmZpZGVuY2UtZmlsdGVyZWQgR0ZGIG9mIHByZWRpY3RlZCBtaVJOQXMuCi0gICBVbmZpbHRlcmVkIEZhc3RBIG9mIHByZWRpY3RlZCBtaVJOQXMuCi0gICBVbmZpbHRlcmVkIEdGRiBvZiBwcmVkaWN0ZWQgbWlSTkFzLgoKU29mdHdhcmUgcmVxdWlyZW1lbnRzOgoKLSAgIFJlcXVpcmVzIGEgW01pck1hY2hpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5hbnVndXIvTWlyTWFjaGluZSkgQ29uZGEvTWFtYmEgZW52aXJvbm1lbnQsIHBlciB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBTZXQgUiB2YXJpYWJsZXMKClJlcGxhY2Ugd2l0aCBuYW1lIG9mIHlvdXIgTWlyTWFjaGluZSBlbnZpcm9ubWVudCBhbmQgdGhlIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29uZGEgaW5zdGFsbGF0aW9uIChmaW5kIHRoaXMgKmFmdGVyKiB5b3UndmUgYWN0aXZhdGVkIHRoZSBlbnZpcm9ubWVudCkuCgpFLmcuCgpgYGB7ciBjb25kYS1lbnYtZXhhbXBsZSwgZXZhbD1GQUxTRX0KIyBBY3RpdmF0ZSBlbnZpcm9ubWVudApjb25kYSBhY3RpdmF0ZSBtaXJtYWNoaW5lX2VudgoKIyBGaW5kIGNvbmRhIHBhdGgKd2hpY2ggY29uZGEKYGBgCgpgYGB7ciBSLXZhcmlhYmxlcywgZXZhbD1UUlVFfQptaXJtYWNoaW5lX2NvbmRhX2Vudl9uYW1lIDwtIGMoIm1pcm1hY2hpbmVfZW52IikKbWlybWFjaGluZV9jb25kX3BhdGggPC0gYygiL2hvbWUvc2FtL3Byb2dyYW1zL21hbWJhZm9yZ2UvY29uZGFiaW4vY29uZGEiKQpgYGAKCiMgQ3JlYXRlIGEgQmFzaCB2YXJpYWJsZXMgZmlsZQoKVGhpcyBhbGxvd3MgdXNhZ2Ugb2YgQmFzaCB2YXJpYWJsZXMgYWNyb3NzIFIgTWFya2Rvd24gY2h1bmtzLgoKYGBge3Igc2F2ZS1iYXNoLXZhcmlhYmxlcy10by1ydmFycy1maWxlLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CnsKZWNobyAiIyMjIyBBc3NpZ24gVmFyaWFibGVzICMjIyMiCmVjaG8gIiIKCmVjaG8gIiMgRGF0YSBkaXJlY3RvcmllcyIKZWNobyAnZXhwb3J0IGRlZXBfZGl2ZV9kaXI9L2hvbWUvc2hhcmVkLzhUQl9IRERfMDEvc2FtL2dpdHJlcG9zL2RlZXAtZGl2ZScKZWNobyAnZXhwb3J0IG91dHB1dF9kaXJfdG9wPSR7ZGVlcF9kaXZlX2Rpcn0vRS1QZXZlL291dHB1dC8wNy1QZXZlLXNSTkFzZXEtTWlyTWFjaGluZScKZWNobyAiIgoKZWNobyAnZXhwb3J0IG1pcm1hcmNoaW5lX291dHB1dF9wcmVmaXg9IlBldmUtTWlyTWFjaGluZSInCgplY2hvICIjIElucHV0L091dHB1dCBmaWxlcyIKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YV9kaXI9JHtkZWVwX2RpdmVfZGlyfS9FLVBldmUvZGF0YScKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YV9uYW1lPSJQb3JpdGVzX2V2ZXJtYW5uaV92MS5mYSInCmVjaG8gJ2V4cG9ydCBnZW5vbWVfZmFzdGE9IiR7Z2Vub21lX2Zhc3RhX2Rpcn0vJHtnZW5vbWVfZmFzdGFfbmFtZX0iJwoKZWNobyAiIgoKZWNobyAiIyBFeHRlcm5hbCBkYXRhIFVSTHMiCmVjaG8gJ2V4cG9ydCBnZW5vbWVfZmFzdGFfdXJsPSJodHRwczovL2dhbm5ldC5maXNoLndhc2hpbmd0b24uZWR1L3NlYXNoZWxsL3NuYXBzLyInCmVjaG8gIiIKCmVjaG8gIiMgU2V0IG51bWJlciBvZiBDUFVzIHRvIHVzZSIKZWNobyAnZXhwb3J0IHRocmVhZHM9NDAnCmVjaG8gIiIKfSA+IC5iYXNodmFycwoKY2F0IC5iYXNodmFycwpgYGAKCiMgTG9hZCBbTWlyTWFjaGluZV0oaHR0cHM6Ly9naXRodWIuY29tL3NpbmFudWd1ci9NaXJNYWNoaW5lKSBjb25kYSBlbnZpcm9ubWVudAoKSWYgdGhpcyBpcyBzdWNjZXNzZnVsLCB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgc2hvdWxkIHNob3cgdGhhdCB0aGUgUHl0aG9uIGJlaW5nIHVzZWQgaXMgdGhlIG9uZSBpbiB5b3VyIFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIGNvbmRhIGVudmlyb25tZW50IHBhdGguCgpFLmcuCgpgcHl0aG9uOiAgICAgICAgIC9ob21lL3NhbS9wcm9ncmFtcy9tYW1iYWZvcmdlL2VudnMvbWlybWFjaGluZV9lbnYvYmluL3B5dGhvbmAKCmBgYHtyIGxvYWQtbWlybWFjaGluZS1jb25kYS1lbnYsIGV2YWw9VFJVRX0KdXNlX2NvbmRhZW52KGNvbmRhZW52ID0gbWlybWFjaGluZV9jb25kYV9lbnZfbmFtZSwgY29uZGEgPSBtaXJtYWNoaW5lX2NvbmRfcGF0aCkKCiMgQ2hlY2sgc3VjY2Vzc2Z1bCBlbnYgbG9hZGluZwpweV9jb25maWcoKQpgYGAKCiMgRG93bmxvYWQgKlAuZXZlcm1hbm5pKiBnZW5vbWUgZnJvbSBvdXIgc2VydmVyCgpgYGB7ciBkb3dubG9hZC1nZW5vbWUtZmFzdGEsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCndnZXQgXAotLWRpcmVjdG9yeS1wcmVmaXggJHtnZW5vbWVfZmFzdGFfZGlyfSBcCi0tcmVjdXJzaXZlIFwKLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSBcCi0tY29udGludWUgXAotLW5vLWhvc3QtZGlyZWN0b3JpZXMgXAotLW5vLWRpcmVjdG9yaWVzIFwKLS1uby1wYXJlbnQgXAotLXF1aWV0IFwKLS1leGVjdXRlIHJvYm90cz1vZmYgXAotLWFjY2VwdCAiJHtnZW5vbWVfZmFzdGFfbmFtZX0iICR7Z2Vub21lX2Zhc3RhX3VybH0KCmxzIC1saCAiJHtnZW5vbWVfZmFzdGFfZGlyfSIKYGBgCgojIFJ1biBbTWlyTWFjaGluZV0oaHR0cHM6Ly9naXRodWIuY29tL3NpbmFudWd1ci9NaXJNYWNoaW5lKQoKVGhlIGAtLXNwZWNpZXNgIG9wdGlvbiBzcGVjaWZpZXMgb3V0cHV0IG5hbWluZyBzdHJ1Y3R1cmUKCmBgYHtyIG1pcm1hY2hpbmUsIGVuZ2luZT0nYmFzaCcsIGNhY2hlPVRSVUV9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpjZCAiJHtvdXRwdXRfZGlyX3RvcH0iCgp0aW1lIFwKTWlyTWFjaGluZS5weSBcCi0tbm9kZSBNZXRhem9hIFwKLS1zcGVjaWVzICR7bWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeH0gXAotLWdlbm9tZSAke2dlbm9tZV9mYXN0YX0gXAotLWNwdSA0MCBcCi0tYWRkLWFsbC1ub2RlcyBcCiY+IG1pcm1hY2hpbmUubG9nCmBgYAoKIyBSZXN1bHRzCgojIyBWaWV3IFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIG91dHB1dCBzdHJ1Y3R1cmUKCmBgYHtyIG1pcm1hY2hpbmUtb3V0cHV0LXRyZWUsIGV2YWw9VFJVRSwgZW5naW5lPSdiYXNoJ30KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCnRyZWUgLWggJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0cy9wcmVkaWN0aW9ucwpgYGAKCiMjIENoZWNrIEZhc3RBCgpgYGB7ciBjaGVjay1taXJtYWNoaW5lLWZhc3RhLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgplY2hvICJUb3RhbCBudW1iZXIgb2YgcHJlZGljdGVkIG1pUk5BcyAoaGlnaCAmIGxvdyBjb25maWRlbmNlKToiCmdyZXAgLS1jb3VudCAiXj4iICIke291dHB1dF9kaXJfdG9wfS9yZXN1bHRzL3ByZWRpY3Rpb25zL2Zhc3RhLyR7bWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeH0uUFJFLmZhc3RhIgplY2hvICIiCmVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmVjaG8gIiIKCmhlYWQgIiR7b3V0cHV0X2Rpcl90b3B9L3Jlc3VsdHMvcHJlZGljdGlvbnMvZmFzdGEvJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fS5QUkUuZmFzdGEiCmBgYAoKIyMgQ2hlY2sgZmlsdGVyZWQgR0ZGCgpQZXIgW01pck1hY2hpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5hbnVndXIvTWlyTWFjaGluZSkgcmVjb21tZW5kYXRpb25zOgoKPiBgZmlsdGVyZWRfZ2ZmL2AgSGlnaCBjb25maWRlbmNlIG1pUk5BIGZhbWlseSBwcmVkaWN0aW9ucyBhZnRlciBiaXRzY29yZSBmaWx0ZXJpbmcuIChUaGlzIGZpbGUgaXMgd2hhdCB5b3UgbmVlZCBpbiBtb3N0IGNhc2VzKQoKU28sIHdlJ2xsIHN0aWNrIHdpdGggdGhhdC4KCmBgYHtyIGNoZWNrLWZpbHRlcmVkLWdmZiwgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBBdm9pZCAxMHRoIGxpbmUgLSBsZW5ndGh5IGxpc3Qgb2YgYWxsIG1pUk5BIGZhbWlsaWVzIGV4YW1pbmVkCmhlYWQgLW4gOSAiJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0cy9wcmVkaWN0aW9ucy9maWx0ZXJlZF9nZmYvJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fS5QUkUuZ2ZmIgoKZWNobyAiIgojIFB1bGwgb3V0IGxpbmVzIHRoYXQgZG8gX25vdF8gYmVnaW4gd2l0aCBhICcjJy4KZ3JlcCAiXlteI10iICIke291dHB1dF9kaXJfdG9wfS9yZXN1bHRzL3ByZWRpY3Rpb25zL2ZpbHRlcmVkX2dmZi8ke21pcm1hcmNoaW5lX291dHB1dF9wcmVmaXh9LlBSRS5nZmYiIFwKfCBoZWFkCgpgYGAKCiMjIENvdW50cyBvZiBwcmVkaWN0ZWQgaGlnaC1jb25maWRlbmNlIG1pUk5BcwoKYGBge3IgY291bnQtcHJlZGljdGVkLWhjLW1pcm5hcywgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBTa2lwIGxpbmVzIHdoaWNoIGJlZ2luIHdpdGggJyMnIChpLmUuIHRoZSBoZWFkZXIgY29tcG9uZW50cykKZWNobyAiUHJlZGljdGVkIGxvY2k6IgpncmVwIC1jICJeW14jXSIgIiR7b3V0cHV0X2Rpcl90b3B9L3Jlc3VsdHMvcHJlZGljdGlvbnMvZmlsdGVyZWRfZ2ZmLyR7bWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeH0uUFJFLmdmZiIKCmVjaG8gIiIKZWNobyAiVW5pcXVlIG1pUk5BIGZhbWlsaWVzOiIKZ3JlcCAiXlteI10iICIke291dHB1dF9kaXJfdG9wfS9yZXN1bHRzL3ByZWRpY3Rpb25zL2ZpbHRlcmVkX2dmZi8ke21pcm1hcmNoaW5lX291dHB1dF9wcmVmaXh9LlBSRS5nZmYiIFwKfCBhd2sgLUYiW1x0PTtdIiAne3ByaW50ICQxMH0nIFwKfCBzb3J0IC11IFwKfCB3YyAtbApgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBDaXRhdGlvbnMK