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
Receptor expression in the VNO
Expression level of individual receptors
(total raw counts) plotted against the number of cells expressing the
receptor for V1R, V2R, VNO-Olfr, and MOE-Olfr
V1R
V2R
Olfr
Main Olfactory Epithelium - Olfrs
Ranked distribution of average
expression per cell for the four receptor classes. Pie charts show the
number of cells expressing a receptor at the specified range
V1R
V2R
Olfr
MOE-Olfr
Heatmaps showing the correlation of
transcription factor expression among the V1Rs or V2Rs
V1R
V2R
LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSA0IgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgiPGJ1dHRvbiBvbmNsaWNrPSdoaXN0b3J5LmJhY2soKScgc3R5bGU9J2ZvbnQtc2l6ZTogMjBweDsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDVweDsnPkNsaWNrIEhlcmUgdG8gUmV0dXJuIHRvIFByZXZpb3VzIFBhZ2U8L2J1dHRvbj4iKQoKYGBgCgpgYGB7ciwgZW5naW5lPSdjc3MnLCBlY2hvID0gRkFMU0V9CgoubmF2LXBpbGxzID4gbGkgPiBhIHsKICBjb2xvcjogYmxhY2s7IC8qIFNldCBpbmFjdGl2ZSB0YWIgdGV4dCBjb2xvciB0byBibGFjayAqLwp9CgoubmF2LXBpbGxzID4gbGkgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkgPiBhOmZvY3VzLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYSwKLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGE6aG92ZXIsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmZvY3VzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgLyogU2V0IGhvdmVyIGJhY2tncm91bmQgY29sb3IgdG8gYSBkYXJrZXIgZ3JheSAqLwogIGNvbG9yOiB3aGl0ZTsgLyogU2V0IGhvdmVyIHRleHQgY29sb3IgdG8gd2hpdGUgZm9yIGJldHRlciBjb250cmFzdCAqLwp9CiAgICAgCmBgYCAgCiAgCiAgCj5UaGlzIGZpbGUgY29udGFpbnMgc3RhdGlzdGljcyBhbmQgZmlndXJlcyBmcm9tIHRoZSBwYXBlciwgIk1vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbiIgYnkgTWF4IEhpbGxzIEpyLiwgTGltZWkgTWEsIEFpIEZhbmcsIFRoZWxtYSBDaGlyZW1iYSwgU2V0aCBNYWxsb3ksIEFsbGlzb24gU2NvdHQsIEFub2phIFBlcmVyYSwgYW5kIEMuIFJvbiBZdS4gICAgCgpUaGUgcGFwZXIgY2FuIGJlIGZvdW5kIGhlcmU6ICAKCltNb2xlY3VsYXIsIENlbGx1bGFyLCBhbmQgRGV2ZWxvcG1lbnRhbCBPcmdhbml6YXRpb24gb2YgdGhlIE1vdXNlIFZvbWVyb25hc2FsIG9yZ2FuIGF0IFNpbmdsZSBDZWxsIFJlc29sdXRpb25dKGh0dHBzOi8vZWxpZmVzY2llbmNlcy5vcmcvcmV2aWV3ZWQtcHJlcHJpbnRzLzk3MzU2I3RhYi1jb250ZW50KQoKKioqICAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKIyBSLU1hcmtkb3duIEdsb2JhbCBTZXR0aW5ncyAgCgojIFNldC11cCBhIGRlZmF1bHQgaW1hZ2Ugc2l6ZSBvZiAxMCBYIDEwIGluY2hlcy4gU3VwcHJlc3Mgd2FybmluZwojIGFuZCBlcnJvciBtZXNzYWdlcy4gSGlkZSBjb2RlLgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY29tbWVudD0iIiwKICAgICAgICAgICAgICAgICAgICAgIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIGNhY2hlPUZBTFNFKQoKYGBgCgpgYGB7ciBsaWJyYXJpZXMsIGluY2x1ZGU9RkFMU0V9CgojIExpYnJhcnkgTG9hZGluZyAgCgpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoa2l0KTsgbGlicmFyeSh0aWR5dmVyc2UpOyBsaWJyYXJ5KHN0cmluZ3IpOyBsaWJyYXJ5KHBsb3QzRCkgCiAgbGlicmFyeShnZ3Bsb3QyKTsgbGlicmFyeShkYXRhLnRhYmxlKTsgbGlicmFyeShvcmcuTW0uZWcuZGIpCiAgbGlicmFyeShkcGx5cik7IGxpYnJhcnkoU2V1cmF0KTsgbGlicmFyeShEQkkpOyBsaWJyYXJ5KGNvd3Bsb3QpCiAgbGlicmFyeShNYXRyaXgpOyBsaWJyYXJ5KGdsbUdhbVBvaSk7IGxpYnJhcnkoY2lyY2xpemUpCiAgbGlicmFyeSh0aWJibGUpOyBsaWJyYXJ5KGdncHVicik7IGxpYnJhcnkoc3ZnbGl0ZSk7IGxpYnJhcnkoZ2dzaWduaWYpCiAgbGlicmFyeShzdGF0cyk7IGxpYnJhcnkodmVnYW4pOyBsaWJyYXJ5KHNjYWxlcyk7IGxpYnJhcnkoY2FyZXQpCiAgbGlicmFyeShwYXRjaHdvcmspOyBsaWJyYXJ5KHBsb3RseSk7IGxpYnJhcnkoZ2VvbXRleHRwYXRoKQogIGxpYnJhcnkob3Blbnhsc3gpOyBsaWJyYXJ5KGdyaWRFeHRyYSk7IGxpYnJhcnkoZ2dyZXBlbCkKICBsaWJyYXJ5KEdlbmVPdmVybGFwKTsgbGlicmFyeShiaW9tYVJ0KTsgbGlicmFyeShnZ3BvaW50ZGVuc2l0eSkKICBsaWJyYXJ5KHNsaW5nc2hvdCk7IGxpYnJhcnkodHJhZGVTZXEpOyBsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQogIGxpYnJhcnkodmlyaWRpcyk7IGxpYnJhcnkoVXBTZXRSKTsgbGlicmFyeShwaGVhdG1hcCk7IGxpYnJhcnkobXNpZ2RicikKICBsaWJyYXJ5KGZnc2VhKTsgbGlicmFyeShncmlkKTsgbGlicmFyeShJRFBtaXNjKTsgbGlicmFyeShNQVNTKQogIGxpYnJhcnkoUm1pc2MpOyBsaWJyYXJ5KGdncGxvdGlmeSk7IGxpYnJhcnkoZ2dwbWlzYyk7IGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoaGVhdG1hcGx5KTsgbGlicmFyeShkZW5kZXh0ZW5kKQp9KQoKYGBgCgpgYGB7cn0KCiMgR2xvYmFsIFZhcmlhYmxlcwoKIyBUaGUgaG9tZSBkaXJlY3RvcnkKaG9tZV9kaXIgPC0gIi9sL1l1L1l1TGFiL0Jpb2luZm9ybWF0aWNzL3Byb2plY3RzL21oaC9zY19WTk8vIgojIERpcmVjdG9yeSBmb3Igc3RvcmluZyBkYXRhIG9iamVjdHMgYXQgY3J1Y2lhbCBzdGFnZXMKb2JqZWN0X2RpciA8LSBwYXN0ZTAoaG9tZV9kaXIsImZpbmFsLnNldS5vYmpzLyIpCiMgRGlyZWN0b3J5IGZvciBpbWFnZXMgZnJvbSB0aGUgZmluYWwgYW5hbHlzaXMKaW1hZ2VfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWxfaW1hZ2VzLyIpCmFkb2JlX2ltYWdlcyA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCAiYWRvYmVfaWxsdXN0cmF0b3Jfc3ZnX2ZpbGVzLyIpCiMgRGlyZWN0b3J5IGZvciBpbWFnZXMgZm9yIHRoZSBmaW5hbCBwYXBlcgpjbHVzdHJlZV9kaXIgPC0gcGFzdGUwKGltYWdlX2RpciwiY2x1c3RyZWUvIikKIyBBIGRpcmVjdG9yeSBmb3IgVHJhZGVTZXEgZml0R0FNIG91dHB1dApmaXRHQU1fZGlyIDwtIHBhc3RlMChvYmplY3RfZGlyLCAiZml0R0FNLyIpCm1vZV9kaXIgPC0gIi9sL1l1L1l1TGFiL0Jpb2luZm9ybWF0aWNzL3Byb2plY3RzL21oaC9tb2xuZ18yNDA3XzI0NTMvUl9vYmovIgoKIyBPUEVOIGBgYHZuby5zZXUuaW50ZWdyYXRlZGBgYApsb2FkKGZpbGUgPSBwYXN0ZTAob2JqZWN0X2Rpciwidm5vLmludGVncmF0ZWQucG9zdENlbGxJRCIpKQojTG9hZCBOZXVyb25hbCBMaW5lYWdlIFNldXJhdCBPYmplY3QgIApsb2FkKGZpbGUgPSBwYXN0ZTAob2JqZWN0X2RpciwibmV1cm9uLmludGVncmF0ZWQucG9zdENlbGxJRCIpKQoKIyBSZW5hbWUgdW5rbm93bl9tVlNOIHRvIHNWU04KbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHMobmV1cm9uLmludGVncmF0ZWRAYWN0aXZlLmlkZW50KVtsZXZlbHMobmV1cm9uLmludGVncmF0ZWRAYWN0aXZlLmlkZW50KT09InVua25vd25fbVZTTiJdIDwtICJzVlNOIgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZCRjZWxsX3R5cGUpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZCRjZWxsX3R5cGUpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZCRjZWxsX3R5cGUpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCgojIEdldCBjb2xvciBzY2hlbWUgZm9yIHRoZSB3aG9sZSB2bm8gZGF0YXNldAp2bm8uY2VsbF90eXBlLmNvbG9ycyA8LSBodWVfcGFsKCkobGVuZ3RoKGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KSkpCm5hbWVzKHZuby5jZWxsX3R5cGUuY29sb3JzKSA8LSBsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudCkKCiMgS2VlcCBuZXVyb24gZGF0YXNldCBjb2xvciBzY2hlbWUgY29uc2lzdGVudCB3aXRoIHRoZSB3aG9sZSB2bm8gY29sb3Igc2NoZW1lLCB3aGVyZSBwb3NzaWJsZSAgCm5ldXJvbi5jZWxsX3R5cGUuY29sb3JzIDwtIHZuby5jZWxsX3R5cGUuY29sb3JzW2MoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIsIlYxUl9pVlNOIiwiVjJSX2lWU04iLCJHQkMiKV0KbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gc2V0TmFtZXMoYyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycywiIzAwQjBGNiIsIiM5NTkwRkYiLCIjRTc2QkYzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMobmFtZXMobmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpLCJpT1NOIiwibGF0ZV9JTlAiLCJlYXJseV9JTlAiKSkKCm1hdHVyZS5uZXVyb25zIDwtIHN1YnNldChuZXVyb24uaW50ZWdyYXRlZCxpZGVudHM9YygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIikpCm1hdHVyZS5jZWxsX3R5cGUuY29sb3JzIDwtIG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzW2MoIlYxUl9tVlNOIiwiVjJSX21WU04iLCJtT1NOIiwic1ZTTiIpXQoKZ2xvYmFsLnZhcnMgPC0gYyhscygpLCJnbG9iYWwudmFycyIpCgpgYGAKCioqKiAgCgojIFJlY2VwdG9yIGV4cHJlc3Npb24gaW4gdGhlIFZOTyB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgojIyBFeHByZXNzaW9uIGxldmVsIG9mIGluZGl2aWR1YWwgcmVjZXB0b3JzICh0b3RhbCByYXcgY291bnRzKSBwbG90dGVkIGFnYWluc3QgdGhlIG51bWJlciBvZiBjZWxscyBleHByZXNzaW5nIHRoZSByZWNlcHRvciBmb3IgVjFSLCBWMlIsIFZOTy1PbGZyLCBhbmQgTU9FLU9sZnIgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKYGBge3J9Cgpsb2FkKGZpbGU9cGFzdGUwKG1vZV9kaXIsIm1vZS5pbnRlZ3JhdGVkLnByZUNlbGxJRCIpKQojIExvYWQgZGF0YSBmb3IgcGFuZWxzIEUgYW5kIEYKdnIuY29yLnRyYW5zY3JpcHRpb25fZmFjdG9yIDwtIHJlYWRSRFMoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidnIuY29yLnRyYW5zY3JpcHRpb25fZmFjdG9yLnJkcyIpKQp2MXIuY29yLnRyYW5zY3JpcHRpb25fZmFjdG9yIDwtIHJlYWRSRFMoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjFyLmNvci50cmFuc2NyaXB0aW9uX2ZhY3Rvci5yZHMiKSkKdjJyLmNvci50cmFuc2NyaXB0aW9uX2ZhY3RvciA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInYyci5jb3IudHJhbnNjcmlwdGlvbl9mYWN0b3IucmRzIikpCnYxci50cmFuc2NyaXB0aW9uX2ZhY3Rvci5iX2luX2EubWF0IDwtIHJlYWRSRFMoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjFyLnRyYW5zY3JpcHRpb25fZmFjdG9yLmJfaW5fYS5tYXQucmRzIikpCnYyci50cmFuc2NyaXB0aW9uX2ZhY3Rvci5iX2luX2EubWF0IDwtIHJlYWRSRFMoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwidjJyLnRyYW5zY3JpcHRpb25fZmFjdG9yLmJfaW5fYS5tYXQucmRzIikpCnZuby5yZWNlcHRvci5pZGVudGl0eSA8LSByZWFkUkRTKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsInZuby5yZWNlcHRvci5pZGVudGl0eS5tYXRyaXgucmRzIikpCgpgYGAKCmBgYHtyfQoKbW9lLm1hdHVyZS5uZXVyb25zIDwtIHN1YnNldChtb2Uuc2V1LmludGVncmF0ZWQsaWRlbnRzPWMoIjAiLCIyIiwiMyIsIjciLCI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE2IiwiMTciLCIxOCIsIjI2IikpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKcmVjZXB0b3IubmFtZXMgPC0gZ3JlcCgiXihWbW4xclswLTldezEsM30kfFZtbjJyWzAtOV17MSwzfSR8T2xmclswLTldezEsNH0kKSIsCiAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMobWF0dXJlLm5ldXJvbnMpLCB2YWx1ZT1UUlVFKQoKIyBHZXQgYWxsIHJlY2VwdG9yIG5hbWVzIGluIHRoZSBtYXR1cmUubmV1cm9ucyBkYXRhc2V0IChpbmNsdWRpbmcgcHNldWRvZ2VuZXMpCnBzZy5yZWNlcHRvci5uYW1lcyA8LSBncmVwKCJeKFZtbjFyfFZtbjJyfE9sZnIpIiwKICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhtYXR1cmUubmV1cm9ucyksIHZhbHVlPVRSVUUpCgptb2Uub2xmci5uYW1lcyA8LSBncmVwKCJeKE9sZnIpIiwgcm93bmFtZXMobW9lLm1hdHVyZS5uZXVyb25zKSwgdmFsdWU9VFJVRSkKCiMgR2V0IFYxUiwgVjJSLCBhbmQgT2xmciBuYW1lcy4KVjFSLm5hbWVzIDwtIGdyZXAoIl5WbW4xciIscmVjZXB0b3IubmFtZXMsdmFsdWU9VFJVRSkKVjJSLm5hbWVzIDwtIGdyZXAoIl5WbW4yciIscmVjZXB0b3IubmFtZXMsdmFsdWU9VFJVRSkKT2xmci5uYW1lcyA8LSBncmVwKCJeT2xmciIscmVjZXB0b3IubmFtZXMsdmFsdWU9VFJVRSkKCiMgUmV0cmlldmUgdGhlIGNlbGwgYmFyY29kZSBYIHJlY2VwdG9yIGNvdW50IG1hdHJpeCBmb3IgYWxsIGNoZW1vLXNlbnNvcnkgcmVjZXB0b3IgZ2VuZXMKcmVjZXB0b3IuZGYgPC0gRmV0Y2hEYXRhKG1hdHVyZS5uZXVyb25zLCB2YXJzPXJlY2VwdG9yLm5hbWVzLCBzbG90PSJjb3VudHMiKQpwc2cucmVjZXB0b3IuZGYgPC0gRmV0Y2hEYXRhKG1hdHVyZS5uZXVyb25zLCB2YXJzPXBzZy5yZWNlcHRvci5uYW1lcywgc2xvdD0iY291bnRzIikKbW9lLnJlY2VwdG9yLmRmIDwtIEZldGNoRGF0YShtb2UubWF0dXJlLm5ldXJvbnMsIHZhcnM9bW9lLm9sZnIubmFtZXMsIHNsb3Q9ImNvdW50cyIpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKdjFyLmRmIDwtIHJlY2VwdG9yLmRmWyAsVjFSLm5hbWVzXQp2MnIuZGYgPC0gcmVjZXB0b3IuZGZbICxWMlIubmFtZXNdCm9sZnIuZGYgPC0gcmVjZXB0b3IuZGZbICxPbGZyLm5hbWVzXQoKIyBUb3RhbF9Db3VudHMgaXMgYmFzZWQgb24gcmF3IGNvdW50cwp2MXIudG90YWwuY291bnRzIDwtIAogIHNldE5hbWVzKG5tPWMoJ2dlbmUnLCdUb3RhbF9Db3VudHMnKSxzdGFjayhzb3J0KGNvbFN1bXModjFyLmRmKSxkZWNyZWFzaW5nPVRSVUUpKVsyOjFdKQp2MnIudG90YWwuY291bnRzIDwtIAogIHNldE5hbWVzKG5tPWMoJ2dlbmUnLCdUb3RhbF9Db3VudHMnKSxzdGFjayhzb3J0KGNvbFN1bXModjJyLmRmKSxkZWNyZWFzaW5nPVRSVUUpKVsyOjFdKQpvbGZyLnRvdGFsLmNvdW50cyA8LSAKICBzZXROYW1lcyhubT1jKCdnZW5lJywnVG90YWxfQ291bnRzJyksc3RhY2soc29ydChjb2xTdW1zKG9sZnIuZGYpLGRlY3JlYXNpbmc9VFJVRSkpWzI6MV0pCm1vZS5vbGZyLnRvdGFsLmNvdW50cyA8LSAKICBzZXROYW1lcyhubT1jKCdnZW5lJywnVG90YWxfQ291bnRzJyksc3RhY2soc29ydChjb2xTdW1zKG1vZS5yZWNlcHRvci5kZiksZGVjcmVhc2luZz1UUlVFKSlbMjoxXSkKCiMgbkNlbGxzIGlzIGJhc2VkIG9uIHNpbXBsZSBwcmVzZW5jZQp2MXIubkNlbGxzIDwtIAogIHNldE5hbWVzKG5tPWMoImdlbmUiLCJuQ2VsbHMiKSxzdGFjayhzb3J0KGNvbFN1bXModjFyLmRmID4gMCksZGVjcmVhc2luZz1UUlVFKSlbMjoxXSkKdjJyLm5DZWxscyA8LSAKICBzZXROYW1lcyhubT1jKCJnZW5lIiwibkNlbGxzIiksc3RhY2soc29ydChjb2xTdW1zKHYyci5kZiA+IDApLGRlY3JlYXNpbmc9VFJVRSkpWzI6MV0pCm9sZnIubkNlbGxzIDwtIAogIHNldE5hbWVzKG5tPWMoImdlbmUiLCJuQ2VsbHMiKSxzdGFjayhzb3J0KGNvbFN1bXMob2xmci5kZiA+IDApLGRlY3JlYXNpbmc9VFJVRSkpWzI6MV0pCm1vZS5vbGZyLm5DZWxscyA8LSAKICBzZXROYW1lcyhubT1jKCJnZW5lIiwibkNlbGxzIiksc3RhY2soc29ydChjb2xTdW1zKG1vZS5yZWNlcHRvci5kZiA+IDApLGRlY3JlYXNpbmc9VFJVRSkpWzI6MV0pCgp2MXIubWV0YWRhdGEgPC0gbWVyZ2UodjFyLm5DZWxscyx2MXIudG90YWwuY291bnRzKQojIFJlbW92ZSB1bmV4cHJlc3NlZCByZWNlcHRvcnMKdjFyLm1ldGFkYXRhIDwtIHYxci5tZXRhZGF0YVshKHYxci5tZXRhZGF0YSRuQ2VsbHM9PTApLCBdCiMgQ2FsY3VsYXRlIGF2ZXJhZ2UgZXhwcmVzc2lvbgp2MXIubWV0YWRhdGEkYXZnX2V4cCA8LSB2MXIubWV0YWRhdGEkVG90YWxfQ291bnRzL3Yxci5tZXRhZGF0YSRuQ2VsbHMKIyBTZXQgdGhlIGdlbmUgZmFjdG9yIHRvIG9yZGVyZWQgYnkgYXZnX2V4cCBkZWNyZWFzaW5nCnYxci5tZXRhZGF0YSRnZW5lIDwtIGZhY3Rvcih2MXIubWV0YWRhdGEkZ2VuZSxsZXZlbHM9djFyLm1ldGFkYXRhJGdlbmVbb3JkZXIodjFyLm1ldGFkYXRhJGF2Z19leHAsZGVjcmVhc2luZz1UUlVFKV0pCiMgU2V0IHRoZSBkYXRhZnJhbWUgdG8gdGhlIHNhbWUgb3JkZXIKdjFyLm1ldGFkYXRhIDwtIHYxci5tZXRhZGF0YVtvcmRlcih2MXIubWV0YWRhdGEkYXZnX2V4cCxkZWNyZWFzaW5nID0gVFJVRSksIF0KIyBSZXNldCByb3duYW1lcwpyb3duYW1lcyh2MXIubWV0YWRhdGEpIDwtIE5VTEwKIyBHZXQgdGhlIHJhbmsgb2YgcmVjZXB0b3JzIGJ5IHRvdGFsIGNvdW50cwp2MXIubWV0YWRhdGEkcmFuayA8LSBhcy5udW1lcmljKHJvd25hbWVzKHYxci5tZXRhZGF0YSkpCgp2MnIubWV0YWRhdGEgPC0gbWVyZ2UodjJyLm5DZWxscyx2MnIudG90YWwuY291bnRzKQp2MnIubWV0YWRhdGEgPC0gdjJyLm1ldGFkYXRhWyEodjJyLm1ldGFkYXRhJG5DZWxscz09MCksIF0KdjJyLm1ldGFkYXRhJGF2Z19leHAgPC0gdjJyLm1ldGFkYXRhJFRvdGFsX0NvdW50cy92MnIubWV0YWRhdGEkbkNlbGxzCiMgU2V0IHRoZSBnZW5lIGZhY3RvciB0byBvcmRlcmVkIGJ5IGF2Z19leHAgZGVjcmVhc2luZwp2MnIubWV0YWRhdGEkZ2VuZSA8LSBmYWN0b3IodjJyLm1ldGFkYXRhJGdlbmUsbGV2ZWxzPXYyci5tZXRhZGF0YSRnZW5lW29yZGVyKHYyci5tZXRhZGF0YSRhdmdfZXhwLGRlY3JlYXNpbmc9VFJVRSldKQojIFNldCB0aGUgZGF0YWZyYW1lIHRvIHRoZSBzYW1lIG9yZGVyCnYyci5tZXRhZGF0YSA8LSB2MnIubWV0YWRhdGFbb3JkZXIodjJyLm1ldGFkYXRhJGF2Z19leHAsZGVjcmVhc2luZyA9IFRSVUUpLCBdCiMgUmVzZXQgcm93bmFtZXMKcm93bmFtZXModjJyLm1ldGFkYXRhKSA8LSBOVUxMCiMgR2V0IHRoZSByYW5rIG9mIHJlY2VwdG9ycyBieSB0b3RhbCBjb3VudHMKdjJyLm1ldGFkYXRhJHJhbmsgPC0gYXMubnVtZXJpYyhyb3duYW1lcyh2MnIubWV0YWRhdGEpKQoKb2xmci5tZXRhZGF0YSA8LSBtZXJnZShvbGZyLm5DZWxscyxvbGZyLnRvdGFsLmNvdW50cykKb2xmci5tZXRhZGF0YSA8LSBvbGZyLm1ldGFkYXRhWyEob2xmci5tZXRhZGF0YSRuQ2VsbHM9PTApLCBdCm9sZnIubWV0YWRhdGEkYXZnX2V4cCA8LSBvbGZyLm1ldGFkYXRhJFRvdGFsX0NvdW50cy9vbGZyLm1ldGFkYXRhJG5DZWxscwojIFNldCB0aGUgZ2VuZSBmYWN0b3IgdG8gb3JkZXJlZCBieSBhdmdfZXhwIGRlY3JlYXNpbmcKb2xmci5tZXRhZGF0YSRnZW5lIDwtIGZhY3RvcihvbGZyLm1ldGFkYXRhJGdlbmUsbGV2ZWxzPW9sZnIubWV0YWRhdGEkZ2VuZVtvcmRlcihvbGZyLm1ldGFkYXRhJGF2Z19leHAsZGVjcmVhc2luZz1UUlVFKV0pCiMgU2V0IHRoZSBkYXRhZnJhbWUgdG8gdGhlIHNhbWUgb3JkZXIKb2xmci5tZXRhZGF0YSA8LSBvbGZyLm1ldGFkYXRhW29yZGVyKG9sZnIubWV0YWRhdGEkYXZnX2V4cCxkZWNyZWFzaW5nID0gVFJVRSksIF0KIyBSZXNldCByb3duYW1lcwpyb3duYW1lcyhvbGZyLm1ldGFkYXRhKSA8LSBOVUxMCiMgR2V0IHRoZSByYW5rIG9mIHJlY2VwdG9ycyBieSB0b3RhbCBjb3VudHMKb2xmci5tZXRhZGF0YSRyYW5rIDwtIGFzLm51bWVyaWMocm93bmFtZXMob2xmci5tZXRhZGF0YSkpCgptb2Uub2xmci5tZXRhZGF0YSA8LSBtZXJnZShtb2Uub2xmci5uQ2VsbHMsbW9lLm9sZnIudG90YWwuY291bnRzKQojIFJlbW92ZSBHZW5lcyBVbmV4cHJlc3NlZCBpbiBDZWxscwptb2Uub2xmci5tZXRhZGF0YSA8LSBtb2Uub2xmci5tZXRhZGF0YVshKG1vZS5vbGZyLm1ldGFkYXRhJG5DZWxscz09MCksIF0KbW9lLm9sZnIubWV0YWRhdGEkYXZnX2V4cCA8LSBtb2Uub2xmci5tZXRhZGF0YSRUb3RhbF9Db3VudHMvbW9lLm9sZnIubWV0YWRhdGEkbkNlbGxzCiMgU2V0IHRoZSBnZW5lIGZhY3RvciB0byBvcmRlcmVkIGJ5IGF2Z19leHAgZGVjcmVhc2luZwptb2Uub2xmci5tZXRhZGF0YSRnZW5lIDwtIGZhY3Rvcihtb2Uub2xmci5tZXRhZGF0YSRnZW5lLGxldmVscz1tb2Uub2xmci5tZXRhZGF0YSRnZW5lW29yZGVyKG1vZS5vbGZyLm1ldGFkYXRhJGF2Z19leHAsZGVjcmVhc2luZz1UUlVFKV0pCiMgU2V0IHRoZSBkYXRhZnJhbWUgdG8gdGhlIHNhbWUgb3JkZXIKbW9lLm9sZnIubWV0YWRhdGEgPC0gbW9lLm9sZnIubWV0YWRhdGFbb3JkZXIobW9lLm9sZnIubWV0YWRhdGEkYXZnX2V4cCxkZWNyZWFzaW5nID0gVFJVRSksIF0KIyBSZXNldCByb3duYW1lcwpyb3duYW1lcyhtb2Uub2xmci5tZXRhZGF0YSkgPC0gTlVMTAojIEdldCB0aGUgcmFuayBvZiByZWNlcHRvcnMgYnkgdG90YWwgY291bnRzCm1vZS5vbGZyLm1ldGFkYXRhJHJhbmsgPC0gYXMubnVtZXJpYyhyb3duYW1lcyhtb2Uub2xmci5tZXRhZGF0YSkpCgp2MXIubWV0YWRhdGEkcHJvcG9ydGlvbiA8LSB2MXIubWV0YWRhdGEkYXZnX2V4cC9zdW0odjFyLm1ldGFkYXRhJGF2Z19leHApIAp2MnIubWV0YWRhdGEkcHJvcG9ydGlvbiA8LSB2MnIubWV0YWRhdGEkYXZnX2V4cC9zdW0odjJyLm1ldGFkYXRhJGF2Z19leHApIApvbGZyLm1ldGFkYXRhJHByb3BvcnRpb24gPC0gb2xmci5tZXRhZGF0YSRhdmdfZXhwL3N1bShvbGZyLm1ldGFkYXRhJGF2Z19leHApIAptb2Uub2xmci5tZXRhZGF0YSRwcm9wb3J0aW9uIDwtIG1vZS5vbGZyLm1ldGFkYXRhJGF2Z19leHAvc3VtKG1vZS5vbGZyLm1ldGFkYXRhJGF2Z19leHApIAoKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCnZuby5yZWNlcHRvci5kZi5saXN0IDwtIGxpc3QoVjFSPXYxci50b3RhbC5jb3VudHMsVjJSPXYyci50b3RhbC5jb3VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xmcj1vbGZyLnRvdGFsLmNvdW50cyxNT0UuT2xmcj1tb2Uub2xmci5tZXRhZGF0YSkKCnZuby5yZWNlcHRvci5waWUubGlzdCA8LSBsYXBwbHkobmFtZXModm5vLnJlY2VwdG9yLmRmLmxpc3QpLCBmdW5jdGlvbihuYW1lKXsKICBkZiA8LSB2bm8ucmVjZXB0b3IuZGYubGlzdFtbbmFtZV1dCiAgemVyb2VzIDwtIHN1bShkZlsgLCJUb3RhbF9Db3VudHMiXSA9PSAwKQogIGxvdyA8LSBzdW0oZGZbICwiVG90YWxfQ291bnRzIl0gPiAwICYgZGZbICwiVG90YWxfQ291bnRzIl0gPCAxMDApCiAgbWVkaXVtIDwtIHN1bShkZlsgLCJUb3RhbF9Db3VudHMiXSA+PSAxMDAgJiBkZlsgLCJUb3RhbF9Db3VudHMiXSA8IDEwMDApCiAgaGlnaCA8LSBzdW0oZGZbICwiVG90YWxfQ291bnRzIl0gPj0gMTAwMCAmIGRmWyAsIlRvdGFsX0NvdW50cyJdIDwgMTAwMDApCiAgdmVyeV9oaWdoIDwtIHN1bShkZlsgLCJUb3RhbF9Db3VudHMiXSA+PSAxMDAwMCkKICBjKHplcm9lcyxsb3csbWVkaXVtLGhpZ2gsdmVyeV9oaWdoKQp9KQoKbmFtZXModm5vLnJlY2VwdG9yLnBpZS5saXN0KSA8LSBuYW1lcyh2bm8ucmVjZXB0b3IuZGYubGlzdCkKCmxibHMgPC0gYygieCA9IDAiLCIwIDwgeCA8IDEwMCIsIjEwMCDiiaQgeCA8IDEwMDAiLAogICAgICAgICAgIjEwMDAg4omkIHggPCAxMDAwMCIsIngg4omlIDEwMDAwIikKCiMgT3JkZXIgdGhlIFJlY2VwdG9ycyBmYWN0b3IgbGV2ZWxzIGZvciBwbG90dGluZwpsYmxzIDwtIGZhY3Rvcihhcy5mYWN0b3IobGJscyksIGxldmVscz1jKCJ4ID0gMCIsIjAgPCB4IDwgMTAwIiwiMTAwIOKJpCB4IDwgMTAwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMDAg4omkIHggPCAxMDAwMCIsIngg4omlIDEwMDAwIikpCgp2MXIucGllLmRmIDwtIGRhdGEuZnJhbWUoRXhwcmVzc2lvbl9SYW5nZT1sYmxzLENvdW50cz12bm8ucmVjZXB0b3IucGllLmxpc3QkVjFSKQp2MnIucGllLmRmIDwtIGRhdGEuZnJhbWUoRXhwcmVzc2lvbl9SYW5nZT1sYmxzLENvdW50cz12bm8ucmVjZXB0b3IucGllLmxpc3QkVjJSKQpvbGZyLnBpZS5kZiA8LSBkYXRhLmZyYW1lKEV4cHJlc3Npb25fUmFuZ2U9bGJscyxDb3VudHM9dm5vLnJlY2VwdG9yLnBpZS5saXN0JE9sZnIpCm1vZS5vbGZyLnBpZS5kZiA8LSBkYXRhLmZyYW1lKEV4cHJlc3Npb25fUmFuZ2U9bGJscyxDb3VudHM9dm5vLnJlY2VwdG9yLnBpZS5saXN0JE1PRS5PbGZyKQoKYGBgCgojIyMgVjFSICAKCmBgYHtyfQoKIyBDcmVhdGUgYSBjb2xvciB2ZWN0b3IgdG8gZGlzdGluZ3Vpc2ggZ2VuZXMgZnJvbSBwc2V1ZG9nZW5lcy4KdjFyLmRpc3QucGxvdCA8LSB2MXIubWV0YWRhdGEgJT4lIG11dGF0ZShjb2xvciA9IGlmZWxzZShzdHJfZGV0ZWN0KHYxci5tZXRhZGF0YSRnZW5lLCAiLXBzIiksICJncmF5IiwgImdvbGQyIikpCgpmaWc0X2EucGFydF8yIDwtIGdncGxvdCh2MXIuZGlzdC5wbG90LCBhZXMoeD1uQ2VsbHMseT1Ub3RhbF9Db3VudHMsbGFiZWw9Z2VuZSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTIxLHNpemU9NCxmaWxsPXYxci5kaXN0LnBsb3QkY29sb3IsY29sb3I9ImdvbGQyIikgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICsKICBnZW9tX3RleHRfcmVwZWwoZGF0YT12MXIuZGlzdC5wbG90W3Yxci5kaXN0LnBsb3QkbkNlbGxzPjUwMDB8djFyLmRpc3QucGxvdCRUb3RhbF9Db3VudHM+ODAwMDAsIF0sCiAgICAgICAgICAgICAgICAgIG51ZGdlX3g9MTI1LG51ZGdlX3k9LTI1LHBvaW50LnBhZGRpbmc9MCxzaXplPTcsbWluLnNlZ21lbnQubGVuZ3RoPTAuMjUpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSxhc3BlY3QucmF0aW89MSkgKwogIHlsYWIoIlRvdGFsIFJhdyBDb3VudCIpICsKICBzdGF0X3BvbHlfbGluZShtZXRob2Q9ImxtIiwgZm9ybXVsYSA9IHkgfiB4ICsgMCkgKwogIHN0YXRfcG9seV9lcShmb3JtdWxhID0geSB+IHggKyAwLCBhZXMobGFiZWwgPSBwYXN0ZShhZnRlcl9zdGF0KGVxLmxhYmVsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJfc3RhdChyci5sYWJlbCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiKlwiLCBcIioiKSksc2l6ZT03LGxhYmVsLnk9MC44NSxsYWJlbC54PTAuNSkKCnN2Z2xpdGUoZmlsZW5hbWUgPSBwYXN0ZTAoYWRvYmVfaW1hZ2VzLCJmaWc0X2EucGFydF8yLnN2ZyIpLHdpZHRoPTgsaGVpZ2h0PTgpCmZpZzRfYS5wYXJ0XzIKaW52aXNpYmxlKGRldi5vZmYoKSkKCmZpZzRfYS5wYXJ0XzIKCmBgYAoKIyMjIFYyUiAgCgpgYGB7cn0KCiMgQ3JlYXRlIGEgY29sb3IgdmVjdG9yIHRvIGRpc3Rpbmd1aXNoIGdlbmVzIGZyb20gcHNldWRvZ2VuZXMuCnYyci5kaXN0LnBsb3QgPC0gdjJyLm1ldGFkYXRhICU+JSBtdXRhdGUoY29sb3IgPSBpZmVsc2Uoc3RyX2RldGVjdCh2MnIubWV0YWRhdGEkZ2VuZSwgIi1wcyIpLCAiZ3JheSIsICJwdXJwbGUiKSkKCmZpZzRfYi5wYXJ0XzIgPC0gZ2dwbG90KHYyci5kaXN0LnBsb3QsIGFlcyh4PW5DZWxscyx5PVRvdGFsX0NvdW50cyxsYWJlbD1nZW5lKSkgKwogIGdlb21fcG9pbnQoc2hhcGU9MjEsc2l6ZT00LGZpbGw9djJyLmRpc3QucGxvdCRjb2xvcixjb2xvcj0icHVycGxlIikgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICsKICBnZW9tX3RleHRfcmVwZWwoZGF0YT12MnIuZGlzdC5wbG90W3Yyci5kaXN0LnBsb3QkbkNlbGxzPjYwMDB8djJyLmRpc3QucGxvdCRUb3RhbF9Db3VudHM+MzAwMDAsIF0sCiAgICAgICAgICAgICAgICAgIG51ZGdlX3g9LTUwLG51ZGdlX3k9NTAscG9pbnQucGFkZGluZz0wLHNpemU9NyxtaW4uc2VnbWVudC5sZW5ndGg9MC4yNSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MjApLGFzcGVjdC5yYXRpbz0xKSArCiAgeWxhYigiVG90YWwgUmF3IENvdW50IikgKwogIHN0YXRfcG9seV9saW5lKG1ldGhvZD0ibG0iLCBmb3JtdWxhID0geSB+IHggKyAwKSArCiAgc3RhdF9wb2x5X2VxKGZvcm11bGEgPSB5IH4geCArIDAsIGFlcyhsYWJlbCA9IHBhc3RlKGFmdGVyX3N0YXQoZXEubGFiZWwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcl9zdGF0KHJyLmxhYmVsKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIqXCIsIFwiKiIpKSxzaXplPTcsbGFiZWwueT0wLjkpCgpmaWc0X2IucGFydF8yCgpgYGAKCiMjIyBPbGZyICAKCmBgYHtyfQoKIyBDcmVhdGUgYSBjb2xvciB2ZWN0b3IgdG8gZGlzdGluZ3Vpc2ggZ2VuZXMgZnJvbSBwc2V1ZG9nZW5lcy4Kb2xmci5kaXN0LnBsb3QgPC0gb2xmci5tZXRhZGF0YSAlPiUgbXV0YXRlKGNvbG9yID0gaWZlbHNlKHN0cl9kZXRlY3Qob2xmci5tZXRhZGF0YSRnZW5lLCAiLXBzIiksICJncmF5IiwgImdyZWVuMyIpKQoKZmlnNF9jLnBhcnRfMiA8LSBnZ3Bsb3Qob2xmci5kaXN0LnBsb3QsIGFlcyhuQ2VsbHMsVG90YWxfQ291bnRzLGxhYmVsPWdlbmUpKSArCiAgZ2VvbV9wb2ludChzaGFwZT0yMSxzaXplPTQsZmlsbD1vbGZyLmRpc3QucGxvdCRjb2xvcixjb2xvcj0iZ3JlZW4zIikgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICsKICBnZW9tX3RleHRfcmVwZWwoZGF0YT1vbGZyLmRpc3QucGxvdFtvbGZyLmRpc3QucGxvdCRuQ2VsbHM+NjAwMHxvbGZyLmRpc3QucGxvdCRUb3RhbF9Db3VudHM+MTAwMDAsIF0sCiAgICAgICAgICAgICAgICAgIG51ZGdlX3g9LTUwLG51ZGdlX3k9LTc1LHBvaW50LnBhZGRpbmc9MCxzaXplPTcsbWluLnNlZ21lbnQubGVuZ3RoPTAuMjUpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjQpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSxhc3BlY3QucmF0aW89MSkgKwogIHlsYWIoIlRvdGFsIFJhdyBDb3VudCIpICsKICBzdGF0X3BvbHlfbGluZShtZXRob2Q9ImxtIiwgZm9ybXVsYSA9IHkgfiB4ICsgMCkgKwogIHN0YXRfcG9seV9lcShmb3JtdWxhID0geSB+IHggKyAwLCBhZXMobGFiZWwgPSBwYXN0ZShhZnRlcl9zdGF0KGVxLmxhYmVsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJfc3RhdChyci5sYWJlbCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiKlwiLCBcIioiKSksc2l6ZT03LGxhYmVsLnk9MC45LGxhYmVsLng9MC41KQoKZmlnNF9jLnBhcnRfMgoKYGBgCgojIyMgTWFpbiBPbGZhY3RvcnkgRXBpdGhlbGl1bSAtIE9sZnJzICAKCmBgYHtyfQoKZmlnNF9kLnBhcnRfMiA8LSBnZ3Bsb3QobW9lLm9sZnIubWV0YWRhdGEsIGFlcyhuQ2VsbHMsVG90YWxfQ291bnRzLGxhYmVsPWdlbmUpKSArCiAgZ2VvbV9wb2ludChzaGFwZT0yMSxzaXplPTMsZmlsbD0ibWFnZW50YSIsY29sb3I9Im1hZ2VudGEiKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGE9bW9lLm9sZnIubWV0YWRhdGFbbW9lLm9sZnIubWV0YWRhdGEkbkNlbGxzPjEwMDB8bW9lLm9sZnIubWV0YWRhdGEkVG90YWxfQ291bnRzPjMwMDAsIF0sCiAgICAgICAgICAgICAgICAgIG51ZGdlX3g9LTI1LG51ZGdlX3k9LTc1LHBvaW50LnBhZGRpbmc9MCxzaXplPTcpICsKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTI0KSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgeWxhYigiVG90YWwgUmF3IENvdW50IikgKwogIHN0YXRfcG9seV9saW5lKG1ldGhvZD0ibG0iLCBmb3JtdWxhID0geSB+IHggKyAwKSArCiAgc3RhdF9wb2x5X2VxKGZvcm11bGEgPSB5IH4geCArIDAsIGFlcyhsYWJlbCA9IHBhc3RlKGFmdGVyX3N0YXQoZXEubGFiZWwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcl9zdGF0KHJyLmxhYmVsKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIqXCIsIFwiKiIpKSxzaXplPTcsbGFiZWwueT0wLjksbGFiZWwueD0wLjUpCgpmaWc0X2QucGFydF8yCgpgYGAKCiMjIFJhbmtlZCBkaXN0cmlidXRpb24gb2YgYXZlcmFnZSBleHByZXNzaW9uIHBlciBjZWxsIGZvciB0aGUgZm91ciByZWNlcHRvciBjbGFzc2VzLiBQaWUgY2hhcnRzIHNob3cgdGhlIG51bWJlciBvZiBjZWxscyBleHByZXNzaW5nIGEgcmVjZXB0b3IgYXQgdGhlIHNwZWNpZmllZCByYW5nZSB7LnRhYnNldCAudGFic2V0LXBpbGxzfSAgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCnYxci5waWUuZGYyIDwtIHYxci5waWUuZGYgJT4lIAogIG11dGF0ZShjc3VtID0gcmV2KGN1bXN1bShyZXYoQ291bnRzKSkpLCAKICAgICAgICAgcG9zID0gQ291bnRzLzIgKyBsZWFkKGNzdW0sIDEpLAogICAgICAgICBwb3MgPSBpZl9lbHNlKGlzLm5hKHBvcyksIENvdW50cy8yLCBwb3MpKSAjIGlzbid0IHdvcmtpbmcKdjFyLnBpZS5kZjJbNSw0XSA8LSB2MXIucGllLmRmJENvdW50c1s1XS8yCgpmaWc0X2EucGFydF8xIDwtIGdncGxvdCh2MXIucGllLmRmMiwgYWVzKHg9IiIsIHk9Q291bnRzLCBmaWxsPUV4cHJlc3Npb25fUmFuZ2UpKSArCiAgICBnZW9tX2NvbChjb2xvcj0iYmxhY2siKSArIHRoZW1lX3ZvaWQoKSArCiAgICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTAsIGRpcmVjdGlvbj0tMSkgKyBnZ3RpdGxlKCJWMVIiKSArCiAgICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTI0KSxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArCiAgICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1Db3VudHMpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZT02LHNlZ21lbnQuY29sb3IgPSAiYmxhY2siLHNlZ21lbnQuc2l6ZSA9IDAuNSxzZWdtZW50LmN1cnZhdHVyZSA9IDAuMikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKQoKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCiMgQ3JlYXRlIHRoZSBnYW1tYSBtb2RlbCB3aXRoIGEgMTUgZGVncmVlIHBvbHlub21pYWwuCnYxci5nYW1tYS5tb2RlbCA8LSBnbG0oYXZnX2V4cCB+IHBvbHkocmFuaywgMTUsIHJhdz1UUlVFKSwgZGF0YT12MXIuZGlzdC5wbG90LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w9Z2xtLmNvbnRyb2wobWF4aXQ9MTAwMCksIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSkKIyBDcmVhdGUgdGhlIHZlY3RvciBvZiBwcmVkaWN0ZWQgdmFsdWVzLCBiYXNlZCBvbiBvdXIgbW9kZWwuCnYxci5kaXN0LnBsb3QkcHJlZGljdGVkIDwtIHByZWRpY3QodjFyLmdhbW1hLm1vZGVsLCB0eXBlPSJyZXNwb25zZSIpCgojIFBsb3QgdGhlIGRhdGEgYW5kIHRoZSBmaXR0ZWQgbW9kZWwKZmlnNF9hLnBhcnRfMyA8LSBnZ3Bsb3QodjFyLmRpc3QucGxvdCwgYWVzKHggPSByYW5rLCB5ID0gYXZnX2V4cCwgY29sb3I9Y29sb3IpKSArCiAgZ2VvbV9wb2ludChzaXplPTQpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfY29sb3JfaWRlbnRpdHkoKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZGljdGVkKSwgY29sb3IgPSAiYmxhY2siKSArCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yNCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwKICAgICAgICBhc3BlY3QucmF0aW89MSkgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gZ2VuZSwgY29sb3I9ImJsYWNrIiksIHNpemU9OCwgbGFiZWwuc2l6ZSA9IDAsIHBvaW50LnBhZGRpbmc9MC41LAogICAgICAgICAgICAgICAgICAgZGF0YSA9IH4gc3Vic2V0KC4sIGdlbmUgPT0gdjFyLm1ldGFkYXRhJGdlbmVbMTo2XSksIGxhYmVsLnBhZGRpbmc9MC4xLCAKICAgICAgICAgICAgICAgICAgIG51ZGdlX3g9NzAsbnVkZ2VfeT0tMTAsbWluLnNlZ21lbnQubGVuZ3RoPTAuMjUsIGJveC5wYWRkaW5nPTAuMSkgKwogIGxhYnMoeD0icmFuayIsIHk9ImF2Z19leHAiKQoKYGBgCgojIyMgVjFSICAKCmBgYHtyLGZpZy53aWR0aD0xNixmaWcuaGVpZ2h0PTh9CgpnZ2FycmFuZ2UoZmlnNF9hLnBhcnRfMyxmaWc0X2EucGFydF8xLG5jb2w9Mixucm93PTEpCgpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKdjJyLnBpZS5kZjIgPC0gdjJyLnBpZS5kZiAlPiUgCiAgbXV0YXRlKGNzdW0gPSByZXYoY3Vtc3VtKHJldihDb3VudHMpKSksIAogICAgICAgICBwb3MgPSBDb3VudHMvMiArIGxlYWQoY3N1bSwgMSksCiAgICAgICAgIHBvcyA9IGlmX2Vsc2UoaXMubmEocG9zKSwgQ291bnRzLzIsIHBvcykpICMgaXNuJ3Qgd29ya2luZwp2MnIucGllLmRmMls1LDRdIDwtIHYyci5waWUuZGYkQ291bnRzWzVdLzIKCmZpZzRfYi5wYXJ0XzEgPC0gZ2dwbG90KHYyci5waWUuZGYyLCBhZXMoeD0iIiwgeT1Db3VudHMsIGZpbGw9RXhwcmVzc2lvbl9SYW5nZSkpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX2NvbChjb2xvcj0iYmxhY2siKSArIHRoZW1lX3ZvaWQoKSArIAogICAgICAgICAgICAgICAgICAgIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCwgZGlyZWN0aW9uPS0xKSArIGdndGl0bGUoIlYyUiIpICsKICAgICAgICAgICAgICAgICAgICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTI0KSxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArCiAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9Q291bnRzKSxwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPTYsc2VnbWVudC5jb2xvciA9ICJibGFjayIsc2VnbWVudC5zaXplID0gMC41LHNlZ21lbnQuY3VydmF0dXJlID0gMC4yKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChsYWJlbCA9ICIiKSkpCgoKYGBgCgpgYGB7cn0KCnYyci5nYW1tYS5tb2RlbCA8LSBnbG0oYXZnX2V4cCB+IHBvbHkocmFuaywgMjMsIHJhdz1UUlVFKSwgZGF0YT12MnIubWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbD1nbG0uY29udHJvbChtYXhpdD0xMDAwKSwgZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpKQojIENyZWF0ZSB0aGUgdmVjdG9yIG9mIHByZWRpY3RlZCB2YWx1ZXMsIGJhc2VkIG9uIG91ciBtb2RlbC4KdjJyLmRpc3QucGxvdCRwcmVkaWN0ZWQgPC0gcHJlZGljdCh2MnIuZ2FtbWEubW9kZWwsIHR5cGU9InJlc3BvbnNlIikKCiMgUGxvdCB0aGUgZGF0YSBhbmQgdGhlIGZpdHRlZCBtb2RlbApmaWc0X2IucGFydF8zIDwtIGdncGxvdCh2MnIuZGlzdC5wbG90LCBhZXMoeCA9IHJhbmssIHkgPSBhdmdfZXhwLCBjb2xvcj1jb2xvcikpICsKICBnZW9tX3BvaW50KHNpemU9NCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkaWN0ZWQpLCBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTI0KSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBnZW5lLGNvbG9yPSJibGFjayIpLCBzaXplPTgsIGxhYmVsLnNpemUgPSAwLCBwb2ludC5wYWRkaW5nPTAuNSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSB+IHN1YnNldCguLCBnZW5lID09IHYyci5tZXRhZGF0YSRnZW5lWzE6Nl0pLCBsYWJlbC5wYWRkaW5nPTAuMSwgCiAgICAgICAgICAgICAgICAgICBudWRnZV94PTMwLCBtaW4uc2VnbWVudC5sZW5ndGg9MC4yNSwgYm94LnBhZGRpbmc9MC4xKSArCiAgbGFicyh4ID0gInJhbmsiLCB5ID0gImF2Z19leHAiKQoKYGBgCgojIyMgVjJSICAKCmBgYHtyLGZpZy53aWR0aD0xNixmaWcuaGVpZ2h0PTh9CgpnZ2FycmFuZ2UoZmlnNF9iLnBhcnRfMyxmaWc0X2IucGFydF8xLG5jb2w9Mixucm93PTEpCgpgYGAKCmBgYHtyfQoKb2xmci5waWUuZGYyIDwtIG9sZnIucGllLmRmICU+JSAKICBtdXRhdGUoY3N1bSA9IHJldihjdW1zdW0ocmV2KENvdW50cykpKSwgCiAgICAgICAgIHBvcyA9IENvdW50cy8yICsgbGVhZChjc3VtLCAxKSwKICAgICAgICAgcG9zID0gaWZfZWxzZShpcy5uYShwb3MpLCBDb3VudHMvMiwgcG9zKSkgIyBpc24ndCB3b3JraW5nCm9sZnIucGllLmRmMls1LDRdIDwtIG9sZnIucGllLmRmJENvdW50c1s1XS8yCgpmaWc0X2MucGFydF8xIDwtIGdncGxvdChvbGZyLnBpZS5kZjIsIGFlcyh4PSIiLCB5PUNvdW50cywgZmlsbD1FeHByZXNzaW9uX1JhbmdlKSkgKwogICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGNvbG9yPSJibGFjayIpICsgdGhlbWVfdm9pZCgpICsgCiAgICAgICAgICAgICAgICAgICAgY29vcmRfcG9sYXIoInkiLCBzdGFydD0wLCBkaXJlY3Rpb249LTEpICsgZ2d0aXRsZSgiVk5PLU9sZnIiKSArCiAgICAgICAgICAgICAgICAgICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yNCkscGxvdC50aXRsZT1lbGVtZW50X3RleHQoaGp1c3Q9MC41KSkgKwogICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPUNvdW50cykscG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT02LHNlZ21lbnQuY29sb3IgPSAiYmxhY2siLHNlZ21lbnQuc2l6ZSA9IDAuNSxzZWdtZW50LmN1cnZhdHVyZSA9IDAuMikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKQogICAgICAgICAgICAgICAgICAgIApgYGAKCmBgYHtyfQoKb2xmci5nYW1tYS5tb2RlbCA8LSBnbG0oYXZnX2V4cCB+IHBvbHkocmFuaywgMTUsIHJhdz1UUlVFKSwgZGF0YT1vbGZyLm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w9Z2xtLmNvbnRyb2wobWF4aXQ9MTAwMCksIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSkKb2xmci5kaXN0LnBsb3QkcHJlZGljdGVkIDwtIHByZWRpY3Qob2xmci5nYW1tYS5tb2RlbCwgdHlwZT0icmVzcG9uc2UiKQoKIyBQbG90IHRoZSBkYXRhIGFuZCB0aGUgZml0dGVkIG1vZGVsCmZpZzRfYy5wYXJ0XzMgPC0gZ2dwbG90KG9sZnIuZGlzdC5wbG90LCBhZXMoeCA9IHJhbmssIHkgPSBhdmdfZXhwLCBjb2xvcj1jb2xvcikpICsKICBnZW9tX3BvaW50KHNpemU9NCkgKyB0aGVtZV9jbGFzc2ljKCkgKyBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkaWN0ZWQpLCBjb2xvciA9ICJibGFjayIpICsKICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTI0KSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjApLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9Z2VuZSxjb2xvcj0iYmxhY2siKSwgc2l6ZT04LCBsYWJlbC5zaXplPTAsIHBvaW50LnBhZGRpbmc9MC41LCBtYXgub3ZlcmxhcHM9MSwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSB+IHN1YnNldCguLCBnZW5lPT1vbGZyLm1ldGFkYXRhJGdlbmVbMTo3XSwgbGFiZWwucGFkZGluZz0wLjEpLCAKICAgICAgICAgICAgICAgICAgIG51ZGdlX3g9MTUwLCBudWRnZV95PS0xLCBtaW4uc2VnbWVudC5sZW5ndGg9MC4yNSwgYm94LnBhZGRpbmc9MC4xLCB4bGltPWMoNzUsNjAwKSkgKwogIGxhYnMoeCA9ICJyYW5rIiwgeSA9ICJhdmdfZXhwIikKCmBgYAoKIyMjIE9sZnIgIAoKYGBge3IsZmlnLndpZHRoPTE2LGZpZy5oZWlnaHQ9OH0KCmdnYXJyYW5nZShmaWc0X2MucGFydF8zLGZpZzRfYy5wYXJ0XzEsbmNvbD0yLG5yb3c9MSkKCmBgYAoKYGBge3J9Cgptb2Uub2xmci5waWUuZGYyIDwtIG1vZS5vbGZyLnBpZS5kZiAlPiUgCiAgbXV0YXRlKGNzdW0gPSByZXYoY3Vtc3VtKHJldihDb3VudHMpKSksIAogICAgICAgICBwb3MgPSBDb3VudHMvMiArIGxlYWQoY3N1bSwgMSksCiAgICAgICAgIHBvcyA9IGlmX2Vsc2UoaXMubmEocG9zKSwgQ291bnRzLzIsIHBvcykpICMgaXNuJ3Qgd29ya2luZwptb2Uub2xmci5waWUuZGYyWzUsNF0gPC0gbW9lLm9sZnIucGllLmRmJENvdW50c1s1XS8yCgpmaWc0X2QucGFydF8xIDwtIGdncGxvdChtb2Uub2xmci5waWUuZGYyLCBhZXMoeD0iIiwgeT1Db3VudHMsIGZpbGw9RXhwcmVzc2lvbl9SYW5nZSkpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX2NvbChjb2xvcj0iYmxhY2siKSArIHRoZW1lX3ZvaWQoKSArIAogICAgICAgICAgICAgICAgICAgIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCwgZGlyZWN0aW9uPS0xKSArIGdndGl0bGUoIk1PRS1PbGZyIikgKwogICAgICAgICAgICAgICAgICAgIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjQpLHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICAgICAgICAgICAgICAgICAgICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1Db3VudHMpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9NixzZWdtZW50LmNvbG9yID0gImJsYWNrIixzZWdtZW50LnNpemUgPSAwLjUsc2VnbWVudC5jdXJ2YXR1cmUgPSAwLjIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkKICAgICAgICAgICAgICAgICAgICAKCmBgYAoKYGBge3J9Cgptb2Uub2xmci5nYW1tYS5tb2RlbCA8LSBnbG0oYXZnX2V4cCB+IHBvbHkocmFuaywgMjIsIHJhdz1UUlVFKSwgZGF0YT1tb2Uub2xmci5tZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sPWdsbS5jb250cm9sKG1heGl0PTEwMDApLCBmYW1pbHk9R2FtbWEobGluaz0ibG9nIikpCm1vZS5vbGZyLm1ldGFkYXRhJHByZWRpY3RlZCA8LSBwcmVkaWN0KG1vZS5vbGZyLmdhbW1hLm1vZGVsLCB0eXBlPSJyZXNwb25zZSIpCgojIFBsb3QgdGhlIGRhdGEgYW5kIHRoZSBmaXR0ZWQgbW9kZWwKZmlnNF9kLnBhcnRfMyA8LSBnZ3Bsb3QobW9lLm9sZnIubWV0YWRhdGEsIGFlcyh4ID0gcmFuaywgeSA9IGF2Z19leHApKSArCiAgZ2VvbV9wb2ludChjb2xvcj0ibWFnZW50YSIsc2l6ZT01KSArIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZGljdGVkKSwgY29sb3IgPSAiYmxhY2siKSArCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT00MCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTMzKSwKICAgICAgICBhc3BlY3QucmF0aW89MSkgKwogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gZ2VuZSksIHNpemU9MTIsIGxhYmVsLnNpemUgPSBOQSwgcG9pbnQucGFkZGluZz0wLjUsCiAgICAgICAgICAgICAgICAgICBkYXRhID0gfiBzdWJzZXQoLiwgZ2VuZSA9PSBtb2Uub2xmci5tZXRhZGF0YSRnZW5lWzE6Nl0pLCBsYWJlbC5wYWRkaW5nPTAuMSwgCiAgICAgICAgICAgICAgICAgICBudWRnZV94PTEyMCwgbnVkZ2VfeT0tMiwgbWluLnNlZ21lbnQubGVuZ3RoPTAsIGJveC5wYWRkaW5nPTAuMSwgeGxpbT1jKDEwMCw5MDApKSArCiAgbGFicyh4ID0gInJhbmsiLCB5ID0gImF2Z19leHAiKQoKYGBgCgojIyMgTU9FLU9sZnIgIAoKYGBge3IsZmlnLndpZHRoPTE2LGZpZy5oZWlnaHQ9OH0KCmdnYXJyYW5nZShmaWc0X2QucGFydF8zLGZpZzRfZC5wYXJ0XzEsbmNvbD0yLG5yb3c9MSkKCmBgYAoKIyMgSGVhdG1hcHMgc2hvd2luZyB0aGUgY29ycmVsYXRpb24gb2YgdHJhbnNjcmlwdGlvbiBmYWN0b3IgZXhwcmVzc2lvbiBhbW9uZyB0aGUgVjFScyBvciBWMlJzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCiMjIyBWMVIgIAoKYGBge3IsZmlnLndpZHRoPTE2LGZpZy5oZWlnaHQ9MTZ9CgpmaWc0X2kgPC0KICBwaGVhdG1hcCh2MXIuY29yLnRyYW5zY3JpcHRpb25fZmFjdG9yLGZvbnRzaXplPTEyLHRyZWVoZWlnaHRfcm93PTI1LHRyZWVoZWlnaHRfY29sPTI1KQoKIyBTYXZlIGltYWdlIHRvIHN2ZyBmaWxlCmdyaWQuZHJhdyhyZWN0R3JvYihncD1ncGFyKGZpbGw9IndoaXRlIiwgbHdkPTApKSkKZ3JpZC5kcmF3KGZpZzRfaVtbNF1dKQoKYGBgCgojIyMgVjJSICAKCmBgYHtyLGZpZy53aWR0aD0xNixmaWcuaGVpZ2h0PTE2fQoKZmlnNF9qIDwtCiAgcGhlYXRtYXAodjJyLmNvci50cmFuc2NyaXB0aW9uX2ZhY3Rvcixmb250c2l6ZT0xMix0cmVlaGVpZ2h0X3Jvdz0yNSx0cmVlaGVpZ2h0X2NvbD0yNSkKCiMgU2F2ZSBpbWFnZSB0byBzdmcgZmlsZQpzdmdsaXRlKGZpbGVuYW1lID0gcGFzdGUwKGFkb2JlX2ltYWdlcywiZmlnNF9qLnN2ZyIpLGhlaWdodD0xNix3aWR0aD0xNikKZ3JpZC5kcmF3KHJlY3RHcm9iKGdwPWdwYXIoZmlsbD0id2hpdGUiLCBsd2Q9MCkpKQpncmlkLmRyYXcoZmlnNF9qW1s0XV0pCmludmlzaWJsZShkZXYub2ZmKCkpCgpgYGAKCg==