IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkezErJEB9IgoKIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuICIuZ2l0IgogICAgfQp9Cgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0cyBjb21tZmQgcGhhc2UgY2FudiBtYWluZm9udCBlbnYKICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUgbmNtdXBkYXRlCiAgICBnbG9iYWwgY3RleHQgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGxlZnRvdmVyCgogICAgIyBjaGVjayB0aGF0IHdlIGNhbiBmaW5kIGEgLmdpdCBkaXJlY3Rvcnkgc29tZXdoZXJlLi4uCiAgICBzZXQgZ2l0ZGlyIFtnaXRkaXJdCiAgICBpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWl0cyB7fQogICAgc2V0IHBoYXNlIGdldGNvbW1pdHMKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByICRzdGFydG1zZWNzICsgMTAwXQogICAgc2V0IG5jbXVwZGF0ZSAxCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAtLXBhcmVudHMgJHBhcnNlZF9hcmdzIiByXQogICAgfSBlcnJdIHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0LXJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgbGVmdG92ZXIge30KICAgIGZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlIFtsaXN0IGdldGNvbW1pdGxpbmVzICRjb21tZmRdCiAgICAkY2FudiBkZWxldGUgYWxsCiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAiUmVhZGluZyBjb21taXRzLi4uIiBcCgktZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXR0ZXh0Y3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4KICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcGhhc2UgY29tbWl0aW5mbyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCByZWRpc3BsYXlpbmcgbGVmdG92ZXIKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGNvbW1mZF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkY29tbWZkXX0gcmV0dXJuCgkjIHNldCBpdCBibG9ja2luZyBzbyB3ZSB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUKCWZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMQoJaWYgeyFbY2F0Y2gge2Nsb3NlICRjb21tZmR9IGVycl19IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCSAgICByZXR1cm4KCX0KCWlmIHtbc3RyaW5nIHJhbmdlICRlcnIgMCA0XSA9PSAidXNhZ2UifSB7CgkgICAgc2V0IGVyciBcCntHaXRrOiBlcnJvciByZWFkaW5nIGNvbW1pdHM6IGJhZCBhcmd1bWVudHMgdG8gZ2l0LXJldi1saXN0LgooTm90ZTogYXJndW1lbnRzIHRvIGdpdGsgYXJlIHBhc3NlZCB0byBnaXQtcmV2LWxpc3QKdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLil9Cgl9IGVsc2UgewoJICAgIHNldCBlcnIgIkVycm9yIHJlYWRpbmcgY29tbWl0czogJGVyciIKCX0KCWVycm9yX3BvcHVwICRlcnIKCWV4aXQgMQogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyIFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBlbmRdCgkgICAgcmV0dXJuCgl9CglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJaWYgeyRzdGFydCA9PSAwfSB7CgkgICAgc2V0IGNtaXQgIiRsZWZ0b3ZlciRjbWl0IgoJICAgIHNldCBsZWZ0b3ZlciB7fQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCWlmIHskaiA+PSAwfSB7CgkgICAgc2V0IGlkcyBbc3RyaW5nIHJhbmdlICRjbWl0IDAgW2V4cHIgeyRqIC0gMX1dXQoJICAgIHNldCBvayAxCgkgICAgZm9yZWFjaCBpZCAkaWRzIHsKCQlpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSB7CgkJICAgIHNldCBvayAwCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0KCWlmIHshJG9rfSB7CgkgICAgc2V0IHNob3J0Y21pdCAkY21pdAoJICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hvcnRjbWl0XSA+IDgwfSB7CgkJc2V0IHNob3J0Y21pdCAiW3N0cmluZyByYW5nZSAkc2hvcnRjbWl0IDAgODBdLi4uIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0LXJldi1saXN0IG91dHB1dDogeyRzaG9ydGNtaXR9IgoJICAgIGV4aXQgMQoJfQoJc2V0IGlkIFtsaW5kZXggJGlkcyAwXQoJc2V0IG9sZHMgW2xyYW5nZSAkaWRzIDEgZW5kXQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkY21pdCBbZXhwciB7JGogKyAxfV0gZW5kXQoJbGFwcGVuZCBjb21taXRzICRpZAoJc2V0IGNvbW1pdGxpc3RlZCgkaWQpIDEKCXBhcnNlY29tbWl0ICRpZCAkY21pdCAxIFtscmFuZ2UgJGlkcyAxIGVuZF0KCWRyYXdjb21taXQgJGlkCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJICAgIGRvdXBkYXRlIDEKCX0KCXdoaWxlIHskcmVkaXNwbGF5aW5nfSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgkgICAgaWYgeyRzdG9wcGVkID09IDF9IHsKCQlzZXQgc3RvcHBlZCAwCgkJc2V0IHBoYXNlICJnZXRjb21taXRzIgoJCWZvcmVhY2ggaWQgJGNvbW1pdHMgewoJCSAgICBkcmF3Y29tbWl0ICRpZAoJCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgkJICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkJCWRvdXBkYXRlIDEKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge3JlYWRpbmd9IHsKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZSBudW1jb21taXRzIG5jbXVwZGF0ZQoKICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgaWYgeyRudW1jb21taXRzIDwgMTAwfSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDF9XQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzIDwgMTAwMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQogICAgfSBlbHNlIHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTAwfV0KICAgIH0KICAgIGlmIHskcmVhZGluZ30gewoJZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGNvbW1mZF0KICAgIH0KfQoKcHJvYyByZWFkY29tbWl0IHtpZH0gewogICAgaWYgW2NhdGNoIHtzZXQgY29udGVudHMgW2V4ZWMgZ2l0LWNhdC1maWxlIGNvbW1pdCAkaWRdfV0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAge30KfQoKcHJvYyBwYXJzZWNvbW1pdCB7aWQgY29udGVudHMgbGlzdGVkIG9sZHN9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNoaWxkcmVuIG5jaGlsZHJlbiBwYXJlbnRzIG5wYXJlbnRzIGNkYXRlIG5jbGVmdAoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIGlmIHshW2luZm8gZXhpc3RzIG5jaGlsZHJlbigkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRpZCkge30KCXNldCBuY2hpbGRyZW4oJGlkKSAwCglzZXQgbmNsZWZ0KCRpZCkgMAogICAgfQogICAgc2V0IHBhcmVudHMoJGlkKSAkb2xkcwogICAgc2V0IG5wYXJlbnRzKCRpZCkgW2xsZW5ndGggJG9sZHNdCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHApIFtsaXN0ICRpZF0KCSAgICBzZXQgbmNoaWxkcmVuKCRwKSAxCgkgICAgc2V0IG5jbGVmdCgkcCkgMQoJfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4oJHApICRpZF0gPCAwfSB7CgkgICAgbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkgICAgaW5jciBuY2hpbGRyZW4oJHApCgkgICAgaW5jciBuY2xlZnQoJHApCgl9CiAgICB9CiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb250ZW50cyAiXG4iXSB7CglpZiB7JGluaGRyfSB7CgkgICAgaWYgeyRsaW5lID09IHt9fSB7CgkJc2V0IGluaGRyIDAKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBbZXhwciB7JHggLSAxfV1dCgkJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCQkgICAgc2V0IHggW2V4cHIge1tsbGVuZ3RoICRsaW5lXSAtIDJ9XQoJCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHskY29tbWVudCA9PSB7fX0gewoJCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCgkgICAgfSBlbHNlIHsKCQlhcHBlbmQgY29tbWVudCAiXG4iCgkgICAgfQoJICAgIGlmIHshJGxpc3RlZH0gewoJCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCgkJYXBwZW5kIGNvbW1lbnQgIiAgICAiCgkgICAgfQoJICAgIGFwcGVuZCBjb21tZW50ICRsaW5lCgl9CiAgICB9CiAgICBpZiB7JGF1ZGF0ZSAhPSB7fX0gewoJc2V0IGF1ZGF0ZSBbY2xvY2sgZm9ybWF0ICRhdWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQoJc2V0IGNvbWRhdGUgW2Nsb2NrIGZvcm1hdCAkY29tZGF0ZSAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdjb250ZW50cwoKICAgIHNldCB0YWdzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBmIFtnaXRkaXJdL3JlZnMvdGFncy8qXQogICAgZm9yZWFjaCBmICR0YWdzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmRdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBkaXJlY3QgW2ZpbGUgdGFpbCAkZl0KCQlzZXQgdGFnaWRzKCRkaXJlY3QpICRpZAoJCWxhcHBlbmQgaWR0YWdzKCRpZCkgJGRpcmVjdAoJCXNldCB0YWdibG9iIFtleGVjIGdpdC1jYXQtZmlsZSB0YWcgJGlkXQoJCXNldCBjb250ZW50cyBbc3BsaXQgJHRhZ2Jsb2IgIlxuIl0KCQlzZXQgb2JqIHt9CgkJc2V0IHR5cGUge30KCQlzZXQgdGFnIHt9CgkJZm9yZWFjaCBsICRjb250ZW50cyB7CgkJICAgIGlmIHskbCA9PSB7fX0gYnJlYWsKCQkgICAgc3dpdGNoIC0tIFtsaW5kZXggJGwgMF0gewoJCQkib2JqZWN0IiB7c2V0IG9iaiBbbGluZGV4ICRsIDFdfQoJCQkidHlwZSIge3NldCB0eXBlIFtsaW5kZXggJGwgMV19CgkJCSJ0YWciIHtzZXQgdGFnIFtzdHJpbmcgcmFuZ2UgJGwgNCBlbmRdfQoJCSAgICB9CgkJfQoJCWlmIHskb2JqICE9IHt9ICYmICR0eXBlID09ICJjb21taXQiICYmICR0YWcgIT0ge319IHsKCQkgICAgc2V0IHRhZ2lkcygkdGFnKSAkb2JqCgkJICAgIGxhcHBlbmQgaWR0YWdzKCRvYmopICR0YWcKCQkgICAgc2V0IHRhZ2NvbnRlbnRzKCR0YWcpICR0YWdibG9iCgkJfQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBoZWFkcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZ2l0ZGlyXS9yZWZzL2hlYWRzLypdCiAgICBmb3JlYWNoIGYgJGhlYWRzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBoZWFkIFtmaWxlIHRhaWwgJGZdCgkJc2V0IGhlYWRpZHMoJGhlYWQpICRsaW5lCgkJbGFwcGVuZCBpZGhlYWRzKCRsaW5lKSAkaGVhZAoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHJlYWRvdGhlcnJlZnMgcmVmcyB7fSB7dGFncyBoZWFkc30KfQoKcHJvYyByZWFkb3RoZXJyZWZzIHtiYXNlIGRuYW1lIGV4Y2x9IHsKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIHNldCBnaXQgW2dpdGRpcl0KICAgIHNldCBmaWxlcyBbZ2xvYiAtbm9jb21wbGFpbiAtdHlwZXMgZiBbZmlsZSBqb2luICRnaXQgJGJhc2UgKl1dCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCWNhdGNoIHsKCSAgICBzZXQgZmQgW29wZW4gJGYgcl0KCSAgICBzZXQgbGluZSBbcmVhZCAkZmQgNDBdCgkgICAgaWYge1tyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJCXNldCBuYW1lICIkZG5hbWVbZmlsZSB0YWlsICRmXSIKCQlzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAoJCWxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQoJICAgIH0KCSAgICBjbG9zZSAkZmQKCX0KICAgIH0KICAgIHNldCBkaXJzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBkIFtmaWxlIGpvaW4gJGdpdCAkYmFzZSAqXV0KICAgIGZvcmVhY2ggZCAkZGlycyB7CglzZXQgZGlyIFtmaWxlIHRhaWwgJGRdCglpZiB7W2xzZWFyY2ggLWV4YWN0ICRleGNsICRkaXJdID49IDB9IGNvbnRpbnVlCglyZWFkb3RoZXJyZWZzIFtmaWxlIGpvaW4gJGJhc2UgJGRpcl0gIiRkbmFtZSRkaXIvIiB7fQogICAgfQp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgogICAgZ2xvYmFsIHJvd2N0eG1lbnUgZ2F1ZHlkaWZmIG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciA0NSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciAzMCAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciAxNSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciAyNSAqICRsaW5lc3BjICsgNF0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCgkkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgIH0gZWxzZSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBibHVlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgIiMwMGEwMDAiCgkkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCgkkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCgkkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KCSRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CglzZXQgbWVyZ2VtYXggNQoJJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KCSRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CiAgICB9CgogICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAogICAgc2V0IGNmbGlzdCAuY3RvcC5jZGV0LnJpZ2h0LmNmaWxlcwogICAgbGlzdGJveCAkY2ZsaXN0IC1iZyB3aGl0ZSAtc2VsZWN0bW9kZSBleHRlbmRlZCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5yaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5yaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJhbGxjYW52cyBzY2FuIG1hcmsgMCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImFsbGNhbnZzIHNjYW4gZHJhZ3RvIDAgJXkiCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8S2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBmaW5kcHJldgogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgJGNmbGlzdCA8PExpc3Rib3hTZWxlY3Q+PiBsaXN0Ym94c2VsCiAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0Cn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIGdhdWR5ZGlmZiBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGdhdWR5ZGlmZiAkZ2F1ZHlkaWZmXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNvbG9ybWFwIGNvbW1jb2xvcnMgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIFtpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBuZXh0Y29sb3IgbGluZXNwYwogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgbmNoaWxkcmVuIG5jbGVmdAogICAgZ2xvYmFsIGRpc3BsaXN0IG5oeXBlcnNwYWNlCgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgY2FudnkgJGNhbnZ5MAogICAgc2V0IGxpbmVubyAtMQogICAgc2V0IG51bWNvbW1pdHMgMAogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lfQogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lYXJyb3d9CiAgICBjYXRjaCB7dW5zZXQgc2lkZWxpbmVzfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgbmNoaWxkcmVuXSB7CglzZXQgbmNsZWZ0KCRpZCkgJG5jaGlsZHJlbigkaWQpCiAgICB9CiAgICBzZXQgZGlzcGxpc3Qge30KICAgIHNldCBuaHlwZXJzcGFjZSAwCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIGRpc3BsaXN0CnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBkaXNwbGlzdAogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29sb3JtYXAgbnVtY29tbWl0cyBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcm93dGV4dHggaWRwb3MgbGFzdHVzZSBkaXNwbGlzdAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKCiAgICBpbmNyIG51bWNvbW1pdHMKICAgIGluY3IgbGluZW5vCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxpc3QgJGxldmVsXQogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCiAgICBzZXQgbGluZWlkKCRsaW5lbm8pICRpZAogICAgc2V0IGlkbGluZSgkaWQpICRsaW5lbm8KICAgIHNldCBvZmlsbCBbZXhwciB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXT8gImJsdWUiOiAid2hpdGUifV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJICAgIHNldCBucGFyZW50cygkaWQpIDAKCX0KICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGN1cnJlbnRwYXJlbnRzIHt9CiAgICBzZXQgZHVwcGFyZW50cyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0gJiYgW2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjdXJyZW50cGFyZW50cyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjdXJyZW50cGFyZW50cyAkcAoJICAgIH0gZWxzZSB7CgkJIyByZW1lbWJlciB0aGF0IHRoaXMgcGFyZW50IHdhcyBsaXN0ZWQgdHdpY2UKCQlsYXBwZW5kIGR1cHBhcmVudHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeCBbeGNvb3JkICRsZXZlbCAkbGV2ZWwgJGxpbmVub10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgLWFycm93ICRtYWlubGluZWFycm93KCRpZCldCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgdGhpY2sgW2xpbmRleCAkbHMgMV0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgICAgIC13aWR0aCBbZXhwciB7JHRoaWNrICogJGx0aGlja25lc3N9XSAtYXJyb3cgJGFycm93XQoJICAgICRjYW52IGxvd2VyICR0CgkgICAgYmluZGxpbmUgJHQgJGlkCgl9CiAgICB9CiAgICBzZXQgb3JhZCBbZXhwciB7JGxpbmVzcGMgLyAzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgb3ZhbCBbZXhwciAkeCAtICRvcmFkXSBbZXhwciAkeTEgLSAkb3JhZF0gXAoJICAgICAgIFtleHByICR4ICsgJG9yYWQgLSAxXSBbZXhwciAkeTEgKyAkb3JhZCAtIDFdIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDFdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4Y29vcmQgW2xsZW5ndGggJGRpc3BsaXN0XSAkbGV2ZWwgJGxpbmVub10KICAgIGlmIHtbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID4gMn0gewoJc2V0IHh0IFtleHByIHskeHQgKyAoW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSAtIDIpICogJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHJvd3RleHR4KCRsaW5lbm8pICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5MV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeTFdCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGxpbmVodGFnKCRsaW5lbm8pIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJG1haW5mb250IF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRsaW5lbm8pIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRsaW5lbm8pIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkbGluZW5vKSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnRdCgogICAgc2V0IG9sZGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGRkaXNwbGlzdCAkZGlzcGxpc3QKICAgIHNldCBvbGRubGluZXMgW2xsZW5ndGggJGRpc3BsaXN0XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGlkbGluZSByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByICR5MSAtIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IHliIFtleHByICR5dCArICRsaW5lc3BjIC0gMV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgJHggKyAkZGVsdGFdCglzZXQgeHIgW2V4cHIgJHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3NdCglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgJHliIC0gJGRlbHRhXSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkaWRsaW5lKCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciAkeGwgLSAkZGVsdGEvMl0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyBcCgkJICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRhZy4kaWRdCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyBub3RlY3Jvc3NpbmdzIHtpZCBsbyBoaSBjb3JuZXJ9IHsKICAgIGdsb2JhbCBvbGRkaXNwbGlzdCBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldCglpZiB7JHAgPT0ge319IGNvbnRpbnVlCglpZiB7JGkgPT0gJGNvcm5lcn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfSBlbHNlIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKIyBpdCBzZWVtcyBUayBjYW4ndCBkcmF3IGFycm93cyBvbiB0aGUgZW5kIG9mIGRpYWdvbmFsIGxpbmUgc2VnbWVudHMuLi4KcHJvYyB0cmltZGlhZ2VuZCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIGVuZC0zXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgZW5kLTJdCglzZXQgeDIgW2xpbmRleCAkbGluZSBlbmQtMV0KCXNldCB5MiBbbGluZGV4ICRsaW5lIGVuZF0KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIGVuZC0xIGVuZF0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIHRyaW1kaWFnc3RhcnQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSAwXQoJc2V0IHkxIFtsaW5kZXggJGxpbmUgMV0KCXNldCB4MiBbbGluZGV4ICRsaW5lIDJdCglzZXQgeTIgW2xpbmRleCAkbGluZSAzXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgMCAxXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgZHJhd3NsYW50cyB7aWQgbmVlZG9uc2NyZWVuIG5vaHN9IHsKICAgIGdsb2JhbCBjYW52IG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzCiAgICBnbG9iYWwgY2FudngwIGNhbnZ5IHhzcGMxIHhzcGMyIGx0aGlja25lc3MKICAgIGdsb2JhbCBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgbHRoaWNrbmVzcyBsaW5lc3BjIGNhbnZ5IGNvbG9ybWFwIGxpbmVubyBnZW9tZXRyeQogICAgZ2xvYmFsIG1heGdyYXBocGN0IG1heHdpZHRoCiAgICBnbG9iYWwgZGlzcGxpc3Qgb25zY3JlZW4gbGFzdHVzZQogICAgZ2xvYmFsIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAogICAgZ2xvYmFsIG5oeXBlcnNwYWNlIG51bWNvbW1pdHMgbm5ld3BhcmVudHMKCiAgICBpZiB7JGxpbmVubyA8IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCglyZXR1cm4gMAogICAgfQoKICAgIHNldCB5MSBbZXhwciB7JGNhbnZ5IC0gJGxpbmVzcGN9XQogICAgc2V0IHkyICRjYW52eQoKICAgICMgd29yayBvdXQgd2hhdCB3ZSBuZWVkIHRvIGdldCBiYWNrIG9uIHNjcmVlbgogICAgc2V0IHJlaW5zIHt9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPCAwfSB7CgkjIG5leHQgdG8gZG8gaXNuJ3QgZGlzcGxheWVkLCBiZXR0ZXIgZ2V0IGl0IG9uIHNjcmVlbi4uLgoJbGFwcGVuZCByZWlucyBbbGlzdCAkaWQgMF0KICAgIH0KICAgICMgbWFrZSBzdXJlIGFsbCB0aGUgcHJldmlvdXMgY29tbWl0cydzIHBhcmVudHMgYXJlIG9uIHRoZSBzY3JlZW4KICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgbGFwcGVuZCByZWlucyBbbGlzdCAkcCAwXQoJfQogICAgfQogICAgIyBicmluZyBiYWNrIGFueXRoaW5nIHJlcXVlc3RlZCBieSBjYWxsZXIKICAgIGlmIHskbmVlZG9uc2NyZWVuIG5lIHt9fSB7CglsYXBwZW5kIHJlaW5zICRuZWVkb25zY3JlZW4KICAgIH0KCiAgICAjIHRyeSB0aGUgc2hvcnRjdXQKICAgIGlmIHskY3VycmVudHBhcmVudHMgPT0gJGlkICYmICRvbnNjcmVlbigkaWQpID09IDAgJiYgJHJlaW5zIGVxIHt9fSB7CglzZXQgZGxldmVsICRvbGRkbGV2ZWwKCXNldCB4IFt4Y29vcmQgJGRsZXZlbCAkZGxldmVsICRsaW5lbm9dCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeCAkeTFdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIG5vbmUKCXNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGRsZXZlbCAkZGxldmVsICRpZF0KCXNldCBvbnNjcmVlbigkaWQpIDEKCXNldCB4c3BjMShbZXhwciB7JGxpbmVubyArIDF9XSkgJHhzcGMxKCRsaW5lbm8pCglyZXR1cm4gJGRsZXZlbAogICAgfQoKICAgICMgdXBkYXRlIGRpc3BsaXN0CiAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCiAgICBzZXQgaiAkb2xkZGxldmVsCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCXNldCBsYXN0dXNlKCRwKSAkbGluZW5vCglpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaiAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBpbmNyIGoKCX0KICAgIH0KICAgIGlmIHskb25zY3JlZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQogICAgfQoKICAgICMgcmVtb3ZlIHRoZSBudWxsIGVudHJ5IGlmIHByZXNlbnQKICAgIHNldCBudWxsZW50cnkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRudWxsZW50cnkgJG51bGxlbnRyeV0KICAgIH0KCiAgICAjIGJyaW5nIGJhY2sgdGhlIG9uZXMgd2UgbmVlZCBub3cgKGlmIHdlIGRpZCBpdCBlYXJsaWVyCiAgICAjIGl0IHdvdWxkIGNoYW5nZSBkaXNwbGlzdCBhbmQgaW52YWxpZGF0ZSBvbGRkbGV2ZWwpCiAgICBmb3JlYWNoIHBpICRyZWlucyB7CgkjIHRlc3QgYWdhaW4gaW4gY2FzZSBvZiBkdXBsaWNhdGVzIGluIHJlaW5zCglzZXQgcCBbbGluZGV4ICRwaSAwXQoJaWYgeyRvbnNjcmVlbigkcCkgPCAwfSB7CgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0IFtsaW5kZXggJHBpIDFdICRwXQoJICAgIGluY3Igbmh5cGVyc3BhY2UgLTEKCX0KICAgIH0KCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCiAgICAjIHNlZSBpZiB3ZSBuZWVkIHRvIG1ha2UgYW55IGxpbmVzIGp1bXAgb2ZmIGludG8gaHlwZXJzcGFjZQogICAgc2V0IGRpc3BsIFtsbGVuZ3RoICRkaXNwbGlzdF0KICAgIGlmIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCXNldCBhZ2VzIHt9Cglmb3JlYWNoIHggJGRpc3BsaXN0IHsKCSAgICBsYXBwZW5kIGFnZXMgW2xpc3QgJGxhc3R1c2UoJHgpICR4XQoJfQoJc2V0IGFnZXMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRhZ2VzXQoJc2V0IGsgMAoJd2hpbGUgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJICAgIHNldCB1c2UgW2xpbmRleCAkYWdlcyAkayAwXQoJICAgIHNldCB2aWN0aW0gW2xpbmRleCAkYWdlcyAkayAxXQoJICAgIGlmIHskdXNlID49ICRsaW5lbm8gLSA1fSBicmVhawoJICAgIGluY3IgawoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHZpY3RpbV0gPj0gMH0gY29udGludWUKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICR2aWN0aW1dCgkgICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJGkgJGldCgkgICAgc2V0IG9uc2NyZWVuKCR2aWN0aW0pIC0xCgkgICAgaW5jciBuaHlwZXJzcGFjZQoJICAgIGluY3IgZGlzcGwgLTEKCSAgICBpZiB7JGkgPCAkbnVsbGVudHJ5fSB7CgkJaW5jciBudWxsZW50cnkgLTEKCSAgICB9CgkgICAgc2V0IHggW2xpbmRleCAkbWFpbmxpbmUoJHZpY3RpbSkgZW5kLTFdCgkgICAgbGFwcGVuZCBtYWlubGluZSgkdmljdGltKSAkeCAkeTEKCSAgICBzZXQgbGluZSBbdHJpbWRpYWdlbmQgJG1haW5saW5lKCR2aWN0aW0pXQoJICAgIHNldCBhcnJvdyAibGFzdCIKCSAgICBpZiB7JG1haW5saW5lYXJyb3coJHZpY3RpbSkgbmUgIm5vbmUifSB7CgkJc2V0IGxpbmUgW3RyaW1kaWFnc3RhcnQgJGxpbmVdCgkJc2V0IGFycm93ICJib3RoIgoJICAgIH0KCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkdmljdGltKSBbbGlzdCAkbGluZSAxICRhcnJvd10KCSAgICB1bnNldCBtYWlubGluZSgkdmljdGltKQoJfQogICAgfQoKICAgIHNldCBkbGV2ZWwgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgogICAgIyBJZiB3ZSBhcmUgcmVkdWNpbmcsIHB1dCBpbiBhIG51bGwgZW50cnkKICAgIGlmIHskZGlzcGwgPCAkb2xkbmxpbmVzfSB7CgkjIGRvZXMgdGhlIG5leHQgbGluZSBsb29rIGxpa2UgYSBtZXJnZT8KCSMgaS5lLiBkb2VzIGl0IGhhdmUgPiAxIG5ldyBwYXJlbnQ/CglpZiB7JG5uZXdwYXJlbnRzKCRpZCkgPiAxfSB7CgkgICAgc2V0IGkgW2V4cHIgeyRkbGV2ZWwgKyAxfV0KCX0gZWxzZWlmIHskbm5ld3BhcmVudHMoW2xpbmRleCAkb2xkZGlzcGxpc3QgJG9sZGRsZXZlbF0pID09IDB9IHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRudWxsZW50cnkgPj0gMCAmJiAkbnVsbGVudHJ5IDwgJGl9IHsKCQlpbmNyIGkgLTEKCSAgICB9Cgl9IGVsc2VpZiB7JG51bGxlbnRyeSA+PSAwfSB7CgkgICAgc2V0IGkgJG51bGxlbnRyeQoJICAgIHdoaWxlIHskaSA8ICRkaXNwbAoJCSAgICYmIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXSA9PSBbbGluZGV4ICRkaXNwbGlzdCAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgaQoJICAgIH0KCX0KCWlmIHskaSA8ICRkaXNwbH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGkge31dCgkgICAgaW5jciBkaXNwbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBkbGV2ZWwKCSAgICB9Cgl9CiAgICB9CgogICAgIyBkZWNpZGUgb24gdGhlIGxpbmUgc3BhY2luZyBmb3IgdGhlIG5leHQgbGluZQogICAgc2V0IGxqIFtleHByIHskbGluZW5vICsgMX1dCiAgICBzZXQgbWF4dyBbZXhwciB7JG1heGdyYXBocGN0ICogJGdlb21ldHJ5KGNhbnYxKSAvIDEwMH1dCiAgICBpZiB7JGRpc3BsIDw9IDEgfHwgJGNhbnZ4MCArICRkaXNwbCAqICR4c3BjMiA8PSAkbWF4d30gewoJc2V0IHhzcGMxKCRsaikgJHhzcGMyCiAgICB9IGVsc2UgewoJc2V0IHhzcGMxKCRsaikgW2V4cHIgeygkbWF4dyAtICRjYW52eDAgLSAkeHNwYzIpIC8gKCRkaXNwbCAtIDEpfV0KCWlmIHskeHNwYzEoJGxqKSA8ICRsdGhpY2tuZXNzfSB7CgkgICAgc2V0IHhzcGMxKCRsaikgJGx0aGlja25lc3MKCX0KICAgIH0KCiAgICBmb3JlYWNoIGlkaSAkcmVpbnMgewoJc2V0IGlkIFtsaW5kZXggJGlkaSAwXQoJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCglzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4aiAkeTJdCglzZXQgbWFpbmxpbmVhcnJvdygkaWQpIGZpcnN0CiAgICB9CgogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggaWQgJG9sZGRpc3BsaXN0IHsKCWluY3IgaQoJaWYgeyRpZCA9PSB7fX0gY29udGludWUKCWlmIHskb25zY3JlZW4oJGlkKSA8PSAwfSBjb250aW51ZQoJc2V0IHhpIFt4Y29vcmQgJGkgJG9sZGRsZXZlbCAkbGluZW5vXQoJaWYgeyRpID09ICRvbGRkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRwXQoJCXNldCBjb29yZHMgW2xpc3QgJHhpICR5MV0KCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlpZiB7JHhqIDwgJHhpIC0gJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiArICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyR4aiA+ICR4aSArICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogLSAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRpICRqIFtleHByIHskaiAtIDF9XQoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkdXBwYXJlbnRzICRwXSA+PSAwfSB7CgkJICAgICMgZHJhdyBhIGRvdWJsZS13aWR0aCBsaW5lIHRvIGluZGljYXRlIHRoZSBkb3VibGVkIHBhcmVudAoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDIgbm9uZV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlzZXQgbWFpbmxpbmUoJHApIFtsaXN0ICR4aiAkeTJdCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICAjIG5vcm1hbCBjYXNlLCBubyBwYXJlbnQgZHVwbGljYXRlZAoJCSAgICBzZXQgeWIgJHkyCgkJICAgIHNldCBkeCBbZXhwciB7YWJzKCR4aSAtICR4ail9XQoJCSAgICBpZiB7MCAmJiAkZHggPCAkbGluZXNwY30gewoJCQlzZXQgeWIgW2V4cHIgeyR5MSArICRkeH1dCgkJICAgIH0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbWFpbmxpbmUoJHApXX0gewoJCQlpZiB7JHhpICE9ICR4an0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQl9CgkJCXNldCBtYWlubGluZSgkcCkgJGNvb3JkcwoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCWlmIHskeWIgPCAkeTJ9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJfQoJCQlsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAxIG5vbmVdCgkJICAgIH0KCQl9CgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaiAkaQoJICAgIGlmIHtbbGluZGV4ICRkaXNwbGlzdCAkaV0gIT0gJGlkfSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkaWRdCgkgICAgfQoJICAgIGlmIHskaiAhPSAkaSB8fCAkeHNwYzEoJGxpbmVubykgIT0gJHhzcGMxKCRsaikKCQl8fCAoJG9sZGRsZXZlbCA8ICRpICYmICRpIDwgJGRsZXZlbCkKCQl8fCAoJGRsZXZlbCA8ICRpICYmICRpIDwgJG9sZGRsZXZlbCl9IHsKCQlzZXQgeGogW3hjb29yZCAkaiAkZGxldmVsICRsal0KCQlsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRkbGV2ZWwKfQoKIyBzZWFyY2ggZm9yIHggaW4gYSBsaXN0IG9mIGxpc3RzCnByb2MgbGxzZWFyY2gge2xsaXN0IHh9IHsKICAgIHNldCBpIDAKICAgIGZvcmVhY2ggbCAkbGxpc3QgewoJaWYgeyRsID09ICR4IHx8IFtsc2VhcmNoIC1leGFjdCAkbCAkeF0gPj0gMH0gewoJICAgIHJldHVybiAkaQoJfQoJaW5jciBpCiAgICB9CiAgICByZXR1cm4gLTEKfQoKcHJvYyBkcmF3bW9yZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIG5jbXVwZGF0ZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCBuaHlwZXJzcGFjZSBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG1heHdpZHRoIG9uc2NyZWVuIGRpc3BsaXN0IGN1cnJlbnRwYXJlbnRzIG9sZGRsZXZlbAoKICAgIHNldCBuIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICB3aGlsZSB7JG51bWNvbW1pdHMgPCAkbn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbnVtY29tbWl0c10KCXNldCBjdHhlbmQgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQoJaWYgeyEkcmVhZGluZyAmJiAkY3R4ZW5kID4gJG59IHsKCSAgICBzZXQgY3R4ZW5kICRuCgl9CglzZXQgZGxpc3Qge30KCWlmIHskbnVtY29tbWl0cyA+IDB9IHsKCSAgICBzZXQgZGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkb2xkZGxldmVsICRvbGRkbGV2ZWxdCgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCQkgICAgc2V0IGRsaXN0IFtsaW5zZXJ0ICRkbGlzdCAkaSAkcF0KCQkgICAgaW5jciBpCgkJfQoJICAgIH0KCX0KCXNldCBub2hzIHt9CglzZXQgcmVpbnMge30KCXNldCBpc2ZhdCBbZXhwciB7W2xsZW5ndGggJGRsaXN0XSA+ICRtYXh3aWR0aH1dCglpZiB7JG5oeXBlcnNwYWNlID4gMCB8fCAkaXNmYXR9IHsKCSAgICBpZiB7JGN0eGVuZCA+ICRufSBicmVhawoJICAgICMgd29yayBvdXQgd2hhdCB0byBicmluZyBiYWNrIGFuZAoJICAgICMgd2hhdCB3ZSB3YW50IHRvIGRvbid0IHdhbnQgdG8gc2VuZCBpbnRvIGh5cGVyc3BhY2UKCSAgICBzZXQgcm9vbSAxCgkgICAgZm9yIHtzZXQgayAkbnVtY29tbWl0c30geyRrIDwgJGN0eGVuZH0ge2luY3Iga30gewoJCXNldCB4IFtsaW5kZXggJGRpc3BsYXlvcmRlciAka10KCQlzZXQgaSBbbGxzZWFyY2ggJGRsaXN0ICR4XQoJCWlmIHskaSA8IDB9IHsKCQkgICAgc2V0IGkgW2xsZW5ndGggJGRsaXN0XQoJCSAgICBsYXBwZW5kIGRsaXN0ICR4CgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHhdIDwgMH0gewoJCSAgICBsYXBwZW5kIG5vaHMgJHgKCQl9CgkJaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHgpIDwgMCAmJiAkcm9vbX0gewoJCSAgICBzZXQgcmVpbnMgW2xpc3QgJHggJGldCgkJfQoJCXNldCBuZXdwIHt9CgkJaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJHgpXX0gewoJCSAgICBzZXQgcmlnaHQgMAoJCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJHgpIHsKCQkJaWYge1tsbHNlYXJjaCAkZGxpc3QgJHBdIDwgMH0gewoJCQkgICAgbGFwcGVuZCBuZXdwICRwCgkJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICRwXSA8IDB9IHsKCQkJCWxhcHBlbmQgbm9ocyAkcAoJCQkgICAgfQoJCQkgICAgaWYgeyRyZWlucyBlcSB7fSAmJiAkb25zY3JlZW4oJHApIDwgMCAmJiAkcm9vbX0gewoJCQkJc2V0IHJlaW5zIFtsaXN0ICRwIFtleHByIHskaSArICRyaWdodH1dXQoJCQkgICAgfQoJCQl9CgkJCXNldCByaWdodCAxCgkJICAgIH0KCQl9CgkJc2V0IGwgW2xpbmRleCAkZGxpc3QgJGldCgkJaWYge1tsbGVuZ3RoICRsXSA9PSAxfSB7CgkJICAgIHNldCBsICRuZXdwCgkJfSBlbHNlIHsKCQkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRsICR4XQoJCSAgICBzZXQgbCBbY29uY2F0IFtscmVwbGFjZSAkbCAkaiAkal0gJG5ld3BdCgkJfQoJCXNldCBkbGlzdCBbbHJlcGxhY2UgJGRsaXN0ICRpICRpICRsXQoJCWlmIHskcm9vbSAmJiAkaXNmYXQgJiYgW2xsZW5ndGggJG5ld3BdIDw9IDF9IHsKCQkgICAgc2V0IHJvb20gMAoJCX0KCSAgICB9Cgl9CgoJc2V0IGRsZXZlbCBbZHJhd3NsYW50cyAkaWQgJHJlaW5zICRub2hzXQoJZHJhd2NvbW1pdGxpbmUgJGRsZXZlbAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGUKCSAgICAmJiAkbnVtY29tbWl0cyA+PSAkbmNtdXBkYXRlfSB7CgkgICAgZG91cGRhdGUgJHJlYWRpbmcKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgl9CiAgICB9Cn0KCiMgbGV2ZWwgaGVyZSBpcyBhbiBpbmRleCBpbiB0b2RvCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvIG5uZXdwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBhcmVudHMgb25zY3JlZW4KCiAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCiAgICBzZXQgb2xkcyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRvbGRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIG9sZHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7ISRub3Nob3J0Y3V0ICYmIFtsbGVuZ3RoICRvbGRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRvbGRzIDBdCglpZiB7JG5jbGVmdCgkcCkgPT0gMSAmJiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdIDwgMH0gewoJICAgIHNldCBuY2xlZnQoJHApIDAKCSAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbCAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAxCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgc2V0IG4gMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCWluY3IgbmNsZWZ0KCRwKSAtMQoJc2V0IGsgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXQoJaWYgeyRrIDwgMH0gewoJICAgIHNldCB0b2RvIFtsaW5zZXJ0ICR0b2RvICRpICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIGluY3IgaQoJICAgIGluY3IgbgoJfQogICAgfQogICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgJG4KCiAgICByZXR1cm4gMQp9Cgpwcm9jIGRlY2lkZW5leHQge3tub3JlYWQgMH19IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICMgY2hvb3NlIHdoaWNoIG9uZSB0byBkbyBuZXh0IHRpbWUgYXJvdW5kCiAgICBzZXQgdG9kb2wgW2xsZW5ndGggJHRvZG9dCiAgICBzZXQgbGV2ZWwgLTEKICAgIHNldCBsYXRlc3Qge30KICAgIGZvciB7c2V0IGsgJHRvZG9sfSB7W2luY3IgayAtMV0gPj0gMH0ge30gewoJc2V0IHAgW2xpbmRleCAkdG9kbyAka10KCWlmIHskbmNsZWZ0KCRwKSA9PSAwfSB7CgkgICAgaWYgeyRkYXRlbW9kZX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJCSAgICBpZiB7JG5vcmVhZH0gewoJCQlyZXR1cm4ge30KCQkgICAgfQoJCSAgICByZWFkY29tbWl0ICRwCgkJfQoJCWlmIHskbGF0ZXN0ID09IHt9IHx8ICRjZGF0ZSgkcCkgPiAkbGF0ZXN0fSB7CgkJICAgIHNldCBsZXZlbCAkawoJCSAgICBzZXQgbGF0ZXN0ICRjZGF0ZSgkcCkKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgbGV2ZWwgJGsKCQlicmVhawoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbGV2ZWwgPCAwfSB7CglpZiB7JHRvZG8gIT0ge319IHsKCSAgICBwdXRzICJFUlJPUjogbm9uZSBvZiB0aGUgcGVuZGluZyBjb21taXRzIGNhbiBiZSBkb25lIHlldDoiCgkgICAgZm9yZWFjaCBwICR0b2RvIHsKCQlwdXRzICIgICRwICgkbmNsZWZ0KCRwKSkiCgkgICAgfQoJfQoJcmV0dXJuIC0xCiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgdG9kbyBuY2hpbGRyZW4gZGF0ZW1vZGUgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIG51bWNvbW1pdHMgbmNtdXBkYXRlIGRpc3BsYXlvcmRlciB0b2RvIG9uc2NyZWVuCgogICAgaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CglzZXQgcGhhc2UgaW5jcmRyYXcKCXNldCBkaXNwbGF5b3JkZXIge30KCXNldCB0b2RvIHt9Cglpbml0Z3JhcGgKICAgIH0KICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCiAgICBpZiB7JGxldmVsID09IHt9IHx8ICRpZCAhPSBbbGluZGV4ICR0b2RvICRsZXZlbF19IHsKCXJldHVybgogICAgfQogICAgd2hpbGUgMSB7CglsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCWlmIHtbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXX0gewoJICAgIHNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJICAgIGlmIHskbGV2ZWwgPT0ge319IGJyZWFrCgl9CglzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV19IHsKCSAgICBicmVhawoJfQogICAgfQogICAgZHJhd21vcmUgMQp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9IGVsc2UgewoJZHJhd3Jlc3QKICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2MgZHJhd2dyYXBoIHt9IHsKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgbmNtdXBkYXRlCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG9uc2NyZWVuCgogICAgaWYgeyRkaXNwbGF5b3JkZXIgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcwoKICAgIHNldCBsZXZlbCBbZGVjaWRlbmV4dF0KICAgIGlmIHskbGV2ZWwgPj0gMH0gewoJc2V0IHBoYXNlIGRyYXdncmFwaAoJd2hpbGUgMSB7CgkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgc2V0IGhhcmQgW3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV0KCSAgICBpZiB7JGhhcmR9IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCgkJaWYgeyRsZXZlbCA8IDB9IGJyZWFrCgkgICAgfQoJfQoJZHJhd21vcmUgMAogICAgfQogICAgc2V0IHBoYXNlIHt9CiAgICBzZXQgZHJhd21zZWNzIFtleHByIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc10KICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCiAgICBpZiB7JHJlZGlzcGxheWluZ30gewoJaWYgeyRzdG9wcGVkID09IDAgJiYgW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCSAgICBzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByICRqKyRmb3VuZHN0cmxlbi0xXV0KCSAgICBzZXQgaSBbZXhwciAkaiArICRmb3VuZHN0cmxlbl0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCgogICAgc3RvcGZpbmRwcm9jCiAgICB1bm1hcmttYXRjaGVzCiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJZmluZHBhdGNoZXMKCXJldHVybgogICAgfQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgaWYgeyRmaW5kbG9jID09ICJGaWxlcyJ9IHsKCWZpbmRmaWxlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnR9CiAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCXNldCBkb2VzbWF0Y2ggMAoJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CgkgICAgaWYgeyRmaW5kbG9jICE9ICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyAhPSAkdHl9IHsKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCgkgICAgaWYgeyRtYXRjaGVzID09IHt9fSBjb250aW51ZQoJICAgIHNldCBkb2VzbWF0Y2ggMQoJICAgIGlmIHskdHkgPT0gIkhlYWRsaW5lIn0gewoJCW1hcmttYXRjaGVzICRjYW52ICRsICRmICRsaW5laHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiQXV0aG9yIn0gewoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRuYW1lZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYzICRsICRmICRsaW5lZHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCSAgICBpZiB7ISRkaWRzZWwgJiYgJGwgPiAkb2xkc2VsfSB7CgkJZmluZHNlbGVjdGxpbmUgJGwKCQlzZXQgZGlkc2VsIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG1hdGNoaW5nbGluZXMgPT0ge319IHsKCWJlbGwKICAgIH0gZWxzZWlmIHshJGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXQogICAgfQp9Cgpwcm9jIGZpbmRzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgZmluZGxvYyBjb21tZW50ZW5kIGN0ZXh0CiAgICBzZWxlY3RsaW5lICRsIDEKICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0gewoJIyBoaWdobGlnaHQgdGhlIG1hdGNoZXMgaW4gdGhlIGNvbW1lbnRzCglzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCglzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCglmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCSAgICBzZXQgZW5kIFtleHByIFtsaW5kZXggJG1hdGNoIDFdICsgMV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2MgZmluZGxvY2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGZpbmRsb2MgZmluZHR5cGUgZmluZHR5cGVtZW51CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglzZXQgZmluZHR5cGUgRXhhY3QKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDEgLXN0YXRlICRzdGF0ZQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMiAtc3RhdGUgJHN0YXRlCn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7Cgl1bnNldCBmaW5kaW5wcm9ncmVzcwoJaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkgICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKCX0KICAgIH0KfQoKcHJvYyBmaW5kcGF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZQogICAgZ2xvYmFsIGZpbmRkaWRzZWwgY3RleHQgbGluZWlkIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZGluc2VydHBvcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICAjIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaWRzIHRvIHNlYXJjaCwgc3RhcnRpbmcgYXQgdGhlIG9uZQogICAgIyBhZnRlciB0aGUgc2VsZWN0ZWQgbGluZSAoaWYgYW55KQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCAkc2VsZWN0ZWRsaW5lCiAgICB9IGVsc2UgewoJc2V0IGwgLTEKICAgIH0KICAgIHNldCBpbnB1dGlkcyB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnVtY29tbWl0c30ge2luY3IgaX0gewoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJYXBwZW5kIGlucHV0aWRzICRsaW5laWQoJGwpICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKfQoKcHJvYyByZWFkZmluZHByb2Mge30gewogICAgZ2xvYmFsIGZpbmRwcm9jZmlsZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgaWRsaW5lIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcwoKICAgIHNldCBuIFtnZXRzICRmaW5kcHJvY2ZpbGUgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRmaW5kcHJvY2ZpbGVdfSB7CgkgICAgc3RvcGZpbmRwcm9jIDEKCSAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgkJYmVsbAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCWVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtZGlmZi10cmVlIG91dHB1dDogJGxpbmUiCglzdG9wZmluZHByb2MKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglwdXRzIHN0ZGVyciAic3B1cmlvdXMgaWQ6ICRpZCIKCXJldHVybgogICAgfQogICAgc2V0IGwgJGlkbGluZSgkaWQpCiAgICBpbnNlcnRtYXRjaCAkbCAkaWQKfQoKcHJvYyBpbnNlcnRtYXRjaCB7bCBpZH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcyBmaW5kZGlkc2VsCgogICAgaWYgeyRmaW5kaW5zZXJ0cG9zID09ICJlbmQifSB7CglpZiB7JG1hdGNoaW5nbGluZXMgIT0ge30gJiYgJGwgPCBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdfSB7CgkgICAgc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgMCAkbF0KCSAgICBzZXQgZmluZGluc2VydHBvcyAxCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJfQogICAgfSBlbHNlIHsKCXNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzICRmaW5kaW5zZXJ0cG9zICRsXQoJaW5jciBmaW5kaW5zZXJ0cG9zCiAgICB9CiAgICBtYXJraGVhZGxpbmUgJGwgJGlkCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSAkbAoJc2V0IGZpbmRkaWRzZWwgMQogICAgfQp9Cgpwcm9jIGZpbmRmaWxlcyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMgbGluZWlkIGN0ZXh0CiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRkaWRzZWwgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzIGZpbmRzdGFydGxpbmUgZmluZGluc2VydHBvcwogICAgZ2xvYmFsIHRyZWVkaWZmcyBmZGlmZmlkcyBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgMX1dCiAgICB9IGVsc2UgewoJc2V0IGwgMAogICAgfQogICAgc2V0IGZmaWxlbGluZSAkbAogICAgc2V0IGZpbmRzdGFydGxpbmUgJGwKICAgIHNldCBkaWZmc25lZWRlZCB7fQogICAgc2V0IGZkaWZmc25lZWRlZCB7fQogICAgd2hpbGUgMSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCQlpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoW2xpc3QgJGlkICRwXSldfSB7CgkJICAgIGFwcGVuZCBkaWZmc25lZWRlZCAiJGlkICRwXG4iCgkJICAgIGxhcHBlbmQgZmRpZmZzbmVlZGVkIFtsaXN0ICRpZCAkcF0KCQl9CgkgICAgfQoJfQoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawogICAgfQoKICAgICMgc3RhcnQgb2ZmIGEgZ2l0LWRpZmYtdHJlZSBwcm9jZXNzIGlmIG5lZWRlZAogICAgaWYgeyRkaWZmc25lZWRlZCBuZSB7fX0gewoJaWYge1tjYXRjaCB7CgkgICAgc2V0IGRmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtLXN0ZGluIDw8ICRkaWZmc25lZWRlZF0gcl0KCX0gZXJyIF19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCgkgICAgcmV0dXJuCgl9CgljYXRjaCB7dW5zZXQgZmRpZmZpZHN9CglzZXQgZmRpZmZwb3MgMAoJZmNvbmZpZ3VyZSAkZGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZGYgcmVhZGFibGUgW2xpc3QgcmVhZGZpbGVkaWZmcyAkZGZdCiAgICB9CgogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAwXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250IFtsaXN0ICRpZCAkcF0KICAgIHVwZGF0ZQp9Cgpwcm9jIHJlYWRmaWxlZGlmZnMge2RmfSB7CiAgICBnbG9iYWwgZmluZGlkcyBmZGlmZmlkcyBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXX0gewoJCXNldCBpZHMgJGZpbmRpZHMKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yIHskaWRzfSIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgXChmcm9tIChbMC05YS1mXXs0MH0pXCl9ICRsaW5lIG1hdGNoIGlkIHBdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IHN0cmluZyBvZiBkaWZmcwoJZG9uZWZpbGVkaWZmCglzZXQgZmRpZmZpZHMgW2xpc3QgJGlkICRwXQoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWRzIGZkaWZmcyB0cmVlZGlmZnMgZmluZGlkcwogICAgZ2xvYmFsIGZkaWZmc25lZWRlZCBmZGlmZnBvcwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmRpZmZpZHNdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWRzCgkgICAgICAgJiYgJGZkaWZmcG9zIDwgW2xsZW5ndGggJGZkaWZmc25lZWRlZF19IHsKCSAgICAjIGdpdC1kaWZmLXRyZWUgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcgZm9yIGEgY29tbWl0CgkgICAgIyB3aGljaCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwoJICAgIHNldCBudWxsaWRzIFtsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdCgkgICAgc2V0IHRyZWVkaWZmcygkbnVsbGlkcykge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRudWxsaWRzIGVxICRmaW5kaWRzfSB7CgkJdW5zZXQgZmluZGlkcwoJCWZpbmRjb250ICRudWxsaWRzCgkgICAgfQoJICAgIGluY3IgZmRpZmZwb3MKCX0KCWluY3IgZmRpZmZwb3MKCglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGZkaWZmaWRzKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkcykgJGZkaWZmcwoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkZmRpZmZpZHMgZXEgJGZpbmRpZHN9IHsKCSAgICB1bnNldCBmaW5kaWRzCgkgICAgZmluZGNvbnQgJGZkaWZmaWRzCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkc30gewogICAgZ2xvYmFsIGZpbmRpZHMgdHJlZWRpZmZzIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZHN0YXJ0bGluZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMgbWF0Y2hpbmdsaW5lcyBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgcGkgW2xzZWFyY2ggLWV4YWN0ICRwYXJlbnRzKCRpZCkgJHBdCiAgICBzZXQgbCAkZmZpbGVsaW5lCiAgICB3aGlsZSAxIHsKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCQlzZXQgZmluZGlkcyAkaWRzCgkJc2V0IGZmaWxlbGluZSAkbAoJCXJldHVybgoJICAgIH0KCSAgICBzZXQgZG9lc21hdGNoIDAKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkJc2V0IHggW2ZpbmRtYXRjaGVzICRmXQoJCWlmIHskeCAhPSB7fX0gewoJCSAgICBzZXQgZG9lc21hdGNoIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGlmIHskZG9lc21hdGNofSB7CgkJaW5zZXJ0bWF0Y2ggJGwgJGlkCgkJc2V0IHBpICRucGFyZW50cygkaWQpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCX0KCWlmIHtbaW5jciBwaV0gPj0gJG5wYXJlbnRzKCRpZCl9IHsKCSAgICBzZXQgcGkgMAoJICAgIGlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJCXNldCBsIDAKCSAgICB9CgkgICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawoJICAgIHNldCBpZCAkbGluZWlkKCRsKQoJfQoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwaV0KCXNldCBpZHMgW2xpc3QgJGlkICRwXQogICAgfQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgliZWxsCiAgICB9Cn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZyBjb21taXRpbmZvCgogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkc3RhcnQtMV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciAkZW5kXV1dCglzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgJHgwKyR4b2ZmXSAkeTAgW2V4cHIgJHgwKyR4bGVuKzJdICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKSIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0fSB7CiAgICBnbG9iYWwgY3RleHQgaWRsaW5lIGxpbmtudW0KCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gW2xpc3Qgc2VsZWN0bGluZSAkaWRsaW5lKCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4KICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGlkbGluZSBsaW5rbnVtCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laWQoJGwpXSB8fCAhW2luZm8gZXhpc3RzIGxpbmVodGFnKCRsKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52IGxvd2VyICR0CiAgICAkY2FudjIgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MiBsb3dlciAkdAogICAgJGNhbnYzIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MyBjcmVhdGUgcmVjdCBbJGNhbnYzIGJib3ggJGxpbmVkdGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjMgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjMgbG93ZXIgJHQKICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIFtsaW5kZXggJHdub3cgMF0gKiAkeW1heF0KICAgIHNldCB3Ym90IFtleHByIFtsaW5kZXggJHdub3cgMV0gKiAkeW1heF0KICAgIHNldCB3aCBbZXhwciB7JHdib3QgLSAkd3RvcH1dCiAgICBzZXQgbmV3dG9wICR3dG9wCiAgICBpZiB7JHl0b3AgPCAkd3RvcH0gewoJaWYgeyR5Ym90IDwgJHd0b3B9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgJHl0b3AKCSAgICBpZiB7JG5ld3RvcCA+ICR3dG9wIC0gJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCAtICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9IGVsc2VpZiB7JHlib3QgPiAkd2JvdH0gewoJaWYgeyR5dG9wID4gJHdib3R9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5Ym90IC0gJHdofV0KCSAgICBpZiB7JG5ld3RvcCA8ICR3dG9wICsgJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG5ld3RvcCAhPSAkd3RvcH0gewoJaWYgeyRuZXd0b3AgPCAwfSB7CgkgICAgc2V0IG5ld3RvcCAwCgl9CglhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgJG5ld3RvcCAqIDEuMCAvICR5bWF4XQogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzZWxlY3RsaW5lICRsIDBdCiAgICB9CgogICAgc2V0IHNlbGVjdGVkbGluZSAkbAoKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IGN1cnJlbnRpZCAkaWQKICAgICRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICAkc2hhMWVudHJ5IGluc2VydCAwICRpZAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gZnJvbSAwCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiB0byBlbmQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgIHNldCBsaW5rbnVtIDAKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gIFtsaW5kZXggJGluZm8gMl1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gIFtsaW5kZXggJGluZm8gNF1cbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGNvbW1lbnQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGFwcGVuZCBjb21tZW50ICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF1cbiIKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCWZvcmVhY2ggYyAkY2hpbGRyZW4oJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXVxuIgoJfQogICAgfQogICAgYXBwZW5kIGNvbW1lbnQgIlxuIgogICAgYXBwZW5kIGNvbW1lbnQgW2xpbmRleCAkaW5mbyA1XQoKICAgICMgbWFrZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBTSEExIElEIGJlIGEgY2xpY2thYmxlIGxpbmsKICAgIGFwcGVuZHdpdGhsaW5rcyAkY29tbWVudAoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJDb21tZW50cyIKICAgIGlmIHskbnBhcmVudHMoJGlkKSA9PSAxfSB7CglzdGFydGRpZmYgW2NvbmNhdCAkaWQgJHBhcmVudHMoJGlkKV0KICAgIH0gZWxzZWlmIHskbnBhcmVudHMoJGlkKSA+IDF9IHsKCW1lcmdlZGlmZiAkaWQKICAgIH0KfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByICRzZWxlY3RlZGxpbmUgKyAkZGlyXQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRjbWR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGNtZF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGNtZAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnb2Zvcncge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQoJaW5jciBoaXN0b3J5aW5kZXgKCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgbWVyZ2VkaWZmIHtpZH0gewogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm1lcmdlZ2NhIG1lcmdlZmlsZWxpc3QgZGlmZnBpbmRleAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmcGluZGV4IC0xCiAgICBzZXQgZGlmZm1lcmdlZ2NhIFtmaW5kZ2NhICRwYXJlbnRzKCRpZCldCiAgICBpZiB7W2luZm8gZXhpc3RzIG1lcmdlZmlsZWxpc3QoJGlkKV19IHsKCWlmIHskbWVyZ2VmaWxlbGlzdCgkaWQpIG5lIHt9fSB7CgkgICAgc2hvd21lcmdlZGlmZgoJfQogICAgfSBlbHNlIHsKCWNvbnRtZXJnZWRpZmYge30KICAgIH0KfQoKcHJvYyBmaW5kZ2NhIHtpZHN9IHsKICAgIHNldCBnY2Ege30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7JGdjYSBlcSB7fX0gewoJICAgIHNldCBnY2EgJGlkCgl9IGVsc2UgewoJICAgIGlmIHtbY2F0Y2ggewoJCXNldCBnY2EgW2V4ZWMgZ2l0LW1lcmdlLWJhc2UgJGdjYSAkaWRdCgkgICAgfSBlcnJdfSB7CgkJcmV0dXJuIHt9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRnY2EKfQoKcHJvYyBjb250bWVyZ2VkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmcGluZGV4IHBhcmVudHMgbnBhcmVudHMgZGlmZm1lcmdlZ2NhCiAgICBnbG9iYWwgdHJlZWRpZmZzIG1lcmdlZmlsZWxpc3QgZGlmZmlkcyB0cmVlcGVuZGluZwoKICAgICMgZGlmZiB0aGUgY2hpbGQgYWdhaW5zdCBlYWNoIG9mIHRoZSBwYXJlbnRzLCBhbmQgZGlmZgogICAgIyBlYWNoIG9mIHRoZSBwYXJlbnRzIGFnYWluc3QgdGhlIEdDQS4KICAgIHdoaWxlIDEgewoJaWYge1tsaW5kZXggJGlkcyAwXSA9PSAkZGlmZm1lcmdlaWQgJiYgJGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJICAgIHNldCBpZHMgW2xpc3QgW2xpbmRleCAkaWRzIDFdICRkaWZmbWVyZ2VnY2FdCgl9IGVsc2UgewoJICAgIGlmIHtbaW5jciBkaWZmcGluZGV4XSA+PSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKX0gYnJlYWsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGRpZmZwaW5kZXhdCgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgl9CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkgICAgc2V0IGRpZmZpZHMgJGlkcwoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJCWdldHRyZWVkaWZmcyAkaWRzCgkgICAgfQoJICAgIHJldHVybgoJfQogICAgfQoKICAgICMgSWYgYSBmaWxlIGluIHNvbWUgcGFyZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBhbmQgYWxzbwogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgR0NBLCB0aGVuIGl0J3MgaW50ZXJlc3RpbmcuCiAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBHQ0EsIHRoZW4gYSBmaWxlIGlzIGludGVyZXN0aW5nIGlmIGl0IGlzCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBpbiBhbGwgdGhlIHBhcmVudHMuCiAgICBpZiB7JGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJc2V0IGZpbGVzIHt9Cglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGdjYWRpZmZzICR0cmVlZGlmZnMoW2xpc3QgJHAgJGRpZmZtZXJnZWdjYV0pCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGZpbGVzICRmXSA8IDAKCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRnY2FkaWZmcyAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIGZpbGVzICRmCgkJfQoJICAgIH0KCX0KCXNldCBmaWxlcyBbbHNvcnQgJGZpbGVzXQogICAgfSBlbHNlIHsKCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAwXQoJc2V0IGZpbGVzICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCWZvciB7c2V0IGkgMX0geyRpIDwgJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJiYgJGZpbGVzIG5lIHt9fSB7aW5jciBpfSB7CgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpICRpXQoJICAgIHNldCBkZiAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0pCgkgICAgc2V0IG5mIHt9CgkgICAgZm9yZWFjaCBmICRmaWxlcyB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZGYgJGZdID49IDB9IHsKCQkgICAgbGFwcGVuZCBuZiAkZgoJCX0KCSAgICB9CgkgICAgc2V0IGZpbGVzICRuZgoJfQogICAgfQoKICAgIHNldCBtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZpbGVzCiAgICBpZiB7JGZpbGVzIG5lIHt9fSB7CglzaG93bWVyZ2VkaWZmCiAgICB9Cn0KCnByb2Mgc2hvd21lcmdlZGlmZiB7fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGRpZmZtZXJnZWlkIG1lcmdlZmlsZWxpc3QgcGFyZW50cwogICAgZ2xvYmFsIGRpZmZvcHRzIGRpZmZpbmh1bmsgY3VycmVudGZpbGUgY3VycmVudGh1bmsgZmlsZWxpbmVzCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgZ3JvdXBmaWxlbGFzdCBtZXJnZWZkcyBncm91cGZpbGVudW0gZ3JvdXBodW5rcwoKICAgIHNldCBmaWxlcyAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBmbGlzdCB7fQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRmaWxlfQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRodW5rfQogICAgY2F0Y2gge3Vuc2V0IGZpbGVsaW5lc30KICAgIGNhdGNoIHt1bnNldCBncm91cGZpbGVudW19CiAgICBjYXRjaCB7dW5zZXQgZ3JvdXBodW5rc30KICAgIHNldCBncm91cGZpbGVsYXN0IC0xCiAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CglzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtcCAkcCAkZGlmZm1lcmdlaWRdCglzZXQgY21kIFtjb25jYXQgJGNtZCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQoJaWYge1tjYXRjaCB7c2V0IGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJICAgIGZvcmVhY2ggZiAkZmxpc3QgewoJCWNhdGNoIHtjbG9zZSAkZn0KCSAgICB9CgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGZsaXN0ICRmCglzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCXNldCBtZXJnZWZkcygkaWRzKSAkZgoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCWZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRmICRpZHMgJGRpZmZtZXJnZWlkXQogICAgfQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge2YgaWRzIGlkfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZmluaHVuayBkaWZmb2xkbGluZXMgZGlmZm5ld2xpbmVzCiAgICBnbG9iYWwgY3VycmVudGZpbGUgY3VycmVudGh1bmsKICAgIGdsb2JhbCBkaWZmb2xkc3RhcnQgZGlmZm5ld3N0YXJ0IGRpZmZvbGRsbm8gZGlmZm5ld2xubwogICAgZ2xvYmFsIGRpZmZibG9ja2VkIG1lcmdlZmlsZWxpc3QKICAgIGdsb2JhbCBub2xkbGluZXMgbm5ld2xpbmVzIGRpZmZsY291bnRzIGZpbGVsaW5lcwoKICAgIHNldCBuIFtnZXRzICRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGZdfSByZXR1cm4KICAgIH0KCiAgICBpZiB7IShbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdICYmICRkaWZmbWVyZ2VpZCA9PSAkaWQpfSB7CglpZiB7JG4gPCAwfSB7CgkgICAgY2xvc2UgJGYKCX0KCXJldHVybgogICAgfQoKICAgIGlmIHskZGlmZmluaHVuaygkaWRzKSAhPSAwfSB7CglzZXQgZmkgJGN1cnJlbnRmaWxlKCRpZHMpCglpZiB7JG4gPiAwICYmIFtyZWdleHAge15bLSsgXFxdfSAkbGluZSBtYXRjaF19IHsKCSAgICAjIGNvbnRpbnVpbmcgYW4gZXhpc3RpbmcgaHVuawoJICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCgkgICAgaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIgIn0gewoJCXNldCBmaWxlbGluZXMoJHAsJGZpLCRkaWZmb2xkbG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm9sZGxubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIrIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkaWQsJGZpLCRkaWZmbmV3bG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm5ld2xubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIgIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgXAoJCQlbbGlzdCAkbm9sZGxpbmVzKCRpZHMpICRubmV3bGluZXMoJGlkcyldCgkJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkJfQoJCWluY3Igbm9sZGxpbmVzKCRpZHMpCgkgICAgfSBlbHNlaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIrIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBubmV3bGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAyCgkJfQoJCWlmIHskbWF0Y2ggZXEgIi0ifSB7CgkJICAgIGluY3Igbm9sZGxpbmVzKCRpZHMpCgkJfSBlbHNlIHsKCQkgICAgaW5jciBubmV3bGluZXMoJGlkcykKCQl9CgkgICAgfQoJICAgICMgYW5kIGlmIGl0J3MgXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBsaW5lLCB0aGVuIHdoYXQ/CgkgICAgcmV0dXJuCgl9CgkjIGVuZCBvZiBhIGh1bmsKCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxICYmICRub2xkbGluZXMoJGlkcykgIT0gMH0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCX0gZWxzZWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyCgkJICAmJiAoJG5vbGRsaW5lcygkaWRzKSAhPSAwIHx8ICRubmV3bGluZXMoJGlkcykgIT0gMCl9IHsKCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCX0KCXNldCBjdXJyZW50aHVuaygkaWRzKSBbbGlzdCAkY3VycmVudGZpbGUoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRzdGFydCgkaWRzKSAkZGlmZm5ld3N0YXJ0KCRpZHMpIFwKCQkJCSAgICRkaWZmb2xkbG5vKCRpZHMpICRkaWZmbmV3bG5vKCRpZHMpIFwKCQkJCSAgICRkaWZmbGNvdW50cygkaWRzKV0KCXNldCBkaWZmaW5odW5rKCRpZHMpIDAKCSMgLTEgPSBuZWVkIHRvIGJsb2NrLCAwID0gdW5ibG9ja2VkLCAxID0gaXMgYmxvY2tlZAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIC0xCglwcm9jZXNzaHVua3MKCWlmIHskZGlmZmJsb2NrZWQoJGlkcykgPT0gLTF9IHsKCSAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUge30KCSAgICBzZXQgZGlmZmJsb2NrZWQoJGlkcykgMQoJfQogICAgfQoKICAgIGlmIHskbiA8IDB9IHsKCSMgZW9mCglpZiB7ISRkaWZmYmxvY2tlZCgkaWRzKX0gewoJICAgIGNsb3NlICRmCgkgICAgc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFtsbGVuZ3RoICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCgkgICAgc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSAwIDAgMCAwIHt9XQoJICAgIHByb2Nlc3NodW5rcwoJfQogICAgfSBlbHNlaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCXNldCBjdXJyZW50ZmlsZSgkaWRzKSBcCgkgICAgW2xzZWFyY2ggLWV4YWN0ICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZuYW1lXQogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHtbaW5mbyBleGlzdHMgY3VycmVudGZpbGUoJGlkcyldICYmICRjdXJyZW50ZmlsZSgkaWRzKSA+PSAwfSB7CgkgICAgIyBzdGFydCBvZiBhIG5ldyBodW5rCgkgICAgaWYgeyRmMWwgPT0gMCAmJiAkZjFjID09IDB9IHsKCQlzZXQgZjFsIDEKCSAgICB9CgkgICAgaWYgeyRmMmwgPT0gMCAmJiAkZjJjID09IDB9IHsKCQlzZXQgZjJsIDEKCSAgICB9CgkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMQoJICAgIHNldCBkaWZmb2xkc3RhcnQoJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3c3RhcnQoJGlkcykgJGYybAoJICAgIHNldCBkaWZmb2xkbG5vKCRpZHMpICRmMWwKCSAgICBzZXQgZGlmZm5ld2xubygkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZsY291bnRzKCRpZHMpIHt9CgkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgl9CiAgICB9Cn0KCnByb2MgcHJvY2Vzc2h1bmtzIHt9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIG5wYXJlbnRzIGN1cnJlbnRodW5rCiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmYmxvY2tlZCBtZXJnZWZkcwogICAgZ2xvYmFsIGdyb3VwaHVua3MgZ3JvdXBsaW5lc3RhcnQgZ3JvdXBsaW5lZW5kIGdyb3VwZmlsZW51bQoKICAgIHNldCBuZmlsZXMgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KICAgIHdoaWxlIDEgewoJc2V0IGZpICRuZmlsZXMKCXNldCBsbm8gMAoJIyBsb29rIGZvciB0aGUgZWFybGllc3QgaHVuawoJZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJICAgIHNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRodW5rKCRpZHMpXX0gcmV0dXJuCgkgICAgc2V0IGkgW2xpbmRleCAkY3VycmVudGh1bmsoJGlkcykgMF0KCSAgICBzZXQgbCBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAyXQoJICAgIGlmIHskaSA8ICRmaSB8fCAoJGkgPT0gJGZpICYmICRsIDwgJGxubyl9IHsKCQlzZXQgZmkgJGkKCQlzZXQgbG5vICRsCgkJc2V0IHBpICRwCgkgICAgfQoJfQoKCWlmIHskZmkgPCAkbmZpbGVzfSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBpXQoJICAgIHNldCBodW5rICRjdXJyZW50aHVuaygkaWRzKQoJICAgIHVuc2V0IGN1cnJlbnRodW5rKCRpZHMpCgkgICAgaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA+IDB9IHsKCQlmaWxlZXZlbnQgJG1lcmdlZmRzKCRpZHMpIHJlYWRhYmxlIFwKCQkgICAgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWVyZ2VmZHMoJGlkcykgJGlkcyAkZGlmZm1lcmdlaWRdCgkgICAgfQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAwCgoJICAgIGlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXSAmJiAkZ3JvdXBmaWxlbnVtID09ICRmaQoJCSYmICRsbm8gPD0gJGdyb3VwbGluZWVuZH0gewoJCSMgYWRkIHRoaXMgaHVuayB0byB0aGUgcGVuZGluZyBncm91cAoJCWxhcHBlbmQgZ3JvdXBodW5rcygkcGkpICRodW5rCgkJc2V0IGVuZGxuIFtsaW5kZXggJGh1bmsgNF0KCQlpZiB7JGVuZGxuID4gJGdyb3VwbGluZWVuZH0gewoJCSAgICBzZXQgZ3JvdXBsaW5lZW5kICRlbmRsbgoJCX0KCQljb250aW51ZQoJICAgIH0KCX0KCgkjIHN1Y2NlZWRpbmcgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBncm91cCwgc28KCSMgcHJvY2VzcyB0aGUgZ3JvdXAgbm93CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwZmlsZW51bV19IHsKCSAgICBwcm9jZXNzZ3JvdXAKCSAgICB1bnNldCBncm91cGZpbGVudW0KCSAgICB1bnNldCBncm91cGh1bmtzCgl9CgoJaWYgeyRmaSA+PSAkbmZpbGVzfSBicmVhawoKCSMgc3RhcnQgYSBuZXcgZ3JvdXAKCXNldCBncm91cGZpbGVudW0gJGZpCglzZXQgZ3JvdXBodW5rcygkcGkpIFtsaXN0ICRodW5rXQoJc2V0IGdyb3VwbGluZXN0YXJ0ICRsbm8KCXNldCBncm91cGxpbmVlbmQgW2xpbmRleCAkaHVuayA0XQogICAgfQp9Cgpwcm9jIHByb2Nlc3Nncm91cCB7fSB7CiAgICBnbG9iYWwgZ3JvdXBmaWxlbGFzdCBncm91cGZpbGVudW0gZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG1lcmdlZmlsZWxpc3QgZGlmZm1lcmdlaWQgY3RleHQgZmlsZWxpbmVzCiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmb2Zmc2V0CiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgbnBhcmVudHMKICAgIGdsb2JhbCBtZXJnZW1heAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBmICRncm91cGZpbGVudW0KICAgIGlmIHskZ3JvdXBmaWxlbGFzdCAhPSAkZn0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGYpICRoZXJlCglzZXQgbWFyayBmbWFyay5bZXhwciB7JGYgKyAxfV0KCSRjdGV4dCBtYXJrIHNldCAkbWFyayAkaGVyZQoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSAkbWFyayBsZWZ0CglzZXQgaGVhZGVyIFtsaW5kZXggJG1lcmdlZmlsZWxpc3QoJGlkKSAkZl0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZ3JvdXBmaWxlbGFzdCAkZgoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIHNldCBkaWZmb2Zmc2V0KCRwKSAwCgl9CiAgICB9CgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkBAIiBtc2VwCiAgICBzZXQgbmxpbmVzIFtleHByIHskZ3JvdXBsaW5lZW5kIC0gJGdyb3VwbGluZXN0YXJ0fV0KICAgIHNldCBldmVudHMge30KICAgIHNldCBwbnVtIDAKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCXNldCBzdGFydGxpbmUgW2V4cHIgeyRncm91cGxpbmVzdGFydCArICRkaWZmb2Zmc2V0KCRwKX1dCglzZXQgb2wgJHN0YXJ0bGluZQoJc2V0IG5sICRncm91cGxpbmVzdGFydAoJaWYge1tpbmZvIGV4aXN0cyBncm91cGh1bmtzKCRwKV19IHsKCSAgICBmb3JlYWNoIGggJGdyb3VwaHVua3MoJHApIHsKCQlzZXQgbCBbbGluZGV4ICRoIDJdCgkJaWYgeyRubCA8ICRsfSB7CgkJICAgIGZvciB7fSB7JG5sIDwgJGx9IHtpbmNyIG5sfSB7CgkJCXNldCBmaWxlbGluZXMoJHAsJGYsJG9sKSAkZmlsZWxpbmVzKCRpZCwkZiwkbmwpCgkJCWluY3Igb2wKCQkgICAgfQoJCX0KCQlmb3JlYWNoIGNodW5rIFtsaW5kZXggJGggNV0gewoJCSAgICBpZiB7W2xsZW5ndGggJGNodW5rXSA9PSAyfSB7CgkJCXNldCBvbGMgW2xpbmRleCAkY2h1bmsgMF0KCQkJc2V0IG5sYyBbbGluZGV4ICRjaHVuayAxXQoJCQlzZXQgbm5sIFtleHByIHskbmwgKyAkbmxjfV0KCQkJbGFwcGVuZCBldmVudHMgW2xpc3QgJG5sICRubmwgJHBudW0gJG9sYyAkbmxjXQoJCQlpbmNyIG9sICRvbGMKCQkJc2V0IG5sICRubmwKCQkgICAgfSBlbHNlIHsKCQkJaW5jciBvbCBbbGluZGV4ICRjaHVuayAwXQoJCQlpbmNyIG5sIFtsaW5kZXggJGNodW5rIDBdCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJaWYgeyRubCA8ICRncm91cGxpbmVlbmR9IHsKCSAgICBmb3Ige30geyRubCA8ICRncm91cGxpbmVlbmR9IHtpbmNyIG5sfSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQlpbmNyIG9sCgkgICAgfQoJfQoJc2V0IG5saW5lcyBbZXhwciB7JG9sIC0gJHN0YXJ0bGluZX1dCgkkY3RleHQgaW5zZXJ0IGVuZCAiIC0kc3RhcnRsaW5lLCRubGluZXMiIG1zZXAKCWluY3IgcG51bQogICAgfQoKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIiArJGdyb3VwbGluZXN0YXJ0LCRubGluZXMgQEBcbiIgbXNlcAoKICAgIHNldCBldmVudHMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRldmVudHNdCiAgICBzZXQgbmV2ZW50cyBbbGxlbmd0aCAkZXZlbnRzXQogICAgc2V0IG5tZXJnZSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKQogICAgc2V0IGwgJGdyb3VwbGluZXN0YXJ0CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRuZXZlbnRzfSB7c2V0IGkgJGp9IHsKCXNldCBubCBbbGluZGV4ICRldmVudHMgJGkgMF0KCXdoaWxlIHskbCA8ICRubH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCgkgICAgaW5jciBsCgl9CglzZXQgZSBbbGluZGV4ICRldmVudHMgJGldCglzZXQgZW5sIFtsaW5kZXggJGUgMV0KCXNldCBqICRpCglzZXQgYWN0aXZlIHt9Cgl3aGlsZSAxIHsKCSAgICBzZXQgcG51bSBbbGluZGV4ICRlIDJdCgkgICAgc2V0IG9sYyBbbGluZGV4ICRlIDNdCgkgICAgc2V0IG5sYyBbbGluZGV4ICRlIDRdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCXNldCBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCQlsYXBwZW5kIGFjdGl2ZSAkcG51bQoJICAgIH0gZWxzZSB7CgkJaW5jciBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCSAgICB9CgkgICAgaWYge1tpbmNyIGpdID49ICRuZXZlbnRzfSBicmVhawoJICAgIHNldCBlIFtsaW5kZXggJGV2ZW50cyAkal0KCSAgICBpZiB7W2xpbmRleCAkZSAwXSA+PSAkZW5sfSBicmVhawoJICAgIGlmIHtbbGluZGV4ICRlIDFdID4gJGVubH0gewoJCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJICAgIH0KCX0KCXNldCBubGMgW2V4cHIgeyRlbmwgLSAkbH1dCglzZXQgbmNvbCBtcmVzdWx0CglzZXQgYmVzdHBuIC0xCglpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZSAtIDF9IHsKCSAgICAjIG5vIGRpZmYgZm9yIG9uZSBvZiB0aGUgcGFyZW50cywgaS5lLiBpdCdzIGlkZW50aWNhbAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV19IHsKCQkgICAgaWYgeyRwbnVtIDwgJG1lcmdlbWF4fSB7CgkJCWxhcHBlbmQgbmNvbCBtJHBudW0KCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBuY29sIG1tYXgKCQkgICAgfQoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZX0gewoJICAgICMgYWxsIHBhcmVudHMgYXJlIGRpZmZlcmVudCwgc2VlIGlmIG9uZSBpcyB2ZXJ5IHNpbWlsYXIKCSAgICBzZXQgYmVzdHNpbSAzMAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCXNldCBzaW0gW3NpbWlsYXJpdHkgJHBudW0gJGwgJG5sYyAkZiBcCgkJCSAgICAgW2xyYW5nZSAkZXZlbnRzICRpIFtleHByIHskai0xfV1dXQoJCWlmIHskc2ltID4gJGJlc3RzaW19IHsKCQkgICAgc2V0IGJlc3RzaW0gJHNpbQoJCSAgICBzZXQgYmVzdHBuICRwbnVtCgkJfQoJICAgIH0KCSAgICBpZiB7JGJlc3RwbiA+PSAwfSB7CgkJbGFwcGVuZCBuY29sIG0kYmVzdHBuCgkgICAgfQoJfQoJc2V0IHBudW0gLTEKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpbmNyIHBudW0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldIHx8ICRwbnVtID09ICRiZXN0cG59IGNvbnRpbnVlCgkgICAgc2V0IG9sYyBbZXhwciB7JG5sYyArICRkZWx0YSgkcG51bSl9XQoJICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQoJICAgIGluY3IgZGlmZm9mZnNldCgkcCkgJGRlbHRhKCRwbnVtKQoJICAgIHVuc2V0IGRlbHRhKCRwbnVtKQoJICAgIGZvciB7fSB7JG9sYyA+IDB9IHtpbmNyIG9sYyAtMX0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kcG51bQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KCWlmIHskYmVzdHBuID49IDB9IHsKCSAgICAjIHNob3cgdGhpcyBwcmV0dHkgbXVjaCBhcyBhIG5vcm1hbCBkaWZmCgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRiZXN0cG5dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJGJlc3RwbikKCSAgICB1bnNldCBkZWx0YSgkYmVzdHBuKQoJICAgIGZvciB7c2V0IGsgJGl9IHskayA8ICRqfSB7aW5jciBrfSB7CgkJc2V0IGUgW2xpbmRleCAkZXZlbnRzICRrXQoJCWlmIHtbbGluZGV4ICRlIDJdICE9ICRiZXN0cG59IGNvbnRpbnVlCgkJc2V0IG5sIFtsaW5kZXggJGUgMF0KCQlzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgkJfQoJCXNldCBjIFtsaW5kZXggJGUgM10KCQlmb3Ige30geyRjID4gMH0ge2luY3IgYyAtMX0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiLSRmaWxlbGluZXMoJHAsJGYsJG9sKVxuIiBtJGJlc3RwbgoJCSAgICBpbmNyIG9sCgkJfQoJCXNldCBubCBbbGluZGV4ICRlIDFdCgkJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiBtcmVzdWx0CgkJfQoJICAgIH0KCX0KCWZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgl9CiAgICB9CiAgICB3aGlsZSB7JGwgPCAkZ3JvdXBsaW5lZW5kfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiICRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIgoJaW5jciBsCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzaW1pbGFyaXR5IHtwbnVtIGwgbmxjIGYgZXZlbnRzfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgcGFyZW50cyBkaWZmb2Zmc2V0IGZpbGVsaW5lcwoKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcG51bV0KICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQogICAgc2V0IGVuZGwgW2V4cHIgeyRsICsgJG5sY31dCiAgICBzZXQgc2FtZSAwCiAgICBzZXQgZGlmZiAwCiAgICBmb3JlYWNoIGUgJGV2ZW50cyB7CglpZiB7W2xpbmRleCAkZSAyXSAhPSAkcG51bX0gY29udGludWUKCXNldCBubCBbbGluZGV4ICRlIDBdCglzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3Igc2FtZQoJfQoJc2V0IG9jIFtsaW5kZXggJGUgM10KCWZvciB7fSB7JG9jID4gMH0ge2luY3Igb2MgLTF9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkcCwkZiwkb2wpXQoJICAgIGluY3IgZGlmZgoJICAgIGluY3Igb2wKCX0KCXNldCBubCBbbGluZGV4ICRlIDFdCglmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkgICAgaW5jciBkaWZmIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCSAgICBpbmNyIGRpZmYKCX0KICAgIH0KICAgIGZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJaW5jciBzYW1lIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCWluY3Igc2FtZQogICAgfQogICAgaWYgeyRzYW1lID09IDB9IHsKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgezIwMCAqICRzYW1lIC8gKDIgKiAkc2FtZSArICRkaWZmKX1dCn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CiAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiBwYXJlbnRzIHRyZWVwZW5kaW5nCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRwICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtcCAtQyAkcCAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwogICAgZ2xvYmFsIGdhdWR5ZGlmZgoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGhlYWRlciAkbmV3bmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkgICAgaW5jciBpCgkgICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkgICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0Cgl9CglpZiB7JG5ld25hbWUgIT0gJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRuZXduYW1lXQoJICAgIGlmIHskaSA+PSAwfSB7CgkJc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkJaW5jciBpCgkJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteKC0tLXxcK1wrXCspfSAkbGluZV19IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHskZ2F1ZHlkaWZmfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0IiBodW5rc2VwCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAgICAkZjFsICAgICIgZDAgIiAgICAkZjJsICAgICIgZDEKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRyZXN0IFxuIiBodW5rc2VwCgl9IGVsc2UgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgl9CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICBpZiB7JGdhdWR5ZGlmZn0gewoJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCiAgICBzZXQgY2FudngwIFtleHByIDMgKyAwLjUgKiAkbGluZXNwY10KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHBoYXNlCiAgICBpZiB7JHN0b3BwZWQgPiAxfSByZXR1cm4KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSByZXR1cm4KICAgIHNldCByZWRpc3BsYXlpbmcgMQogICAgaWYgeyRwaGFzZSA9PSAiZHJhd2dyYXBoIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJc2V0IHN0b3BwZWQgMQogICAgfSBlbHNlIHsKCWRyYXdncmFwaAogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IG5hbWVmb250IFtscmVwbGFjZSAkbmFtZWZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRuYW1lZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGlkbGluZSB0YWdpZHMKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGxpbmVpZCgkbCldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkbGluZWlkKCRsKQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWciCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNmbGlzdCBjYW52CgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR4ICRpZCAwXQogICAgfQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHRbbGluZGV4ICRpbmZvIDJdXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICBpbmNyIGkKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0W2xpbmRleCAkaW5mbyAyXVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGlkbGluZQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBpZGxpbmUgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgJGlkbGluZSgkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAyIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgbGluZWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQogICAgfQogICAgYWRkdG9oaXN0b3J5IFtsaXN0IGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkXQogICAgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWQKfQoKcHJvYyBkb3NlbGRpZmYge29sZGlkIG5ld2lkfSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiVG9wIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkZyb20gIgogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRvbGRpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazEgPDE+IFtsaXN0IHNlbGJ5aWQgJG5ld2lkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG5ld2lkIFtsaXN0IGxpbmsgbGluazFdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRuZXdpZCAkb2xkaWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0LWRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgcmVkcmF3dGFncyAkaWQKfQoKcHJvYyByZWRyYXd0YWdzIHtpZH0gewogICAgZ2xvYmFsIGNhbnYgbGluZWh0YWcgaWRsaW5lIGlkcG9zIHNlbGVjdGVkbGluZQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGlkbGluZSgkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPT0gJGlkbGluZSgkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIGxpc3RyZWZzIHtpZH0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCgogICAgc2V0IHgge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgeCAkaWR0YWdzKCRpZCkKICAgIH0KICAgIHNldCB5IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCB5ICRpZGhlYWRzKCRpZCkKICAgIH0KICAgIHNldCB6IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR4ICR5ICR6XQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgdGFnaWRzIGhlYWRpZHMgb3RoZXJyZWZpZHMKCiAgICBzZXQgcmVmaWRzIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCSAgICBbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV19IHsKCSAgICBzZXQgcmVmKCRpZCkgW2xpc3RyZWZzICRpZF0KCX0KICAgIH0KICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHJlYWRyZWZzCiAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglzZXQgdiBbbGlzdHJlZnMgJGlkXQoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdn0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtCgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBib2xkbmFtZXMgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCBmaW5kbWVyZ2VmaWxlcyAwCnNldCBnYXVkeWRpZmYgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCnNldCBuYW1lZm9udCAkbWFpbmZvbnQKaWYgeyRib2xkbmFtZXN9IHsKICAgIGxhcHBlbmQgbmFtZWZvbnQgYm9sZAp9CgpzZXQgcmV2dHJlZWFyZ3Mge30KZm9yZWFjaCBhcmcgJGFyZ3YgewogICAgc3dpdGNoIC1yZWdleHAgLS0gJGFyZyB7CgkiXiQiIHsgfQoJIl4tYiIgeyBzZXQgYm9sZG5hbWVzIDEgfQoJIl4tZCIgeyBzZXQgZGF0ZW1vZGUgMSB9CglkZWZhdWx0IHsKCSAgICBsYXBwZW5kIHJldnRyZWVhcmdzICRhcmcKCX0KICAgIH0KfQoKc2V0IGhpc3Rvcnkge30Kc2V0IGhpc3RvcnlpbmRleCAwCgpzZXQgc3RvcHBlZCAwCnNldCByZWRpc3BsYXlpbmcgMApzZXQgc3R1ZmZzYXZlZCAwCnNldCBwYXRjaG51bSAwCnNldGNvb3JkcwptYWtld2luZG93CnJlYWRyZWZzCmdldGNvbW1pdHMgJHJldnRyZWVhcmdzCg==