Raising the Bar Graph
Interactive Data visualization Example
Quick and easy visalization: Using the plotly
package
p <- ggplot(mtcars, aes(wt, mpg)) +
geom_point(aes(colour = factor(cyl)))
ggplotly(p)Tips and bills
Power rate
Error rate
Dynamic Data visualization Example
Interactive-Dynamic Data visualization Example
mtcars$am[which(mtcars$am == 0)] <- 'Automatic'
mtcars$am[which(mtcars$am == 1)] <- 'Manual'
mtcars$am <- as.factor(mtcars$am)
fig <- plot_ly(mtcars, x = ~wt, y = ~hp, z = ~qsec, color = ~am)
figLS0tCnRpdGxlOiAiUmFpc2luZyB0aGUgQmFyIEdyYXBoIgphdXRob3I6ICJVZGkgQWx0ZXIgJiBNaWNoYWVsIEZyaWVuZGx5IgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWRmb3JtYXRzOjpyb2JvYm9vazoKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aHVtYm5haWxzOiB0cnVlCiAgICBsaWdodGJveDogdHJ1ZQogICAgZ2FsbGVyeTogZmFsc2UKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwotLS0KCgpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiNpbnN0YWxsLnBhY2thZ2VzKCJybWRmb3JtYXRzIikKbGlicmFyeShybWRmb3JtYXRzKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShNZXRCcmV3ZXIpCmxpYnJhcnkoZ2dhbmltYXRlKQoKIyMgR2xvYmFsIG9wdGlvbnMKb3B0aW9ucyhtYXgucHJpbnQ9Ijc1IikKb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLAoJICAgICAgICAgICAgIGNhY2hlPVRSVUUsCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwKICAgICAgICAgICAgICAgY29tbWVudD1OQSwKICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwKICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkKb3B0c19rbml0JHNldCh3aWR0aD03NSkKYGBgCgoKCiMgSW50ZXJhY3RpdmUgRGF0YSB2aXN1YWxpemF0aW9uIEV4YW1wbGUKCiMjICBRdWljayBhbmQgZWFzeSB2aXNhbGl6YXRpb246IFVzaW5nIHRoZSBgcGxvdGx5YCBwYWNrYWdlCgpgYGB7cn0KcCA8LSBnZ3Bsb3QobXRjYXJzLCBhZXMod3QsIG1wZykpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBmYWN0b3IoY3lsKSkpCgpnZ3Bsb3RseShwKQogIAoKCmBgYAoKCgojIyBUaXBzIGFuZCBiaWxscwoKCmBgYHtyIGVjaG89Rn0KbGlicmFyeShyZXNoYXBlMikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeW1vZGVscykKbGlicmFyeShwbG90bHkpCmRhdGEodGlwcykKCnkgPC0gdGlwcyR0aXAKWCA8LSB0aXBzJHRvdGFsX2JpbGwKCnNldC5zZWVkKDMxMSkKdGlwc19zcGxpdCA8LSBpbml0aWFsX3NwbGl0KHRpcHMpCnRpcHNfdHJhaW5pbmcgPC0gdGlwc19zcGxpdCAlPiUgCiAgdHJhaW5pbmcoKQp0aXBzX3Rlc3QgPC0gdGlwc19zcGxpdCAlPiUgCiAgdGVzdGluZygpCgpsbV9tb2RlbCA8LSBsaW5lYXJfcmVnKCkgJT4lIAogIHNldF9lbmdpbmUoJ2xtJykgJT4lIAogIHNldF9tb2RlKCdyZWdyZXNzaW9uJykgJT4lCiAgZml0KHRpcCB+IHRvdGFsX2JpbGwsIGRhdGEgPSB0aXBzX3RyYWluaW5nKSAKCnhfcmFuZ2UgPC0gc2VxKG1pbihYKSwgbWF4KFgpLCBsZW5ndGgub3V0ID0gMTAwKQp4X3JhbmdlIDwtIG1hdHJpeCh4X3JhbmdlLCBucm93PTEwMCwgbmNvbD0xKQp4ZGYgPC0gZGF0YS5mcmFtZSh4X3JhbmdlKQpjb2xuYW1lcyh4ZGYpIDwtIGMoJ3RvdGFsX2JpbGwnKQoKeWRmIDwtIGxtX21vZGVsICU+JQogIHByZWRpY3QoeGRmKSAKCmNvbG5hbWVzKHlkZikgPC0gYygndGlwJykKeHkgPC0gZGF0YS5mcmFtZSh4ZGYsIHlkZikgCgpmaWcgPC0gcGxvdF9seShkYXRhID0gdGlwc190cmFpbmluZywgeCA9IH50b3RhbF9iaWxsLCB5ID0gfnRpcCwgdHlwZSA9ICdzY2F0dGVyJywgbmFtZSA9ICd0cmFpbicsIG1vZGUgPSAnbWFya2VycycsIGFscGhhID0gMC42NSwKICAgICAgICAgICAgICAgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCc8Yj5UaXAgaW4gZG9sbGFyczwvYj46ICQle3g6LjJmfScsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+QmlsbCBpbiBkb2xsYXJzOiA8L2I+JCV7eX08YnI+JykpICU+JSAKICAKICBhZGRfdHJhY2UoZGF0YSA9IHRpcHNfdGVzdCwgeCA9IH50b3RhbF9iaWxsLCB5ID0gfnRpcCwgdHlwZSA9ICdzY2F0dGVyJywgbmFtZSA9ICd0ZXN0JywgbW9kZSA9ICdtYXJrZXJzJywgYWxwaGEgPSAwLjY1LCBob3ZlcnRlbXBsYXRlID0gcGFzdGUoJzxiPlRpcCBpbiBkb2xsYXJzPC9iPjogJCV7eDouMmZ9JywKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj48Yj5CaWxsIGluIGRvbGxhcnM6IDwvYj4kJXt5fTxicj4nKSkgJT4lIAogIGFkZF90cmFjZShkYXRhID0geHksIHggPSB+dG90YWxfYmlsbCwgeSA9IH50aXAsIG5hbWUgPSAncHJlZGljdGlvbicsIG1vZGUgPSAnbGluZXMnLCBhbHBoYSA9IDEsaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCc8Yj5UaXAgaW4gZG9sbGFyczwvYj46ICQle3g6LjJmfScsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+QmlsbCBpbiBkb2xsYXJzOiA8L2I+JCV7eX08YnI+JykpCmZpZyAKCmBgYAoKCgoKCgoKCiMjIFBvd2VyIHJhdGUKCgpgYGB7ciBlY2hvPUZ9CnNpbXJlc3VsdHMgPC0gcmVhZHhsOjpyZWFkX3hsc3goIn4vR29vZ2xlIERyaXZlL015IERyaXZlL0NvdXJzZSBNYXRlcmlhbHMgYW5kIFJlc291cmNlcy82MTM1IERhdGEgVmlzdWFsaXphdGlvbiAod2ludGVyIDIwMjIpL3dlbGNvbWUyZmxleGRhc2hib2FyZC9zaW11bGF0aW9uIHJlc3VsdHMueGxzeCIsIGNvbF9uYW1lcyA9IFRSVUUpCgoKc2ltcmVzdWx0cyRhcHByb2FjaCA8LSBmYWN0b3Ioc2ltcmVzdWx0cyRhcHByb2FjaCwgbGV2ZWxzID0gYygiZGlmZmVyZW5jZSBiYXNlZCIsICJlcXVpdmFsZW5jZSBiYXNlZCIpLCBvcmRlcmVkID0gRkFMU0UpCnNpbXJlc3VsdHMkYHRlc3QgdHlwZWAgPC0gZmFjdG9yKHNpbXJlc3VsdHMkYHRlc3QgdHlwZWAsIGxldmVscyA9IGMoIkRCIiwgIlRPU1QiLCAiQUgiKSwgb3JkZXJlZCA9IFRSVUUpCnNpbXJlc3VsdHMkcHJlZGljdG9yIDwtIGZhY3RvcihzaW1yZXN1bHRzJHByZWRpY3RvciwgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSwgb3JkZXJlZCA9IFRSVUUpCnNpbXJlc3VsdHMkYGVmZmVjdCBzaXplYCA8LSBmYWN0b3Ioc2ltcmVzdWx0cyRgZWZmZWN0IHNpemVgLCBsZXZlbHMgPSBjKDAsIDAuMDUsIDAuMSwgMC4xNSwgMC4yKSwgb3JkZXJlZCA9IFRSVUUpCnNpbXJlc3VsdHMkYHNhbXBsZSBzaXplYCA8LSBmYWN0b3Ioc2ltcmVzdWx0cyRgc2FtcGxlIHNpemVgLCBsZXZlbHMgPSBjKDUwLCA3NSwgMTAwLCAyNTAsIDUwMCwgMTAwMCksIG9yZGVyZWQgPSBUUlVFKQoKI3N0cihzaW1yZXN1bHRzKQoKY29ycmVjdExPQSA8LSBzdWJzZXQoc2ltcmVzdWx0cywgc2ltcmVzdWx0cyRgZWZmZWN0IHNpemVgICE9ICIwLjE1IiAmIHNpbXJlc3VsdHMkYGVmZmVjdCBzaXplYCAhPSAiMC4yIikgCmluY29ycmVjdExPQSA8LSBzdWJzZXQoc2ltcmVzdWx0cywgc2ltcmVzdWx0cyRgZWZmZWN0IHNpemVgID09IDAuMTUgfCBzaW1yZXN1bHRzJGBlZmZlY3Qgc2l6ZWAgPT0gMC4yKSAKCmNvcnJlY3RMT0EgPC0gY29ycmVjdExPQSAlPiUgCiAgcmVuYW1lKAogICAgZXMgPSBgZWZmZWN0IHNpemVgLAogICAgc3MgPSBgc2FtcGxlIHNpemVgCiAgICApCgppbmNvcnJlY3RMT0EgPC0gaW5jb3JyZWN0TE9BICU+JSAKICByZW5hbWUoCiAgICBlcyA9IGBlZmZlY3Qgc2l6ZWAsCiAgICBzcyA9IGBzYW1wbGUgc2l6ZWAKICAgICkKCgplcy5sYWJzIDwtIGMoJ1x1MDNCMiA9IDAnLCAiXHUwM0IyID0gMC4wNSIsICJcdTAzQjIgPSAwLjEiKQpuYW1lcyhlcy5sYWJzKSA8LSBjKCIwIiwgIjAuMDUiLCAiMC4xIikKCnAgPC0gY29ycmVjdExPQSAlPiUKZ2dwbG90KGFlcyh4ID1zcywgeSA9IGBMT0EgY29uY2x1c2lvbiByYXRlYCwgZ3JvdXAgPSBgdGVzdCB0eXBlYCwgY29sb3I9IGB0ZXN0IHR5cGVgLCB0ZXh0ID0gY29sbmFtZXMoY29ycmVjdExPQSkpKSArIGdlb21fbGluZShhZXModGV4dD0gcGFzdGUoIlRlc3Q6ICIsYHRlc3QgdHlwZWAsICJcblx1MDNCMiA9ICIsZXMsICJcbm46ICIsIHNzLCAiXG5Db3JyZWN0IENvbmNsdXNpb24gUmF0ZTogIiwxMDAqYExPQSBjb25jbHVzaW9uIHJhdGVgLCIlIiwgc2VwID0gIiIpICApLCBhbHBoYT0gLjgsc2l6ZT0gMS41LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0uMSkpK2ZhY2V0X3dyYXAofmVzLCBsYWJlbGxlciA9IGxhYmVsbGVyKGVzPSBlcy5sYWJzKSkrdGhlbWVfbWluaW1hbCgpK2xhYnMoeT0iUmF0ZSBvZiBDb3JyZWN0IE5lZ2xpZ2libGUgRWZmZWN0IENvbmNsdXNpb25zIiwgeCA9ICJTYW1wbGUgU2l6ZSIpKyBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSt0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSx2anVzdCA9IDEsIGhqdXN0PTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKQoKYGBgCgoKCgoKYGBge3IgZWNobz1GLCByZXN1bHRzPSdoaWRlJ30KCgpzaW1yZXN1bHRzIDwtIHJlYWRfZXhjZWwoIn4vR29vZ2xlIERyaXZlL015IERyaXZlL01hc3RlcidzIHRoZXNpcy9UUU1QIHN1Ym1pc3Npb24vUm91bmQgMS9GaW5hbC9GdWxsX3Jlc3VsdHNfZnJvbV9TaW1EZXNpZ25fQ29ycmVsYXRpb25zIERFQzI2Lnhsc3giKQoKI1ZpZXcoc2ltcmVzdWx0cykKc2ltcmVzdWx0c1siYmV0YSJdW3NpbXJlc3VsdHNbImJldGEiXSA9PSAxXSA8LSAwCnNpbXJlc3VsdHNbImJldGEiXVtzaW1yZXN1bHRzWyJiZXRhIl0gPT0gMl0gPC0gMC4wNQpzaW1yZXN1bHRzWyJiZXRhIl1bc2ltcmVzdWx0c1siYmV0YSJdID09IDNdIDwtIDAuMQpzaW1yZXN1bHRzWyJiZXRhIl1bc2ltcmVzdWx0c1siYmV0YSJdID09IDRdIDwtIDAuMTUKc2ltcmVzdWx0c1siYmV0YSJdW3NpbXJlc3VsdHNbImJldGEiXSA9PSA1XSA8LSAwLjIKc2ltcmVzdWx0cyRjb3JzIDwtIGZhY3RvcihzaW1yZXN1bHRzJGNvcnMpCnNpbXJlc3VsdHMkbGFiZWwgPC0gcGFzdGUoIs6yID0iLCBhcy5jaGFyYWN0ZXIoc2ltcmVzdWx0cyRiZXRhKSkKaGVhZChzaW1yZXN1bHRzKQoKCiMgQ09SUkVDVCAKY29ycmVjdCA8LSBzaW1yZXN1bHRzIHw+CiAgZmlsdGVyKGJldGEgPT0gMCB8IGJldGE9PTAuMDUgfCBiZXRhID09IDAuMSkgfD4KICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoTiksIHkgPSBjb25jbHVkaW5nX25lZ2xpZ2libGUucCwgCiAgICAgICAgICAgICAgZ3JvdXA9IGludGVyYWN0aW9uKHRlc3QsIGNvcnMpLCAKICAgICAgICAgICAgICBjb2xvdXI9IHRlc3QsICBsaW5ldHlwZSA9IGNvcnMpKSsKICBnZW9tX2xpbmUoYWVzKHRleHQ9IHBhc3RlKCJUZXN0OiAiLGB0ZXN0YCwgIlxuXHUwM0IyID0gIiwgYmV0YSwiXG5Db3JyZWxhdGlvbiA9ICIsIGNvcnMgLCAiXG5TYW1wbGUgc2l6ZTogIiwgTiwgIlxuQ29ycmVjdCBDb25jbHVzaW9uIFJhdGU6ICIsMTAwKmNvbmNsdWRpbmdfbmVnbGlnaWJsZS5wLCIlIiwgc2VwID0gIiIpICApLCBsaW5ld2lkdGg9MC44LCBhbHBoYT0wLjgpKyAKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygic29saWQiLCAibG9uZ2Rhc2giLCAiZG90ZGFzaCIsICJkb3R0ZWQiKSkrCiAgZmFjZXRfd3JhcCh+bGFiZWwpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZSgKICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dCgpKSsKICBsYWJzKGNvbG9yID0gIlRlc3QiLCBsaW5ldHlwZT0iQ29ycmVsYXRpb25zIikrCiAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxLDAuMSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLjgsIGxpbmV0eXBlPSdkb3R0ZWQnLCBjb2wgPSAnYmx1ZScpKwogIGxhYnMoeT0iUmF0ZSBvZiBDb3JyZWN0IE5lZ2xpZ2libGUgQXNzb2NpYXRpb24gQ29uY2x1c2lvbnMiLCB4ID0gIlNhbXBsZSBTaXplIikrICN0aXRsZSA9ICJDb3JyZWN0bHkgQ29uY2x1ZGluZyBOZWdsaWdpYmxlIEFzc29jaWF0aW9uIGJ5IFRlc3QsIEVmZmVjdCwgQ29ycmVsYXRpb24sIGFuZCBTYW1wbGUgU2l6ZSIKICBhbm5vdGF0ZSgidGV4dCIseD0iNTAiICwgeSA9IDAuODIsIGxhYmVsID0gIjEtXHUwM0IyID0gLjgwIiwgdmp1c3Q9LS43LGhqdXN0PS4yLCBzaXplPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgCgoKCmdncGxvdGx5KGNvcnJlY3QsIHRvb2x0aXAgPSAidGV4dCIpCgpgYGAKCiMjIEVycm9yIHJhdGUKCgpgYGB7ciBlY2hvPUZ9CiMgSU5DT1JSRUNUIAppbmNvcnJlY3QgPC0gc2ltcmVzdWx0cyB8PgogIGZpbHRlcihiZXRhID09IDAuMTUgfCBiZXRhPT0wLjIgKSB8PgogIGdncGxvdCggYWVzKHggPSBmYWN0b3IoTiksIHkgPSBjb25jbHVkaW5nX25lZ2xpZ2libGUucCwgCiAgICAgICAgICAgICAgZ3JvdXA9IGludGVyYWN0aW9uKHRlc3QsIGNvcnMpLCAKICAgICAgICAgICAgICBjb2xvdXI9IHRlc3QsIGxpbmV0eXBlID0gY29ycykpKwogIGdlb21fbGluZShhZXModGV4dD0gcGFzdGUoIlRlc3Q6ICIsYHRlc3RgLCAiXG5cdTAzQjIgPSAiLCBiZXRhLCJcbkNvcnJlbGF0aW9uID0gIiwgY29ycyAsICJcblNhbXBsZSBzaXplOiAiLCBOLCAiXG5Db3JyZWN0IENvbmNsdXNpb24gUmF0ZTogIiwxMDAqY29uY2x1ZGluZ19uZWdsaWdpYmxlLnAsIiUiLCBzZXAgPSAiIikgICksbGluZXdpZHRoPTAuOCwgYWxwaGE9MC44KSsgCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoInNvbGlkIiwgImxvbmdkYXNoIiwgImRvdGRhc2giLCAiZG90dGVkIikpKwogIGZhY2V0X3dyYXAofmxhYmVsKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUoCiAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoKSkrCiAgbGFicyhjb2xvciA9ICJUZXN0IiwgbGluZXR5cGU9IkNvcnJlbGF0aW9ucyIpKwogIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsMSwwLjEpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MC4wNSwgbGluZXR5cGU9J2RvdHRlZCcsIGNvbCA9ICdyZWQnKSsKICBsYWJzKCB5PSJSYXRlIG9mIEluY29ycmVjdCBOZWdsaWdpYmxlIEFzc29jaWF0aW9uIENvbmNsdXNpb25zIiwgeCA9ICJTYW1wbGUgU2l6ZSIpKyAjdGl0bGUgPSAiSW5jb3JyZWN0bHkgQ29uY2x1ZGluZyBOZWdsaWdpYmxlIEFzc29jaWF0aW9uIGJ5IFRlc3QsIEVmZmVjdCwgQ29ycmVsYXRpb24sIGFuZCBTYW1wbGUgU2l6ZSIsCiAgYW5ub3RhdGUoInRleHQiLHg9IjUwIiAsIHkgPSAwLjA3LCBsYWJlbCA9ICJcdTAzQjEgPSAuMDUiLCB2anVzdD0tLjcsaGp1c3Q9LjU1LCAgc2l6ZT0gMykrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSx2anVzdCA9IDEsIGhqdXN0PTEpKSAgCgoKZ2dwbG90bHkoaW5jb3JyZWN0LCB0b29sdGlwID0gInRleHQiKQoKCmBgYAoKCgojIER5bmFtaWMgRGF0YSB2aXN1YWxpemF0aW9uIEV4YW1wbGUKCiAqKltFeGFtcGxlcyBmcm9tIE1pY2hhZWwgQ2xhcmtdKGh0dHBzOi8vbS1jbGFyay5naXRodWIuaW8vcG9zdHMvMjAxOS0wNS0xNC1zaHJpbmthZ2UtaW4tbWl4ZWQtbW9kZWxzLyM6fjp0ZXh0PTAuNTQ0MDUlMjAlMjAlMjAlMjAwLjA0MjcwJTIwJTIwJTIwMTIuNzQtLFZpc3VhbGl6ZSUyMHRoZSUyMGJhc2VsaW5lJTIwbW9kZWwsLU5vdyUyMGl0JTIwaXMpKiogCgoKIyBJbnRlcmFjdGl2ZS1EeW5hbWljIERhdGEgdmlzdWFsaXphdGlvbiBFeGFtcGxlCgoKYGBge3IgcmVzdWx0cz0naGlkZSd9Cm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMCldIDwtICdBdXRvbWF0aWMnCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMSldIDwtICdNYW51YWwnCm10Y2FycyRhbSA8LSBhcy5mYWN0b3IobXRjYXJzJGFtKQoKZmlnIDwtIHBsb3RfbHkobXRjYXJzLCB4ID0gfnd0LCB5ID0gfmhwLCB6ID0gfnFzZWMsIGNvbG9yID0gfmFtKQoKZmlnCgoKYGBgCgpgYGB7ciBlY2hvPUZ9CiMgTUlOSSBQUkVTRU5UQVRJT046IERFTU9OU1RSQVRJT04gCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMCldIDwtICdBdXRvbWF0aWMnCm10Y2FycyRhbVt3aGljaChtdGNhcnMkYW0gPT0gMSldIDwtICdNYW51YWwnCm10Y2FycyRhbSA8LSBhcy5mYWN0b3IobXRjYXJzJGFtKQoKCmZpZyA8LSBwbG90X2x5KG10Y2FycywgeCA9IH53dCwgeSA9IH5ocCwgeiA9IH5xc2VjLCBjb2xvciA9IH5hbSwgCiAgICAgICAgICAgICAgIGNvbG9ycyA9IGMoJyNCRjM4MkEnLCAnIzBDNEI4RScpKQpmaWcgPC0gZmlnICU+JSBhZGRfbWFya2Vycyhob3ZlcnRlbXBsYXRlID0gcGFzdGUoJzxiPndlaWdodDwvYj46ICV7eDouMmZ9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+aG9yc2UgcG93ZXI8L2I+OiAle3l9PGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGI+MS80bWlsZS9nPC9iPjogJXt6fTxicj4nKSkKZmlnIDwtIGZpZyAlPiUgbGF5b3V0KHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnV2VpZ2h0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0dyb3NzIGhvcnNlcG93ZXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAnMS80IG1pbGUgdGltZScpKSkKZmlnCgoKY291bnQgPC0gMzAwMAoKeCA8LSBjKCkKeSA8LSBjKCkKeiA8LSBjKCkKYyA8LSBjKCkKCmZvciAoaSBpbiAxOmNvdW50KSB7CiAgciA8LSBpICogKGNvdW50IC0gaSkKICB4IDwtIGMoeCwgciAqIGNvcyhpIC8gMzApKQogIHkgPC0gYyh5LCByICogc2luKGkgLyAzMCkpCiAgeiA8LSBjKHosIGkpCiAgYyA8LSBjKGMsIGkpCn0KCmRhdGEgPC0gZGF0YS5mcmFtZSh4LCB5LCB6LCBjKQoKZmlnIDwtIHBsb3RfbHkoZGF0YSwgeCA9IH54LCB5ID0gfnksIHogPSB+eiwgdHlwZSA9ICdzY2F0dGVyM2QnLCBtb2RlID0gJ2xpbmVzJywKICAgICAgICAgICAgICAgbGluZSA9IGxpc3Qod2lkdGggPSA0LCBjb2xvciA9IH5jLCBjb2xvcnNjYWxlID0gbGlzdChjKDAsJyNCQTUyRUQnKSwgYygxLCcjRkNCMDQwJykpKSkKCmZpZwpgYGAKYGBge3IgZWNobz1GfQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5bW9kZWxzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShrZXJubGFiKQpsaWJyYXJ5KHByYWNtYSkgI0ZvciBtZXNoZ3JpZCgpCgoKbG0xIDwtIGxtKG1wZyB+IGhwICsgZGlzcCwgZGF0YSA9IG10Y2FycykKCmhwX2Rpc3BfZ3JpZCA8LSBleHBhbmRfZ3JpZChocCA9IHNlcSg1MCwgNTAwLCBieSA9IDEwKSwgZGlzcCA9IHNlcSg1MCwgNTAwLCBieSA9IDEwKSkKZ3JpZDIgPC0gCiAgaHBfZGlzcF9ncmlkICU+JSAKICBtdXRhdGUobXBnX3ByZWRfbG0xID0gcHJlZGljdChsbTEsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKGhwLCBkaXNwKSkpCgpncmlkX3dpZGUgPC0gCiAgZ3JpZDIgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkaXNwLCB2YWx1ZXNfZnJvbSA9IG1wZ19wcmVkX2xtMSkgJT4lIAogIHNlbGVjdCgtMSkgJT4lICAjIGtpY2sgdGhlIG5hbWUncyBjb2x1bW4gb3V0CiAgYXMubWF0cml4KCkKCgpwMSA8LSBwbG90X2x5KG10Y2FycywKICAgICAgICB4ID0gfiBocCwKICAgICAgICB5ID0gfiBkaXNwLAogICAgICAgIHogPSB+IG1wZywKICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIpCgpwMiA8LSBhZGRfdHJhY2UocCA9IHAxLAogICAgICAgICAgICAgICAgeiA9IGdyaWRfd2lkZSwKICAgICAgICAgICAgICAgIHggPSBzZXEoNTAsIDMwMCwgYnkgPSAxMCksCiAgICAgICAgICAgICAgICB5ID0gc2VxKDUwLCA1MDAsIGJ5ID0gMTApLAogICAgICAgICAgICAgICAgdHlwZSA9ICJzdXJmYWNlIikKcDIKCgoKCgoKZGF0YShpcmlzKQoKCgoKCgoKCm1lc2hfc2l6ZSA8LSAuMDIKbWFyZ2luIDwtIDAKWCA8LSBpcmlzICU+JSBzZWxlY3QoU2VwYWwuV2lkdGgsIFNlcGFsLkxlbmd0aCkKeSA8LSBpcmlzICU+JSBzZWxlY3QoUGV0YWwuV2lkdGgpCgptb2RlbCA8LSBzdm1fcmJmKGNvc3QgPSAxLjApICU+JSAKICBzZXRfZW5naW5lKCJrZXJubGFiIikgJT4lIAogIHNldF9tb2RlKCJyZWdyZXNzaW9uIikgJT4lIAogIGZpdChQZXRhbC5XaWR0aCB+IFNlcGFsLldpZHRoICsgU2VwYWwuTGVuZ3RoLCBkYXRhID0gaXJpcykKCnhfbWluIDwtIG1pbihYJFNlcGFsLldpZHRoKSAtIG1hcmdpbgp4X21heCA8LSBtYXgoWCRTZXBhbC5XaWR0aCkgLSBtYXJnaW4KeV9taW4gPC0gbWluKFgkU2VwYWwuTGVuZ3RoKSAtIG1hcmdpbgp5X21heCA8LSBtYXgoWCRTZXBhbC5MZW5ndGgpIC0gbWFyZ2luCnhyYW5nZSA8LSBzZXEoeF9taW4sIHhfbWF4LCBtZXNoX3NpemUpCnlyYW5nZSA8LSBzZXEoeV9taW4sIHlfbWF4LCBtZXNoX3NpemUpCnh5IDwtIG1lc2hncmlkKHggPSB4cmFuZ2UsIHkgPSB5cmFuZ2UpCnh4IDwtIHh5JFgKeXkgPC0geHkkWQpkaW1fdmFsIDwtIGRpbSh4eCkKeHgxIDwtIG1hdHJpeCh4eCwgbGVuZ3RoKHh4KSwgMSkKeXkxIDwtIG1hdHJpeCh5eSwgbGVuZ3RoKHl5KSwgMSkKZmluYWwgPC0gY2JpbmQoeHgxLCB5eTEpCnByZWQgPC0gbW9kZWwgJT4lCiAgcHJlZGljdChmaW5hbCkKCnByZWQgPC0gcHJlZCQucHJlZApwcmVkIDwtIG1hdHJpeChwcmVkLCBkaW1fdmFsWzFdLCBkaW1fdmFsWzJdKQoKZmlnIDwtIHBsb3RfbHkoaXJpcywgeCA9IH5TZXBhbC5XaWR0aCwgeSA9IH5TZXBhbC5MZW5ndGgsIHogPSB+UGV0YWwuV2lkdGggKSAlPiUgCiAgYWRkX21hcmtlcnMoc2l6ZSA9IDUpICU+JSAKICBhZGRfc3VyZmFjZSh4PXhyYW5nZSwgeT15cmFuZ2UsIHo9cHJlZCwgYWxwaGEgPSAwLjY1LCB0eXBlID0gJ21lc2gzZCcsIG5hbWUgPSAncHJlZF9zdXJmYWNlJykKZmlnCiAgCgoKCgoKCmBgYA==