Click Here to Return to Previous Page
This file contains statistics and figures from the paper, “Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma
Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.
The paper can be found here:
Molecular,
Cellular, and Developmental Organization of the Mouse Vomeronasal organ
at Single Cell Resolution
Molecular cascades separating the
neuronal lineages
PCA plot of V1R and V2R pseudotime principal curves across cell
types
Cell density plots across pseudotime for P14 and P56 mice
Summary of
Kolmogorov-Smirnov Test
Two-sample Kolmogorov-Smirnov test
data: p14.v1r.pseudotime$v1r.pseudotime and p56.v1r.pseudotime$v1r.pseudotime
D = 0.21438, p-value < 2.2e-16
alternative hypothesis: two-sided
Two-sample Kolmogorov-Smirnov test
data: p14.v2r.pseudotime$v2r.pseudotime and p56.v2r.pseudotime$v2r.pseudotime
D = 0.10572, p-value = 1.892e-13
alternative hypothesis: two-sided
Heatmap showing expression in pseudotime for genes that
differentially expressed between the V1R and V2R lineages. Heat
indicates Z-score values
Zoomed in UMAP of cell types early in the neuronal lineage
Feature plots for select genes expressed early in the neuronal
lineage
UMAP of INP, iVSN, iOSN, and mOSN cell types
Normalized expression of candidate genes for V1R/V2R/OSN lineage
determination - V1R expressing genes
Normalized expression of candidate genes for V1R/V2R/OSN lineage
determination
LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAzIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgiPGJ1dHRvbiBvbmNsaWNrPSdoaXN0b3J5LmJhY2soKScgc3R5bGU9J2ZvbnQtc2l6ZTogMjBweDsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDVweDsnPkNsaWNrIEhlcmUgdG8gUmV0dXJuIHRvIFByZXZpb3VzIFBhZ2U8L2J1dHRvbj4iKQoKYGBgCgpgYGB7ciwgZW5naW5lPSdjc3MnLCBlY2hvID0gRkFMU0V9CgoubmF2LXBpbGxzID4gbGkgPiBhIHsKICBjb2xvcjogYmxhY2s7IC8qIFNldCBpbmFjdGl2ZSB0YWIgdGV4dCBjb2xvciB0byBibGFjayAqLwp9CgoubmF2LXBpbGxzID4gbGkgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkgPiBhOmZvY3VzLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSwKLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmZvY3VzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgLyogU2V0IGhvdmVyIGJhY2tncm91bmQgY29sb3IgdG8gYSBkYXJrZXIgZ3JheSAqLwogIGNvbG9yOiB3aGl0ZTsgLyogU2V0IGhvdmVyIHRleHQgY29sb3IgdG8gd2hpdGUgZm9yIGJldHRlciBjb250cmFzdCAqLwp9CiAgICAgCmBgYAogIAogIAo+VGhpcyBmaWxlIGNvbnRhaW5zIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgZnJvbSB0aGUgcGFwZXIsICJNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb24iIGJ5IE1heCBIaWxscyBKci4sIExpbWVpIE1hLCBBaSBGYW5nLCBUaGVsbWEgQ2hpcmVtYmEsIFNldGggTWFsbG95LCBBbGxpc29uIFNjb3R0LCBBbm9qYSBQZXJlcmEsIGFuZCBDLiBSb24gWXUuICAgIAoKVGhlIHBhcGVyIGNhbiBiZSBmb3VuZCBoZXJlOiAgCgpbTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uXShodHRwczovL2VsaWZlc2NpZW5jZXMub3JnL3Jldmlld2VkLXByZXByaW50cy85NzM1NiN0YWItY29udGVudCkKCioqKiAgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgUi1NYXJrZG93biBHbG9iYWwgU2V0dGluZ3MgIAoKIyBTZXQtdXAgYSBkZWZhdWx0IGltYWdlIHNpemUgb2YgMTAgWCAxMCBpbmNoZXMuIFN1cHByZXNzIHdhcm5pbmcKIyBhbmQgZXJyb3IgbWVzc2FnZXMuIEhpZGUgY29kZS4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBjYWNoZT1GQUxTRSkKCmBgYAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMaWJyYXJ5IExvYWRpbmcgIAoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KGtpdCk7IGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShzdHJpbmdyKTsgbGlicmFyeShwbG90M0QpIAogIGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZGF0YS50YWJsZSk7IGxpYnJhcnkob3JnLk1tLmVnLmRiKQogIGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KFNldXJhdCk7IGxpYnJhcnkoREJJKTsgbGlicmFyeShjb3dwbG90KQogIGxpYnJhcnkoTWF0cml4KTsgbGlicmFyeShnbG1HYW1Qb2kpOyBsaWJyYXJ5KGNpcmNsaXplKQogIGxpYnJhcnkodGliYmxlKTsgbGlicmFyeShnZ3B1YnIpOyBsaWJyYXJ5KHN2Z2xpdGUpOyBsaWJyYXJ5KGdnc2lnbmlmKQogIGxpYnJhcnkoc3RhdHMpOyBsaWJyYXJ5KHZlZ2FuKTsgbGlicmFyeShzY2FsZXMpOyBsaWJyYXJ5KGNhcmV0KQogIGxpYnJhcnkocGF0Y2h3b3JrKTsgbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdlb210ZXh0cGF0aCkKICBsaWJyYXJ5KG9wZW54bHN4KTsgbGlicmFyeShncmlkRXh0cmEpOyBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShHZW5lT3ZlcmxhcCk7IGxpYnJhcnkoYmlvbWFSdCk7IGxpYnJhcnkoZ2dwb2ludGRlbnNpdHkpCiAgbGlicmFyeShzbGluZ3Nob3QpOyBsaWJyYXJ5KHRyYWRlU2VxKTsgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHZpcmlkaXMpOyBsaWJyYXJ5KFVwU2V0Uik7IGxpYnJhcnkocGhlYXRtYXApOyBsaWJyYXJ5KG1zaWdkYnIpCiAgbGlicmFyeShmZ3NlYSk7IGxpYnJhcnkoZ3JpZCk7IGxpYnJhcnkoSURQbWlzYyk7IGxpYnJhcnkoTUFTUykKICBsaWJyYXJ5KFJtaXNjKTsgbGlicmFyeShnZ3Bsb3RpZnkpOyBsaWJyYXJ5KGdncG1pc2MpOyBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KGhlYXRtYXBseSk7IGxpYnJhcnkoZGVuZGV4dGVuZCkKfSkKCmBgYAoKYGBge3J9CgojIEdsb2JhbCBWYXJpYWJsZXMKCiMgVGhlIGhvbWUgZGlyZWN0b3J5CmhvbWVfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvc2NfVk5PLyIKIyBEaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGF0YSBvYmplY3RzIGF0IGNydWNpYWwgc3RhZ2VzCm9iamVjdF9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbC5zZXUub2Jqcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZyb20gdGhlIGZpbmFsIGFuYWx5c2lzCmltYWdlX2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsX2ltYWdlcy8iKQphZG9iZV9pbWFnZXMgPC0gcGFzdGUwKGltYWdlX2RpciwgImFkb2JlX2lsbHVzdHJhdG9yX3N2Z19maWxlcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZvciB0aGUgZmluYWwgcGFwZXIKY2x1c3RyZWVfZGlyIDwtIHBhc3RlMChpbWFnZV9kaXIsImNsdXN0cmVlLyIpCiMgQSBkaXJlY3RvcnkgZm9yIFRyYWRlU2VxIGZpdEdBTSBvdXRwdXQKZml0R0FNX2RpciA8LSBwYXN0ZTAob2JqZWN0X2RpciwgImZpdEdBTS8iKQptb2VfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvbW9sbmdfMjQwN18yNDUzL1Jfb2JqLyIKCiMgT1BFTiBgYGB2bm8uc2V1LmludGVncmF0ZWRgYGAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInZuby5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKI0xvYWQgTmV1cm9uYWwgTGluZWFnZSBTZXVyYXQgT2JqZWN0ICAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIm5ldXJvbi5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKCiMgUmVuYW1lIHVua25vd25fbVZTTiB0byBzVlNOCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgoKIyBHZXQgY29sb3Igc2NoZW1lIGZvciB0aGUgd2hvbGUgdm5vIGRhdGFzZXQKdm5vLmNlbGxfdHlwZS5jb2xvcnMgPC0gaHVlX3BhbCgpKGxlbmd0aChsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQpuYW1lcyh2bm8uY2VsbF90eXBlLmNvbG9ycykgPC0gbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgojIEtlZXAgbmV1cm9uIGRhdGFzZXQgY29sb3Igc2NoZW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2hvbGUgdm5vIGNvbG9yIHNjaGVtZSwgd2hlcmUgcG9zc2libGUgIApuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSB2bm8uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiR0JDIildCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHNldE5hbWVzKGMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMsIiMwMEIwRjYiLCIjOTU5MEZGIiwiI0U3NkJGMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG5hbWVzKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSwiaU9TTiIsImxhdGVfSU5QIiwiZWFybHlfSU5QIikpCgptYXR1cmUubmV1cm9ucyA8LSBzdWJzZXQobmV1cm9uLmludGVncmF0ZWQsaWRlbnRzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpKQptYXR1cmUuY2VsbF90eXBlLmNvbG9ycyA8LSBuZXVyb24uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKV0KCmdsb2JhbC52YXJzIDwtIGMobHMoKSwiZ2xvYmFsLnZhcnMiKQoKYGBgCgoqKiogIAoKIyBNb2xlY3VsYXIgY2FzY2FkZXMgc2VwYXJhdGluZyB0aGUgbmV1cm9uYWwgbGluZWFnZXMgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKIyMgUENBIHBsb3Qgb2YgVjFSIGFuZCBWMlIgcHNldWRvdGltZSBwcmluY2lwYWwgY3VydmVzIGFjcm9zcyBjZWxsIHR5cGVzICAKCmBgYHtyfQoKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ2MXIudi52MnIuc2V1IikpICAgICAgICAgICAgICAgICAgICAgICAjIFNldXJhdCBPYmplY3QKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJpbnAuaW50ZWdyYXRlZC5wcmVDZWxsSUQiKSkgICAgICAgICAgICAjIElOUCBTZXVyYXQgT2JqZWN0CmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjFyLnYudjJyLnNkcyIpKSAgICAgICAgICAgICAgICAgICAgICAgIyBTbGluZ3Nob3QgT2JqZWN0CmxvYWQoZmlsZT1wYXN0ZTAoZml0R0FNX2RpciwidjFyLnYudjJyLnNjZSIpKSAgICAgICAgICAgICAgICAgICAgICAgIyBMb2FkIHRoZSB0cmFkZVNlcSBvYmplY3QKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ2MXIudi52MnIucGF0dGVybkRFcmVzIikpICAgICAgICAgICAgICAjIHBhdHRlcm5ERSB0ZXN0IHJlc3VsdHMgb2JqZWN0CgpgYGAKCmBgYHtyfQoKIyBFeHRyYWN0IHNsaW5nc2hvdCBwcmluY2lwYWwgY3VydmVzIGZvciBwbG90dGluZyB3aXRoIFNldXJhdC9nZ3Bsb3QyCnYxci5jdXJ2ZSA8LSBzbGluZ0N1cnZlcyh2MXIudi52MnIuc2RzKVtbMl1dIAp2MXIuY3VydmUgPC0gZGF0YS5mcmFtZSh2MXIuY3VydmUkc1t2MXIuY3VydmUkb3JkLCBdKQp2MnIuY3VydmUgPC0gc2xpbmdDdXJ2ZXModjFyLnYudjJyLnNkcylbWzFdXSAKdjJyLmN1cnZlIDwtIGRhdGEuZnJhbWUodjJyLmN1cnZlJHNbdjJyLmN1cnZlJG9yZCwgXSkKCmBgYAoKYGBge3J9Cgp2MXIudi52MnIuc2V1QGFjdGl2ZS5pZGVudCA8LSB2MXIudi52MnIuc2V1JGNlbGxfdHlwZQojIFNldCB0aGUgb3JkZXIgb2YgdGhlIGxldmVscyBmb3IgdGhlIGZhY3Rvcgp2MXIudi52MnIuc2V1QGFjdGl2ZS5pZGVudCA8LSBmYWN0b3IodjFyLnYudjJyLnNldUBhY3RpdmUuaWRlbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkdCQyIsICJJTlAiLCAiVjFSLklOUCIsICJWMlIuSU5QIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWMVJfaVZTTiIsICJWMlJfaVZTTiIsICJWMVJfbVZTTiIsICJWMlJfbVZTTiIpKQoKYGBgCgpgYGB7cn0KCnRlbXAucGFsLjEgPC0gd2VzYW5kZXJzb246Ondlc19wYWxldHRlKCJHcmFuZEJ1ZGFwZXN0MSIpCnRlbXAucGFsLjIgPC0gd2VzYW5kZXJzb246Ondlc19wYWxldHRlKCJHcmFuZEJ1ZGFwZXN0MiIpCnBhbCA8LSBjKHRlbXAucGFsLjEsdGVtcC5wYWwuMikKbmFtZXMocGFsKSA8LSBsZXZlbHModjFyLnYudjJyLnNldUBhY3RpdmUuaWRlbnQpCiMgU2F2ZSB0aGUgMkQgUENBIG9mIENlbGwgVHlwZXMgd2l0aCBWMVIgYW5kIFYyUiBQcmluY2lwYWwgQ3VydmVzCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWczX2Euc3ZnIiksd2lkdGg9NixoZWlnaHQ9NikKZmlnM19hIDwtIERpbVBsb3QodjFyLnYudjJyLnNldSwgcmVkdWN0aW9uPSJwY2EiLCBwdC5zaXplPTIsIHNodWZmbGU9VFJVRSwgY29scz1wYWwpICsKICBnZW9tX3BhdGgoZGF0YT12MXIuY3VydmUsIGFlcyh4PVBDXzEsIHk9UENfMiksIHNpemU9MC4wNSwgY29sPSJibGFjayIpICsKICBnZW9tX3BhdGgoZGF0YT12MnIuY3VydmUsIGFlcyh4PVBDXzEsIHk9UENfMiksIHNpemU9MC4wNSwgY29sPSJibHVlIikgKwogIGdlb21fbGFiZWxwYXRoKGRhdGE9djFyLmN1cnZlLCBhZXMoeD1QQ18xLHk9UENfMiksIHNpemU9NC41LCBsYWJlbD0iVjFSIiwgaGp1c3Q9MC44LAogICAgICAgICAgICAgICAgIGZvbnRmYWNlPSJib2xkIikgKwogIGdlb21fbGFiZWxwYXRoKGRhdGE9djJyLmN1cnZlLCBhZXMoeD1QQ18xLHk9UENfMiksIHNpemU9NC41LCBsYWJlbD0iVjJSIiwgaGp1c3Q9MC44LCAKICAgICAgICAgICAgICAgICBjb2xvdXI9ImJsdWUiLCBmb250ZmFjZT0iYm9sZCIpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLjAsIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjIpLCBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobnJvdyA9IDIpKQogIApybSh0ZW1wLnBhbC4xLHRlbXAucGFsLjIpCgpmaWczX2EKaW52aXNpYmxlKGRldi5vZmYoKSkKCmBgYAoKYGBge3IsZmlnLndpZHRoPTEyLGZpZy5oZWlnaHQ9MTJ9CgojIFYxUi9WMlIgUHJpbmNpcGFsIEN1cnZlcyAgCiMgUGxvdCB0aGUgMkQgUENBIG9mIENlbGwgVHlwZXMgd2l0aCBWMVIgYW5kIFYyUiBQcmluY2lwYWwgQ3VydmVzCmZpZzNfYQoKYGBgCgojIyBDZWxsIGRlbnNpdHkgcGxvdHMgYWNyb3NzIHBzZXVkb3RpbWUgZm9yIFAxNCBhbmQgUDU2IG1pY2UgIAoKYGBge3J9CgojIENhbGN1bGF0ZSBwc2V1ZG90aW1lcwp2MXIudi52MnIucHQgPC0gc2xpbmdQc2V1ZG90aW1lKHYxci52LnYyci5zZHMsIG5hPUZBTFNFKQp2MXIudi52MnIuc2V1IDwtIEFkZE1ldGFEYXRhKHYxci52LnYyci5zZXUsIHYxci52LnYyci5wdFsgLDJdLCBjb2wubmFtZSA9ICJ2MXIucHNldWRvdGltZSIpCnYxci52LnYyci5zZXUgPC0gQWRkTWV0YURhdGEodjFyLnYudjJyLnNldSwgdjFyLnYudjJyLnB0WyAsMV0sIGNvbC5uYW1lID0gInYyci5wc2V1ZG90aW1lIikKCiMgQWRkIGNlbGwtd2VpZ2h0cwp2MXIuY3cgPC0gYXMuaW50ZWdlcih2MXIudi52MnIuc2V1JGNlbGxfdHlwZSA9PSAiR0JDIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIklOUCIgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYxUi5JTlAiIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYxUl9pVlNOIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MXIudi52MnIuc2V1JGNlbGxfdHlwZSA9PSAiVjFSX21WU04iKQp2MnIuY3cgPC0gYXMuaW50ZWdlcih2MXIudi52MnIuc2V1JGNlbGxfdHlwZSA9PSAiR0JDIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIklOUCIgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYyUi5JTlAiIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjFyLnYudjJyLnNldSRjZWxsX3R5cGUgPT0gIlYyUl9pVlNOIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MXIudi52MnIuc2V1JGNlbGxfdHlwZSA9PSAiVjJSX21WU04iKQp2MXIudi52MnIuc2V1IDwtIEFkZE1ldGFEYXRhKHYxci52LnYyci5zZXUsIHYxci5jdywgY29sLm5hbWUgPSAidjFyLmN3IikKdjFyLnYudjJyLnNldSA8LSBBZGRNZXRhRGF0YSh2MXIudi52MnIuc2V1LCB2MnIuY3csIGNvbC5uYW1lID0gInYyci5jdyIpCgpgYGAKCmBgYHtyfQoKdjFyLnYudjJyLnBzZXVkb3RpbWUgPC0gRmV0Y2hEYXRhKHYxci52LnYyci5zZXUsdmFycz1jKCJjZWxsX3R5cGUiLCJhZ2UiLCJ2MXIucHNldWRvdGltZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidjJyLnBzZXVkb3RpbWUiLCJ2MXIuY3ciLCJ2MnIuY3ciKSkKCnYxci52LnYyci5wc2V1ZG90aW1lJGNlbGxfdHlwZSA8LSAKICBmYWN0b3IodjFyLnYudjJyLnBzZXVkb3RpbWUkY2VsbF90eXBlLAogICAgICAgICBsZXZlbHM9YygiR0JDIiwiSU5QIiwiVjFSLklOUCIsIlYyUi5JTlAiLCJWMVJfaVZTTiIsCiAgICAgICAgICAgICAgICAgICJWMlJfaVZTTiIsIlYxUl9tVlNOIiwiVjJSX21WU04iKSkKCmBgYAoKW1N1bW1hcnkgb2YgS29sbW9nb3Jvdi1TbWlybm92IFRlc3RdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0tvbG1vZ29yb3bigJNTbWlybm92X3Rlc3QpICAKCmBgYHtyfQoKIyBTdWJzZXQgdGhlIGNlbGxzIGZvciBlYWNoIGxpbmVhZ2UKdjFyLnBzZXVkb3RpbWUgPC0gdjFyLnYudjJyLnBzZXVkb3RpbWVbdjFyLnYudjJyLnBzZXVkb3RpbWUkdjFyLmN3PT0xLCBdCnYxci5wc2V1ZG90aW1lIDwtIHN1YnNldCh2MXIucHNldWRvdGltZSxzZWxlY3Q9YyhjZWxsX3R5cGUsYWdlLHYxci5wc2V1ZG90aW1lLHYxci5jdykpCnYxci5wc2V1ZG90aW1lJGNlbGxfdHlwZSA8LSBkcm9wbGV2ZWxzKHYxci5wc2V1ZG90aW1lJGNlbGxfdHlwZSkKdjJyLnBzZXVkb3RpbWUgPC0gdjFyLnYudjJyLnBzZXVkb3RpbWVbdjFyLnYudjJyLnBzZXVkb3RpbWUkdjJyLmN3PT0xLCBdCnYyci5wc2V1ZG90aW1lIDwtIHN1YnNldCh2MnIucHNldWRvdGltZSxzZWxlY3Q9YyhjZWxsX3R5cGUsYWdlLHYyci5wc2V1ZG90aW1lLHYyci5jdykpCnYyci5wc2V1ZG90aW1lJGNlbGxfdHlwZSA8LSBkcm9wbGV2ZWxzKHYyci5wc2V1ZG90aW1lJGNlbGxfdHlwZSkKCiMgR2V0IGFnZSBzcGVjaWZpYyBjZWxscyBmb3Igc3RhdGlzdGljYWwgdGVzdApwMTQudjFyLnBzZXVkb3RpbWUgPC0gdjFyLnBzZXVkb3RpbWVbdjFyLnBzZXVkb3RpbWUkYWdlPT0iUDE0IiwgXQpwNTYudjFyLnBzZXVkb3RpbWUgPC0gdjFyLnBzZXVkb3RpbWVbdjFyLnBzZXVkb3RpbWUkYWdlPT0iUDU2IiwgXQpwMTQudjJyLnBzZXVkb3RpbWUgPC0gdjJyLnBzZXVkb3RpbWVbdjJyLnBzZXVkb3RpbWUkYWdlPT0iUDE0IiwgXQpwNTYudjJyLnBzZXVkb3RpbWUgPC0gdjJyLnBzZXVkb3RpbWVbdjJyLnBzZXVkb3RpbWUkYWdlPT0iUDU2IiwgXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgS29sbW9nb3Jvdi1TbWlybm92IFRlc3QgIyMjICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwprcy50ZXN0KHAxNC52MXIucHNldWRvdGltZSR2MXIucHNldWRvdGltZSxwNTYudjFyLnBzZXVkb3RpbWUkdjFyLnBzZXVkb3RpbWUpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKcGFsIDwtIHdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiLDQsImRpc2NyZXRlIikKCmZpZzNfYi5wYXJ0XzEgPC0gZ2dkZW5zaXR5KGRhdGE9djFyLnBzZXVkb3RpbWUsIHg9InYxci5wc2V1ZG90aW1lIiwKICAgICAgICAgICAgICAgICAgICBjb2xvcj0iYWdlIixmaWxsPSJhZ2UiLHRpdGxlPSJWMVIiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEsIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjApLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41LHNpemU9MjgpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yMCkpICsKICB4bGFiKCJwc2V1ZG90aW1lIikgKyAKICBhbm5vdGF0ZSgidGV4dCIseD0xMDAseT0wLjA1LGxhYmVsPSJwLXZhbHVlIDwgMi4yZS0xNiIsc2l6ZT0yMC8ucHQpICsKICBhbm5vdGF0ZSgKICAgIHltaW4gPSAtMC4wMDEsIHltYXggPSAtMC4wMDAzLAogICAgeG1pbiA9IGMoMCwgNjMsIDE1MCwgMjAwKSwKICAgIHhtYXggPSBjKDYzLCAxNTAsIDIwMCwgMjM3KSwKICAgIGdlb20gPSAicmVjdCIsCiAgICBmaWxsID0gYyhwYWxbMl0scGFsWzNdLHBhbFs0XSxwYWxbMV0pCiAgKSArCiAgYW5ub3RhdGUoInRleHQiLHg9MzEseT0tMC4wMDI1LGxhYmVsPSJHQkMiLHNpemU9MTYvLnB0KSArCiAgYW5ub3RhdGUoInRleHQiLHg9MTA2LHk9LTAuMDAyNSxsYWJlbD0iSU5QIixzaXplPTE2Ly5wdCkgKwogIGFubm90YXRlKCJ0ZXh0Iix4PTE3NSx5PS0wLjAwMjUsbGFiZWw9ImlWU04iLHNpemU9MTYvLnB0KSArCiAgYW5ub3RhdGUoInRleHQiLHg9MjE4LHk9LTAuMDAyNSxsYWJlbD0ibVZTTiIsc2l6ZT0xNi8ucHQpCiAgCmBgYAoKYGBge3J9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyBLb2xtb2dvcm92LVNtaXJub3YgVGVzdCAjIyMgIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmtzLnRlc3QocDE0LnYyci5wc2V1ZG90aW1lJHYyci5wc2V1ZG90aW1lLHA1Ni52MnIucHNldWRvdGltZSR2MnIucHNldWRvdGltZSkKCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgpmaWczX2IucGFydF8yIDwtIGdnZGVuc2l0eShkYXRhPXYyci5wc2V1ZG90aW1lLCB4PSJ2MnIucHNldWRvdGltZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9ImFnZSIsZmlsbD0iYWdlIix0aXRsZT0iVjJSIikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSxzaXplPTI4KSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjApKSArCiAgeGxhYigicHNldWRvdGltZSIpICsgCiAgYW5ub3RhdGUoInRleHQiLHg9MTQwLHk9MC4wMyxsYWJlbD0icC12YWx1ZTogMS44OTJlLTEzIixzaXplPTIwLy5wdCkgKwogIGFubm90YXRlKAogICAgeW1pbiA9IC0wLjAwMSwgeW1heCA9IC0wLjAwMDMsCiAgICB4bWluID0gYygwLCA2MiwgMTU2LCAyMjUpLAogICAgeG1heCA9IGMoNjIsIDE1NiwgMjI1LCAyNzIpLAogICAgZ2VvbSA9ICJyZWN0IiwKICAgIGZpbGwgPSBjKHBhbFsyXSxwYWxbM10scGFsWzRdLHBhbFsxXSkKICApICsKICBhbm5vdGF0ZSgidGV4dCIseD0zMSx5PS0wLjAwMjUsbGFiZWw9IkdCQyIsc2l6ZT0xNi8ucHQpICsKICBhbm5vdGF0ZSgidGV4dCIseD0xMDkseT0tMC4wMDI1LGxhYmVsPSJJTlAiLHNpemU9MTYvLnB0KSArCiAgYW5ub3RhdGUoInRleHQiLHg9MTkwLHk9LTAuMDAyNSxsYWJlbD0iaVZTTiIsc2l6ZT0xNi8ucHQpICsKICBhbm5vdGF0ZSgidGV4dCIseD0yNDkseT0tMC4wMDI1LGxhYmVsPSJtVlNOIixzaXplPTE2Ly5wdCkKCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgpmaWczX2IgPC0gZ2dhcnJhbmdlKHBsb3RsaXN0PWxpc3QoVjFSPWZpZzNfYi5wYXJ0XzEsVjJSPWZpZzNfYi5wYXJ0XzIpLAogICAgICAgICAgICAgICAgICAgIG5yb3c9MSxuY29sPTIsY29tbW9uLmxlZ2VuZD1UUlVFLGxlZ2VuZD0icmlnaHQiKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzNfYi5zdmciKSwgd2lkdGg9MTIsIGhlaWdodD02KQpmaWczX2IKaW52aXNpYmxlKGRldi5vZmYoKSkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNixmaWcuaGVpZ2h0PTh9CgpmaWczX2IKCmBgYAoKIyMgSGVhdG1hcCBzaG93aW5nIGV4cHJlc3Npb24gaW4gcHNldWRvdGltZSBmb3IgZ2VuZXMgdGhhdCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgYmV0d2VlbiB0aGUgVjFSIGFuZCBWMlIgbGluZWFnZXMuIEhlYXQgaW5kaWNhdGVzIFotc2NvcmUgdmFsdWVzICAKCmBgYHtyfQoKZ2VuZS5jb3VudHMgPC0gR2V0QXNzYXlEYXRhKG9iamVjdD12MXIudi52MnIuc2V1LCBzbG90PSJkYXRhIikKZ2VuZS50b3QuY291bnRzIDwtIHJvd1N1bXMoZ2VuZS5jb3VudHMpCiMgT25seSBrZWVwIGdlbmVzIHdpdGggbW9yZSB0aGFuIDEwMCB0b3RhbCBub3JtYWxpemVkIGNvdW50cwpnZW5lLnRvdC5jb3VudHMgPC0gZ2VuZS50b3QuY291bnRzW2dlbmUudG90LmNvdW50cyA+PSAzMDBdCgpzaWcudjFyLnYudjJyLnBhdHRlcm5ERXJlcyA8LSB2MXIudi52MnIucGF0dGVybkRFcmVzW25hbWVzKGdlbmUudG90LmNvdW50cyksIF0Kc2lnLnYxci52LnYyci5wYXR0ZXJuREVyZXMgPC0gbmEub21pdChzaWcudjFyLnYudjJyLnBhdHRlcm5ERXJlcykKIyBLZWVwIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcC12YWx1ZSDiiaQgMC4wMDEKcGF0dGVybkRFLmdlbmVzIDwtIHJvd25hbWVzKHNpZy52MXIudi52MnIucGF0dGVybkRFcmVzKVtzaWcudjFyLnYudjJyLnBhdHRlcm5ERXJlcyRwYWRqIDw9IDFlLTNdCgpybShnZW5lLmNvdW50cyxnZW5lLnRvdC5jb3VudHMpCgpgYGAKCmBgYHtyfQoKY29sb3JzIDwtIGMoIiMwMDdGRkYiLCAiIzJFOEI1NyIsICIjRkZGRjY2IiwgIiNGRkE1MDAiLCAiI0ZGMDAwMCIpCiMgQ3VzdG9tIGNvbG9yIHBhbGV0dGUgIApwYWxldHRlIDwtIGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzKQoKIyMjIGJhc2VkIG9uIG1lYW4gc21vb3RoZXIKcGF0dGVybkRFLnloYXRTbW9vdGggPC0gcHJlZGljdFNtb290aChtb2RlbHM9djFyLnYudjJyLnNjZSxnZW5lPXBhdHRlcm5ERS5nZW5lcyxuUG9pbnRzPTUwLHRpZHk9RkFMU0UpCnBhdHRlcm5ERS55aGF0U21vb3RoU2NhbGVkIDwtIHQoc2NhbGUodChwYXR0ZXJuREUueWhhdFNtb290aCkpKQpwYXR0ZXJuREUuaGVhdFNtb290aF9WMVIgPC0gcGhlYXRtYXAocGF0dGVybkRFLnloYXRTbW9vdGhTY2FsZWRbICxjKDUxOjEwMCldLCBmb250c2l6ZSA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9cGFsZXR0ZShuPTUwKSwgY2x1c3Rlcl9jb2xzPUZBTFNFLGNsdXN0ZXJfcm93cz1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yb3duYW1lcz1GQUxTRSxzaG93X2NvbG5hbWVzPUZBTFNFLHRyZWVoZWlnaHRfcm93PTMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbj0iVjFSIiwgbGVnZW5kPUZBTFNFLCBzaWxlbnQ9VFJVRSkKCnBhdHRlcm5ERS5tYXRjaGluZ0hlYXRtYXBfVjJSIDwtIAogIHBoZWF0bWFwKHBhdHRlcm5ERS55aGF0U21vb3RoU2NhbGVkW3BhdHRlcm5ERS5oZWF0U21vb3RoX1YxUiR0cmVlX3JvdyRvcmRlcixjKDE6NTApXSwKICAgICAgICAgICBjb2xvcj1wYWxldHRlKG49NTApLCBjbHVzdGVyX2NvbHM9RkFMU0UsIGNsdXN0ZXJfcm93cz1GQUxTRSwKICAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLCBzaG93X2NvbG5hbWVzPUZBTFNFLCBmb250c2l6ZSA9IDEyLAogICAgICAgICAgIG1haW49IlYyUiIsIGxlZ2VuZD1UUlVFLCBzaWxlbnQ9VFJVRSkKCmdyaWQuYXJyYW5nZShwYXR0ZXJuREUuaGVhdFNtb290aF9WMVJbWzRdXSwgcGF0dGVybkRFLm1hdGNoaW5nSGVhdG1hcF9WMlJbWzRdXSwgbmNvbCA9IDIsIHdpZHRocz1jKDEsMS4wMSkpCgpgYGAKCiMjIFpvb21lZCBpbiBVTUFQIG9mIGNlbGwgdHlwZXMgZWFybHkgaW4gdGhlIG5ldXJvbmFsIGxpbmVhZ2UgIAoKYGBge3J9CgpJZGVudHMoaW5wLmludGVncmF0ZWQpIDwtIGFzLmZhY3RvcihpbnAuaW50ZWdyYXRlZCRjZWxsX3R5cGUpCiMgU2V0IHRoZSBvcmRlciBvZiB0aGUgbGV2ZWxzIGZvciB0aGUgZmFjdG9yCmlucC5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCA8LSBmYWN0b3IoaW5wLmludGVncmF0ZWRAYWN0aXZlLmlkZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJlYXJseV9JTlAiLCAibGF0ZV9JTlAiLCAiVjFSX2lWU04iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYyUl9pVlNOIiwgImlPU04iLCAibU9TTiIpKQoKCmBgYAoKYGBge3J9CgpmaWczX2QgPC0gRGltUGxvdChuZXVyb24uaW50ZWdyYXRlZCxsYWJlbD1UUlVFLGxhYmVsLnNpemU9OCxwdC5zaXplPTEuNSkgKyAKICBOb0xlZ2VuZCgpICsgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMyw0KSx4bGltPWMoOC41LDE1KSkKZmlnM19kCgpgYGAKCiMjIEZlYXR1cmUgcGxvdHMgZm9yIHNlbGVjdCBnZW5lcyBleHByZXNzZWQgZWFybHkgaW4gdGhlIG5ldXJvbmFsIGxpbmVhZ2UgIAoKYGBge3J9CgpGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJBc2NsMSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTMsNCkseGxpbT1jKDguNSwxNSkpCgpGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJTb3gyIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygtMyw0KSx4bGltPWMoOC41LDE1KSkKCkZlYXR1cmVQbG90KG5ldXJvbi5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIk5ldXJvZDEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0zLDQpLHhsaW09Yyg4LjUsMTUpKQoKRmVhdHVyZVBsb3QobmV1cm9uLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTmV1cm9nMSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoLTMsNCkseGxpbT1jKDguNSwxNSkpCgpGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJTcDgiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKC0zLDQpLHhsaW09Yyg4LjUsMTUpKQoKYGBgCgojIyBVTUFQIG9mIElOUCwgaVZTTiwgaU9TTiwgYW5kIG1PU04gY2VsbCB0eXBlcyAgCgpgYGB7cn0KCkRpbVBsb3QoaW5wLmludGVncmF0ZWQsIHB0LnNpemU9MSwgbGFiZWw9VFJVRSwgY29scz1uZXVyb24uY2VsbF90eXBlLmNvbG9ycywgbGFiZWwuc2l6ZT04LCByZXBlbD1UUlVFKSArIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCgpgYGAKCiMjIE5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBvZiBjYW5kaWRhdGUgZ2VuZXMgZm9yIFYxUi9WMlIvT1NOIGxpbmVhZ2UgZGV0ZXJtaW5hdGlvbiAtIFYxUiBleHByZXNzaW5nIGdlbmVzICAKCmBgYHtyfQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTWVpczIiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJTY3QiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJGYW0xODNiIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTWlyMTAwaGciKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJBY2FkMTAiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpgYGAKCiMjIE5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBvZiBjYW5kaWRhdGUgZ2VuZXMgZm9yIFYxUi9WMlIvT1NOIGxpbmVhZ2UgZGV0ZXJtaW5hdGlvbiAgCgpgYGB7cn0KCkZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIlRmYXAyZSIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiRmV6ZjEiKSxvcmRlcj1UUlVFLHB0LnNpemU9MSxjb2xzPWMoImN5YW4iLCJtYWdlbnRhIikpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCkZlYXR1cmVQbG90KGlucC5pbnRlZ3JhdGVkLGZlYXR1cmVzPWMoIk9saWcyIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpGZWF0dXJlUGxvdChpbnAuaW50ZWdyYXRlZCxmZWF0dXJlcz1jKCJUc2h6MiIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiTmZpYiIpLG9yZGVyPVRSVUUscHQuc2l6ZT0xLGNvbHM9YygiY3lhbiIsIm1hZ2VudGEiKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKRmVhdHVyZVBsb3QoaW5wLmludGVncmF0ZWQsZmVhdHVyZXM9YygiQmNsMTFiIiksb3JkZXI9VFJVRSxwdC5zaXplPTEsY29scz1jKCJjeWFuIiwibWFnZW50YSIpKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCgpgYGAKCg==