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



Novel neuronal lineage

UMAP visualization of cell-type clusters for the neuronal lineage

How many mature neurons are OSNs?


all_mature_neurons <- c("V1R_mVSN","V2R_mVSN","mOSN","sVSN")
table(neuron.integrated@active.ident)[c("mOSN")]/sum(table(neuron.integrated@active.ident)[all_mature_neurons])
      mOSN 
0.02236955 

Expression of Gnai2 and Gnao1 in the neuronal lineage

Expression of Cnga2 and Gnal in the OSN lineage

Location of mOSNs

Location of sVSNs in a VNO slice

Heatmap of normalized expression for a select set of mutually differentially expressed genes between sVSNs and mature V1Rs, V2Rs, and OSNs

Enriched gene ontology (GO) terms in sVSNs when compared with V1R and V2R VSNs, respectively

Box plots of normalized expression for Muc2, Obp2a, Obp2b, and Lcn3 across mature sensory neurons

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSAyIgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCgpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9CgpjYXQoIjxidXR0b24gb25jbGljaz0naGlzdG9yeS5iYWNrKCknIHN0eWxlPSdmb250LXNpemU6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA1cHg7Jz5DbGljayBIZXJlIHRvIFJldHVybiB0byBQcmV2aW91cyBQYWdlPC9idXR0b24+IikKCmBgYAoKYGBge3IsIGVuZ2luZT0nY3NzJywgZWNobyA9IEZBTFNFfQoKLm5hdi1waWxscyA+IGxpID4gYSB7CiAgY29sb3I6IGJsYWNrOyAvKiBTZXQgaW5hY3RpdmUgdGFiIHRleHQgY29sb3IgdG8gYmxhY2sgKi8KfQoKLm5hdi1waWxscyA+IGxpID4gYTpob3ZlciwgLm5hdi1waWxscyA+IGxpID4gYTpmb2N1cywgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsCi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYTpmb2N1cyB7CiAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IC8qIFNldCBob3ZlciBiYWNrZ3JvdW5kIGNvbG9yIHRvIGEgZGFya2VyIGdyYXkgKi8KICBjb2xvcjogd2hpdGU7IC8qIFNldCBob3ZlciB0ZXh0IGNvbG9yIHRvIHdoaXRlIGZvciBiZXR0ZXIgY29udHJhc3QgKi8KfQogICAgIApgYGAKCgo+VGhpcyBmaWxlIGNvbnRhaW5zIHN0YXRpc3RpY3MgYW5kIGZpZ3VyZXMgZnJvbSB0aGUgcGFwZXIsICJNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb24iIGJ5IE1heCBIaWxscyBKci4sIExpbWVpIE1hLCBBaSBGYW5nLCBUaGVsbWEgQ2hpcmVtYmEsIFNldGggTWFsbG95LCBBbGxpc29uIFNjb3R0LCBBbm9qYSBQZXJlcmEsIGFuZCBDLiBSb24gWXUuICAgIAoKVGhlIHBhcGVyIGNhbiBiZSBmb3VuZCBoZXJlOiAgCgpbTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uXShodHRwczovL2VsaWZlc2NpZW5jZXMub3JnL3Jldmlld2VkLXByZXByaW50cy85NzM1NiN0YWItY29udGVudCkKCioqKiAgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiMgUi1NYXJrZG93biBHbG9iYWwgU2V0dGluZ3MgIAoKIyBTZXQtdXAgYSBkZWZhdWx0IGltYWdlIHNpemUgb2YgMTAgWCAxMCBpbmNoZXMuIFN1cHByZXNzIHdhcm5pbmcKIyBhbmQgZXJyb3IgbWVzc2FnZXMuIEhpZGUgY29kZS4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNvbW1lbnQ9IiIsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBjYWNoZT1GQUxTRSkKCmBgYAoKYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPUZBTFNFfQoKIyBMaWJyYXJ5IExvYWRpbmcgIAoKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKHsKICBsaWJyYXJ5KGtpdCk7IGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShzdHJpbmdyKTsgbGlicmFyeShwbG90M0QpIAogIGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkoZGF0YS50YWJsZSk7IGxpYnJhcnkob3JnLk1tLmVnLmRiKQogIGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KFNldXJhdCk7IGxpYnJhcnkoREJJKTsgbGlicmFyeShjb3dwbG90KQogIGxpYnJhcnkoTWF0cml4KTsgbGlicmFyeShnbG1HYW1Qb2kpOyBsaWJyYXJ5KGNpcmNsaXplKQogIGxpYnJhcnkodGliYmxlKTsgbGlicmFyeShnZ3B1YnIpOyBsaWJyYXJ5KHN2Z2xpdGUpOyBsaWJyYXJ5KGdnc2lnbmlmKQogIGxpYnJhcnkoc3RhdHMpOyBsaWJyYXJ5KHZlZ2FuKTsgbGlicmFyeShzY2FsZXMpOyBsaWJyYXJ5KGNhcmV0KQogIGxpYnJhcnkocGF0Y2h3b3JrKTsgbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdlb210ZXh0cGF0aCkKICBsaWJyYXJ5KG9wZW54bHN4KTsgbGlicmFyeShncmlkRXh0cmEpOyBsaWJyYXJ5KGdncmVwZWwpCiAgbGlicmFyeShHZW5lT3ZlcmxhcCk7IGxpYnJhcnkoYmlvbWFSdCk7IGxpYnJhcnkoZ2dwb2ludGRlbnNpdHkpCiAgbGlicmFyeShzbGluZ3Nob3QpOyBsaWJyYXJ5KHRyYWRlU2VxKTsgbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKICBsaWJyYXJ5KHZpcmlkaXMpOyBsaWJyYXJ5KFVwU2V0Uik7IGxpYnJhcnkocGhlYXRtYXApOyBsaWJyYXJ5KG1zaWdkYnIpCiAgbGlicmFyeShmZ3NlYSk7IGxpYnJhcnkoZ3JpZCk7IGxpYnJhcnkoSURQbWlzYyk7IGxpYnJhcnkoTUFTUykKICBsaWJyYXJ5KFJtaXNjKTsgbGlicmFyeShnZ3Bsb3RpZnkpOyBsaWJyYXJ5KGdncG1pc2MpOyBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KGhlYXRtYXBseSk7IGxpYnJhcnkoZGVuZGV4dGVuZCkKfSkKCmBgYAoKYGBge3J9CgojIEdsb2JhbCBWYXJpYWJsZXMKCiMgVGhlIGhvbWUgZGlyZWN0b3J5CmhvbWVfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvc2NfVk5PLyIKIyBEaXJlY3RvcnkgZm9yIHN0b3JpbmcgZGF0YSBvYmplY3RzIGF0IGNydWNpYWwgc3RhZ2VzCm9iamVjdF9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbC5zZXUub2Jqcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZyb20gdGhlIGZpbmFsIGFuYWx5c2lzCmltYWdlX2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsX2ltYWdlcy8iKQphZG9iZV9pbWFnZXMgPC0gcGFzdGUwKGltYWdlX2RpciwgImFkb2JlX2lsbHVzdHJhdG9yX3N2Z19maWxlcy8iKQojIERpcmVjdG9yeSBmb3IgaW1hZ2VzIGZvciB0aGUgZmluYWwgcGFwZXIKY2x1c3RyZWVfZGlyIDwtIHBhc3RlMChpbWFnZV9kaXIsImNsdXN0cmVlLyIpCiMgQSBkaXJlY3RvcnkgZm9yIFRyYWRlU2VxIGZpdEdBTSBvdXRwdXQKZml0R0FNX2RpciA8LSBwYXN0ZTAob2JqZWN0X2RpciwgImZpdEdBTS8iKQptb2VfZGlyIDwtICIvbC9ZdS9ZdUxhYi9CaW9pbmZvcm1hdGljcy9wcm9qZWN0cy9taGgvbW9sbmdfMjQwN18yNDUzL1Jfb2JqLyIKCiMgT1BFTiBgYGB2bm8uc2V1LmludGVncmF0ZWRgYGAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInZuby5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKI0xvYWQgTmV1cm9uYWwgTGluZWFnZSBTZXVyYXQgT2JqZWN0ICAKbG9hZChmaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIm5ldXJvbi5pbnRlZ3JhdGVkLnBvc3RDZWxsSUQiKSkKCiMgUmVuYW1lIHVua25vd25fbVZTTiB0byBzVlNOCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWQkY2VsbF90eXBlKT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgoKIyBHZXQgY29sb3Igc2NoZW1lIGZvciB0aGUgd2hvbGUgdm5vIGRhdGFzZXQKdm5vLmNlbGxfdHlwZS5jb2xvcnMgPC0gaHVlX3BhbCgpKGxlbmd0aChsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkpKQpuYW1lcyh2bm8uY2VsbF90eXBlLmNvbG9ycykgPC0gbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpCgojIEtlZXAgbmV1cm9uIGRhdGFzZXQgY29sb3Igc2NoZW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2hvbGUgdm5vIGNvbG9yIHNjaGVtZSwgd2hlcmUgcG9zc2libGUgIApuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSB2bm8uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iLCJWMVJfaVZTTiIsIlYyUl9pVlNOIiwiR0JDIildCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHNldE5hbWVzKGMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMsIiMwMEIwRjYiLCIjOTU5MEZGIiwiI0U3NkJGMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG5hbWVzKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzKSwiaU9TTiIsImxhdGVfSU5QIiwiZWFybHlfSU5QIikpCgptYXR1cmUubmV1cm9ucyA8LSBzdWJzZXQobmV1cm9uLmludGVncmF0ZWQsaWRlbnRzPWMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpKQptYXR1cmUuY2VsbF90eXBlLmNvbG9ycyA8LSBuZXVyb24uY2VsbF90eXBlLmNvbG9yc1tjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKV0KCmdsb2JhbC52YXJzIDwtIGMobHMoKSwiZ2xvYmFsLnZhcnMiKQoKYGBgCgoqKiogIAoKIyBOb3ZlbCBuZXVyb25hbCBsaW5lYWdlIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIyBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBvZiBHZW5lcyBBY3Jvc3MgQ2VsbC1UeXBlcwpWMVJfaVZTTl9WMlJfaVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMVJfaVZTTl9WMlJfaVZTTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQpWMVJfaVZTTl9pT1NOLkRFR3MgPC0gCiAgcmVhZC54bHN4KHhsc3hGaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIlYxUl9pVlNOX2lPU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKVjJSX2lWU05faU9TTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJWMlJfaVZTTl9pT1NOLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpClYxUl9tVlNOX1YyUl9tVlNOLkRFR3MgPC0gCiAgcmVhZC54bHN4KHhsc3hGaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIlYxUl9tVlNOX1YyUl9tVlNOLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpClYxUl9pVlNOX2xhdGVfSU5QLkRFR3MgPC0gCiAgcmVhZC54bHN4KHhsc3hGaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIlYxUl9pVlNOX2xhdGVfSU5QLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpClYyUl9pVlNOX2xhdGVfSU5QLkRFR3MgPC0gCiAgcmVhZC54bHN4KHhsc3hGaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsIlYyUl9pVlNOX2xhdGVfSU5QLkRFR3MueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMVJfbVZTTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjFSX21WU04uREVHcy54bHN4Iikscm93TmFtZXM9VFJVRSkKdW5rbm93bl9tVlNOX1YyUl9tVlNOLkRFR3MgPC0gCiAgcmVhZC54bHN4KHhsc3hGaWxlID0gcGFzdGUwKG9iamVjdF9kaXIsInVua25vd25fbVZTTl9WMlJfbVZTTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fbU9TTi5ERUdzIDwtIAogIHJlYWQueGxzeCh4bHN4RmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fbU9TTi5ERUdzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQoKIyBHZW5lLXNldCBFbnJpY2htZW50IEFuYWx5c2lzIG9mIEdPIFRlcm1zIGZvciBVbmtub3duIG1WU05zIHZzIE90aGVyIE5ldXJvbiBUeXBlcwp1bmtub3duX21WU05fVjFSX21WU04uQlAucmVzIDwtIAogIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInVua25vd25fbVZTTl9WMVJfbVZTTi5CUC5yZXMueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMlJfbVZTTi5CUC5yZXMgPC0gCiAgb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YyUl9tVlNOLkJQLnJlcy54bHN4Iikscm93TmFtZXM9VFJVRSkKdW5rbm93bl9tVlNOX1YxUl9tVlNOLk1GLnJlcyA8LSAKICBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjFSX21WU04uTUYucmVzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQp1bmtub3duX21WU05fVjJSX21WU04uTUYucmVzIDwtIAogIG9wZW54bHN4OjpyZWFkLnhsc3goeGxzeEZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInVua25vd25fbVZTTl9WMlJfbVZTTi5NRi5yZXMueGxzeCIpLHJvd05hbWVzPVRSVUUpCnVua25vd25fbVZTTl9WMVJfbVZTTi5DQy5yZXMgPC0gCiAgb3Blbnhsc3g6OnJlYWQueGxzeCh4bHN4RmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidW5rbm93bl9tVlNOX1YxUl9tVlNOLkNDLnJlcy54bHN4Iikscm93TmFtZXM9VFJVRSkKdW5rbm93bl9tVlNOX1YyUl9tVlNOLkNDLnJlcyA8LSAKICBvcGVueGxzeDo6cmVhZC54bHN4KHhsc3hGaWxlPXBhc3RlMChvYmplY3RfZGlyLCJ1bmtub3duX21WU05fVjJSX21WU04uQ0MucmVzLnhsc3giKSxyb3dOYW1lcz1UUlVFKQoKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCJyZXNvbHZlLmRhdGFzZXRzLlBPU1RwcmVkaWN0IikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwicmVzb2x2ZS5wcmVkaWN0aW9ucy5hc3NheSIpKQoKYGBgCgojIyBVTUFQIHZpc3VhbGl6YXRpb24gb2YgY2VsbC10eXBlIGNsdXN0ZXJzIGZvciB0aGUgbmV1cm9uYWwgbGluZWFnZSAgCgpgYGB7cn0KCmZpZzJfYSA8LSBEaW1QbG90KG5ldXJvbi5pbnRlZ3JhdGVkLCByZWR1Y3Rpb249InVtYXAiLCBsYWJlbD1UUlVFLCBzaHVmZmxlPVRSVUUsIGNvbHM9bmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpICsKICBnZ3RpdGxlKCJOZXVyb25hbCBMaW5lYWdlIikgKyBOb0xlZ2VuZCgpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcyX2Euc3ZnIiksIHdpZHRoPTEwLCBoZWlnaHQ9MTApCmZpZzJfYQppbnZpc2libGUoZGV2Lm9mZigpKQpmaWcyX2EKCmBgYAoKPkhvdyBtYW55IG1hdHVyZSBuZXVyb25zIGFyZSBPU05zPyAgCgpgYGB7ciwgZWNobz1UUlVFfQoKYWxsX21hdHVyZV9uZXVyb25zIDwtIGMoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpCnRhYmxlKG5ldXJvbi5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbYygibU9TTiIpXS9zdW0odGFibGUobmV1cm9uLmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVthbGxfbWF0dXJlX25ldXJvbnNdKQoKYGBgCgojIyBFeHByZXNzaW9uIG9mIEduYWkyIGFuZCBHbmFvMSBpbiB0aGUgbmV1cm9uYWwgbGluZWFnZSAgCgpgYGB7ciwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CgpmaWcyX2IgPC0gRmVhdHVyZVBsb3QobmV1cm9uLmludGVncmF0ZWQsIGZlYXR1cmVzPWMoIkduYWkyIiwiR25hbzEiKSwgb3JkZXI9VFJVRSwgYmxlbmQ9VFJVRSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzJfYi5zdmciKSx3aWR0aD0xNiwgaGVpZ2h0PTQpCmZpZzJfYgppbnZpc2libGUoZGV2Lm9mZigpKQoKZmlnMl9iCgpgYGAKCiMjIEV4cHJlc3Npb24gb2YgQ25nYTIgYW5kIEduYWwgaW4gdGhlIE9TTiBsaW5lYWdlICAKCmBgYHtyLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0KCmZpZzJfYyA8LSBGZWF0dXJlUGxvdChuZXVyb24uaW50ZWdyYXRlZCwgZmVhdHVyZXM9YygiQ25nYTIiLCJHbmFsIiksIAogICAgICAgICAgICBjb2xzPWMoImN5YW4zIiwibWFnZW50YSIpLCBvcmRlcj1UUlVFLCBuY29sPTIpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzJfYy5zdmciKSwgd2lkdGg9MTAsIGhlaWdodD01KQpmaWcyX2MKaW52aXNpYmxlKGRldi5vZmYoKSkKCmZpZzJfYwoKYGBgCgojIyBMb2NhdGlvbiBvZiBtT1NOcyAgCgpgYGB7cn0KCmZpZzJkLnNhbXBsZXMgPC0gcmVzb2x2ZS5kYXRhc2V0c1tbInNsaWRlNy5CMl8yIl1dCgpgYGAKCmBgYHtyfQoKZmlnMl9PU04gPC0gU3BhdGlhbEZlYXR1cmVQbG90KGZpZzJkLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzEyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5zaXplLmZhY3Rvcj00LCkgKyB0aGVtZShhc3BlY3QucmF0aW89MSxsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41LHNpemU9MzYpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImdyZXk4NSIsaGlnaD0ibWFnZW50YSIpICsgZ2d0aXRsZSgibU9TTnMiKQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzJfT1NOLnN2ZyIpLCB3aWR0aD05LCBoZWlnaHQ9OSkKZmlnMl9PU04KaW52aXNpYmxlKGRldi5vZmYoKSkKZmlnMl9PU04KCmBgYAoKIyMgTG9jYXRpb24gb2Ygc1ZTTnMgaW4gYSBWTk8gc2xpY2UgIAoKYGBge3J9CgpmaWcyX3NWU04gPC0gU3BhdGlhbEZlYXR1cmVQbG90KGZpZzJkLnNhbXBsZXMsIGZlYXR1cmVzPXJvd25hbWVzKHJlc29sdmUucHJlZGljdGlvbnMuYXNzYXkpWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0LnNpemUuZmFjdG9yPTQsKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0xLGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsc2l6ZT0zNikpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0iZ3JleTg1IixoaWdoPSJtYWdlbnRhIikgKyBnZ3RpdGxlKCJzVlNOcyIpCgpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnMl9zVlNOLnN2ZyIpLCB3aWR0aD05LCBoZWlnaHQ9OSkKZmlnMl9zVlNOCmludmlzaWJsZShkZXYub2ZmKCkpCmZpZzJfc1ZTTgoKYGBgCgojIyBIZWF0bWFwIG9mIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBmb3IgYSBzZWxlY3Qgc2V0IG9mIG11dHVhbGx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIHNWU05zIGFuZCBtYXR1cmUgVjFScywgVjJScywgYW5kIE9TTnMgIAoKYGBge3J9CgpzdnNuLmdvaSA8LSBjKCJDc3BwMSIsIkQxMFdzdTEwMmUiLCJHbTE2NTc5IiwiTmVhdDEiLCJQMnJ5MTQiLCJSYm00YiIsIlduazEiLCJaZnA3MzgiLAogICAgICAgICAgICAgICJDb3g2YTEiLCJDb3g3YTIiLCJKdW5kIiwiTWFwMWxjM2IiLCJOZHVmYTIiLCJOZHVmYTciLCJPbXAiLCJQcnhsMmIiKQoKbVNOLm1hdHJpeCA8LSBHZXRBc3NheURhdGEoc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSksc2xvdD0nZGF0YScpCnNWU04udG9wLmRmIDwtIGFzLmRhdGEuZnJhbWUobVNOLm1hdHJpeFtzdnNuLmdvaSwgXSkKCiMgVGhlIGNlbGwgSURzIGZvciBBTEwgbWF0dXJlIHNlbnNvcnkgbmV1cm9ucwptYXR1cmUubmV1cm9uLmNlbGxJRHMgPC0gV2hpY2hDZWxscyhvYmplY3Q9bmV1cm9uLmludGVncmF0ZWQsIGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKIyBHZXQgY29ycmVzcG9uZGluZyBjZWxsLXR5cGUgbWV0YWRhdGEgZm9yIGNvbHVtbiBhbm5vdGF0aW9ucwptYXR1cmUubmV1cm9uLmFubm90YXRpb24gPC0gZGF0YS5mcmFtZShjZWxsX3R5cGU9bmV1cm9uLmludGVncmF0ZWRAbWV0YS5kYXRhW21hdHVyZS5uZXVyb24uY2VsbElEcyxjKCJjZWxsX3R5cGUiKSxkcm9wPUZBTFNFXSkKc3Zzbi5jZWxsLm9yZGVyIDwtIG9yZGVyKG1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbiRjZWxsX3R5cGUpCm1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbiA8LSBhcy5kYXRhLmZyYW1lKG1hdHVyZS5uZXVyb24uYW5ub3RhdGlvbltzdnNuLmNlbGwub3JkZXIsICxkcm9wPUZBTFNFXSkKc1ZTTi50b3AuZGYgPC0gc1ZTTi50b3AuZGZbICxzdnNuLmNlbGwub3JkZXJdCgpybShtU04ubWF0cml4LG1hdHVyZS5uZXVyb24uY2VsbElEcykKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQoKIyBDdXN0b20gUGFsZXR0ZSBmb3IgZ2VuZSBleHByZXNzaW9uCmNvbG9ycyA8LSBjKCIjMDA3RkZGIiwgIiMyRThCNTciLCAiI0ZGRkY2NiIsICIjRkZBNTAwIiwgIiNGRjAwMDAiKQpwYWxldHRlIDwtIGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzKQoKIyBDdXN0b20gUGFsZXR0ZSBmb3IgQ2VsbCBUeXBlcwpmaWcyX2cucGFsZXR0ZSA8LXdlc2FuZGVyc29uOjp3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKVsyOjVdCm5hbWVzKGZpZzJfZy5wYWxldHRlKSA8LSBjKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKQoKIyBBbm5vdGF0aW9uIENvbG9yIFNjaGVtYXRpYyAKdnNuLmFubl9jb2xvcnMgPC0gbGlzdChjZWxsX3R5cGU9ZmlnMl9nLnBhbGV0dGUpCgpmaWcyX2cgPC0gcGhlYXRtYXAobWF0PXNWU04udG9wLmRmLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yPXBhbGV0dGUobj01MCksIGZvbnRzaXplPTE0LCB0cmVlaGVpZ2h0X2NvbCA9IDAsIGNlbGx3aWR0aCA9IDAuMDQsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3M9VFJVRSwgY2x1c3Rlcl9jb2xzPUZBTFNFLCAjc2NhbGU9InJvdyIsIAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2w9bWF0dXJlLm5ldXJvbi5hbm5vdGF0aW9uLCBzaG93X2NvbG5hbWVzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgc2hvd19yb3duYW1lcz1UUlVFLCBhbm5vdGF0aW9uX2NvbG9ycz12c24uYW5uX2NvbG9ycykKCmBgYAoKIyMgRW5yaWNoZWQgZ2VuZSBvbnRvbG9neSAoR08pIHRlcm1zIGluIHNWU05zIHdoZW4gY29tcGFyZWQgd2l0aCBWMVIgYW5kIFYyUiBWU05zLCByZXNwZWN0aXZlbHkgIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgojIENvbWJpbmVkIEdPIFJlc3VsdHMgZm9yIFVua25vd24gbVZTTnMgVlMgVjFScwp1bmtub3duX21WU05fVl9WMVIuR08gPC0gcmJpbmQodW5rbm93bl9tVlNOX1YxUl9tVlNOLkJQLnJlcyx1bmtub3duX21WU05fVjFSX21WU04uTUYucmVzLHVua25vd25fbVZTTl9WMVJfbVZTTi5DQy5yZXMpCiMgUmVtb3ZlIE5Bcwp1bmtub3duX21WU05fVl9WMVIuR08gPC0gbmEub21pdCh1bmtub3duX21WU05fVl9WMVIuR08pCiMgSnVzdCBzaWduaWZpY2FudCByZXN1bHRzCnVua25vd25fbVZTTl9WX1YxUi5HTyA8LSB1bmtub3duX21WU05fVl9WMVIuR09bdW5rbm93bl9tVlNOX1ZfVjFSLkdPJHBhZGogPD0gMC4wNSwgXQojIENyZWF0ZSBhIGNvbHVtbiBmb3IgR08gY2F0ZWdvcnkKdW5rbm93bl9tVlNOX1ZfVjFSLkdPJENhdGVnb3J5IDwtIHN1YnN0cmluZyh1bmtub3duX21WU05fVl9WMVIuR08kcGF0aHdheSxmaXJzdD0zLGxhc3Q9NCkKdW5rbm93bl9tVlNOX1ZfVjFSLkdPJHBhdGh3YXkgPC0gc3Vic3RyaW5nKHVua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5LGZpcnN0PTYpCiMgT3JkZXIgYnkgbm9ybWFsaXplZCBlbnJpY2htZW50IHNjb3JlCnVua25vd25fbVZTTl9WX1YxUi5HTyA8LSB1bmtub3duX21WU05fVl9WMVIuR09bb3JkZXIodW5rbm93bl9tVlNOX1ZfVjFSLkdPJE5FUyksIF0KdW5rbm93bl9tVlNOX1ZfVjFSLkdPJHBhdGh3YXkgPC0gZmFjdG9yKHVua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5LCBsZXZlbHM9dW5rbm93bl9tVlNOX1ZfVjFSLkdPJHBhdGh3YXkpCgojIENvbWJpbmQgR08gUmVzdWx0cyBmb3IgVW5rbm93biBtVlNOcyBWUyBWMlJzCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSByYmluZCh1bmtub3duX21WU05fVjJSX21WU04uQlAucmVzLHVua25vd25fbVZTTl9WMlJfbVZTTi5NRi5yZXMsdW5rbm93bl9tVlNOX1YyUl9tVlNOLkNDLnJlcykKIyBSZW1vdmUgTkFzCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSBuYS5vbWl0KHVua25vd25fbVZTTl9WX1YyUi5HTykKIyBKdXN0IHNpZ25pZmljYW50IHJlc3VsdHMKdW5rbm93bl9tVlNOX1ZfVjJSLkdPIDwtIHVua25vd25fbVZTTl9WX1YyUi5HT1t1bmtub3duX21WU05fVl9WMlIuR08kcGFkaiA8PSAwLjA1LCBdCiMgQ3JlYXRlIGEgY29sdW1uIGZvciBHTyBjYXRlZ29yeQp1bmtub3duX21WU05fVl9WMlIuR08kQ2F0ZWdvcnkgPC0gc3Vic3RyaW5nKHVua25vd25fbVZTTl9WX1YyUi5HTyRwYXRod2F5LGZpcnN0PTMsbGFzdD00KSAKdW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhdGh3YXkgPC0gc3Vic3RyaW5nKHVua25vd25fbVZTTl9WX1YyUi5HTyRwYXRod2F5LGZpcnN0PTYpCiMgU29ydCBieSBub3JtYWxpemVkIGVucmljaG1lbnQgc2NvcmUKdW5rbm93bl9tVlNOX1ZfVjJSLkdPIDwtIHVua25vd25fbVZTTl9WX1YyUi5HT1tvcmRlcih1bmtub3duX21WU05fVl9WMlIuR08kTkVTKSwgXQp1bmtub3duX21WU05fVl9WMlIuR08kcGF0aHdheSA8LSBmYWN0b3IodW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhdGh3YXksIGxldmVscz11bmtub3duX21WU05fVl9WMlIuR08kcGF0aHdheSkKCmBgYAoKYGBge3J9CgojIFJlbW92ZSBHTy1UZXJtcyB3aXRoIDEwMDAgb3IgbW9yZSBhc3NvY2lhdGVkIGdlbmVzCnVua25vd25fbVZTTl9WX1YxUi5HTyA8LSB1bmtub3duX21WU05fVl9WMVIuR09bdW5rbm93bl9tVlNOX1ZfVjFSLkdPJHNpemUgPCAxMDAwLCBdCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSB1bmtub3duX21WU05fVl9WMlIuR09bdW5rbm93bl9tVlNOX1ZfVjJSLkdPJHNpemUgPCAxMDAwLCBdCgojIFRlcm1zIHRvIHJlbW92ZSAKdjFyLmdvLnJlbW92ZSA8LSBjKCJFU1RBQkxJU0hNRU5UX09GX1BST1RFSU5fTE9DQUxJWkFUSU9OX1RPX09SR0FORUxMRSIpCnYyci5nby5yZW1vdmUgPC0gYygiUklCT1NPTUFMX1NVQlVOSVQiLCJSSUJPU09NRSIpCgp1bmtub3duX21WU05fVl9WMVIuR08gPC0gdW5rbm93bl9tVlNOX1ZfVjFSLkdPW3Vua25vd25fbVZTTl9WX1YxUi5HTyRwYXRod2F5IT12MXIuZ28ucmVtb3ZlLCBdCnVua25vd25fbVZTTl9WX1YyUi5HTyA8LSB1bmtub3duX21WU05fVl9WMlIuR09bdW5rbm93bl9tVlNOX1ZfVjJSLkdPJHBhdGh3YXkhPXYyci5nby5yZW1vdmUsIF0KCmBgYAoKYGBge3J9CgpmaWcyX2UucGFydDEgPC0gZ2dwbG90KHVua25vd25fbVZTTl9WX1YxUi5HTywgYWVzKHg9cGF0aHdheSx5PU5FUyxmaWxsPUNhdGVnb3J5KSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEscGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpKSArCiAgZ2d0aXRsZSgiRW5yaWNoZWQgR08gVGVybXM6IHNWU05zIHZzIFYxUiBtVlNOcyIpICsKICB4bGFiKCJHTyBUZXJtIikgKwogIGNvb3JkX2ZsaXAoKQoKYGBgCgpgYGB7cn0KCmZpZzJfZS5wYXJ0MiA8LSBnZ3Bsb3QodW5rbm93bl9tVlNOX1ZfVjJSLkdPLCBhZXMoeD1wYXRod2F5LHk9TkVTLGZpbGw9Q2F0ZWdvcnkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIikpICsKICBnZ3RpdGxlKCJFbnJpY2hlZCBHTyBUZXJtcyBpbiBzVlNOcyB2cyBWMlIgbVZTTnMiKSArCiAgeGxhYigiR08gVGVybSIpICsKICBjb29yZF9mbGlwKCkKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCmZpZzJfZSA8LSBnZ2FycmFuZ2UocGxvdGxpc3Q9bGlzdChWMVI9ZmlnMl9lLnBhcnQxLFYyUj1maWcyX2UucGFydDIpLCBucm93PTIsIG5jb2w9MSwgCiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmxlZ2VuZD1UUlVFLCBhbGlnbiA9ICJodiIsIGxlZ2VuZCA9ICJyaWdodCIpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWcyX2Uuc3ZnIiksd2lkdGg9OCxoZWlnaHQ9OCkKZmlnMl9lCmludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCmBgYHtyfQoKZmlnMl9lCgpgYGAKCiMjIEJveCBwbG90cyBvZiBub3JtYWxpemVkIGV4cHJlc3Npb24gZm9yIE11YzIsIE9icDJhLCBPYnAyYiwgYW5kIExjbjMgYWNyb3NzIG1hdHVyZSBzZW5zb3J5IG5ldXJvbnMgIAoKYGBge3J9CgojIEdldCBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGZlYXR1cmVzIG9mIHNWU05zCnNWU04uY29tcGFyZS5kZiA8LSBGZXRjaERhdGEobWF0dXJlLm5ldXJvbnMsdmFycz1jKCJjZWxsX3R5cGUiLCJuRmVhdHVyZV9STkEiLCJuQ291bnRfUk5BIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmNlbnQucmlibyIsIlAycnkxNCIsIkFwMXMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNzcHAxIiwiTXVjMiIsIk9icDJhIiwiT2JwMmIiLCJMY24zIiwjIyBVcC1yZWd1bGF0ZWQgZ2VuZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9tcCIsIlR1YmExYSIsIlB0bWEiKSkgICAgICAgICAgICAgICAjIyBEb3duLXJlZ3VsYXRlZCBnZW5lcwoKbXlfY29tcGFyaXNvbnMgPSBsaXN0KGMoIlYxUl9tVlNOIiwiVjJSX21WU04iKSxjKCJWMlJfbVZTTiIsIm1PU04iKSxjKCJtT1NOIiwic1ZTTiIpLAogICAgICAgICAgICAgICAgICAgICAgYygiVjFSX21WU04iLCJtT1NOIiksYygiVjJSX21WU04iLCJzVlNOIiksYygiVjFSX21WU04iLCJzVlNOIikpCgpteV90aGVtZV8yIDwtIHRoZW1lKGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0yMCksICAgICAgICAgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIHkgYXhpcyBsYWJlbAogICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICNkb24ndCBzaG93IHggYXhpcyBsYWJlbAogICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MzIsaGp1c3Q9MC41KSwgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIHBsb3QgdGl0bGUsIGNlbnRlcgogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksICAgICAgICAgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIGxlZ2VuZCB0aXRsZQogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwgICAgICAgICAgICAgICNjaGFuZ2UgZm9udCBzaXplIG9mIGxlZ2VuZCB0ZXh0CiAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MjApLCAgICAgICAgICAgICAgI2NoYW5nZSBmb250IHNpemUgb2YgYXhpcyB0aWNrIGxhYmVscwogICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICNkb24ndCBzaG93IHgtYXhpcyB0aWNrIGxhYmVscwogICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICNkb24ndCBzaG93IHgtYXhpcyB0aWNrcwogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZT11bml0KDgsJ21tJyksICAgICAgICAgICAgICAgICAgICN0aGUgc2l6ZSBvZiBsZWdlbmQgJ2JveGVzJwogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZS5hbGlnbj0wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICNsZWZ0IGFsaWduIGxlZ2VuZCB0aXRsZQogICAgICAgICAgICAgICAgICAgIGFzcGVjdC5yYXRpbz0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNrZWVwIHBsb3RzIHNxdWFyZQoKYGBgCgpgYGB7cn0KCnAxIDwtIGdncGxvdChzVlNOLmNvbXBhcmUuZGYsYWVzKHg9Y2VsbF90eXBlLHk9TXVjMixmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1tYXR1cmUuY2VsbF90eXBlLmNvbG9ycykgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTIwLGNvbG91cj0iYmxhY2siLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnM9bXlfY29tcGFyaXNvbnMsdGlwLmxlbmd0aD0wLjAxLAogICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIGdndGl0bGUoIk11YzIiKSArIHlsYWIoIm5vcm1hbGl6ZWQgY291bnQiKSArIG15X3RoZW1lXzIKcDIgPC0gZ2dwbG90KHNWU04uY29tcGFyZS5kZixhZXMoeD1jZWxsX3R5cGUseT1PYnAyYSxmaWxsPWNlbGxfdHlwZSkpICsgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJDZWxsIFR5cGUiLHZhbHVlcz1tYXR1cmUuY2VsbF90eXBlLmNvbG9ycykgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTIwLGNvbG91cj0iYmxhY2siLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnM9bXlfY29tcGFyaXNvbnMsdGlwLmxlbmd0aD0wLjAxLAogICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIGdndGl0bGUoIk9icDJhIikgKyB5bGFiKCJub3JtYWxpemVkIGNvdW50IikgKyBteV90aGVtZV8yCnAzIDwtIGdncGxvdChzVlNOLmNvbXBhcmUuZGYsYWVzKHg9Y2VsbF90eXBlLHk9T2JwMmIsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbixnZW9tPSdwb2ludCcsc2l6ZT0yMCxjb2xvdXI9ImJsYWNrIixzaGFwZT05NSxzaG93X2d1aWRlPUZBTFNFKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPW15X2NvbXBhcmlzb25zLHRpcC5sZW5ndGg9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ3aWxjb3gudGVzdCIsbGFiZWw9InAuc2lnbmlmIix2anVzdD0wLjMpICsKICBnZ3RpdGxlKCJPYnAyYiIpICsgeWxhYigibm9ybWFsaXplZCBjb3VudCIpICsgbXlfdGhlbWVfMgpwNCA8LSBnZ3Bsb3Qoc1ZTTi5jb21wYXJlLmRmLGFlcyh4PWNlbGxfdHlwZSx5PUxjbjMsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMpICsgdGhlbWVfY2xhc3NpYygpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbixnZW9tPSdwb2ludCcsc2l6ZT0yMCxjb2xvdXI9ImJsYWNrIixzaGFwZT05NSxzaG93X2d1aWRlPUZBTFNFKSArCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zPW15X2NvbXBhcmlzb25zLHRpcC5sZW5ndGg9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPSJ3aWxjb3gudGVzdCIsbGFiZWw9InAuc2lnbmlmIix2anVzdD0wLjMpICsKICBnZ3RpdGxlKCJMY24zIikgKyB5bGFiKCJub3JtYWxpemVkIGNvdW50IikgKyBteV90aGVtZV8yCgpmaWcyX2YgPC0gZ2dhcnJhbmdlKHAxLHAyLHAzLHA0LG5jb2w9Mixucm93PTIsY29tbW9uLmxlZ2VuZD1UUlVFLGFsaWduPSJodiIsbGVnZW5kPSJib3R0b20iKQogIApgYGAKCmBgYHtyfQoKc3ZnbGl0ZShmaWxlbmFtZSA9IHBhc3RlMChhZG9iZV9pbWFnZXMsImZpZzJfZi5zdmciKSwgd2lkdGg9MTAsIGhlaWdodD0xMCkKZmlnMl9mCmludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCmBgYHtyfQoKZmlnMl9mCgpgYGAKCg==