Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
AF2013FD1DF8662465414FC1751F1FAF8F22F305267517AEF83A5E28E461BC7E
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
28,755,954
Gas consumed
FEE
250000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g17khqpukees4237dtn3astzapmp462vjhsz6st4
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpGpAQoML3ZtLm1fYWRkcGtnEv+oAQooZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NBLRqAEKA25mdBJDZ25vLmxhbmQvcC9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L3NldHRsZXJzL25mdC92MBrkCAoJUkVBRE1FLm1kEtYIIyBTZXR0bGVycyBOVEYKClBhY2thZ2UgdGhhdCBkcmF3cyB0aGUgU2V0dGxlcnMsIHNtYWxsIHBpeGVsLWFydCBnbm9tZXMsIGFzIGFuIFNWRy4KCkdpdmVuIHRoZSBzYW1lIHRyYWl0cywgaXQgYWx3YXlzIGRyYXdzIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgYW5kIGNoZWFwIGZvciBhbnkKcmVhbG0gdG8gaW1wb3J0IGFuZCBjYWxsIGRpcmVjdGx5LgoKQ29kZSBhbHNvIGxpdmVzIGluIFtqZXJvbmltb2FsYmkvZ25vbGFuZC1zZXR0bGVyc10oaHR0cHM6Ly9naXRodWIuY29tL2plcm9uaW1vYWxiaS9nbm9sYW5kLXNldHRsZXJzKS4KCiMjIEZyb20gYSBzZWVkCgpgYGBnbwp0cmFpdHMgOj0gbmZ0Lk5ld1RyYWl0cygic29tZS1zZWVkLXN0cmluZyIpCnN2ZyA6PSBuZnQuUmVuZGVyU1ZHKHRyYWl0cywgbmZ0Lk9wdGlvbnN7U2l6ZTogNTEyfSkKYGBgCgpUaGUgdHJhaXRzIChza2luLCBoYXQsIGJlYXJkLCBjbG90aGVzLCBnbGFzc2VzLCBiYWNrZ3JvdW5kLCBhbmQgc28gb24pIGFyZSBhbGwgd29ya2VkCm91dCBkZXRlcm1pbmlzdGljYWxseSBmcm9tIHRoZSBzZWVkLCBzbyB0aGUgc2FtZSBzZWVkIGFsd2F5cyBnaXZlcyB0aGUgc2FtZSBnbm9tZS4KCiMjIEZyb20gcGFja2VkIHRyYWl0cwoKVHJhaXRzIGFyZSB1c3VhbGx5IHN0b3JlZCBwYWNrZWQgaW50byBhIHNpbmdsZSBgdWludDMyYDoKCmBgYGdvCnBhY2tlZCA6PSBuZnQuUGFjayh0cmFpdHMpCnRyYWl0cywgZXJyIDo9IG5mdC5Gcm9tUGFja2VkKHBhY2tlZCkKc3ZnIDo9IG5mdC5SZW5kZXJTVkcodHJhaXRzLCBuZnQuT3B0aW9uc3t9KQpgYGAKCmBPcHRpb25zYCBhbHNvIHRha2VzIGBOb0JhY2tncm91bmRgIChhIHRyYW5zcGFyZW50IGltYWdlKSBhbmQgYEJhY2tncm91bmRDb2xvcmAKKGEgY3VzdG9tIG9uZSkuIGBSZW5kZXJEYXRhVVJJYCBnaXZlcyB0aGUgc2FtZSBpbWFnZSBhcyBhIGBkYXRhOmltYWdlL3N2Zyt4bWw7Li4uYCBVUkksCnJlYWR5IHRvIHVzZSBhcyBhbiBgPGltZz5gIHNvdXJjZS4KCiMjIExpY2Vuc2UKClRoZSBhcnQgaXRzZWxmIGlzIGRlZGljYXRlZCB0byB0aGUgcHVibGljIGRvbWFpbiB1bmRlciBDQzAgMS4wIFVuaXZlcnNhbDsgc2VlIGBDcmVkaXRzYC4KGsQqCghkYXRhLmdubxK3KnBhY2thZ2UgbmZ0CgovLyBQYXJ0cy4gRXZlcnkgcm93IGlzIHRoZSBsZWZ0IGhhbGYgb2YgdGhlIHNwcml0ZSwgbGVmdC1wYWRkZWQgd2l0aCAnLicgKHRyYW5zcGFyZW50KSB0byAxMgovLyBjb2x1bW5zLCBhbmQgcGFydHMgYXJlIHRoZSByb3dzIG9uZSBhZnRlciB0aGUgb3RoZXIuIFJvdyBpIHN0YXJ0cyBhdCBpKjEyLgoKY29uc3QgaGF0VGFsbCA9ICIiICsKCSIuLi4uLi4uLi4uLm8iICsgLy8geT0wCgkiLi4uLi4uLi4uLm9oIiArIC8vIHk9MQoJIi4uLi4uLi4uLi5vSCIgKyAvLyB5PTIKCSIuLi4uLi4uLi5vaEgiICsgLy8geT0zCgkiLi4uLi4uLi4ub0hIIiArIC8vIHk9NAoJIi4uLi4uLi4ub2hISCIgKyAvLyB5PTUKCSIuLi4uLi4uLm9ISEgiICsgLy8geT02CgkiLi4uLi4uLm9oSEhIIiArIC8vIHk9NwoJIi4uLi4uLi5vSEhISCIgKyAvLyB5PTgKCSIuLi4uLi5vaEhISEgiICsgLy8geT05CgkiLi4uLi4ub0hISEhIIiAvLyB5PTEwCgpjb25zdCBicmltID0gIiIgKwoJIi4uLi5vaEhISEhISCIgKyAvLyB5PTExCgkiLi4uLm9qampqampqIiAvLyB5PTEyCgpjb25zdCBoZWFkID0gIiIgKwoJIi4uLi4uLm91dXV1dSIgKyAvLyB5PTEzCgkiLi4uLi4ub3NXV1dzIiArIC8vIHk9MTQKCSIuLi4uLm9zc2Vzc3MiICsgLy8geT0xNQoJIi4uLi5vdXNzZXNzbiIgKyAvLyB5PTE2CgkiLi4uLi4ub3Nzc21uIiAvLyB5PTE3Cgpjb25zdCBoZWFkQmVhcmQgPSAiIiArCgkiLi4uLi5vd1dXV3Z2IiAvLyB5PTE4Cgpjb25zdCBoZWFkTm9CZWFyZCA9ICIiICsKCSIuLi4uLi5vc3NzdnYiICsgLy8geT0xOAoJIi4uLi4uLm9zc3N1dSIgKyAvLyB5PTE5CgkiLi4uLi4uLm9zc3NzIiArIC8vIHk9MjAKCSIuLi4uLi4uLm9vb28iIC8vIHk9MjEKCmNvbnN0IGJlYXJkTG9uZyA9ICIiICsKCSIuLi4uLm93V1dXV1ciICsgLy8geT0xOQoJIi4uLi4ub3dXV1d4VyIgKyAvLyB5PTIwCgkiLi4uLi4ub3dXV3hXIiArIC8vIHk9MjEKCSIuLi4uLi5vd1d4V1ciICsgLy8geT0yMgoJIi4uLi4uLi5vd1d4VyIgKyAvLyB5PTIzCgkiLi4uLi4uLm93V1dXIiArIC8vIHk9MjQKCSIuLi4uLi4uLm93V3giICsgLy8geT0yNQoJIi4uLi4uLi4uLm93VyIgKyAvLyB5PTI2CgkiLi4uLi4uLi4uLm93IiAvLyB5PTI3Cgpjb25zdCBiZWFyZFBvaW50eSA9ICIiICsKCSIuLi4uLm93V1dXV1ciICsgLy8geT0xOQoJIi4uLi4uLm93V1dXVyIgKyAvLyB5PTIwCgkiLi4uLi4ub3dXV3hXIiArIC8vIHk9MjEKCSIuLi4uLi4ub3dXV1ciICsgLy8geT0yMgoJIi4uLi4uLi5vd1d4VyIgKyAvLyB5PTIzCgkiLi4uLi4uLi5vd1dXIiArIC8vIHk9MjQKCSIuLi4uLi4uLm93V3giICsgLy8geT0yNQoJIi4uLi4uLi4uLm93VyIgKyAvLyB5PTI2CgkiLi4uLi4uLi4ub3d4IiArIC8vIHk9MjcKCSIuLi4uLi4uLi4ub3ciIC8vIHk9MjgKCmNvbnN0IGJlYXJkUm91bmQgPSAiIiArCgkiLi4uLi5vd1dXV1dXIiArIC8vIHk9MTkKCSIuLi4uLm93V1dXV1ciICsgLy8geT0yMAoJIi4uLi4uLm93V1dXVyIgKyAvLyB5PTIxCgkiLi4uLi4uLm93V1d4IiArIC8vIHk9MjIKCSIuLi4uLi4uLm93V1ciICsgLy8geT0yMwoJIi4uLi4uLi4uLm93VyIgKyAvLyB5PTI0CgkiLi4uLi4uLi4uLm93IiAvLyB5PTI1Cgpjb25zdCBib2R5ID0gIiIgKwoJIi4uLi5vY0NDQ0NDQyIgKyAvLyB5PTE5CgkiLi4ub2NDQ0NDQ0NDIiArIC8vIHk9MjAKCSIuLi5vY0NDQ0NDQ0MiICsgLy8geT0yMQoJIi4uLm9jQ0NDQ0NDQyIgKyAvLyB5PTIyCgkiLi5vc2NDQ0NDQ0NDIiArIC8vIHk9MjMKCSIuLm91Y0NDQ0NDQ0MiICsgLy8geT0yNAoJIi4uLm9ra2tra2treSIgKyAvLyB5PTI1CgkiLi4ub2NDQ0NDQ0NDIiArIC8vIHk9MjYKCSIuLi5vZGRkZGRkZGQiIC8vIHk9MjcKCmNvbnN0IGJvb3RzID0gIiIgKwoJIi4uLi4ub3BwcHBwbyIgKyAvLyB5PTI4CgkiLi4uLi5vcHBwcHBvIiArIC8vIHk9MjkKCSIuLi4uLm9xcXFxcW8iICsgLy8geT0zMAoJIi4uLi4ub29vb29vbyIgLy8geT0zMQoKLy8gQmVudC10aXAgaGF0LCBzZWUgdGhlIHNwZWMgc2VjdGlvbiA2LjEuCmNvbnN0IGNvbmVZMCA9IDIKCnZhciBjb25lSyA9IFsuLi5daW50ezEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDV9CgovLyB0YWlsU3BhbnMgYXJlIHRoZSBwaXhlbHMgb2YgdGhlIHRpcCwgd2hlbiBpdCBmYWxscyB0byB0aGUgcmlnaHQ6IHJvdyB5LCBmcm9tIHgwIHRvIHgxIChpbmNsdXNpdmUpLgp2YXIgdGFpbFNwYW5zID0gWy4uLl1zcGFue3sxLCAxMSwgMTR9LCB7MiwgMTQsIDE1fSwgezMsIDE1LCAxNX19CgovLyBHbGFzc2VzLCBzZWUgdGhlIHNwZWMgc2VjdGlvbiA2LjIuIFBhaXJzIGFyZSB4LCB5Lgp2YXIgKAoJZ2xhc3Nlc0ZyYW1lID0gWy4uLl1bMl1pbnR7ezcsIDE1fSwgezgsIDE1fSwgezksIDE1fSwgezE0LCAxNX0sIHsxNSwgMTV9LCB7MTYsIDE1fSwgezcsIDE2fSwgezksIDE2fSwgezEwLCAxNn0sIHsxMywgMTZ9LCB7MTQsIDE2fSwgezE2LCAxNn0sIHs3LCAxN30sIHs4LCAxN30sIHs5LCAxN30sIHsxNCwgMTd9LCB7MTUsIDE3fSwgezE2LCAxN319CglnbGFzc2VzRXllcyAgPSBbLi4uXVsyXWludHt7OCwgMTZ9LCB7MTUsIDE2fX0KKQoKLy8gUGFsZXR0ZXMsIGFzIGhleCBkaWdpdHMgd2l0aG91dCAnIycuIEV2ZXJ5IGVudHJ5IGhhcyAzIHRvbmVzOiBza2luIHQgcyB1LCBoYXQgaCBIIGosCi8vIGJlYXJkIHcgVyB4LCB0dW5pYyBjIEMgZC4gRW50cnkgaSBzdGFydHMgYXQgaSozLgp2YXIgKAoJc2tpbkNvbG9ycyAgICA9IFsuLi5dc3RyaW5neyJmZmQyYjAiLCAiZjJiNThjIiwgImQxOGY2OCIsICJmMGJkOTQiLCAiZDk5YTZjIiwgImI1NzY1MCIsICJjOThmNjYiLCAiYTg2ZjQ4IiwgIjgzNTAyZiJ9CgloYXRDb2xvcnMgICAgID0gWy4uLl1zdHJpbmd7ImYwNmE1YSIsICJkMTQxM2EiLCAiOWMyYTMzIiwgIjZhYTBmMCIsICIzZjZmZDEiLCAiMmI0YTk5IiwgIjdlZDM2YSIsICI0YWE4NGEiLCAiMmU3YTNhIiwgImI1OGNmMCIsICI4YTVjZDEiLCAiNWUzYzlhIiwgImZmYjQ1YSIsICJmMDhhMmEiLCAiYjU2MDFjIn0KCWJlYXJkQ29sb3JzICAgPSBbLi4uXXN0cmluZ3siZmZmZmZmIiwgImU5ZWNmMiIsICJiOWMwZDAiLCAiZDVkOWUwIiwgImFhYjFiZCIsICI3Yjg0OTQiLCAiZmZiMDVhIiwgImUwN2EyYSIsICJhNDUwMWMiLCAiYTg3NDRlIiwgIjdmNTIzNCIsICI1NzM2MjIifQoJdHVuaWNDb2xvcnMgICA9IFsuLi5dc3RyaW5neyI1ZmIwZTgiLCAiM2Y4ZmQxIiwgIjJiNjQ5YSIsICI4ZmQwNmEiLCAiNWZhODNmIiwgIjNkN2EyYSIsICJjOThhNWEiLCAiYTQ2NzNhIiwgIjc1NDUyYSIsICJlOTg2OGYiLCAiY2M1YTY4IiwgIjk5NDA1MCIsICJmMGQzNmEiLCAiZDFhODNhIiwgImEwN2EyNSJ9CglnbGFzc2VzQ29sb3JzID0gWy4uLl1zdHJpbmd7IjJhMWEyZSIsICJlOGI0MjIiLCAiZDE0MTNhIiwgIjJhYTE5OCJ9CgliZ0NvbG9ycyAgICAgID0gWy4uLl1zdHJpbmd7ImNmZThmMyIsICJmM2UzYzkiLCAiZGJlZWQyIiwgImVhZGNmMyIsICJmNmQ5ZDUifQopCgovLyBmaXhlZENvbG9yIHJldHVybnMgdGhlIGNvbG9yIG9mIHRoZSBrZXlzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIHRyYWl0LCBvciAiIi4KZnVuYyBmaXhlZENvbG9yKGtleSBieXRlKSBzdHJpbmcgewoJc3dpdGNoIGtleSB7CgljYXNlICdvJzoKCQlyZXR1cm4gIjJhMWEyZSIKCWNhc2UgJ2UnOgoJCXJldHVybiAiMWIxNjI2IgoJY2FzZSAnayc6CgkJcmV0dXJuICI2YjNmMjIiCgljYXNlICd5JzoKCQlyZXR1cm4gImY1YzU0MiIKCWNhc2UgJ3AnOgoJCXJldHVybiAiNmE0MTI2IgoJY2FzZSAncSc6CgkJcmV0dXJuICI0NjI3MWEiCgljYXNlICduJzoKCQlyZXR1cm4gImYwOGM3YyIKCWNhc2UgJ20nOgoJCXJldHVybiAiZmZiMGEwIgoJY2FzZSAndic6CgkJcmV0dXJuICJjODY0NWEiCgl9CglyZXR1cm4gIiIKfQoKLy8gc3dhcFRhYmxlIGhhcyB0aGUga2V5IHVzZWQgb24gdGhlIHJpZ2h0IGhhbGYgZm9yIGVhY2gga2V5IG9mIHRoZSBsZWZ0IGhhbGYuCnZhciBzd2FwVGFibGUgPSBbMTI4XWJ5dGV7CgknQyc6ICdDJywKCSdIJzogJ0gnLAoJJ1cnOiAnVycsCgknYyc6ICdkJywKCSdkJzogJ2QnLAoJJ2UnOiAnZScsCgknaCc6ICdqJywKCSdqJzogJ2onLAoJJ2snOiAnaycsCgknbSc6ICd2JywKCSduJzogJ24nLAoJJ28nOiAnbycsCgkncCc6ICdwJywKCSdxJzogJ3EnLAoJJ3MnOiAncycsCgkndSc6ICd1JywKCSd2JzogJ3YnLAoJJ3cnOiAneCcsCgkneCc6ICd4JywKCSd5JzogJ3knLAp9CgovLyBQYXRoIHNlZ21lbnRzIGFyZSAiTXt4fSB7eX1oe259djFoLXtufXoiLCB3cml0dGVuIGFzIG1IZWFkW3hdICsgbnVtc1t5XSArIHJ1blRhaWxbbl0uCi8vIFRoZSBwZXJjZW50LWVuY29kZWQgdmFyaWFudCBvbmx5IGRpZmZlcnMgaW4gdGhlIHNwYWNlLCB0aGF0IGlzIHdyaXR0ZW4gYXMgJTIwLgp2YXIgKAoJcmF3TUhlYWQgPSBbLi4uXXN0cmluZ3siTTAgIiwgIk0xICIsICJNMiAiLCAiTTMgIiwgIk00ICIsICJNNSAiLCAiTTYgIiwgIk03ICIsICJNOCAiLCAiTTkgIiwgIk0xMCAiLCAiTTExICIsICJNMTIgIiwgIk0xMyAiLCAiTTE0ICIsICJNMTUgIiwgIk0xNiAiLCAiTTE3ICIsICJNMTggIiwgIk0xOSAiLCAiTTIwICIsICJNMjEgIiwgIk0yMiAiLCAiTTIzICJ9Cgl1cmlNSGVhZCA9IFsuLi5dc3RyaW5neyJNMCUyMCIsICJNMSUyMCIsICJNMiUyMCIsICJNMyUyMCIsICJNNCUyMCIsICJNNSUyMCIsICJNNiUyMCIsICJNNyUyMCIsICJNOCUyMCIsICJNOSUyMCIsICJNMTAlMjAiLCAiTTExJTIwIiwgIk0xMiUyMCIsICJNMTMlMjAiLCAiTTE0JTIwIiwgIk0xNSUyMCIsICJNMTYlMjAiLCAiTTE3JTIwIiwgIk0xOCUyMCIsICJNMTklMjAiLCAiTTIwJTIwIiwgIk0yMSUyMCIsICJNMjIlMjAiLCAiTTIzJTIwIn0KCW51bXMgICAgID0gWy4uLl1zdHJpbmd7IjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAiMTEiLCAiMTIiLCAiMTMiLCAiMTQiLCAiMTUiLCAiMTYiLCAiMTciLCAiMTgiLCAiMTkiLCAiMjAiLCAiMjEiLCAiMjIiLCAiMjMiLCAiMjQiLCAiMjUiLCAiMjYiLCAiMjciLCAiMjgiLCAiMjkiLCAiMzAiLCAiMzEifQoJcnVuVGFpbCAgPSBbLi4uXXN0cmluZ3siIiwgImgxdjFoLTF6IiwgImgydjFoLTJ6IiwgImgzdjFoLTN6IiwgImg0djFoLTR6IiwgImg1djFoLTV6IiwgImg2djFoLTZ6IiwgImg3djFoLTd6IiwgImg4djFoLTh6IiwgImg5djFoLTl6IiwgImgxMHYxaC0xMHoiLCAiaDExdjFoLTExeiIsICJoMTJ2MWgtMTJ6IiwgImgxM3YxaC0xM3oiLCAiaDE0djFoLTE0eiIsICJoMTV2MWgtMTV6IiwgImgxNnYxaC0xNnoiLCAiaDE3djFoLTE3eiIsICJoMTh2MWgtMTh6IiwgImgxOXYxaC0xOXoiLCAiaDIwdjFoLTIweiIsICJoMjF2MWgtMjF6IiwgImgyMnYxaC0yMnoiLCAiaDIzdjFoLTIzeiIsICJoMjR2MWgtMjR6In0KKQoapAMKB2RvYy5nbm8SmAMvLyBQYWNrYWdlIGBuZnRgIGRyYXdzIHRoZSBTZXR0bGVycywgcGl4ZWwtYXJ0IGdub21lcy4KLy8gVGhlIGFydCBpcyBkZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4gdW5kZXIgQ0MwIDEuMCwgc2VlIENyZWRpdHMuCnBhY2thZ2UgbmZ0Cgpjb25zdCAoCgkvLyBTdHlsZSBpcyB0aGUgSUQgb2YgdGhlIGFydCBzdHlsZS4KCVN0eWxlID0gInNldHRsZXJzLXYxIgoKCS8vIENyZWRpdHMgaXMgdGhlIGxpY2Vuc2Ugb2YgdGhlIGFydC4KCUNyZWRpdHMgPSAiVGhlIGFydCBvZiB0aGUgU2V0dGxlcnMgaXMgZGVkaWNhdGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluIHVuZGVyICIgKwoJCSJbQ0MwIDEuMCBVbml2ZXJzYWxdKGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvKSIKKQoaagoLZ25vbW9kLnRvbWwSW21vZHVsZSA9ICJnbm8ubGFuZC9wL2cxN2tocXB1a2VlczQyMzdkdG4zYXN0emFwbXA0NjJ2amhzejZzdDQvc2V0dGxlcnMvbmZ0L3YwIgpnbm8gPSAiMC45IgoahB0KCGdyaWQuZ25vEvcccGFja2FnZSBuZnQKCmNvbnN0ICgKCWdyaWRXID0gMjQKCWdyaWRIID0gMzIKCWhhbGYgID0gMTIgLy8gY29sdW1ucyBvZiB0aGUgbGVmdCBoYWxmLCB3aGVyZSByb3dzIGFyZSB3cml0dGVuCikKCi8vIHNwYW4gaXMgYSBob3Jpem9udGFsIHJhbmdlIG9mIHBpeGVscywgeDAgdG8geDEgaW5jbHVzaXZlLgp0eXBlIHNwYW4gc3RydWN0eyB5LCB4MCwgeDEgaW50IH0KCi8vIEJ1aWxkR3JpZCByZXR1cm5zIHRoZSBwaXhlbCBncmlkIG9mIGEgZ25vbWUsIGFzIDMyIHJvd3Mgb2YgMjQgcGFsZXR0ZSBrZXlzICgnLicgaXMgdHJhbnNwYXJlbnQpLgovLyBUcmFpdHMgbXVzdCBiZSB2YWxpZC4KZnVuYyBCdWlsZEdyaWQodCBUcmFpdHMpIFtdc3RyaW5nIHsKCWcgOj0gYnVpbGRHcmlkKHQpCgoJcm93cyA6PSBtYWtlKFtdc3RyaW5nLCBncmlkSCkKCWZvciB5IDo9IDA7IHkgPCBncmlkSDsgeSsrIHsKCQlyb3cgOj0gbWFrZShbXWJ5dGUsIGdyaWRXKQoJCWZvciB4IDo9IDA7IHggPCBncmlkVzsgeCsrIHsKCQkJYyA6PSBnW3kqZ3JpZFcreF0KCQkJaWYgYyA9PSAwIHsKCQkJCWMgPSAnLicKCQkJfQoJCQlyb3dbeF0gPSBjCgkJfQoJCXJvd3NbeV0gPSBzdHJpbmcocm93KQoJfQoJcmV0dXJuIHJvd3MKfQoKLy8gYnVpbGRHcmlkIGRyYXdzIGFsbCB0aGUgbGF5ZXJzIG9mIGEgZ25vbWUuIFRoZSBncmlkIGhhcyBhIGJ5dGUgcGVyIHBpeGVsLCByb3cgYnkgcm93LCBhbmQgMCBpcyB0cmFuc3BhcmVudC4KZnVuYyBidWlsZEdyaWQodCBUcmFpdHMpIFtdYnl0ZSB7CglpZiBlcnIgOj0gdC5WYWxpZGF0ZSgpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygic2V0dGxlcnM6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCglnIDo9IG1ha2UoW11ieXRlLCBncmlkVypncmlkSCkKCglkcmF3KGcsIGJvZHksIDE5KQoJaWYgdC5CZWFyZCA9PSAwIHsKCQlkcmF3KGcsIGhlYWQraGVhZE5vQmVhcmQsIDEzKQoJfSBlbHNlIHsKCQlzd2l0Y2ggdC5CZWFyZCB7CgkJY2FzZSAxOgoJCQlkcmF3KGcsIGJlYXJkTG9uZywgMTkpCgkJY2FzZSAyOgoJCQlkcmF3KGcsIGJlYXJkUG9pbnR5LCAxOSkKCQlkZWZhdWx0OgoJCQlkcmF3KGcsIGJlYXJkUm91bmQsIDE5KQoJCX0KCQlkcmF3KGcsIGhlYWQraGVhZEJlYXJkLCAxMykKCX0KCglpZiB0LkdsYXNzZXMgPiAwIHsKCQlmb3IgXywgcCA6PSByYW5nZSBnbGFzc2VzRnJhbWUgewoJCQlwdXQoZywgcFswXSwgcFsxXSwgJ2cnKQoJCX0KCQlmb3IgXywgcCA6PSByYW5nZSBnbGFzc2VzRXllcyB7CgkJCXB1dChnLCBwWzBdLCBwWzFdLCAnZScpCgkJfQoJfQoKCWlmIHQuSGF0U2hhcGUgPT0gMCB7CgkJZHJhdyhnLCBoYXRUYWxsLCAwKQoJfSBlbHNlIHsKCQlkcmF3QmVudEhhdChnLCB0LkZsaXAgPT0gMSkKCX0KCWRyYXcoZywgYnJpbSwgMTEpCglkcmF3KGcsIGJvb3RzLCAyOCkKCXJldHVybiBnCn0KCi8vIGRyYXcgZHJhd3Mgcm93cywgdGhhdCBhcmUgdGhlIGxlZnQgaGFsZiBvZiB0aGUgc3ByaXRlLCBzdGFydGluZyBhdCByb3cgeTAuIFRoZSByaWdodCBoYWxmIGlzCi8vIHRoZSBsZWZ0IGhhbGYgbWlycm9yZWQsIHdoZXJlIGxpZ2h0IHRvbmVzIGFyZSBzd2FwcGVkIGJ5IHRoZWlyIHNoYWRlZCB0d2luLgpmdW5jIGRyYXcoZyBbXWJ5dGUsIHJvd3Mgc3RyaW5nLCB5MCBpbnQpIHsKCWZvciBpIDo9IDA7IGkqaGFsZiA8IGxlbihyb3dzKTsgaSsrIHsKCQl5IDo9IHkwICsgaQoJCWlmIHkgPCAwIHx8IHkgPj0gZ3JpZEggewoJCQljb250aW51ZQoJCX0KCgkJcm93IDo9IHJvd3NbaSpoYWxmIDogKGkrMSkqaGFsZl0KCQlmb3IgaiA6PSAwOyBqIDwgaGFsZjsgaisrIHsKCQkJYyA6PSByb3dbal0KCQkJaWYgYyAhPSAnLicgewoJCQkJZ1t5KmdyaWRXK2pdID0gYwoJCQkJZ1t5KmdyaWRXK2dyaWRXLTEtal0gPSBzd2FwVGFibGVbY10KCQkJfQoJCX0KCX0KfQoKZnVuYyBwdXQoZyBbXWJ5dGUsIHgsIHkgaW50LCBjIGJ5dGUpIHsKCWlmIHggPj0gMCAmJiB4IDwgZ3JpZFcgJiYgeSA+PSAwICYmIHkgPCBncmlkSCB7CgkJZ1t5KmdyaWRXK3hdID0gYwoJfQp9CgovLyBkcmF3QmVudEhhdCBkcmF3cyB0aGUgaGF0IHdpdGggdGhlIHRpcCB0aGF0IGZhbGxzIHRvIHRoZSByaWdodCwgb3IgdG8gdGhlIGxlZnQgd2hlbiBmbGlwcGVkLgovLwovLyBJdCBpcyB3cml0dGVuIHdpdGhvdXQgZnVuY3Rpb24gY2FsbHMgKG5vIGNsb3N1cmVzIG9yIGhlbHBlcnMpLCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBtb3N0Ci8vIGV4cGVuc2l2ZSB0aGluZyBpbiBHbm8uIFRoZSBmaWxsIGhhcyBhIGJvcmRlciBvZiBvbmUgY2VsbCwgc28gbmVpZ2hib3JzIG5ldmVyIG5lZWQgYSBib3VuZHMgY2hlY2suCmZ1bmMgZHJhd0JlbnRIYXQoZyBbXWJ5dGUsIGZsaXAgYm9vbCkgewoJY29uc3QgKAoJCXJvd3MgICA9IGNvbmVZMCArIGxlbihjb25lSykgKyAxIC8vIHJvd3Mgb2YgdGhlIGhhdCwgb25lIG1vcmUgdGhhbiB0aGUgY29uZSBmb3IgaXRzIG91dGxpbmUKCQlzdHJpZGUgPSBncmlkVyArIDIKCSkKCXZhciBmaWxsIFsocm93cyArIDIpICogc3RyaWRlXWJvb2wgLy8gTm8gbWFwcyBhcmUgdXNlZCB0byBrZWVwIGl0IGRldGVybWluaXN0aWMKCglmb3IgaSwgayA6PSByYW5nZSBjb25lSyB7CgkJZm9yIHggOj0gaGFsZiAtIGs7IHggPCBoYWxmK2s7IHgrKyB7CgkJCWlmIGZsaXAgewoJCQkJZmlsbFsoY29uZVkwK2krMSkqc3RyaWRlK2dyaWRXLXhdID0gdHJ1ZSAvLyBtaXJyb3JlZCBjb2x1bW4gZ3JpZFctMS14LCBwbHVzIHRoZSBib3JkZXIKCQkJfSBlbHNlIHsKCQkJCWZpbGxbKGNvbmVZMCtpKzEpKnN0cmlkZSt4KzFdID0gdHJ1ZQoJCQl9CgkJfQoJfQoJZm9yIF8sIHMgOj0gcmFuZ2UgdGFpbFNwYW5zIHsKCQlmb3IgeCA6PSBzLngwOyB4IDw9IHMueDE7IHgrKyB7CgkJCWlmIGZsaXAgewoJCQkJZmlsbFsocy55KzEpKnN0cmlkZStncmlkVy14XSA9IHRydWUKCQkJfSBlbHNlIHsKCQkJCWZpbGxbKHMueSsxKSpzdHJpZGUreCsxXSA9IHRydWUKCQkJfQoJCX0KCX0KCglmb3IgeSA6PSAwOyB5IDwgcm93czsgeSsrIHsKCQlmb3IgeCA6PSAwOyB4IDwgZ3JpZFc7IHgrKyB7CgkJCWkgOj0gKHkrMSkqc3RyaWRlICsgeCArIDEKCQkJaWYgIWZpbGxbaV0gewoJCQkJY29udGludWUKCQkJfQoJCQlsZWZ0LCByaWdodCwgdXAsIGRvd24gOj0gZmlsbFtpLTFdLCBmaWxsW2krMV0sIGZpbGxbaS1zdHJpZGVdLCBmaWxsW2krc3RyaWRlXQoKCQkJLy8gU2hhZGluZwoJCQljIDo9IGJ5dGUoJ0gnKQoJCQlpZiAhbGVmdCB7CgkJCQlpZiB5JTIgPT0gMSB7CgkJCQkJYyA9ICdoJwoJCQkJfQoJCQl9IGVsc2UgaWYgIXJpZ2h0IHx8ICFkb3duIHsKCQkJCWMgPSAnaicKCQkJfQoJCQlnW3kqZ3JpZFcreF0gPSBjCgoJCQkvLyBPdXRsaW5lLiBJdCBvbmx5IHRvdWNoZXMgcGl4ZWxzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBoYXQsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyCgkJCS8vIHRoYXQgaXQgaXMgZG9uZSBpbiB0aGUgc2FtZSBwYXNzIGFzIHRoZSBzaGFkaW5nLgoJCQlpZiAhbGVmdCAmJiB4ID4gMCB7CgkJCQlnW3kqZ3JpZFcreC0xXSA9ICdvJwoJCQl9CgkJCWlmICFyaWdodCAmJiB4IDwgZ3JpZFctMSB7CgkJCQlnW3kqZ3JpZFcreCsxXSA9ICdvJwoJCQl9CgkJCWlmICF1cCAmJiB5ID4gMCB7CgkJCQlnWyh5LTEpKmdyaWRXK3hdID0gJ28nCgkJCX0KCQkJaWYgIWRvd24gewoJCQkJZ1soeSsxKSpncmlkVyt4XSA9ICdvJwoJCQl9CgkJfQoJfQp9ChqjMAoHc3ZnLmdubxKXMHBhY2thZ2UgbmZ0CgppbXBvcnQgKAoJImVuY29kaW5nL2Jhc2U2NCIKCSJzdHJjb252IgopCgovLyBDYW5vbmljYWxTaXplIGlzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgaW1hZ2UgdXNlZCBmb3IgTkZUcy4KY29uc3QgQ2Fub25pY2FsU2l6ZSA9IDUxMgoKLy8gT3B0aW9ucyBhcmUgdGhlIG9wdGlvbnMgdG8gcmVuZGVyIGEgZ25vbWUuCnR5cGUgT3B0aW9ucyBzdHJ1Y3QgewoJLy8gU2l6ZSBpcyB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscywgYmVjYXVzZSB0aGUgaW1hZ2UgaXMgYSBzcXVhcmUuCgkvLyBNdWx0aXBsZXMgb2YgMzIga2VlcCBldmVyeSBhcnQgcGl4ZWwgYXMgYSB3aG9sZSBudW1iZXIgb2Ygc2NyZWVuIHBpeGVscy4KCS8vIFplcm8gb21pdHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQsIHNvIHRoYXQgdGhlIGltYWdlIHNjYWxlcyB0byBpdHMgY29udGFpbmVyLgoJU2l6ZSBpbnQKCgkvLyBOb0JhY2tncm91bmQgb21pdHMgdGhlIGJhY2tncm91bmQuCglOb0JhY2tncm91bmQgYm9vbAoKCS8vIEJhY2tncm91bmRDb2xvciByZXBsYWNlcyB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmQsIGluICIjcnJnZ2JiIiBmb3JtYXQuCglCYWNrZ3JvdW5kQ29sb3Igc3RyaW5nCn0KCi8vIFJlbmRlclNWRyByZW5kZXJzIHRoZSBnbm9tZSBhcyBhbiBTVkcgZG9jdW1lbnQuCi8vIFRyYWl0cyBtdXN0IGJlIHZhbGlkLgovLyBUaGUgc2FtZSB0cmFpdHMgYW5kIG9wdGlvbnMgYWx3YXlzIGdpdmUgdGhlIHNhbWUgYnl0ZXMuCmZ1bmMgUmVuZGVyU1ZHKHQgVHJhaXRzLCBvIE9wdGlvbnMpIHN0cmluZyB7CglyZXR1cm4gcmVuZGVyKHQsIG8sICZyYXdTeW50YXgpCn0KCi8vIFJlbmRlclNlZWQgcmVuZGVycyB0aGUgZ25vbWUgb2YgYSBzZWVkIGFzIGFuIFNWRyBkb2N1bWVudC4KZnVuYyBSZW5kZXJTZWVkKHNlZWQgc3RyaW5nLCBvIE9wdGlvbnMpIHN0cmluZyB7CglyZXR1cm4gUmVuZGVyU1ZHKE5ld1RyYWl0cyhzZWVkKSwgbykKfQoKLy8gUmVuZGVyRGF0YVVSSSByZW5kZXJzIHRoZSBnbm9tZSBhcyBhICJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwiIFVSSSwgcGVyY2VudC1lbmNvZGVkLgovLwovLyBDaGVhcGVzdCB3YXkgdG8gZW1iZWQgYSBnbm9tZS4KLy8gU1ZHIGlzIHdyaXR0ZW4gZW5jb2RlZCwgaW5zdGVhZCBvZiBlbmNvZGluZyBpdCBhZnRlcndhcmRzLgovLyBUcmFpdHMgbXVzdCBiZSB2YWxpZC4KZnVuYyBSZW5kZXJEYXRhVVJJKHQgVHJhaXRzLCBvIE9wdGlvbnMpIHN0cmluZyB7CglyZXR1cm4gImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCIgKyByZW5kZXIodCwgbywgJnVyaVN5bnRheCkKfQoKLy8gRGF0YVVSSSBlbmNvZGVzIGFuIFNWRyBkb2N1bWVudCBhcyBhICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgVVJJLgovLyBJdCBpcyBzbG93ZXIgdGhhbiBSZW5kZXJEYXRhVVJJLCB1c2UgaXQgd2hlbiBCYXNlNjQgaXMgbmVlZGVkLgpmdW5jIERhdGFVUkkoc3ZnIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShzdmcpKQp9CgovLyBzeW50YXggZGVmaW5lIHRoZSBmaXhlZCBwaWVjZXMgb2YgdGhlIFNWRyBkb2N1bWVudCwgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGdub21lLgp0eXBlIHN5bnRheCBzdHJ1Y3QgewoJb3BlbiAgICAgICBzdHJpbmcgLy8gc3RhcnQgb2YgdGhlIHN2ZyBlbGVtZW50LCB1cCB0byBpdHMgc2l6ZQoJd2lkdGhPcGVuICBzdHJpbmcKCWhlaWdodE9wZW4gc3RyaW5nCglzaXplQ2xvc2UgIHN0cmluZwoJb3BlbkVuZCAgICBzdHJpbmcgLy8gZW5kIG9mIHRoZSBzdGFydCBvZiB0aGUgc3ZnIGVsZW1lbnQKCXJlY3RPcGVuICAgc3RyaW5nIC8vIGJhY2tncm91bmQsIGJlZm9yZSBpdHMgY29sb3IKCXJlY3RDbG9zZSAgc3RyaW5nCglwYXRoT3BlbiAgIHN0cmluZyAvLyBiZWZvcmUgdGhlIGNvbG9yCglwYXRoTWlkICAgIHN0cmluZyAvLyBhZnRlciB0aGUgY29sb3IsIGJlZm9yZSB0aGUgc2VnbWVudHMKCXBhdGhDbG9zZSAgc3RyaW5nCgllbmQgICAgICAgIHN0cmluZwoJbUhlYWQgICAgICBbXXN0cmluZyAvLyBzdGFydCBvZiBhIHNlZ21lbnQsIGJ5IHgKfQoKLy8gcmF3U3ludGF4IGNvbnRhaW5zIHRoZSBmaXhlZCBwaWVjZXMgb2YgdGhlIFNWRyBkb2N1bWVudC4KdmFyIHJhd1N5bnRheCA9IHN5bnRheHsKCW9wZW46ICAgICAgIGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iLTQgMCAzMiAzMiJgLAoJd2lkdGhPcGVuOiAgYCB3aWR0aD0iYCwKCWhlaWdodE9wZW46IGAiIGhlaWdodD0iYCwKCXNpemVDbG9zZTogIGAiYCwKCW9wZW5FbmQ6ICAgIGAgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj5gLAoJcmVjdE9wZW46ICAgYDxyZWN0IHg9Ii00IiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IiNgLAoJcmVjdENsb3NlOiAgYCIvPmAsCglwYXRoT3BlbjogICBgPHBhdGggZmlsbD0iI2AsCglwYXRoTWlkOiAgICBgIiBkPSJgLAoJcGF0aENsb3NlOiAgYCIvPmAsCgllbmQ6ICAgICAgICBgPC9zdmc+YCwKCW1IZWFkOiAgICAgIHJhd01IZWFkWzpdLAp9CgovLyB1cmlTeW50YXggY29udGFpbnMgdGhlIGZpeGVzIHBpZWNlcyBvZiB0aGUgU1ZHIGRvY3VtZW50IGVuY29kZWQgZm9yIGRhdGEgVVJJLgp2YXIgdXJpU3ludGF4ID0gc3ludGF4ewoJb3BlbjogICAgICAgYCUzQ3N2ZyUyMHhtbG5zPSUyMmh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTIwdmlld0JveD0lMjItNCUyMDAlMjAzMiUyMDMyJTIyYCwKCXdpZHRoT3BlbjogIGAlMjB3aWR0aD0lMjJgLAoJaGVpZ2h0T3BlbjogYCUyMiUyMGhlaWdodD0lMjJgLAoJc2l6ZUNsb3NlOiAgYCUyMmAsCglvcGVuRW5kOiAgICBgJTIwc2hhcGUtcmVuZGVyaW5nPSUyMmNyaXNwRWRnZXMlMjIlM0VgLAoJcmVjdE9wZW46ICAgYCUzQ3JlY3QlMjB4PSUyMi00JTIyJTIwd2lkdGg9JTIyMzIlMjIlMjBoZWlnaHQ9JTIyMzIlMjIlMjBmaWxsPSUyMiUyM2AsCglyZWN0Q2xvc2U6ICBgJTIyLyUzRWAsCglwYXRoT3BlbjogICBgJTNDcGF0aCUyMGZpbGw9JTIyJTIzYCwKCXBhdGhNaWQ6ICAgIGAlMjIlMjBkPSUyMmAsCglwYXRoQ2xvc2U6ICBgJTIyLyUzRWAsCgllbmQ6ICAgICAgICBgJTNDL3N2ZyUzRWAsCgltSGVhZDogICAgICB1cmlNSGVhZFs6XSwKfQoKLy8gbWF4R3JvdXBzIGlzIHRoZSBiaWdnZXN0IG51bWJlciBvZiBkaWZmZXJlbnQgY29sb3JzIG9mIGEgZ25vbWU6IDIyIGtleXMuCmNvbnN0IG1heEdyb3VwcyA9IDI0CgovLyByZW5kZXIgZHJhd3MgdGhlIGdub21lOgovLyAgIC0gUGl4ZWxzIGFyZSBzY2FubmVkIHJvdyBieSByb3csIGFuZCBob3Jpem9udGFsIHJ1bnMgb2YgdGhlIHNhbWUga2V5IGFyZSBvbmUgc2VnbWVudC4KLy8gICAtIFNlZ21lbnRzIGFyZSBncm91cGVkIGJ5IGNvbG9yLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggZWFjaCBjb2xvciBhcHBlYXJzIGZpcnN0LgpmdW5jIHJlbmRlcih0IFRyYWl0cywgbyBPcHRpb25zLCBzICpzeW50YXgpIHN0cmluZyB7CglnIDo9IGJ1aWxkR3JpZCh0KQoJYmcgOj0gYmdDb2xvcnNbdC5CYWNrZ3JvdW5kXQoJaWYgby5CYWNrZ3JvdW5kQ29sb3IgIT0gIiIgewoJCWJnID0gaGV4Q29sb3Ioby5CYWNrZ3JvdW5kQ29sb3IpCgl9CgoJdmFyICgKCQlncm91cE9mICAgIFsxMjhddWludDggLy8gZ3JvdXAgb2YgYSBrZXkgcGx1cyBvbmUsIG9yIDAgd2hlbiB0aGUga2V5IHdhcyBub3Qgc2VlbgoJCWdyb3VwQ29sb3IgW21heEdyb3Vwc11zdHJpbmcKCQlncm91cFBhdGggIFttYXhHcm91cHNdc3RyaW5nCgkJZ3JvdXBzICAgICBpbnQKCSkKCWZvciB5IDo9IDA7IHkgPCBncmlkSDsgeSsrIHsKCQlyb3cgOj0gZ1t5KmdyaWRXIDogKHkrMSkqZ3JpZFddCgkJZm9yIHggOj0gMDsgeCA8IGdyaWRXOyB7CgkJCWMgOj0gcm93W3hdCgkJCWlmIGMgPT0gMCB7CgkJCQl4KysKCQkJCWNvbnRpbnVlCgkJCX0KCgkJCW4gOj0gMQoJCQlmb3IgeCtuIDwgZ3JpZFcgJiYgcm93W3grbl0gPT0gYyB7CgkJCQluKysKCQkJfQoKCQkJZ2kgOj0gaW50KGdyb3VwT2ZbY10pCgkJCWlmIGdpID09IDAgewoJCQkJLy8gRmlyc3QgdGltZSB0aGF0IHRoZSBrZXkgaXMgc2VlbiwgaXRzIGNvbG9yIG1pZ2h0IGJlIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGtleQoJCQkJY29sb3IgOj0gY29sb3JPZih0LCBjKQoJCQkJZm9yIGkgOj0gMDsgaSA8IGdyb3VwczsgaSsrIHsKCQkJCQlpZiBncm91cENvbG9yW2ldID09IGNvbG9yIHsKCQkJCQkJZ2kgPSBpICsgMQoJCQkJCQlicmVhawoJCQkJCX0KCQkJCX0KCgkJCQlpZiBnaSA9PSAwIHsKCQkJCQlncm91cENvbG9yW2dyb3Vwc10gPSBjb2xvcgoJCQkJCWdyb3VwcysrCgkJCQkJZ2kgPSBncm91cHMKCQkJCX0KCgkJCQlncm91cE9mW2NdID0gdWludDgoZ2kpCgkJCX0KCgkJCWdpLS0KCQkJZ3JvdXBQYXRoW2dpXSArPSBzLm1IZWFkW3hdICsgbnVtc1t5XSArIHJ1blRhaWxbbl0KCQkJeCArPSBuCgkJfQoJfQoKCW91dCA6PSBzLm9wZW4KCWlmIG8uU2l6ZSA+IDAgewoJCXB4IDo9IHN0cmNvbnYuSXRvYShvLlNpemUpCgkJb3V0ICs9IHMud2lkdGhPcGVuICsgcHggKyBzLmhlaWdodE9wZW4gKyBweCArIHMuc2l6ZUNsb3NlCgl9CgoJb3V0ICs9IHMub3BlbkVuZAoJaWYgIW8uTm9CYWNrZ3JvdW5kIHsKCQlvdXQgKz0gcy5yZWN0T3BlbiArIGJnICsgcy5yZWN0Q2xvc2UKCX0KCglmb3IgaSA6PSAwOyBpIDwgZ3JvdXBzOyBpKysgewoJCW91dCArPSBzLnBhdGhPcGVuICsgZ3JvdXBDb2xvcltpXSArIHMucGF0aE1pZCArIGdyb3VwUGF0aFtpXSArIHMucGF0aENsb3NlCgl9CglyZXR1cm4gb3V0ICsgcy5lbmQKfQoKLy8gY29sb3JPZiByZXR1cm5zIHRoZSBjb2xvciBvZiBhIHBhbGV0dGUga2V5LCBpbiBoZXggZGlnaXRzLgpmdW5jIGNvbG9yT2YodCBUcmFpdHMsIGtleSBieXRlKSBzdHJpbmcgewoJaWYgYyA6PSBmaXhlZENvbG9yKGtleSk7IGMgIT0gIiIgewoJCXJldHVybiBjCgl9CgoJc2tpbiA6PSBpbnQodC5Ta2luKSAqIDMKCWhhdCA6PSBpbnQodC5IYXQpICogMwoJYmVhcmQgOj0gaW50KHQuQmVhcmRDb2xvcikgKiAzCgl0dW5pYyA6PSBpbnQodC5UdW5pYykgKiAzCgoJc3dpdGNoIGtleSB7CgljYXNlICd0JzoKCQlyZXR1cm4gc2tpbkNvbG9yc1tza2luXQoJY2FzZSAncyc6CgkJcmV0dXJuIHNraW5Db2xvcnNbc2tpbisxXQoJY2FzZSAndSc6CgkJcmV0dXJuIHNraW5Db2xvcnNbc2tpbisyXQoJY2FzZSAnaCc6CgkJcmV0dXJuIGhhdENvbG9yc1toYXRdCgljYXNlICdIJzoKCQlyZXR1cm4gaGF0Q29sb3JzW2hhdCsxXQoJY2FzZSAnaic6CgkJcmV0dXJuIGhhdENvbG9yc1toYXQrMl0KCWNhc2UgJ3cnOgoJCXJldHVybiBiZWFyZENvbG9yc1tiZWFyZF0KCWNhc2UgJ1cnOgoJCXJldHVybiBiZWFyZENvbG9yc1tiZWFyZCsxXQoJY2FzZSAneCc6CgkJcmV0dXJuIGJlYXJkQ29sb3JzW2JlYXJkKzJdCgljYXNlICdjJzoKCQlyZXR1cm4gdHVuaWNDb2xvcnNbdHVuaWNdCgljYXNlICdDJzoKCQlyZXR1cm4gdHVuaWNDb2xvcnNbdHVuaWMrMV0KCWNhc2UgJ2QnOgoJCXJldHVybiB0dW5pY0NvbG9yc1t0dW5pYysyXQoJY2FzZSAnZyc6CgkJcmV0dXJuIGdsYXNzZXNDb2xvcnNbdC5HbGFzc2VzLTFdCgl9CglwYW5pYygidW5rbm93biBwYWxldHRlIGtleSAiICsgc3RyaW5nKHJ1bmUoa2V5KSkpCn0KCi8vIGhleENvbG9yIGNoZWNrcyBhICIjcnJnZ2JiIiBjb2xvciBhbmQgcmV0dXJucyBpdHMgaGV4IGRpZ2l0cy4KZnVuYyBoZXhDb2xvcihjb2xvciBzdHJpbmcpIHN0cmluZyB7CglpZiBsZW4oY29sb3IpICE9IDcgfHwgY29sb3JbMF0gIT0gJyMnIHsKCQlwYW5pYygiaW52YWxpZCBiYWNrZ3JvdW5kIGNvbG9yLCBleHBlY3RlZCAjcnJnZ2JiIikKCX0KCglmb3IgaSA6PSAxOyBpIDwgNzsgaSsrIHsKCQljIDo9IGNvbG9yW2ldCgkJaWYgIShjID49ICcwJyAmJiBjIDw9ICc5JyB8fCBjID49ICdhJyAmJiBjIDw9ICdmJyB8fCBjID49ICdBJyAmJiBjIDw9ICdGJykgewoJCQlwYW5pYygiaW52YWxpZCBiYWNrZ3JvdW5kIGNvbG9yLCBleHBlY3RlZCAjcnJnZ2JiIikKCQl9Cgl9CglyZXR1cm4gY29sb3JbMTpdCn0KGvIiCgp0cmFpdHMuZ25vEuMicGFja2FnZSBuZnQKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJlcnJvcnMiCikKCnZhciAoCgliZWFyZENvbG9yTmFtZXMgPSBbLi4uXXN0cmluZ3siV2hpdGUiLCAiR3JleSIsICJHaW5nZXIiLCAiQnJvd24ifQoJYmVhcmRTaGFwZU5hbWVzID0gWy4uLl1zdHJpbmd7Ik5vbmUiLCAiTG9uZyIsICJQb2ludHkiLCAiUm91bmQifQoJYmFja2dyb3VuZE5hbWVzID0gWy4uLl1zdHJpbmd7IlNreSIsICJTYW5kIiwgIk1pbnQiLCAiTGlsYWMiLCAiQmx1c2gifQoJZ2xhc3Nlc05hbWVzICAgID0gWy4uLl1zdHJpbmd7Ik5vbmUiLCAiQmxhY2siLCAiR29sZCIsICJSZWQiLCAiVGVhbCJ9CgloYXROYW1lcyAgICAgICAgPSBbLi4uXXN0cmluZ3siUmVkIiwgIkJsdWUiLCAiR3JlZW4iLCAiUHVycGxlIiwgIk9yYW5nZSJ9Cglza2luTmFtZXMgICAgICAgPSBbLi4uXXN0cmluZ3siTGlnaHQiLCAiTWVkaXVtIiwgIkRlZXAifQoJdHVuaWNOYW1lcyAgICAgID0gWy4uLl1zdHJpbmd7IlNreSIsICJMZWFmIiwgIkNsYXkiLCAiUm9zZSIsICJTdW4ifQopCgovLyBBdHRyaWJ1dGUgaXMgYSBuYW1lZCB0cmFpdCBvZiBhIGdub21lLgp0eXBlIEF0dHJpYnV0ZSBzdHJ1Y3QgewoJVHlwZSAgc3RyaW5nCglWYWx1ZSBzdHJpbmcKfQoKLy8gVHJhaXRzIGRlc2NyaWJlIGEgZ25vbWUuCnR5cGUgVHJhaXRzIHN0cnVjdCB7CglTa2luICAgICAgIHVpbnQ4CglIYXQgICAgICAgIHVpbnQ4CglCZWFyZENvbG9yIHVpbnQ4CglUdW5pYyAgICAgIHVpbnQ4CglCYWNrZ3JvdW5kIHVpbnQ4CglIYXRTaGFwZSAgIHVpbnQ4IC8vIDAgcG9pbnR5LCAxIGJlbnQKCUZsaXAgICAgICAgdWludDggLy8gMCBvciAxLCBubyBlZmZlY3Qgb24gcG9pbnR5IGhhdHMKCUdsYXNzZXMgICAgdWludDgKCUJlYXJkICAgICAgdWludDgKfQoKLy8gTmV3VHJhaXRzIGRlcml2ZXMgdGhlIHRyYWl0cyBvZiB0aGUgZ25vbWUgZnJvbSBhIHNlZWQuCi8vIEEgc2luZ2xlIHNlZWQgYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIHRyYWl0cy4KLy8gVXNlIGBWYWxpZGF0ZSgpYCB0byBjaGVjayB0cmFpdHMgYmVmb3JlIGRyYXdpbmcuCmZ1bmMgTmV3VHJhaXRzKHNlZWQgc3RyaW5nKSBUcmFpdHMgewoJZGF0YSA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShzZWVkKSkKCXQgOj0gVHJhaXRzewoJCVNraW46ICAgICAgIGRhdGFbMF0gJSAzLAoJCUhhdDogICAgICAgIGRhdGFbMV0gJSA1LAoJCUJlYXJkQ29sb3I6IGRhdGFbMl0gJSA0LAoJCVR1bmljOiAgICAgIGRhdGFbM10gJSA1LAoJCUJhY2tncm91bmQ6IGRhdGFbNF0gJSA1LAoJCUZsaXA6ICAgICAgIGRhdGFbNl0gJiAxLAoJfQoKCS8vIEdub21lIHdpdGggYmVudCBoYXQsIGFib3V0IDM1JQoJaWYgZGF0YVs1XSA8IDkwIHsKCQl0LkhhdFNoYXBlID0gMQoJfQoKCS8vIEdub21lIHdpdGggZ2xhc3NlcywgYWJvdXQgMzAlCglpZiBkYXRhWzddIDwgNzcgewoJCXQuR2xhc3NlcyA9IGRhdGFbOF0lNCArIDEKCX0KCgkvLyBHbm9tZSB3aXRob3V0IGJlYXJkIGlzIGEgcmFyZSB0cmFpdCwgYWJvdXQgNCUKCWlmIGRhdGFbOV0gPj0gMTAgewoJCXQuQmVhcmQgPSBkYXRhWzEwXSUzICsgMQoJfQoJcmV0dXJuIHQKfQoKLy8gVmFsaWRhdGUgY2hlY2tzIHRoYXQgYWxsIHRoZSB0cmFpdHMgYXJlIGluIHJhbmdlLgpmdW5jICh0IFRyYWl0cykgVmFsaWRhdGUoKSBlcnJvciB7Cglzd2l0Y2ggewoJY2FzZSB0LlNraW4gPiAyOgoJCXJldHVybiBlcnJvcnMuTmV3KCJpbnZhbGlkIHNraW4iKQoJY2FzZSB0LkhhdCA+IDQ6CgkJcmV0dXJuIGVycm9ycy5OZXcoImludmFsaWQgaGF0IGNvbG9yIikKCWNhc2UgdC5CZWFyZENvbG9yID4gMzoKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW52YWxpZCBiZWFyZCBjb2xvciIpCgljYXNlIHQuVHVuaWMgPiA0OgoJCXJldHVybiBlcnJvcnMuTmV3KCJpbnZhbGlkIHR1bmljIikKCWNhc2UgdC5CYWNrZ3JvdW5kID4gNDoKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW52YWxpZCBiYWNrZ3JvdW5kIikKCWNhc2UgdC5IYXRTaGFwZSA+IDE6CgkJcmV0dXJuIGVycm9ycy5OZXcoImludmFsaWQgaGF0IHNoYXBlIikKCWNhc2UgdC5GbGlwID4gMToKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW52YWxpZCBmbGlwIikKCWNhc2UgdC5HbGFzc2VzID4gNDoKCQlyZXR1cm4gZXJyb3JzLk5ldygiaW52YWxpZCBnbGFzc2VzIikKCWNhc2UgdC5CZWFyZCA+IDM6CgkJcmV0dXJuIGVycm9ycy5OZXcoImludmFsaWQgYmVhcmQiKQoJfQoJcmV0dXJuIG5pbAp9CgovLyBOb3JtYWxpemVkIHJldHVybnMgdGhlIHRyYWl0cyB3aXRoIHRoZSBmbGlwIGNsZWFyZWQgd2hlbiBpdCBoYXMgbm8gZWZmZWN0LgovLyBUd28gdHJhaXRzIHRoYXQgZHJhdyB0aGUgc2FtZSBnbm9tZSBoYXZlIHRoZSBzYW1lIG5vcm1hbGl6ZWQgdHJhaXRzLCBzbwovLyB0aGlzIGlzIHRoZSB2YWx1ZSB0byBjb21wYXJlIGFuZCB0byBrZWVwIHdoZW4gZ25vbWVzIG11c3QgYmUgZGlmZmVyZW50LgpmdW5jICh0IFRyYWl0cykgTm9ybWFsaXplZCgpIFRyYWl0cyB7CgkvLyBDbGVhciB0cmFpdCB3aGVuIGhhdCBpcyBwb2ludHkuCglpZiB0LkhhdFNoYXBlID09IDAgewoJCXQuRmxpcCA9IDAKCX0KCXJldHVybiB0Cn0KCi8vIEF0dHJpYnV0ZXMgcmV0dXJucyB0aGUgdHJhaXRzIG9mIGEgZ25vbWUgd2l0aCB0aGVpciBuYW1lcy4KLy8gSXQgcGFuaWNzIHdoZW4gdHJhaXRzIGFyZSBub3QgdmFsaWQuCmZ1bmMgKHQgVHJhaXRzKSBBdHRyaWJ1dGVzKCkgW11BdHRyaWJ1dGUgewoJaWYgZXJyIDo9IHQuVmFsaWRhdGUoKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CgoJaGF0IDo9ICJQb2ludGVkIgoJaWYgdC5IYXRTaGFwZSA9PSAxIHsKCQloYXQgPSAiQmVudCB0aXAgKHJpZ2h0KSIKCQlpZiB0LkZsaXAgPT0gMSB7CgkJCWhhdCA9ICJCZW50IHRpcCAobGVmdCkiCgkJfQoJfQoKCXJldHVybiBbXUF0dHJpYnV0ZXsKCQl7IlNraW4iLCBza2luTmFtZXNbdC5Ta2luXX0sCgkJeyJIYXQgY29sb3IiLCBoYXROYW1lc1t0LkhhdF19LAoJCXsiSGF0IiwgaGF0fSwKCQl7IkJlYXJkIGNvbG9yIiwgYmVhcmRDb2xvck5hbWVzW3QuQmVhcmRDb2xvcl19LAoJCXsiQmVhcmQiLCBiZWFyZFNoYXBlTmFtZXNbdC5CZWFyZF19LAoJCXsiVHVuaWMiLCB0dW5pY05hbWVzW3QuVHVuaWNdfSwKCQl7IkdsYXNzZXMiLCBnbGFzc2VzTmFtZXNbdC5HbGFzc2VzXX0sCgkJeyJCYWNrZ3JvdW5kIiwgYmFja2dyb3VuZE5hbWVzW3QuQmFja2dyb3VuZF19LAoJfQp9CgovLyBQYWNrIHBhY2tzIHRoZSB0cmFpdHMgaW4gMjAgYml0cy4KZnVuYyBQYWNrKHQgVHJhaXRzKSB1aW50MzIgewoJLy8gQml0czoKCS8vICAgMC0xICAgc2tpbgoJLy8gICAyLTQgICBoYXQKCS8vICAgNS02ICAgYmVhcmQgY29sb3IKCS8vICAgNy05ICAgdHVuaWMKCS8vICAgMTAtMTIgYmFja2dyb3VuZAoJLy8gICAxMyAgICBoYXQgc2hhcGUKCS8vICAgMTQgICAgZmxpcAoJLy8gICAxNS0xNyBnbGFzc2VzCgkvLyAgIDE4LTE5IGJlYXJkCglyZXR1cm4gdWludDMyKHQuU2tpbikgfAoJCXVpbnQzMih0LkhhdCk8PDIgfAoJCXVpbnQzMih0LkJlYXJkQ29sb3IpPDw1IHwKCQl1aW50MzIodC5UdW5pYyk8PDcgfAoJCXVpbnQzMih0LkJhY2tncm91bmQpPDwxMCB8CgkJdWludDMyKHQuSGF0U2hhcGUpPDwxMyB8CgkJdWludDMyKHQuRmxpcCk8PDE0IHwKCQl1aW50MzIodC5HbGFzc2VzKTw8MTUgfAoJCXVpbnQzMih0LkJlYXJkKTw8MTgKfQoKLy8gVW5wYWNrIHVucGFja3MgdGhlIHRyYWl0cy4KLy8gSXQgZG9lcyBub3QgY2hlY2sgdGhlIHZhbHVlcywgdXNlIEZyb21QYWNrZWQgZm9yIHVudHJ1c3RlZCBpbnB1dC4KZnVuYyBVbnBhY2sodiB1aW50MzIpIFRyYWl0cyB7CglyZXR1cm4gVHJhaXRzewoJCVNraW46ICAgICAgIHVpbnQ4KHYgJiAzKSwKCQlIYXQ6ICAgICAgICB1aW50OCgodiA+PiAyKSAmIDcpLAoJCUJlYXJkQ29sb3I6IHVpbnQ4KCh2ID4+IDUpICYgMyksCgkJVHVuaWM6ICAgICAgdWludDgoKHYgPj4gNykgJiA3KSwKCQlCYWNrZ3JvdW5kOiB1aW50OCgodiA+PiAxMCkgJiA3KSwKCQlIYXRTaGFwZTogICB1aW50OCgodiA+PiAxMykgJiAxKSwKCQlGbGlwOiAgICAgICB1aW50OCgodiA+PiAxNCkgJiAxKSwKCQlHbGFzc2VzOiAgICB1aW50OCgodiA+PiAxNSkgJiA3KSwKCQlCZWFyZDogICAgICB1aW50OCgodiA+PiAxOCkgJiAzKSwKCX0KfQoKLy8gRnJvbVBhY2tlZCB1bnBhY2tzIHRyYWl0cyBhbmQgY2hlY2tzIHRoZW0uCmZ1bmMgRnJvbVBhY2tlZCh2IHVpbnQzMikgKFRyYWl0cywgZXJyb3IpIHsKCWlmIHY+PjIwICE9IDAgewoJCXJldHVybiBUcmFpdHN7fSwgZXJyb3JzLk5ldygiaW52YWxpZCBwYWNrZWQgdHJhaXRzIikKCX0KCgl0IDo9IFVucGFjayh2KQoJaWYgZXJyIDo9IHQuVmFsaWRhdGUoKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIFRyYWl0c3t9LCBlcnIKCX0KCXJldHVybiB0LCBuaWwKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEC4PxyLfsYi/QQsqsxbMKIf+O3u6M61qDJVtrbEORYXsgSQCROqMG0levLk3d4BxLQqDKKDdjSlym05ukYaTJ8rq+tKY4OuXeVSTbYFbQ6qHAwLo7Xj+QmvoAS0TQgzXzvCv8aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=