IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkezErJEB9IgoKIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0cyBjb21tZmQgcGhhc2UgY2FudiBtYWluZm9udCBlbnYKICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUKICAgIGdsb2JhbCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IgbGVmdG92ZXIKCiAgICAjIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4KICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KEdJVF9ESVIpXX0gewoJc2V0IGdpdGRpciAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJc2V0IGdpdGRpciAiLmdpdCIKICAgIH0KICAgIGlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKCWVycm9yX3BvcHVwICJDYW5ub3QgZmluZCB0aGUgZ2l0IGRpcmVjdG9yeSBcIiRnaXRkaXJcIi4iCglleGl0IDEKICAgIH0KICAgIHNldCBjb21taXRzIHt9CiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAkcGFyc2VkX2FyZ3MiIHJdCiAgICB9IGVycl0gewoJcHV0cyBzdGRlcnIgIkVycm9yIGV4ZWN1dGluZyBnaXQtcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlICJnZXRjb21taXRsaW5lcyAkY29tbWZkIgogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgJGN0ZXh0IGNvbmZpZyAtY3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIGNvbW1pdGluZm8gbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIGxlZnRvdmVyCgogICAgc2V0IHN0dWZmIFtyZWFkICRjb21tZmRdCiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGNvbW1mZF19IHJldHVybgoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDEKCWlmIHshW2NhdGNoIHtjbG9zZSAkY29tbWZkfSBlcnJdfSB7CgkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJICAgIHNldCBlcnIgXAp7R2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzOiBiYWQgYXJndW1lbnRzIHRvIGdpdC1yZXYtbGlzdC4KKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0LXJldi1saXN0CnRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pfQoJfSBlbHNlIHsKCSAgICBzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHM6ICRlcnIiCgl9CgllcnJvcl9wb3B1cCAkZXJyCglleGl0IDEKICAgIH0KICAgIHNldCBzdGFydCAwCiAgICB3aGlsZSAxIHsKCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQoJaWYgeyRpIDwgMH0gewoJICAgIGFwcGVuZCBsZWZ0b3ZlciBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIHJldHVybgoJfQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IFtleHByIHskaSAtIDF9XV0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICIkbGVmdG92ZXIkY21pdCIKCSAgICBzZXQgbGVmdG92ZXIge30KCX0KCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pXG59ICRjbWl0IG1hdGNoIGlkXX0gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJGNtaXQgNDEgZW5kXQoJbGFwcGVuZCBjb21taXRzICRpZAoJc2V0IGNvbW1pdGxpc3RlZCgkaWQpIDEKCXBhcnNlY29tbWl0ICRpZCAkY21pdCAxCglkcmF3Y29tbWl0ICRpZAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCSAgICBkb3VwZGF0ZQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlCgogICAgaW5jciBuZXh0dXBkYXRlIDEwMAogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIHVwZGF0ZQogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgImdldGNvbW1pdGxpbmVzICRjb21tZmQiCn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIFtjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdC1jYXQtZmlsZSBjb21taXQgJGlkXX1dIHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpIHt9CiAgICBzZXQgbnBhcmVudHMoJGlkKSAwCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb250ZW50cyAiXG4iXSB7CglpZiB7JGluaGRyfSB7CgkgICAgaWYgeyRsaW5lID09IHt9fSB7CgkJc2V0IGluaGRyIDAKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJCWlmIHskdGFnID09ICJwYXJlbnQifSB7CgkJICAgIHNldCBwIFtsaW5kZXggJGxpbmUgMV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCQkJc2V0IGNoaWxkcmVuKCRwKSB7fQoJCQlzZXQgbmNoaWxkcmVuKCRwKSAwCgkJCXNldCBuY2xlZnQoJHApIDAKCQkgICAgfQoJCSAgICBsYXBwZW5kIHBhcmVudHMoJGlkKSAkcAoJCSAgICBpbmNyIG5wYXJlbnRzKCRpZCkKCQkgICAgIyBzb21ldGltZXMgd2UgZ2V0IGEgY29tbWl0IHRoYXQgbGlzdHMgYSBwYXJlbnQgdHdpY2UuLi4KCQkgICAgaWYgeyRsaXN0ZWQgJiYgW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCQkJbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkJCWluY3IgbmNoaWxkcmVuKCRwKQoJCQlpbmNyIG5jbGVmdCgkcCkKCQkgICAgfQoJCX0gZWxzZWlmIHskdGFnID09ICJhdXRob3IifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBbZXhwciB7JHggLSAxfV1dCgkJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCQkgICAgc2V0IHggW2V4cHIge1tsbGVuZ3RoICRsaW5lXSAtIDJ9XQoJCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHskY29tbWVudCA9PSB7fX0gewoJCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCgkgICAgfSBlbHNlIHsKCQlhcHBlbmQgY29tbWVudCAiXG4iCgkgICAgfQoJICAgIGlmIHshJGxpc3RlZH0gewoJCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCgkJYXBwZW5kIGNvbW1lbnQgIiAgICAiCgkgICAgfQoJICAgIGFwcGVuZCBjb21tZW50ICRsaW5lCgl9CiAgICB9CiAgICBpZiB7JGF1ZGF0ZSAhPSB7fX0gewoJc2V0IGF1ZGF0ZSBbY2xvY2sgZm9ybWF0ICRhdWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQoJc2V0IGNvbWRhdGUgW2Nsb2NrIGZvcm1hdCAkY29tZGF0ZSAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcwogICAgc2V0IHRhZ3MgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgLmdpdC9yZWZzL3RhZ3MvKl0KICAgIGZvcmVhY2ggZiAkdGFncyB7CgljYXRjaCB7CgkgICAgc2V0IGZkIFtvcGVuICRmIHJdCgkgICAgc2V0IGxpbmUgW3JlYWQgJGZkXQoJICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCQlzZXQgZGlyZWN0IFtmaWxlIHRhaWwgJGZdCgkJc2V0IHRhZ2lkcygkZGlyZWN0KSAkaWQKCQlsYXBwZW5kIGlkdGFncygkaWQpICRkaXJlY3QKCQlzZXQgY29udGVudHMgW3NwbGl0IFtleGVjIGdpdC1jYXQtZmlsZSB0YWcgJGlkXSAiXG4iXQoJCXNldCBvYmoge30KCQlzZXQgdHlwZSB7fQoJCXNldCB0YWcge30KCQlmb3JlYWNoIGwgJGNvbnRlbnRzIHsKCQkgICAgaWYgeyRsID09IHt9fSBicmVhawoJCSAgICBzd2l0Y2ggLS0gW2xpbmRleCAkbCAwXSB7CgkJCSJvYmplY3QiIHtzZXQgb2JqIFtsaW5kZXggJGwgMV19CgkJCSJ0eXBlIiB7c2V0IHR5cGUgW2xpbmRleCAkbCAxXX0KCQkJInRhZyIge3NldCB0YWcgW3N0cmluZyByYW5nZSAkbCA0IGVuZF19CgkJICAgIH0KCQl9CgkJaWYgeyRvYmogIT0ge30gJiYgJHR5cGUgPT0gImNvbW1pdCIgJiYgJHRhZyAhPSB7fX0gewoJCSAgICBzZXQgdGFnaWRzKCR0YWcpICRvYmoKCQkgICAgbGFwcGVuZCBpZHRhZ3MoJG9iaikgJHRhZwoJCX0KCSAgICB9CgkgICAgY2xvc2UgJGZkCgl9CiAgICB9CiAgICBzZXQgaGVhZHMgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgLmdpdC9yZWZzL2hlYWRzLypdCiAgICBmb3JlYWNoIGYgJGhlYWRzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBoZWFkIFtmaWxlIHRhaWwgJGZdCgkJc2V0IGhlYWRpZHMoJGhlYWQpICRsaW5lCgkJbGFwcGVuZCBpZGhlYWRzKCRsaW5lKSAkaGVhZAoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcm93Y3R4bWVudSBnYXVkeWRpZmYKCiAgICBtZW51IC5iYXIKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKICAgIG1lbnUgLmJhci5maWxlCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIG1lbnUgLmJhci5oZWxwCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiSGVscCIgLW1lbnUgLmJhci5oZWxwCiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBnaXRrIiAtY29tbWFuZCBhYm91dAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KGNhbnYxKV19IHsKCXNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIgNDUgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgMzAgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgMTUgKiAkY2hhcnNwY10KCXNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgMjUgKiAkbGluZXNwYyArIDRdCglzZXQgZ2VvbWV0cnkoY3RleHR3KSA4MAoJc2V0IGdlb21ldHJ5KGN0ZXh0aCkgMzAKCXNldCBnZW9tZXRyeShjZmxpc3R3KSAzMAogICAgfQogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAogICAgaWYge1tpbmZvIGV4aXN0cyBnZW9tZXRyeSh3aWR0aCldfSB7CgkuY3RvcCBjb25mIC13aWR0aCAkZ2VvbWV0cnkod2lkdGgpIC1oZWlnaHQgJGdlb21ldHJ5KGhlaWdodCkKCXNldCB0ZXh0aCBbZXhwciB7JGdlb21ldHJ5KGhlaWdodCkgLSAkZ2VvbWV0cnkoY2FudmgpIC0gNTZ9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0aCkgW2V4cHIgeygkdGV4dGggLSA4KSAvCgkJCQkgICAgW2ZvbnQgbWV0cmljcyAkdGV4dGZvbnQgLWxpbmVzcGFjZV19XQogICAgfQogICAgZnJhbWUgLmN0b3AudG9wCiAgICBmcmFtZSAuY3RvcC50b3AuYmFyCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHNldCBjc2Nyb2xsIC5jdG9wLnRvcC5jc2IKICAgIHNjcm9sbGJhciAkY3Njcm9sbCAtY29tbWFuZCB7YWxsY2FudnMgeXZpZXd9IC1oaWdobGlnaHR0aGlja25lc3MgMAogICAgcGFjayAkY3Njcm9sbCAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYW5lZHdpbmRvdyAuY3RvcC50b3AuY2xpc3QgLW9yaWVudCBob3Jpem9udGFsIC1zYXNocGFkIDAgLWhhbmRsZXNpemUgNAogICAgcGFjayAuY3RvcC50b3AuY2xpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLmN0b3AudG9wCiAgICBzZXQgY2FudiAuY3RvcC50b3AuY2xpc3QuY2FudgogICAgY2FudmFzICRjYW52IC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYxKSBcCgktYmcgd2hpdGUgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAiJGNzY3JvbGwgc2V0IgogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudgogICAgc2V0IGNhbnYyIC5jdG9wLnRvcC5jbGlzdC5jYW52MgogICAgY2FudmFzICRjYW52MiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MikgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjIKICAgIHNldCBjYW52MyAuY3RvcC50b3AuY2xpc3QuY2FudjMKICAgIGNhbnZhcyAkY2FudjMgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjMpIFwKCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCiAgICBiaW5kIC5jdG9wLnRvcC5jbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KCiAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQogICAgc2V0IGVudHJpZXMgJHNoYTFlbnRyeQogICAgc2V0IHNoYTFidXQgLmN0b3AudG9wLmJhci5zaGExbGFiZWwKICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKCS1jb21tYW5kIGdvdG9jb21taXQgLXdpZHRoIDgKICAgICRzaGExYnV0IGNvbmYgLWRpc2FibGVkZm9yZWdyb3VuZCBbJHNoYTFidXQgY2dldCAtZm9yZWdyb3VuZF0KICAgIHBhY2sgLmN0b3AudG9wLmJhci5zaGExbGFiZWwgLXNpZGUgbGVmdAogICAgZW50cnkgJHNoYTFlbnRyeSAtd2lkdGggNDAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2hhMXN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNoYTFzdHJpbmcgd3JpdGUgc2hhMWNoYW5nZQogICAgcGFjayAkc2hhMWVudHJ5IC1zaWRlIGxlZnQgLXBhZHkgMgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IgogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQubGVmdC5zYiAtY29tbWFuZCAiJGN0ZXh0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY3RleHQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5sZWZ0CgogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0gLWJhY2sgIiNhYWFhYWEiCiAgICBpZiB7JGdhdWR5ZGlmZn0gewoJJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWJhY2sgYmx1ZSAtZm9yZSB3aGl0ZQoJJGN0ZXh0IHRhZyBjb25mIGQwIC1iYWNrICIjZmY4MDgwIgoJJGN0ZXh0IHRhZyBjb25mIGQxIC1iYWNrIGdyZWVuCiAgICB9IGVsc2UgewoJJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIHJlZAoJJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlICIjMDBhMDAwIgoJJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwogICAgfQoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIGxpc3Rib3ggJGNmbGlzdCAtYmcgd2hpdGUgLXNlbGVjdG1vZGUgZXh0ZW5kZWQgLXdpZHRoICRnZW9tZXRyeShjZmxpc3R3KSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IgogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQucmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQucmlnaHQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY2ZsaXN0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQucmlnaHQKICAgIGJpbmQgLmN0b3AuY2RldCA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQoKICAgIHBhY2sgLmN0b3AgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiYWxsY2FudnMgc2NhbiBtYXJrIDAgJXkiCiAgICBiaW5kYWxsIDxCMi1Nb3Rpb24+ICJhbGxjYW52cyBzY2FuIGRyYWd0byAwICV5IgogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxLZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1CYWNrU3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LXNwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgbiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgYiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKICAgIGJpbmRrZXkgdSAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMTggdW5pdHMiCiAgICBiaW5ka2V5IC8ge2ZpbmRuZXh0IDF9CiAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KICAgIGJpbmRrZXkgPyBmaW5kcHJldgogICAgYmluZGtleSBmIG5leHRmaWxlCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZmluZHByZXYKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kICRjZmxpc3QgPDxMaXN0Ym94U2VsZWN0Pj4gbGlzdGJveHNlbAogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdGV4dGZvbnQgJHRleHRmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgZmluZG1lcmdlZmlsZXMgJGZpbmRtZXJnZWZpbGVzXQoJcHV0cyAkZiBbbGlzdCBzZXQgZ2F1ZHlkaWZmICRnYXVkeWRpZmZdCglwdXRzICRmICJzZXQgZ2VvbWV0cnkod2lkdGgpIFt3aW5mbyB3aWR0aCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoaGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIgW3dpbmZvIHdpZHRoICRjYW52XS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgW3dpbmZvIHdpZHRoICRjYW52Ml0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjNdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciBbd2luZm8gaGVpZ2h0ICRjYW52XS0yXSIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGN0ZXh0XSAtIDgpIFwKCQkJICAgLyBbZm9udCBtZWFzdXJlICR0ZXh0Zm9udCAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjdGV4dHcpICR3aWQiCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjZmxpc3RdIC0gMTEpIFwKCQkJICAgLyBbZm9udCBtZWFzdXJlIFskY2ZsaXN0IGNnZXQgLWZvbnRdICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNmbGlzdHcpICR3aWQiCgljbG9zZSAkZgoJZmlsZSByZW5hbWUgLWZvcmNlICJ+Ly5naXRrLW5ldyIgIn4vLmdpdGsiCiAgICB9CiAgICBzZXQgc3R1ZmZzYXZlZCAxCn0KCnByb2MgcmVzaXplY2xpc3RwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYgW2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByICRzYXNoMCArIDIwXQoJICAgIH0KCSAgICBpZiB7JHNhc2gxID4gJHcgLSAxMH0gewoJCXNldCBzYXNoMSBbZXhwciAkdyAtIDEwXQoJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0gewoJCSAgICBzZXQgc2FzaDAgW2V4cHIgJHNhc2gxIC0gMjBdCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcqMy80IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDQ1fSB7CgkJc2V0IHNhc2gwIDQ1CgkgICAgfQoJICAgIGlmIHskc2FzaDAgPiAkdyAtIDE1fSB7CgkJc2V0IHNhc2gwIFtleHByICR3IC0gMTVdCgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyBhbGxjYW52cyBhcmdzIHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBldmFsICRjYW52ICRhcmdzCiAgICBldmFsICRjYW52MiAkYXJncwogICAgZXZhbCAkY2FudjMgJGFyZ3MKfQoKcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBiaW5kICRjYW52ICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjMgJGV2ZW50ICRhY3Rpb24KfQoKcHJvYyBhYm91dCB7fSB7CiAgICBzZXQgdyAuYWJvdXQKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJBYm91dCBnaXRrIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayB2ZXJzaW9uIDEuMgoKQ29weXJpZ2h0IKkgMjAwNSBQYXVsIE1hY2tlcnJhcwoKVXNlIGFuZCByZWRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0gXAoJICAgIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQp9Cgpwcm9jIGFzc2lnbmNvbG9yIHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY29sb3JtYXAgY29tbWNvbG9ycyBjb2xvcnMgbmV4dGNvbG9yCiAgICBnbG9iYWwgcGFyZW50cyBucGFyZW50cyBjaGlsZHJlbiBuY2hpbGRyZW4KICAgIGdsb2JhbCBjb3JuZXJjcm9zc2luZ3MgY3Jvc3NpbmdzCgogICAgaWYgW2luZm8gZXhpc3RzIGNvbG9ybWFwKCRpZCldIHJldHVybgogICAgc2V0IG5jb2xvcnMgW2xsZW5ndGggJGNvbG9yc10KICAgIGlmIHskbnBhcmVudHMoJGlkKSA8PSAxICYmICRuY2hpbGRyZW4oJGlkKSA9PSAxfSB7CglzZXQgY2hpbGQgW2xpbmRleCAkY2hpbGRyZW4oJGlkKSAwXQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJICAgICYmICRucGFyZW50cygkY2hpbGQpID09IDF9IHsKCSAgICBzZXQgY29sb3JtYXAoJGlkKSAkY29sb3JtYXAoJGNoaWxkKQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGJhZGNvbG9ycyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJGlkKV19IHsKCWZvcmVhY2ggeCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0gewoJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzIHt9Cgl9CiAgICB9CiAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWlmIHtbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRpZCldfSB7CgkgICAgZm9yZWFjaCB4ICRjcm9zc2luZ3MoJGlkKSB7CgkJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0gewoJCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkJfQoJICAgIH0KCSAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCQlzZXQgYmFkY29sb3JzICRvcmlnYmFkCgkgICAgfQoJfQoJc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgfQogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7Cglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCldIDwgMH0gewoJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgfQoJICAgIGlmIHtbaW5mbyBleGlzdHMgcGFyZW50cygkY2hpbGQpXX0gewoJCWZvcmVhY2ggcCAkcGFyZW50cygkY2hpbGQpIHsKCQkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkcCldCgkJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkcCldIDwgMH0gewoJCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHApCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJfQogICAgfQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJG5jb2xvcnN9IHtpbmNyIGl9IHsKCXNldCBjIFtsaW5kZXggJGNvbG9ycyAkbmV4dGNvbG9yXQoJaWYge1tpbmNyIG5leHRjb2xvcl0gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgbmV4dGNvbG9yIDAKCX0KCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY119IGJyZWFrCiAgICB9CiAgICBzZXQgY29sb3JtYXAoJGlkKSAkYwp9Cgpwcm9jIGluaXRncmFwaCB7fSB7CiAgICBnbG9iYWwgY2FudnkgY2FudnkwIGxpbmVubyBudW1jb21taXRzIGx0aGlja25lc3MgbmV4dGNvbG9yIGxpbmVzcGMKICAgIGdsb2JhbCBtYWlubGluZSBzaWRlbGluZXMKICAgIGdsb2JhbCBuY2hpbGRyZW4gbmNsZWZ0CgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgY2FudnkgJGNhbnZ5MAogICAgc2V0IGxpbmVubyAtMQogICAgc2V0IG51bWNvbW1pdHMgMAogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBjYXRjaCB7dW5zZXQgbWFpbmxpbmV9CiAgICBjYXRjaCB7dW5zZXQgc2lkZWxpbmVzfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgbmNoaWxkcmVuXSB7CglzZXQgbmNsZWZ0KCRpZCkgJG5jaGlsZHJlbigkaWQpCiAgICB9Cn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQiCn0KCnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBuY2hpbGRyZW4gdG9kbwogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudngwIGNhbnZ5IGxpbmVzcGMKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcgY29tbWl0aW5mbwogICAgZ2xvYmFsIGNvbG9ybWFwIG51bWNvbW1pdHMgY3VycmVudHBhcmVudHMgZHVwcGFyZW50cwogICAgZ2xvYmFsIG9sZGxldmVsIG9sZG5saW5lcyBvbGR0b2RvCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgc2lkZWxpbmVzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHJvd3RleHR4IGlkcG9zCgogICAgaW5jciBudW1jb21taXRzCiAgICBpbmNyIGxpbmVubwogICAgc2V0IGlkIFtsaW5kZXggJHRvZG8gJGxldmVsXQogICAgc2V0IGxpbmVpZCgkbGluZW5vKSAkaWQKICAgIHNldCBpZGxpbmUoJGlkKSAkbGluZW5vCiAgICBzZXQgb2ZpbGwgW2V4cHIge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0/ICJibHVlIjogIndoaXRlIn1dCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglyZWFkY29tbWl0ICRpZAoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIHNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KCSAgICBzZXQgbnBhcmVudHMoJGlkKSAwCgl9CiAgICB9CiAgICBhc3NpZ25jb2xvciAkaWQKICAgIHNldCBjdXJyZW50cGFyZW50cyB7fQogICAgc2V0IGR1cHBhcmVudHMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldICYmIFtpbmZvIGV4aXN0cyBwYXJlbnRzKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkY3VycmVudHBhcmVudHMgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3VycmVudHBhcmVudHMgJHAKCSAgICB9IGVsc2UgewoJCSMgcmVtZW1iZXIgdGhhdCB0aGlzIHBhcmVudCB3YXMgbGlzdGVkIHR3aWNlCgkJbGFwcGVuZCBkdXBwYXJlbnRzICRwCgkgICAgfQoJfQogICAgfQogICAgc2V0IHggW2V4cHIgJGNhbnZ4MCArICRsZXZlbCAqICRsaW5lc3BjXQogICAgc2V0IHkxICRjYW52eQogICAgc2V0IGNhbnZ5IFtleHByICRjYW52eSArICRsaW5lc3BjXQogICAgYWxsY2FudnMgY29uZiAtc2Nyb2xscmVnaW9uIFwKCVtsaXN0IDAgMCAwIFtleHByICR5MSArIDAuNSAqICRsaW5lc3BjICsgMl1dCiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglsYXBwZW5kIG1haW5saW5lKCRpZCkgJHggJHkxCglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCAkY29sb3JtYXAoJGlkKV0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7Cglmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkgICAgc2V0IGNvb3JkcyBbbGluZGV4ICRscyAwXQoJICAgIHNldCB0aGljayBbbGluZGV4ICRscyAxXQoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC1maWxsICRjb2xvcm1hcCgkaWQpIFwKCQkgICAgICAgLXdpZHRoIFtleHByIHskdGhpY2sgKiAkbHRoaWNrbmVzc31dXQoJICAgICRjYW52IGxvd2VyICR0CgkgICAgYmluZGxpbmUgJHQgJGlkCgl9CiAgICB9CiAgICBzZXQgb3JhZCBbZXhwciB7JGxpbmVzcGMgLyAzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgb3ZhbCBbZXhwciAkeCAtICRvcmFkXSBbZXhwciAkeTEgLSAkb3JhZF0gXAoJICAgICAgIFtleHByICR4ICsgJG9yYWQgLSAxXSBbZXhwciAkeTEgKyAkb3JhZCAtIDFdIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDFdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFtleHByICRjYW52eDAgKyBbbGxlbmd0aCAkdG9kb10gKiAkbGluZXNwY10KICAgIGlmIHtbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID4gMn0gewoJc2V0IHh0IFtleHByIHskeHQgKyAoW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSAtIDIpICogJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHJvd3RleHR4KCRsaW5lbm8pICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5MV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHkxXQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBsaW5laHRhZygkbGluZW5vKSBbJGNhbnYgY3JlYXRlIHRleHQgJHh0ICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRtYWluZm9udCBdCiAgICAkY2FudiBiaW5kICRsaW5laHRhZygkbGluZW5vKSA8QnV0dG9uLTM+ICJyb3dtZW51ICVYICVZICRpZCIKICAgIHNldCBsaW5lbnRhZygkbGluZW5vKSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkbmFtZSAtZm9udCAkbmFtZWZvbnRdCiAgICBzZXQgbGluZWR0YWcoJGxpbmVubykgWyRjYW52MyBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJGRhdGUgLWZvbnQgJG1haW5mb250XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250CgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByICR5MSAtIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IHliIFtleHByICR5dCArICRsaW5lc3BjIC0gMV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgJHggKyAkZGVsdGFdCglzZXQgeHIgW2V4cHIgJHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3NdCglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciAkeXQgKyAkZGVsdGFdICR4bCAkeXRcCgkJJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgJHliIC0gJGRlbHRhXSBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWQKCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZAoJICAgIHNldCB4bCBbZXhwciAkeGwgLSAkZGVsdGEvMl0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgZ3JlZW4gLXRhZ3MgdGFnLiRpZAoJfQoJJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRhZy4kaWQKICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyB1cGRhdGV0b2RvIHtsZXZlbCBub3Nob3J0Y3V0fSB7CiAgICBnbG9iYWwgY3VycmVudHBhcmVudHMgbmNsZWZ0IHRvZG8KICAgIGdsb2JhbCBtYWlubGluZSBvbGRsZXZlbCBvbGR0b2RvIG9sZG5saW5lcwogICAgZ2xvYmFsIGNhbnZ4MCBjYW52eSBsaW5lc3BjIG1haW5saW5lCiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgIHNldCBvbGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGR0b2RvICR0b2RvCiAgICBzZXQgb2xkbmxpbmVzIFtsbGVuZ3RoICR0b2RvXQogICAgaWYgeyEkbm9zaG9ydGN1dCAmJiBbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID09IDF9IHsKCXNldCBwIFtsaW5kZXggJGN1cnJlbnRwYXJlbnRzIDBdCglpZiB7JG5jbGVmdCgkcCkgPT0gMSAmJiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdIDwgMH0gewoJICAgIHNldCBuY2xlZnQoJHApIDAKCSAgICBzZXQgeCBbZXhwciAkY2FudngwICsgJGxldmVsICogJGxpbmVzcGNdCgkgICAgc2V0IHkgW2V4cHIgJGNhbnZ5IC0gJGxpbmVzcGNdCgkgICAgc2V0IG1haW5saW5lKCRwKSBbbGlzdCAkeCAkeV0KCSAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbCAkcF0KCSAgICByZXR1cm4gMAoJfQogICAgfQoKICAgIHNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbGV2ZWwgJGxldmVsXQogICAgc2V0IGkgJGxldmVsCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCWluY3IgbmNsZWZ0KCRwKSAtMQoJc2V0IGsgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXQoJaWYgeyRrIDwgMH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpICRwXQoJICAgIGluY3IgaQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyBub3RlY3Jvc3NpbmdzIHtpZCBsbyBoaSBjb3JuZXJ9IHsKICAgIGdsb2JhbCBvbGR0b2RvIGNyb3NzaW5ncyBjb3JuZXJjcm9zc2luZ3MKCiAgICBmb3Ige3NldCBpICRsb30ge1tpbmNyIGldIDwgJGhpfSB7fSB7CglzZXQgcCBbbGluZGV4ICRvbGR0b2RvICRpXQoJaWYgeyRwID09IHt9fSBjb250aW51ZQoJaWYgeyRpID09ICRjb3JuZXJ9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0gZWxzZSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZHJhd3NsYW50cyB7fSB7CiAgICBnbG9iYWwgY2FudiBtYWlubGluZSBzaWRlbGluZXMgY2FudngwIGNhbnZ5IGxpbmVzcGMKICAgIGdsb2JhbCBvbGRsZXZlbCBvbGR0b2RvIHRvZG8gY3VycmVudHBhcmVudHMgZHVwcGFyZW50cwogICAgZ2xvYmFsIGx0aGlja25lc3MgbGluZXNwYyBjYW52eSBjb2xvcm1hcAoKICAgIHNldCB5MSBbZXhwciAkY2FudnkgLSAkbGluZXNwY10KICAgIHNldCB5MiAkY2FudnkKICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIGlkICRvbGR0b2RvIHsKCWluY3IgaQoJaWYgeyRpZCA9PSB7fX0gY29udGludWUKCXNldCB4aSBbZXhwciB7JGNhbnZ4MCArICRpICogJGxpbmVzcGN9XQoJaWYgeyRpID09ICRvbGRsZXZlbH0gewoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0KCQlzZXQgY29vcmRzIFtsaXN0ICR4aSAkeTFdCgkJc2V0IHhqIFtleHByIHskY2FudngwICsgJGogKiAkbGluZXNwY31dCgkJaWYgeyRqIDwgJGkgLSAxfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByICR4aiArICRsaW5lc3BjXSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaiAkaSBbZXhwciB7JGogKyAxfV0KCQl9IGVsc2VpZiB7JGogPiAkaSArIDF9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgJHhqIC0gJGxpbmVzcGNdICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRpICRqIFtleHByIHskaiAtIDF9XQoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkdXBwYXJlbnRzICRwXSA+PSAwfSB7CgkJICAgICMgZHJhdyBhIGRvdWJsZS13aWR0aCBsaW5lIHRvIGluZGljYXRlIHRoZSBkb3VibGVkIHBhcmVudAoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDJdCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJc2V0IG1haW5saW5lKCRwKSBbbGlzdCAkeGogJHkyXQoJCSAgICB9CgkJfSBlbHNlIHsKCQkgICAgIyBub3JtYWwgY2FzZSwgbm8gcGFyZW50IGR1cGxpY2F0ZWQKCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlpZiB7JGkgIT0gJGp9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJfQoJCQlzZXQgbWFpbmxpbmUoJHApICRjb29yZHMKCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCQlsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAxXQoJCSAgICB9CgkJfQoJICAgIH0KCX0gZWxzZWlmIHtbbGluZGV4ICR0b2RvICRpXSAhPSAkaWR9IHsKCSAgICBzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJGlkXQoJICAgIHNldCB4aiBbZXhwciB7JGNhbnZ4MCArICRqICogJGxpbmVzcGN9XQoJICAgIGxhcHBlbmQgbWFpbmxpbmUoJGlkKSAkeGkgJHkxICR4aiAkeTIKCX0KICAgIH0KfQoKcHJvYyBkZWNpZGVuZXh0IHt7bm9yZWFkIDB9fSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBuY2hpbGRyZW4gbmNsZWZ0IHRvZG8KICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG1haW5mb250IG5hbWVmb250IGNhbnZ4MCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgZGF0ZW1vZGUgY2RhdGUKICAgIGdsb2JhbCBjb21taXRpbmZvCiAgICBnbG9iYWwgY3VycmVudHBhcmVudHMgb2xkbGV2ZWwgb2xkbmxpbmVzIG9sZHRvZG8KICAgIGdsb2JhbCBsaW5lbm8gbHRoaWNrbmVzcwoKICAgICMgcmVtb3ZlIHRoZSBudWxsIGVudHJ5IGlmIHByZXNlbnQKICAgIHNldCBudWxsZW50cnkgW2xzZWFyY2ggLWV4YWN0ICR0b2RvIHt9XQogICAgaWYgeyRudWxsZW50cnkgPj0gMH0gewoJc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRudWxsZW50cnkgJG51bGxlbnRyeV0KICAgIH0KCiAgICAjIGNob29zZSB3aGljaCBvbmUgdG8gZG8gbmV4dCB0aW1lIGFyb3VuZAogICAgc2V0IHRvZG9sIFtsbGVuZ3RoICR0b2RvXQogICAgc2V0IGxldmVsIC0xCiAgICBzZXQgbGF0ZXN0IHt9CiAgICBmb3Ige3NldCBrICR0b2RvbH0ge1tpbmNyIGsgLTFdID49IDB9IHt9IHsKCXNldCBwIFtsaW5kZXggJHRvZG8gJGtdCglpZiB7JG5jbGVmdCgkcCkgPT0gMH0gewoJICAgIGlmIHskZGF0ZW1vZGV9IHsKCQlpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCQkgICAgaWYgeyRub3JlYWR9IHsKCQkJcmV0dXJuIHt9CgkJICAgIH0KCQkgICAgcmVhZGNvbW1pdCAkcAoJCX0KCQlpZiB7JGxhdGVzdCA9PSB7fSB8fCAkY2RhdGUoJHApID4gJGxhdGVzdH0gewoJCSAgICBzZXQgbGV2ZWwgJGsKCQkgICAgc2V0IGxhdGVzdCAkY2RhdGUoJHApCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGxldmVsICRrCgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JGxldmVsIDwgMH0gewoJaWYgeyR0b2RvICE9IHt9fSB7CgkgICAgcHV0cyAiRVJST1I6IG5vbmUgb2YgdGhlIHBlbmRpbmcgY29tbWl0cyBjYW4gYmUgZG9uZSB5ZXQ6IgoJICAgIGZvcmVhY2ggcCAkdG9kbyB7CgkJcHV0cyAiICAkcCAoJG5jbGVmdCgkcCkpIgoJICAgIH0KCX0KCXJldHVybiAtMQogICAgfQoKICAgICMgSWYgd2UgYXJlIHJlZHVjaW5nLCBwdXQgaW4gYSBudWxsIGVudHJ5CiAgICBpZiB7JHRvZG9sIDwgJG9sZG5saW5lc30gewoJaWYgeyRudWxsZW50cnkgPj0gMH0gewoJICAgIHNldCBpICRudWxsZW50cnkKCSAgICB3aGlsZSB7JGkgPCAkdG9kb2wKCQkgICAmJiBbbGluZGV4ICRvbGR0b2RvICRpXSA9PSBbbGluZGV4ICR0b2RvICRpXX0gewoJCWluY3IgaQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IGkgJG9sZGxldmVsCgkgICAgaWYgeyRsZXZlbCA+PSAkaX0gewoJCWluY3IgaQoJICAgIH0KCX0KCWlmIHskaSA8ICR0b2RvbH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpIHt9XQoJICAgIGlmIHskbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGxldmVsCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgdG9kbyBuY2hpbGRyZW4gZGF0ZW1vZGUgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0YXJ0Y29tbWl0cwoKICAgIGlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJc2V0IHBoYXNlIGluY3JkcmF3CglzZXQgdG9kbyAkaWQKCXNldCBzdGFydGNvbW1pdHMgJGlkCglpbml0Z3JhcGgKCWRyYXdjb21taXRsaW5lIDAKCXVwZGF0ZXRvZG8gMCAkZGF0ZW1vZGUKICAgIH0gZWxzZSB7CglpZiB7JG5jaGlsZHJlbigkaWQpID09IDB9IHsKCSAgICBsYXBwZW5kIHRvZG8gJGlkCgkgICAgbGFwcGVuZCBzdGFydGNvbW1pdHMgJGlkCgl9CglzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCWlmIHskbGV2ZWwgPT0ge30gfHwgJGlkICE9IFtsaW5kZXggJHRvZG8gJGxldmVsXX0gewoJICAgIHJldHVybgoJfQoJd2hpbGUgMSB7CgkgICAgZHJhd3NsYW50cwoJICAgIGRyYXdjb21taXRsaW5lICRsZXZlbAoJICAgIGlmIHtbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXX0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJCWlmIHskbGV2ZWwgPT0ge319IGJyZWFrCgkgICAgfQoJICAgIHNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCQlicmVhawoJICAgIH0KCSAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJCWRvdXBkYXRlCgkJaWYgeyRzdG9wcGVkfSBicmVhawoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBmaW5pc2hjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZQogICAgZ2xvYmFsIHN0YXJ0Y29tbWl0cwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgY3RleHQgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCgogICAgaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkkY2FudiBkZWxldGUgYWxsCgkkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAiTm8gY29tbWl0cyBzZWxlY3RlZCIgXAoJICAgIC1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKCXNldCBwaGFzZSB7fQogICAgfSBlbHNlIHsKCWRyYXdzbGFudHMKCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCWRyYXdyZXN0ICRsZXZlbCBbbGxlbmd0aCAkc3RhcnRjb21taXRzXQogICAgfQogICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgogICAgJGN0ZXh0IGNvbmZpZyAtY3Vyc29yICR0ZXh0Y3Vyc29yCn0KCnByb2MgZHJhd2dyYXBoIHt9IHsKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3Mgc3RhcnRjb21taXRzIHRvZG8KCiAgICBpZiB7JHN0YXJ0Y29tbWl0cyA9PSB7fX0gcmV0dXJuCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciAkc3RhcnRtc2VjcyArIDEwMF0KICAgIGluaXRncmFwaAogICAgc2V0IHRvZG8gW2xpbmRleCAkc3RhcnRjb21taXRzIDBdCiAgICBkcmF3cmVzdCAwIDEKfQoKcHJvYyBkcmF3cmVzdCB7bGV2ZWwgc3RhcnRpeH0gewogICAgZ2xvYmFsIHBoYXNlIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGRhdGVtb2RlIGN1cnJlbnRwYXJlbnRzIHRvZG8KICAgIGdsb2JhbCBudW1jb21taXRzCiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzIHN0YXJ0Y29tbWl0cyBpZGxpbmUKCiAgICBpZiB7JGxldmVsID49IDB9IHsKCXNldCBwaGFzZSBkcmF3Z3JhcGgKCXNldCBzdGFydGlkIFtsaW5kZXggJHN0YXJ0Y29tbWl0cyAkc3RhcnRpeF0KCXNldCBzdGFydGxpbmUgLTEKCWlmIHskc3RhcnRpZCAhPSB7fX0gewoJICAgIHNldCBzdGFydGxpbmUgJGlkbGluZSgkc3RhcnRpZCkKCX0KCXdoaWxlIDEgewoJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCSAgICBkcmF3Y29tbWl0bGluZSAkbGV2ZWwKCSAgICBzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJICAgIGlmIHskbnVtY29tbWl0cyA9PSAkc3RhcnRsaW5lfSB7CgkJbGFwcGVuZCB0b2RvICRzdGFydGlkCgkJc2V0IGhhcmQgMQoJCWluY3Igc3RhcnRpeAoJCXNldCBzdGFydGlkIFtsaW5kZXggJHN0YXJ0Y29tbWl0cyAkc3RhcnRpeF0KCQlzZXQgc3RhcnRsaW5lIC0xCgkJaWYgeyRzdGFydGlkICE9IHt9fSB7CgkJICAgIHNldCBzdGFydGxpbmUgJGlkbGluZSgkc3RhcnRpZCkKCQl9CgkgICAgfQoJICAgIGlmIHskaGFyZH0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCQlpZiB7JGxldmVsIDwgMH0gYnJlYWsKCQlkcmF3c2xhbnRzCgkgICAgfQoJICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkJdXBkYXRlCgkJaW5jciBuZXh0dXBkYXRlIDEwMAoJICAgIH0KCX0KICAgIH0KICAgIHNldCBwaGFzZSB7fQogICAgc2V0IGRyYXdtc2VjcyBbZXhwciBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXNlY3NdCiAgICAjcHV0cyAib3ZlcmFsbCAkZHJhd21zZWNzIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgogICAgaWYgeyRyZWRpc3BsYXlpbmd9IHsKCWlmIHskc3RvcHBlZCA9PSAwICYmIFtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CgkgICAgc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lCgl9CglpZiB7JHN0b3BwZWQgPT0gMX0gewoJICAgIHNldCBzdG9wcGVkIDAKCSAgICBhZnRlciBpZGxlIGRyYXdncmFwaAoJfSBlbHNlIHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCX0KICAgIH0KfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgJGorJGZvdW5kc3RybGVuLTFdXQoJICAgIHNldCBpIFtleHByICRqICsgJGZvdW5kc3RybGVuXQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCiAgICBnbG9iYWwgbnVtY29tbWl0cyBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglmaW5kcGF0Y2hlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICBpZiB7JGZpbmRsb2MgPT0gIkZpbGVzIn0gewoJZmluZGZpbGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudH0KICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCXNldCBpZCAkbGluZWlkKCRsKQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJBdXRob3IifSB7CgkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG5hbWVmb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwKICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0gewoJIyBoaWdobGlnaHQgdGhlIG1hdGNoZXMgaW4gdGhlIGNvbW1lbnRzCglzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCglzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCglmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCSAgICBzZXQgZW5kIFtleHByIFtsaW5kZXggJG1hdGNoIDFdICsgMV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2MgZmluZGxvY2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGZpbmRsb2MgZmluZHR5cGUgZmluZHR5cGVtZW51CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglzZXQgZmluZHR5cGUgRXhhY3QKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDEgLXN0YXRlICRzdGF0ZQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMiAtc3RhdGUgJHN0YXRlCn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7Cgl1bnNldCBmaW5kaW5wcm9ncmVzcwoJaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkgICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJICAgICRjdGV4dCBjb25maWcgLWN1cnNvciAkdGV4dGN1cnNvcgoJfQogICAgfQp9Cgpwcm9jIGZpbmRwYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBmaW5kc3RyaW5nIHNlbGVjdGVkbGluZSBudW1jb21taXRzCiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlCiAgICBnbG9iYWwgZmluZGRpZHNlbCBjdGV4dCBsaW5laWQgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kaW5zZXJ0cG9zCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgICMgbWFrZSBhIGxpc3Qgb2YgYWxsIHRoZSBpZHMgdG8gc2VhcmNoLCBzdGFydGluZyBhdCB0aGUgb25lCiAgICAjIGFmdGVyIHRoZSBzZWxlY3RlZCBsaW5lIChpZiBhbnkpCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsICRzZWxlY3RlZGxpbmUKICAgIH0gZWxzZSB7CglzZXQgbCAtMQogICAgfQogICAgc2V0IGlucHV0aWRzIHt9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRudW1jb21taXRzfSB7aW5jciBpfSB7CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglhcHBlbmQgaW5wdXRpZHMgJGxpbmVpZCgkbCkgIlxuIgogICAgfQoKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXMgLXIgLVMkZmluZHN0cmluZyBcCgkJCSA8PCAkaW5wdXRpZHNdIHJdCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGZpbmRwcm9jZmlsZSAkZgogICAgc2V0IGZpbmRwcm9jcGlkIFtwaWQgJGZdCiAgICBmY29uZmlndXJlICRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUgcmVhZGZpbmRwcm9jCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICAkY3RleHQgY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCn0KCnByb2MgcmVhZGZpbmRwcm9jIHt9IHsKICAgIGdsb2JhbCBmaW5kcHJvY2ZpbGUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGlkbGluZSBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MKCiAgICBzZXQgbiBbZ2V0cyAkZmluZHByb2NmaWxlIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZmluZHByb2NmaWxlXX0gewoJICAgIHN0b3BmaW5kcHJvYyAxCgkgICAgaWYgeyEkZmluZGRpZHNlbH0gewoJCWJlbGwKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfX0gJGxpbmUgaWRdfSB7CgllcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0LWRpZmYtdHJlZSBvdXRwdXQ6ICRsaW5lIgoJc3RvcGZpbmRwcm9jCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJcHV0cyBzdGRlcnIgInNwdXJpb3VzIGlkOiAkaWQiCglyZXR1cm4KICAgIH0KICAgIHNldCBsICRpZGxpbmUoJGlkKQogICAgaW5zZXJ0bWF0Y2ggJGwgJGlkCn0KCnByb2MgaW5zZXJ0bWF0Y2gge2wgaWR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MgZmluZGRpZHNlbAoKICAgIGlmIHskZmluZGluc2VydHBvcyA9PSAiZW5kIn0gewoJaWYgeyRtYXRjaGluZ2xpbmVzICE9IHt9ICYmICRsIDwgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXX0gewoJICAgIHNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzIDAgJGxdCgkgICAgc2V0IGZpbmRpbnNlcnRwb3MgMQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCX0KICAgIH0gZWxzZSB7CglzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAkZmluZGluc2VydHBvcyAkbF0KCWluY3IgZmluZGluc2VydHBvcwogICAgfQogICAgbWFya2hlYWRsaW5lICRsICRpZAogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgJGwKCXNldCBmaW5kZGlkc2VsIDEKICAgIH0KfQoKcHJvYyBmaW5kZmlsZXMge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBudW1jb21taXRzIGxpbmVpZCBjdGV4dAogICAgZ2xvYmFsIGZmaWxlbGluZSBmaW5kZGlkc2VsIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcyBmaW5kc3RhcnRsaW5lIGZpbmRpbnNlcnRwb3MKICAgIGdsb2JhbCB0cmVlZGlmZnMgZmRpZmZpZHMgZmRpZmZzbmVlZGVkIGZkaWZmcG9zCiAgICBnbG9iYWwgZmluZG1lcmdlZmlsZXMKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArIDF9XQogICAgfSBlbHNlIHsKCXNldCBsIDAKICAgIH0KICAgIHNldCBmZmlsZWxpbmUgJGwKICAgIHNldCBmaW5kc3RhcnRsaW5lICRsCiAgICBzZXQgZGlmZnNuZWVkZWQge30KICAgIHNldCBmZGlmZnNuZWVkZWQge30KICAgIHdoaWxlIDEgewoJc2V0IGlkICRsaW5laWQoJGwpCglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKFtsaXN0ICRpZCAkcF0pXX0gewoJCSAgICBhcHBlbmQgZGlmZnNuZWVkZWQgIiRpZCAkcFxuIgoJCSAgICBsYXBwZW5kIGZkaWZmc25lZWRlZCBbbGlzdCAkaWQgJHBdCgkJfQoJICAgIH0KCX0KCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKICAgIH0KCiAgICAjIHN0YXJ0IG9mZiBhIGdpdC1kaWZmLXRyZWUgcHJvY2VzcyBpZiBuZWVkZWQKICAgIGlmIHskZGlmZnNuZWVkZWQgbmUge319IHsKCWlmIHtbY2F0Y2ggewoJICAgIHNldCBkZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLXIgLS1zdGRpbiA8PCAkZGlmZnNuZWVkZWRdIHJdCgl9IGVyciBdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJICAgIHJldHVybgoJfQoJY2F0Y2gge3Vuc2V0IGZkaWZmaWRzfQoJc2V0IGZkaWZmcG9zIDAKCWZjb25maWd1cmUgJGRmIC1ibG9ja2luZyAwCglmaWxlZXZlbnQgJGRmIHJlYWRhYmxlIFtsaXN0IHJlYWRmaWxlZGlmZnMgJGRmXQogICAgfQoKICAgIHNldCBmaW5kZGlkc2VsIDAKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgMF0KICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgICRjdGV4dCBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250IFtsaXN0ICRpZCAkcF0KICAgIHVwZGF0ZQp9Cgpwcm9jIHJlYWRmaWxlZGlmZnMge2RmfSB7CiAgICBnbG9iYWwgZmluZGlkcyBmZGlmZmlkcyBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXX0gewoJCXNldCBpZHMgJGZpbmRpZHMKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yIHskaWRzfSIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgXChmcm9tIChbMC05YS1mXXs0MH0pXCl9ICRsaW5lIG1hdGNoIGlkIHBdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IHN0cmluZyBvZiBkaWZmcwoJZG9uZWZpbGVkaWZmCglzZXQgZmRpZmZpZHMgW2xpc3QgJGlkICRwXQoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWRzIGZkaWZmcyB0cmVlZGlmZnMgZmluZGlkcwogICAgZ2xvYmFsIGZkaWZmc25lZWRlZCBmZGlmZnBvcwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmRpZmZpZHNdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWRzCgkgICAgICAgJiYgJGZkaWZmcG9zIDwgW2xsZW5ndGggJGZkaWZmc25lZWRlZF19IHsKCSAgICAjIGdpdC1kaWZmLXRyZWUgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcgZm9yIGEgY29tbWl0CgkgICAgIyB3aGljaCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwoJICAgIHNldCBudWxsaWRzIFtsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdCgkgICAgc2V0IHRyZWVkaWZmcygkbnVsbGlkcykge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRudWxsaWRzIGVxICRmaW5kaWRzfSB7CgkJdW5zZXQgZmluZGlkcwoJCWZpbmRjb250ICRudWxsaWRzCgkgICAgfQoJICAgIGluY3IgZmRpZmZwb3MKCX0KCWluY3IgZmRpZmZwb3MKCglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGZkaWZmaWRzKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkcykgJGZkaWZmcwoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkZmRpZmZpZHMgZXEgJGZpbmRpZHN9IHsKCSAgICB1bnNldCBmaW5kaWRzCgkgICAgZmluZGNvbnQgJGZkaWZmaWRzCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkc30gewogICAgZ2xvYmFsIGZpbmRpZHMgdHJlZWRpZmZzIHBhcmVudHMgbnBhcmVudHMgdHJlZXBlbmRpbmcKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZHN0YXJ0bGluZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMgbWF0Y2hpbmdsaW5lcyBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgcGkgW2xzZWFyY2ggLWV4YWN0ICRwYXJlbnRzKCRpZCkgJHBdCiAgICBzZXQgbCAkZmZpbGVsaW5lCiAgICB3aGlsZSAxIHsKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCQlzZXQgZmluZGlkcyAkaWRzCgkJc2V0IGZmaWxlbGluZSAkbAoJCXJldHVybgoJICAgIH0KCSAgICBzZXQgZG9lc21hdGNoIDAKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkJc2V0IHggW2ZpbmRtYXRjaGVzICRmXQoJCWlmIHskeCAhPSB7fX0gewoJCSAgICBzZXQgZG9lc21hdGNoIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGlmIHskZG9lc21hdGNofSB7CgkJaW5zZXJ0bWF0Y2ggJGwgJGlkCgkJc2V0IHBpICRucGFyZW50cygkaWQpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCX0KCWlmIHtbaW5jciBwaV0gPj0gJG5wYXJlbnRzKCRpZCl9IHsKCSAgICBzZXQgcGkgMAoJICAgIGlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJCXNldCBsIDAKCSAgICB9CgkgICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawoJICAgIHNldCBpZCAkbGluZWlkKCRsKQoJfQoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwaV0KCXNldCBpZHMgW2xpc3QgJGlkICRwXQogICAgfQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgliZWxsCiAgICB9Cn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZyBjb21taXRpbmZvCgogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkc3RhcnQtMV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkZW5kXV1dCglzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgJHgwKyR4b2ZmXSAkeTAgW2V4cHIgJHgwKyR4bGVuKzJdICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcgcm93dGV4dHgKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0KICAgIGlmIHskdyBlcSAkY2Fudn0gewoJaWYgeyFbaW5mbyBleGlzdHMgcm93dGV4dHgoJGwpXSB8fCAkeCA8ICRyb3d0ZXh0eCgkbCl9IHJldHVybgogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbAp9Cgpwcm9jIHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGNmbGlzdCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWlkKCRsKV0gfHwgIVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciBbbGluZGV4ICR3bm93IDBdICogJHltYXhdCiAgICBzZXQgd2JvdCBbZXhwciBbbGluZGV4ICR3bm93IDFdICogJHltYXhdCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByICRuZXd0b3AgKiAxLjAgLyAkeW1heF0KICAgIH0KICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQXV0aG9yOiBbbGluZGV4ICRpbmZvIDFdICBbbGluZGV4ICRpbmZvIDJdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICBbbGluZGV4ICRpbmZvIDRdXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlRhZ3M6IgoJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICR0YWciCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRpbmZvIDVdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgY29tbWVudGVuZCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiQ29tbWVudHMiCiAgICBzdGFydGRpZmYgJGlkICRwYXJlbnRzKCRpZCkKfQoKcHJvYyBzdGFydGRpZmYge2lkIHZzfSB7CiAgICBnbG9iYWwgZGlmZnBlbmRpbmcgZGlmZnBpbmRleAogICAgZ2xvYmFsIGRpZmZpbmRleCBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAoKICAgIHNldCBkaWZmcGVuZGluZyAkdnMKICAgIHNldCBkaWZmcGluZGV4IDAKICAgIHNldCBkaWZmaW5kZXggMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY29udGRpZmYgW2xpc3QgJGlkIFtsaW5kZXggJHZzIDBdXQp9Cgpwcm9jIGNvbnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZwoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgJHNlbGVjdGVkbGluZSArICRkaXJdCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsCn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QgZGlmZnBpbmRleAoKICAgIHNldCBjb2xvcnMge2JsYWNrIGJsdWUgZ3JlZW4gcmVkIGN5YW4gbWFnZW50YX0KICAgIHNldCBjb2xvciBbbGluZGV4ICRjb2xvcnMgW2V4cHIgeyRkaWZmcGluZGV4ICUgW2xsZW5ndGggJGNvbG9yc119XV0KICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgoJJGNmbGlzdCBpdGVtY29uZiBlbmQgLWZvcmVncm91bmQgJGNvbG9yCiAgICB9CiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmZzKCRpZHMpIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRwICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSAiZ2V0dHJlZWRpZmZsaW5lICRnZHRmIHskaWRzfSIKfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCgl1bnNldCB0cmVlcGVuZGluZwoJaWYge1tpbmZvIGV4aXN0cyBkaWZmaWRzXX0gewoJICAgIGlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgkgICAgfSBlbHNlIHsKCQlhZGR0b2NmbGlzdCAkaWRzCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlsZSBbbGluZGV4ICRsaW5lIDVdCiAgICBsYXBwZW5kIHRyZWVkaWZmcygkaWRzKSAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudgogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgaWYgW2NhdGNoIHtzZXQgYmRmIFtvcGVuICJ8Z2l0LWRpZmYtdHJlZSAtciAtcCAkcCAkaWQiIHJdfSBlcnJdIHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkaWRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldGJsb2JkaWZmbGluZSB7YmRmIGlkc30gewogICAgZ2xvYmFsIGRpZmZpZHMgYmxvYmRpZmZmZCBjdGV4dCBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmaW5kZXggZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZnBlbmRpbmcgZGlmZnBpbmRleCBkaWZmaW5oZHIKICAgIGdsb2JhbCBnYXVkeWRpZmYKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCWlmIHtbaW5jciBkaWZmcGluZGV4XSA8IFtsbGVuZ3RoICRkaWZmcGVuZGluZ119IHsKCQkgICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQoJCSAgICBzZXQgcCBbbGluZGV4ICRkaWZmcGVuZGluZyAkZGlmZnBpbmRleF0KCQkgICAgY29udGRpZmYgW2xpc3QgJGlkICRwXQoJCX0KCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHskaWRzICE9ICRkaWZmaWRzIHx8ICRiZGYgIT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgaGVhZGVyICRmbmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGRpZmZpbmRleCkgJGhlcmUKCWluY3IgZGlmZmluZGV4CgkjIHN0YXJ0IG1hcmsgbmFtZXMgYXQgZm1hcmsuMSBmb3IgZmlyc3QgZmlsZQoJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRkaWZmaW5kZXggJGhlcmUKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGRpZmZpbmRleCBsZWZ0CglzZXQgY3VyZGlmZnRhZyAiZjokZm5hbWUiCgkkY3RleHQgdGFnIGRlbGV0ZSAkY3VyZGlmZnRhZwoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBkaWZmaW5oZHIgMQogICAgfSBlbHNlaWYge1tyZWdleHAge14oLS0tfFwrXCtcKyl9ICRsaW5lXX0gewoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJaWYgeyRnYXVkeWRpZmZ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHQiIGh1bmtzZXAKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRmMWwgICAgIiBkMCAiICAgICRmMmwgICAgIiBkMQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgICAgJHJlc3QgXG4iIGh1bmtzZXAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCX0KCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlIHsKCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQoJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCSAgICBzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCgl9IGVsc2VpZiB7JHggPT0gIiAifSB7CgkgICAgaWYgeyRnYXVkeWRpZmZ9IHsKCQlzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEgZW5kXQoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3Ige3NldCBpIDB9IHtbaW5mbyBleGlzdHMgZGlmZmZpbGVzdGFydCgkaSldfSB7aW5jciBpfSB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA+ICRoZXJlXX0gewoJICAgICRjdGV4dCB5dmlldyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICBicmVhawoJfQogICAgfQp9Cgpwcm9jIGxpc3Rib3hzZWwge30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCBjdXJyZW50aWQgdHJlZWRpZmZzCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBzZWwgW2xzb3J0IFskY2ZsaXN0IGN1cnNlbGVjdGlvbl1dCiAgICBpZiB7JHNlbCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgZmlyc3QgW2xpbmRleCAkc2VsIDBdCiAgICBjYXRjaCB7JGN0ZXh0IHl2aWV3IGZtYXJrLiRmaXJzdH0KfQoKcHJvYyBzZXRjb29yZHMge30gewogICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgY2FudngwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBzdG9wcGVkIHJlZGlzcGxheWluZyBwaGFzZQogICAgaWYgeyRzdG9wcGVkID4gMX0gcmV0dXJuCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gcmV0dXJuCiAgICBzZXQgcmVkaXNwbGF5aW5nIDEKICAgIGlmIHskcGhhc2UgPT0gImRyYXdncmFwaCIgfHwgJHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCXNldCBzdG9wcGVkIDEKICAgIH0gZWxzZSB7CglkcmF3Z3JhcGgKICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgdGV4dGZvbnQgc2VsZWN0ZWRsaW5lIGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgbmFtZWZvbnQgW2xyZXBsYWNlICRuYW1lZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG5hbWVmb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgaWRsaW5lIHRhZ2lkcwogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzCgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkbGluZWlkKCRsKV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRsaW5laWQoJGwpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWciCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNmbGlzdCBjYW52CgogICAgdW5tYXJrbWF0Y2hlcwogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XG4gIgogICAgY2F0Y2gge2Rlc3Ryb3kgJGN0ZXh0LiRpZH0KICAgIGJ1dHRvbiAkY3RleHQuJGlkIC10ZXh0ICJHbzoiIC1jb21tYW5kICJzZWxieWlkICRpZCIgXAoJLXBhZHggNCAtcGFkeSAwCiAgICAkY3RleHQgd2luZG93IGNyZWF0ZSBlbmQgLXdpbmRvdyAkY3RleHQuJGlkIC1hbGlnbiBjZW50ZXIKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHRbbGluZGV4ICRpbmZvIDJdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRJRDpcdCRpZFxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuQ2hpbGRyZW46IgoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICIKCSAgICBjYXRjaCB7ZGVzdHJveSAkY3RleHQuJGNoaWxkfQoJICAgIGJ1dHRvbiAkY3RleHQuJGNoaWxkIC10ZXh0ICJHbzoiIC1jb21tYW5kICJzZWxieWlkICRjaGlsZCIgXAoJCS1wYWR4IDQgLXBhZHkgMAoJICAgICRjdGV4dCB3aW5kb3cgY3JlYXRlIGVuZCAtd2luZG93ICRjdGV4dC4kY2hpbGQgLWFsaWduIGNlbnRlcgoJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRbbGluZGV4ICRpbmZvIDBdIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGlkbGluZQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgaWRsaW5lIHNlbGVjdGVkbGluZSByb3dtZW51aWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICRpZGxpbmUoJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGxpbmVpZAogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHskZGlybn0gewoJc2V0IG9sZGlkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICRvbGRpZFxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAkbmV3aWRcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG5ld2lkICRvbGRpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQtZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwogICAgZ2xvYmFsIGlkcG9zIGlkbGluZSBsaW5laHRhZyBjYW52IHNlbGVjdGVkbGluZQoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgIi5naXQiCglpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCSAgICBzZXQgZGlyICRlbnYoR0lUX0RJUikKCX0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGlkbGluZSgkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPT0gJGlkbGluZSgkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgZGVzdHJveSAuCn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGJvbGRuYW1lcyAwCnNldCBkaWZmb3B0cyAiLVUgNSAtcCIKc2V0IHdyY29tY21kICJnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXAgLS1wcmV0dHkiCgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IGdhdWR5ZGlmZiAwCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCnNldCBuYW1lZm9udCAkbWFpbmZvbnQKaWYgeyRib2xkbmFtZXN9IHsKICAgIGxhcHBlbmQgbmFtZWZvbnQgYm9sZAp9CgpzZXQgcmV2dHJlZWFyZ3Mge30KZm9yZWFjaCBhcmcgJGFyZ3YgewogICAgc3dpdGNoIC1yZWdleHAgLS0gJGFyZyB7CgkiXiQiIHsgfQoJIl4tYiIgeyBzZXQgYm9sZG5hbWVzIDEgfQoJIl4tZCIgeyBzZXQgZGF0ZW1vZGUgMSB9CglkZWZhdWx0IHsKCSAgICBsYXBwZW5kIHJldnRyZWVhcmdzICRhcmcKCX0KICAgIH0KfQoKc2V0IHN0b3BwZWQgMApzZXQgcmVkaXNwbGF5aW5nIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwpyZWFkcmVmcwpnZXRjb21taXRzICRyZXZ0cmVlYXJncwo=