IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9Cgpwcm9jIHN0YXJ0X3Jldl9saXN0IHt2aWV3fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCiAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgY29tbWl0aWR4KCR2aWV3KSAwCiAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCiAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKCXNldCBhcmdzIFtjb25jYXQgJGFyZ3MgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0KICAgIH0KICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCgkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCiAgICB9IGVycl19IHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCiAgICBub3didXN5ICR2aWV3Cn0KCnByb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CiAgICBnbG9iYWwgY29tbWZkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCiAgICBzZXQgZmQgJGNvbW1mZCgkY3VydmlldykKICAgIGNhdGNoIHsKCXNldCBwaWQgW3BpZCAkZmRdCglleGVjIGtpbGwgJHBpZAogICAgfQogICAgY2F0Y2gge2Nsb3NlICRmZH0KICAgIHVuc2V0IGNvbW1mZCgkY3VydmlldykKfQoKcHJvYyBnZXRjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKCiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgaW5pdGxheW91dAogICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2ZkIHZpZXd9ICB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIHdoaWxlIHtbbGF5b3V0bW9yZSAkbmV4dHVwZGF0ZV19IGRvdXBkYXRlCgl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJICAgIHZoaWdobGlnaHRtb3JlCgl9CiAgICB9CiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJZG91cGRhdGUKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7fSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cwoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKCXNldCBmZCAkY29tbWZkKCR2KQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUKCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglzdG9wX3Jldl9saXN0CglzZXQgcGhhc2Uge30KICAgIH0KICAgIHNldCBuICRjdXJ2aWV3CiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJY2F0Y2gge3Vuc2V0IGNoaWxkcmVuKCRuLCRpZCl9CgljYXRjaCB7dW5zZXQgY29tbWl0cm93KCRuLCRpZCl9CiAgICB9CiAgICBzZXQgY3VydmlldyAtMQogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KICAgIGNhdGNoIHt1bnNldCB2aWV3ZGF0YSgkbil9CiAgICBkaXNjYXJkYWxsY29tbWl0cwogICAgcmVhZHJlZnMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gW3N0cmluZyByYW5nZSAkY29tbWVudCAwICRpXV0KICAgIH0gZWxzZSB7CglzZXQgaGVhZGxpbmUgJGNvbW1lbnQKICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IHNob3ctcmVmXSByXQogICAgd2hpbGUgezAgPD0gW3NldCBuIFtnZXRzICRyZWZkIGxpbmVdXX0gewoJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgcmVmcy8oW15eXSopJH0gJGxpbmUgXAoJICAgIG1hdGNoIGlkIHBhdGhdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy8uKi9IRUFEJH0gJHBhdGggbWF0Y2hdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0gewoJICAgIHNldCB0eXBlIG90aGVycwoJICAgIHNldCBuYW1lICRwYXRoCgl9CglpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvfSAkcGF0aCBtYXRjaF19IHsKCSAgICBzZXQgdHlwZSBoZWFkcwoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHskY29tbWl0ICE9ICRpZH0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICRpZF0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAogICAgc2V0IG1haW5oZWFkIHt9CiAgICBjYXRjaCB7CglzZXQgdGhlaGVhZCBbZXhlYyBnaXQgc3ltYm9saWMtcmVmIEhFQURdCglpZiB7W3N0cmluZyBtYXRjaCAicmVmcy9oZWFkcy8qIiAkdGhlaGVhZF19IHsKCSAgICBzZXQgbWFpbmhlYWQgW3N0cmluZyByYW5nZSAkdGhlaGVhZCAxMSBlbmRdCgl9CiAgICB9Cn0KCnByb2Mgc2hvd19lcnJvciB7dyB0b3AgbXNnfSB7CiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR0b3AiCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR0b3AgPFZpc2liaWxpdHk+ICJncmFiICR0b3A7IGZvY3VzICR0b3AiCiAgICBiaW5kICR0b3AgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR0b3AiCiAgICB0a3dhaXQgd2luZG93ICR0b3AKfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIHNob3dfZXJyb3IgJHcgJHcgJG1zZwp9Cgpwcm9jIGNvbmZpcm1fcG9wdXAgbXNnIHsKICAgIGdsb2JhbCBjb25maXJtX29rCiAgICBzZXQgY29uZmlybV9vayAwCiAgICBzZXQgdyAuY29uZmlybQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJzZXQgY29uZmlybV9vayAxOyBkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBsZWZ0IC1maWxsIHgKICAgIGJ1dHRvbiAkdy5jYW5jZWwgLXRleHQgQ2FuY2VsIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5jYW5jZWwgLXNpZGUgcmlnaHQgLWZpbGwgeAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwogICAgcmV0dXJuICRjb25maXJtX29rCn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgdGV4dGZvbnQgbWFpbmZvbnQgdWlmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGdkdHR5cGUKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcgc3N0cmluZwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMKICAgIGdsb2JhbCBoZWFkY3R4bWVudQoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgLmJhciBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlVwZGF0ZSIgLWNvbW1hbmQgdXBkYXRlY29tbWl0cwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgLmJhci5maWxlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBtZW51IC5iYXIuZWRpdAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAogICAgLmJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiUHJlZmVyZW5jZXMiIC1jb21tYW5kIGRvcHJlZnMKICAgIC5iYXIuZWRpdCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAoKICAgIG1lbnUgLmJhci52aWV3IC1mb250ICR1aWZvbnQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJWaWV3IiAtbWVudSAuYmFyLnZpZXcKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIk5ldyB2aWV3Li4uIiAtY29tbWFuZCB7bmV3dmlldyAwfQogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiRWRpdCB2aWV3Li4uIiAtY29tbWFuZCBlZGl0dmlldyBcCgktc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkRlbGV0ZSB2aWV3IiAtY29tbWFuZCBkZWx2aWV3IC1zdGF0ZSBkaXNhYmxlZAogICAgLmJhci52aWV3IGFkZCBzZXBhcmF0b3IKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICJBbGwgZmlsZXMiIC1jb21tYW5kIHtzaG93dmlldyAwfSBcCgktdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAwCgogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJLZXkgYmluZGluZ3MiIC1jb21tYW5kIGtleXMKICAgIC5iYXIuaGVscCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgICMgdGhlIGd1aSBoYXMgdXBwZXIgYW5kIGxvd2VyIGhhbGYsIHBhcnRzIG9mIGEgcGFuZWQgd2luZG93LgogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAoKICAgICMgcG9zc2libHkgdXNlIGFzc3VtZWQgZ2VvbWV0cnkKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KHRvcGhlaWdodCldfSB7CiAgICAgICAgc2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW2V4cHIgezE1ICogJGxpbmVzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeSh0b3B3aWR0aCkgW2V4cHIgezgwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShib3RoZWlnaHQpIFtleHByIHsxNSAqICRsaW5lc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFtleHByIHs1MCAqICRjaGFyc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoY2FudikgW2V4cHIgezQwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgezIwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezIwICogJGNoYXJzcGN9XQogICAgfQoKICAgICMgdGhlIHVwcGVyIGhhbGYgd2lsbCBoYXZlIGEgcGFuZWQgd2luZG93LCBhIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0LCBhbmQgc29tZSBzdHVmZiBiZWxvdwogICAgZnJhbWUgLnRmIC1oZWlnaHQgJGdlb21ldHJ5KHRvcGhlaWdodCkgLXdpZHRoICRnZW9tZXRyeSh0b3B3aWR0aCkKICAgIGZyYW1lIC50Zi5oaXN0ZnJhbWUKICAgIHBhbmVkd2luZG93IC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CgogICAgIyBjcmVhdGUgdGhyZWUgY2FudmFzZXMKICAgIHNldCBjc2Nyb2xsIC50Zi5oaXN0ZnJhbWUuY3NiCiAgICBzZXQgY2FudiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudgogICAgY2FudmFzICRjYW52IC13aWR0aCAkZ2VvbWV0cnkoY2FudikgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAic2Nyb2xsY2FudiAkY3Njcm9sbCIKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgLXdpZHRoICRnZW9tZXRyeShjYW52MikgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYzCgogICAgIyBhIHNjcm9sbCBiYXIgdG8gcnVsZSB0aGVtCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgYmluZCAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CiAgICBsYXBwZW5kIGJnbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzCiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtc2lkZSBsZWZ0CgogICAgIyB3ZSBoYXZlIHR3byBidXR0b24gYmFycyBhdCBib3R0b20gb2YgdG9wIGZyYW1lLiBCYXIgMQogICAgZnJhbWUgLnRmLmJhcgogICAgZnJhbWUgLnRmLmxiYXIgLWhlaWdodCAxNQoKICAgIHNldCBzaGExZW50cnkgLnRmLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAudGYuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOCAtZm9udCAkdWlmb250CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC50Zi5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC50Zi5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAudGYuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLnRmLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLnRmLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLnRmLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC50Zi5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRzdHJpbmcgd3JpdGUgZmluZF9jaGFuZ2UKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeCAtaW4gLnRmLmJhcgogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZHR5cGUgXAoJCSAgICAgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmR0eXBlIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAudGYuYmFyLmZpbmR0eXBlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAudGYuYmFyLmZpbmR0eXBlLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAudGYuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlcgogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZF9jaGFuZ2UKICAgIC50Zi5iYXIuZmluZGxvYyBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLnRmLmJhci5maW5kbG9jLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC50Zi5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKCiAgICAjIGJ1aWxkIHVwIHRoZSBib3R0b20gYmFyIG9mIHVwcGVyIHdpbmRvdwogICAgbGFiZWwgLnRmLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAogICAgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkiYWRkaW5nL3JlbW92aW5nIHN0cmluZzoiXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGdkdHR5cGUgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgJGdtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgLnRmLmxiYXIuZ2R0dHlwZSBjb25mIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIuZ2R0dHlwZSAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGVudHJ5IC50Zi5sYmFyLmZlbnQgLXdpZHRoIDI1IC1mb250ICR0ZXh0Zm9udCBcCgktdGV4dHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcyB3cml0ZSBoZmlsZXNfY2hhbmdlCiAgICBsYXBwZW5kIGVudHJpZXMgLnRmLmxiYXIuZmVudAogICAgcGFjayAudGYubGJhci5mZW50IC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDEKICAgIGxhYmVsIC50Zi5sYmFyLnZsYWJlbCAtdGV4dCAiIE9SIGluIHZpZXciIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIudmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIHZpZXdobG1lbnUgc2VsZWN0ZWRobHZpZXcKICAgIHNldCB2aWV3aGxtZW51IFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnZobCBzZWxlY3RlZGhsdmlldyBOb25lXQogICAgJHZpZXdobG1lbnUgZW50cnljb25mIE5vbmUgLWNvbW1hbmQgZGVsdmhpZ2hsaWdodAogICAgJHZpZXdobG1lbnUgY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci52aGwgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLnZobCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGxhYmVsIC50Zi5sYmFyLnJsYWJlbCAtdGV4dCAiIE9SICIgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5ybGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKICAgIHNldCBtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnJlbG0gaGlnaGxpZ2h0X3JlbGF0ZWQgTm9uZSBcCgkiRGVzY2VuZGVudCIgIk5vdCBkZXNjZW5kZW50IiAiQW5jZXN0b3IiICJOb3QgYW5jZXN0b3IiXQogICAgJG0gY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci5yZWxtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9yZWxhdGVkIHdyaXRlIHZyZWxfY2hhbmdlCiAgICBwYWNrIC50Zi5sYmFyLnJlbG0gLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgIyBGaW5pc2ggcHV0dGluZyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdmlld2VyIHRvZ2V0aGVyCiAgICBwYWNrIC50Zi5sYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLnRmLmJhciAtaW4gLnRmIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUgLWZpbGwgYm90aCAtc2lkZSB0b3AgLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLnRmCgogICAgIyBub3cgYnVpbGQgdXAgdGhlIGJvdHRvbQogICAgcGFuZWR3aW5kb3cgLnB3Ym90dG9tIC1vcmllbnQgaG9yaXpvbnRhbAoKICAgICMgbG93ZXIgbGVmdCwgYSB0ZXh0IGJveCBvdmVyIHNlYXJjaCBiYXIsIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0CiAgICAjIGlmIHdlIGtub3cgd2luZG93IGhlaWdodCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBsb3dlciB0ZXh0IGhlaWdodCwgb3RoZXJ3aXNlCiAgICAjIHdlIHNldCBsb3dlciB0ZXh0IGhlaWdodCB3aGljaCB3aWxsIGRyaXZlIHdpbmRvdyBoZWlnaHQKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkobWFpbildfSB7CiAgICAgICAgZnJhbWUgLmJsZWZ0IC13aWR0aCAkZ2VvbWV0cnkoYm90d2lkdGgpCiAgICB9IGVsc2UgewogICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShib3RoZWlnaHQpCiAgICB9CiAgICBmcmFtZSAuYmxlZnQudG9wCgogICAgYnV0dG9uIC5ibGVmdC50b3Auc2VhcmNoIC10ZXh0ICJTZWFyY2giIC1jb21tYW5kIGRvc2VhcmNoIFwKCS1mb250ICR1aWZvbnQKICAgIHBhY2sgLmJsZWZ0LnRvcC5zZWFyY2ggLXNpZGUgbGVmdCAtcGFkeCA1CiAgICBzZXQgc3N0cmluZyAuYmxlZnQudG9wLnNzdHJpbmcKICAgIGVudHJ5ICRzc3RyaW5nIC13aWR0aCAyMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzZWFyY2hzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkc3N0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNlYXJjaHN0cmluZyB3cml0ZSBpbmNyc2VhcmNoCiAgICBwYWNrICRzc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBjdGV4dCAuYmxlZnQuY3RleHQKICAgIHRleHQgJGN0ZXh0IC1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKCS1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXlzY3JvbGxjb21tYW5kIHNjcm9sbHRleHQgLXdyYXAgbm9uZQogICAgc2Nyb2xsYmFyIC5ibGVmdC5zYiAtY29tbWFuZCAiJGN0ZXh0IHl2aWV3IgogICAgcGFjayAuYmxlZnQudG9wIC1zaWRlIHRvcCAtZmlsbCB4CiAgICBwYWNrIC5ibGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY3RleHQKICAgIGxhcHBlbmQgZmdsaXN0ICRjdGV4dAoKICAgICRjdGV4dCB0YWcgY29uZiBjb21tZW50IC13cmFwICR3cmFwY29tbWVudAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0gLWJhY2sgIiNhYWFhYWEiCiAgICAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDJdCiAgICAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAwXQogICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBtMSAtZm9yZSBibHVlCiAgICAkY3RleHQgdGFnIGNvbmYgbTIgLWZvcmUgZ3JlZW4KICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKICAgICRjdGV4dCB0YWcgY29uZiBtNCAtZm9yZSBicm93bgogICAgJGN0ZXh0IHRhZyBjb25mIG01IC1mb3JlICIjMDA5MDkwIgogICAgJGN0ZXh0IHRhZyBjb25mIG02IC1mb3JlIG1hZ2VudGEKICAgICRjdGV4dCB0YWcgY29uZiBtNyAtZm9yZSAiIzgwODAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOCAtZm9yZSAiIzAwOTAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOSAtZm9yZSAiI2ZmMDA4MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTAgLWZvcmUgY3lhbgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMSAtZm9yZSAiI2IwNzA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTIgLWZvcmUgIiM3MGIwZjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEzIC1mb3JlICIjNzBmMGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNCAtZm9yZSAiI2YwYjA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTUgLWZvcmUgIiNmZjcwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbW1heCAtZm9yZSBkYXJrZ3JleQogICAgc2V0IG1lcmdlbWF4IDE2CiAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIG1zZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBmb3VuZCAtYmFjayB5ZWxsb3cKCiAgICAucHdib3R0b20gYWRkIC5ibGVmdAoKICAgICMgbG93ZXIgcmlnaHQKICAgIGZyYW1lIC5icmlnaHQKICAgIGZyYW1lIC5icmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuYnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmJyaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktZm9udCAkbWFpbmZvbnQgXAoJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAoJLXlzY3JvbGxjb21tYW5kICIuYnJpZ2h0LnNiIHNldCIgXAoJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY2ZsaXN0CiAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CiAgICBzY3JvbGxiYXIgLmJyaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmJyaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGhpZ2hsaWdodCBcCgktYmFja2dyb3VuZCBbJGNmbGlzdCBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCiAgICAucHdib3R0b20gYWRkIC5icmlnaHQKICAgIC5jdG9wIGFkZCAucHdib3R0b20KCiAgICAjIHJlc3RvcmUgd2luZG93IHBvc2l0aW9uIGlmIGtub3duCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIHdtIGdlb21ldHJ5IC4gIiRnZW9tZXRyeShtYWluKSIKICAgIH0KCiAgICBiaW5kIC5wd2JvdHRvbSA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQogICAgcGFjayAuY3RvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiY2FudnNjYW4gbWFyayAlVyAleCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImNhbnZzY2FuIGRyYWd0byAlVyAleCAleSIKICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQogICAgYmluZGtleSA8RW5kPiBzZWxsYXN0bGluZQogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxTaGlmdC1LZXktVXA+ICJuZXh0X2hpZ2hsaWdodCAtMSIKICAgIGJpbmQgLiA8U2hpZnQtS2V5LURvd24+ICJuZXh0X2hpZ2hsaWdodCAxIgogICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZGtleSA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gInNlbG5leHRwYWdlIC0xIgogICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCiAgICBiaW5kIC4gPENvbnRyb2wtSG9tZT4gImFsbGNhbnZzIHl2aWV3IG1vdmV0byAwLjAiCiAgICBiaW5kIC4gPENvbnRyb2wtRW5kPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDEuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LURvd24+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBkb3NlYXJjaGJhY2sKICAgIGJpbmQgLiA8Q29udHJvbC1zPiBkb3NlYXJjaAogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIHdtIHByb3RvY29sIC4gV01fREVMRVRFX1dJTkRPVyBkb3F1aXQKICAgIGJpbmQgLiA8QnV0dG9uLTE+ICJjbGljayAlVyIKICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAogICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CiAgICBiaW5kICRzaGExZW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IGNsZWFyc2hhMQogICAgYmluZCAkY2ZsaXN0IDwxPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QjEtTW90aW9uPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QnV0dG9uUmVsZWFzZS0xPiB7dHJlZWNsaWNrICVXICV4ICV5fQoKICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KICAgIHNldCB0ZXh0Y3Vyc29yIFskY3RleHQgY2dldCAtY3Vyc29yXQogICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIG5ldyBicmFuY2giIC1jb21tYW5kIG1rYnJhbmNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNoZXJyeS1waWNrIHRoaXMgY29tbWl0IiBcCgktY29tbWFuZCBjaGVycnlwaWNrCgogICAgc2V0IGhlYWRjdHhtZW51IC5oZWFkY3R4bWVudQogICAgbWVudSAkaGVhZGN0eG1lbnUgLXRlYXJvZmYgMAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlY2sgb3V0IHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBjb2JyYW5jaAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiUmVtb3ZlIHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBybWJyYW5jaAp9CgojIG1vdXNlLTIgbWFrZXMgYWxsIHdpbmRvd3Mgc2NhbiB2ZXJ0aWNhbGx5LCBidXQgb25seSB0aGUgb25lCiMgdGhlIGN1cnNvciBpcyBpbiBzY2FucyBob3Jpem9udGFsbHkKcHJvYyBjYW52c2NhbiB7b3AgdyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBmb3JlYWNoIGMgW2xpc3QgJGNhbnYgJGNhbnYyICRjYW52M10gewoJaWYgeyRjID09ICR3fSB7CgkgICAgJGMgc2NhbiAkb3AgJHggJHkKCX0gZWxzZSB7CgkgICAgJGMgc2NhbiAkb3AgMCAkeQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbGNhbnYge2NzY3JvbGwgZjAgZjF9IHsKICAgICRjc2Nyb2xsIHNldCAkZjAgJGYxCiAgICBkcmF3ZnJhYyAkZjAgJGYxCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udCB1aWZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIG1heGdyYXBocGN0CiAgICBnbG9iYWwgbWF4d2lkdGggc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdhcmdzIHZpZXdwZXJtIG5leHR2aWV3bnVtCiAgICBnbG9iYWwgY21pdG1vZGUgd3JhcGNvbW1lbnQKICAgIGdsb2JhbCBjb2xvcnMgYmdjb2xvciBmZ2NvbG9yIGRpZmZjb2xvcnMKCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdGV4dGZvbnQgJHRleHRmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdWlmb250ICR1aWZvbnRdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBtYXhncmFwaHBjdCAkbWF4Z3JhcGhwY3RdCglwdXRzICRmIFtsaXN0IHNldCBtYXh3aWR0aCAkbWF4d2lkdGhdCglwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCglwdXRzICRmIFtsaXN0IHNldCB3cmFwY29tbWVudCAkd3JhcGNvbW1lbnRdCglwdXRzICRmIFtsaXN0IHNldCBzaG93bmVhcnRhZ3MgJHNob3duZWFydGFnc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGJnY29sb3IgJGJnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBmZ2NvbG9yICRmZ2NvbG9yXQoJcHV0cyAkZiBbbGlzdCBzZXQgY29sb3JzICRjb2xvcnNdCglwdXRzICRmIFtsaXN0IHNldCBkaWZmY29sb3JzICRkaWZmY29sb3JzXQoKCXB1dHMgJGYgInNldCBnZW9tZXRyeShtYWluKSBbd20gZ2VvbWV0cnkgLl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFt3aW5mbyB3aWR0aCAudGZdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW3dpbmZvIGhlaWdodCAudGZdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYpIFt3aW5mbyB3aWR0aCAkY2Fudl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFt3aW5mbyB3aWR0aCAkY2FudjJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbd2luZm8gd2lkdGggJGNhbnYzXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShib3R3aWR0aCkgW3dpbmZvIHdpZHRoIC5ibGVmdF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoYm90aGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5ibGVmdF0iCgoJcHV0cyAtbm9uZXdsaW5lICRmICJzZXQgcGVybXZpZXdzIHsiCglmb3Ige3NldCB2IDB9IHskdiA8ICRuZXh0dmlld251bX0ge2luY3Igdn0gewoJICAgIGlmIHskdmlld3Blcm0oJHYpfSB7CgkJcHV0cyAkZiAie1tsaXN0ICR2aWV3bmFtZSgkdikgJHZpZXdmaWxlcygkdikgJHZpZXdhcmdzKCR2KV19IgoJICAgIH0KCX0KCXB1dHMgJGYgIn0iCgljbG9zZSAkZgoJZmlsZSByZW5hbWUgLWZvcmNlICJ+Ly5naXRrLW5ldyIgIn4vLmdpdGsiCiAgICB9CiAgICBzZXQgc3R1ZmZzYXZlZCAxCn0KCnByb2MgcmVzaXplY2xpc3RwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglzZXQgczEgWyR3aW4gc2FzaCBjb29yZCAxXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdy8yIC0gMil9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCR3KjUvNiAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCAzMH0gewoJCXNldCBzYXNoMCAzMAoJICAgIH0KCSAgICBpZiB7JHNhc2gxIDwgJHNhc2gwICsgMjB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyRzYXNoMCArIDIwfV0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyR3IC0gMTB9XQoJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0gewoJCSAgICBzZXQgc2FzaDAgW2V4cHIgeyRzYXNoMSAtIDIwfV0KCQl9CgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCgkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIHJlc2l6ZWNkZXRwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciB7JHcgLSAxNX1dCgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyBhbGxjYW52cyBhcmdzIHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBldmFsICRjYW52ICRhcmdzCiAgICBldmFsICRjYW52MiAkYXJncwogICAgZXZhbCAkY2FudjMgJGFyZ3MKfQoKcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBiaW5kICRjYW52ICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjMgJGV2ZW50ICRhY3Rpb24KfQoKcHJvYyBhYm91dCB7fSB7CiAgICBzZXQgdyAuYWJvdXQKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJBYm91dCBnaXRrIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayAtIGEgY29tbWl0IHZpZXdlciBmb3IgZ2l0CgpDb3B5cmlnaHQgqSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBrZXlzIHt9IHsKICAgIHNldCB3IC5rZXlzCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiR2l0ayBrZXkgYmluZGluZ3MiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgewpHaXRrIGtleSBiaW5kaW5nczoKCjxDdHJsLVE+CQlRdWl0CjxIb21lPgkJTW92ZSB0byBmaXJzdCBjb21taXQKPEVuZD4JCU1vdmUgdG8gbGFzdCBjb21taXQKPFVwPiwgcCwgaQlNb3ZlIHVwIG9uZSBjb21taXQKPERvd24+LCBuLCBrCU1vdmUgZG93biBvbmUgY29tbWl0CjxMZWZ0PiwgeiwgaglHbyBiYWNrIGluIGhpc3RvcnkgbGlzdAo8UmlnaHQ+LCB4LCBsCUdvIGZvcndhcmQgaW4gaGlzdG9yeSBsaXN0CjxQYWdlVXA+CU1vdmUgdXAgb25lIHBhZ2UgaW4gY29tbWl0IGxpc3QKPFBhZ2VEb3duPglNb3ZlIGRvd24gb25lIHBhZ2UgaW4gY29tbWl0IGxpc3QKPEN0cmwtSG9tZT4JU2Nyb2xsIHRvIHRvcCBvZiBjb21taXQgbGlzdAo8Q3RybC1FbmQ+CVNjcm9sbCB0byBib3R0b20gb2YgY29tbWl0IGxpc3QKPEN0cmwtVXA+CVNjcm9sbCBjb21taXQgbGlzdCB1cCBvbmUgbGluZQo8Q3RybC1Eb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgbGluZQo8Q3RybC1QYWdlVXA+CVNjcm9sbCBjb21taXQgbGlzdCB1cCBvbmUgcGFnZQo8Q3RybC1QYWdlRG93bj4JU2Nyb2xsIGNvbW1pdCBsaXN0IGRvd24gb25lIHBhZ2UKPFNoaWZ0LVVwPglNb3ZlIHRvIHByZXZpb3VzIGhpZ2hsaWdodGVkIGxpbmUKPFNoaWZ0LURvd24+CU1vdmUgdG8gbmV4dCBoaWdobGlnaHRlZCBsaW5lCjxEZWxldGU+LCBiCVNjcm9sbCBkaWZmIHZpZXcgdXAgb25lIHBhZ2UKPEJhY2tzcGFjZT4JU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQo8U3BhY2U+CQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gb25lIHBhZ2UKdQkJU2Nyb2xsIGRpZmYgdmlldyB1cCAxOCBsaW5lcwpkCQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gMTggbGluZXMKPEN0cmwtRj4JCUZpbmQKPEN0cmwtRz4JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdAo8UmV0dXJuPglNb3ZlIHRvIG5leHQgZmluZCBoaXQKLwkJTW92ZSB0byBuZXh0IGZpbmQgaGl0LCBvciByZWRvIGZpbmQKPwkJTW92ZSB0byBwcmV2aW91cyBmaW5kIGhpdApmCQlTY3JvbGwgZGlmZiB2aWV3IHRvIG5leHQgZmlsZQo8Q3RybC1TPgkJU2VhcmNoIGZvciBuZXh0IGhpdCBpbiBkaWZmIHZpZXcKPEN0cmwtUj4JCVNlYXJjaCBmb3IgcHJldmlvdXMgaGl0IGluIGRpZmYgdmlldwo8Q3RybC1LUCs+CUluY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1wbHVzPglJbmNyZWFzZSBmb250IHNpemUKPEN0cmwtS1AtPglEZWNyZWFzZSBmb250IHNpemUKPEN0cmwtbWludXM+CURlY3JlYXNlIGZvbnQgc2l6ZQp9IFwKCSAgICAtanVzdGlmeSBsZWZ0IC1iZyB3aGl0ZSAtYm9yZGVyIDIgLXJlbGllZiBzdW5rZW4KICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgYm90aAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKIyBQcm9jZWR1cmVzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGZpbGUgbGlzdCB3aW5kb3cgYXQgdGhlCiMgYm90dG9tIHJpZ2h0IG9mIHRoZSBvdmVyYWxsIHdpbmRvdy4KCnByb2MgdHJlZXZpZXcge3cgbCBvcGVubGV2c30gewogICAgZ2xvYmFsIHRyZWVjb250ZW50cyB0cmVlZGlyb3BlbiB0cmVlaGVpZ2h0IHRyZWVwYXJlbnQgdHJlZWluZGV4CgogICAgc2V0IGl4IDAKICAgIHNldCB0cmVlaW5kZXgoKSAwCiAgICBzZXQgbGV2IDAKICAgIHNldCBwcmVmaXgge30KICAgIHNldCBwcmVmaXhlbmQgLTEKICAgIHNldCBwcmVmZW5kc3RhY2sge30KICAgIHNldCBodHN0YWNrIHt9CiAgICBzZXQgaHQgMAogICAgc2V0IHRyZWVjb250ZW50cygpIHt9CiAgICAkdyBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGZvcmVhY2ggZiAkbCB7Cgl3aGlsZSB7W3N0cmluZyByYW5nZSAkZiAwICRwcmVmaXhlbmRdIG5lICRwcmVmaXh9IHsKCSAgICBpZiB7JGxldiA8PSAkb3BlbmxldnN9IHsKCQkkdyBtYXJrIHNldCBlOiR0cmVlaW5kZXgoJHByZWZpeCkgImVuZCAtMWMiCgkJJHcgbWFyayBncmF2aXR5IGU6JHRyZWVpbmRleCgkcHJlZml4KSBsZWZ0CgkgICAgfQoJICAgIHNldCB0cmVlaGVpZ2h0KCRwcmVmaXgpICRodAoJICAgIGluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCgkgICAgc2V0IGh0c3RhY2sgW2xyZXBsYWNlICRodHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeGVuZCBbbGluZGV4ICRwcmVmZW5kc3RhY2sgZW5kXQoJICAgIHNldCBwcmVmZW5kc3RhY2sgW2xyZXBsYWNlICRwcmVmZW5kc3RhY2sgZW5kIGVuZF0KCSAgICBzZXQgcHJlZml4IFtzdHJpbmcgcmFuZ2UgJHByZWZpeCAwICRwcmVmaXhlbmRdCgkgICAgaW5jciBsZXYgLTEKCX0KCXNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJGYgW2V4cHIgeyRwcmVmaXhlbmQrMX1dIGVuZF0KCXdoaWxlIHtbc2V0IHNsYXNoIFtzdHJpbmcgZmlyc3QgIi8iICR0YWlsXV0gPj0gMH0gewoJICAgIGxhcHBlbmQgaHRzdGFjayAkaHQKCSAgICBzZXQgaHQgMAoJICAgIGxhcHBlbmQgcHJlZmVuZHN0YWNrICRwcmVmaXhlbmQKCSAgICBpbmNyIHByZWZpeGVuZCBbZXhwciB7JHNsYXNoICsgMX1dCgkgICAgc2V0IGQgW3N0cmluZyByYW5nZSAkdGFpbCAwICRzbGFzaF0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkZAoJICAgIHNldCBvbGRwcmVmaXggJHByZWZpeAoJICAgIGFwcGVuZCBwcmVmaXggJGQKCSAgICBzZXQgdHJlZWNvbnRlbnRzKCRwcmVmaXgpIHt9CgkgICAgc2V0IHRyZWVpbmRleCgkcHJlZml4KSBbaW5jciBpeF0KCSAgICBzZXQgdHJlZXBhcmVudCgkcHJlZml4KSAkb2xkcHJlZml4CgkgICAgc2V0IHRhaWwgW3N0cmluZyByYW5nZSAkdGFpbCBbZXhwciB7JHNsYXNoKzF9XSBlbmRdCgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJc2V0IGh0IDEKCQlzZXQgdHJlZWRpcm9wZW4oJHByZWZpeCkgW2V4cHIgeyRsZXYgPCAkb3BlbmxldnN9XQoJCXNldCBibSBbZXhwciB7JGxldiA9PSAkb3BlbmxldnM/ICJ0cmktcnQiOiAidHJpLWRuIn1dCgkJJHcgbWFyayBzZXQgZDokaXggImVuZCAtMWMiCgkJJHcgbWFyayBncmF2aXR5IGQ6JGl4IGxlZnQKCQlzZXQgc3RyICJcbiIKCQlmb3Ige3NldCBpIDB9IHskaSA8ICRsZXZ9IHtpbmNyIGl9IHthcHBlbmQgc3RyICJcdCJ9CgkJJHcgaW5zZXJ0IGVuZCAkc3RyCgkJJHcgaW1hZ2UgY3JlYXRlIGVuZCAtYWxpZ24gY2VudGVyIC1pbWFnZSAkYm0gLXBhZHggMSBcCgkJICAgIC1uYW1lIGE6JGl4CgkJJHcgaW5zZXJ0IGVuZCAkZCBbaGlnaGxpZ2h0X3RhZyAkcHJlZml4XQoJCSR3IG1hcmsgc2V0IHM6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBzOiRpeCBsZWZ0CgkgICAgfQoJICAgIGluY3IgbGV2Cgl9CglpZiB7JHRhaWwgbmUge319IHsKCSAgICBpZiB7JGxldiA8PSAkb3BlbmxldnN9IHsKCQlpbmNyIGh0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGluc2VydCBlbmQgJHRhaWwgW2hpZ2hsaWdodF90YWcgJGZdCgkgICAgfQoJICAgIGxhcHBlbmQgdHJlZWNvbnRlbnRzKCRwcmVmaXgpICR0YWlsCgl9CiAgICB9CiAgICB3aGlsZSB7JGh0c3RhY2sgbmUge319IHsKCXNldCB0cmVlaGVpZ2h0KCRwcmVmaXgpICRodAoJaW5jciBodCBbbGluZGV4ICRodHN0YWNrIGVuZF0KCXNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQogICAgfQogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBsaW5ldG9lbHQge2x9IHsKICAgIGdsb2JhbCB0cmVlaGVpZ2h0IHRyZWVjb250ZW50cwoKICAgIHNldCB5IDIKICAgIHNldCBwcmVmaXgge30KICAgIHdoaWxlIHsxfSB7Cglmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CgkgICAgaWYgeyR5ID09ICRsfSB7CgkJcmV0dXJuICIkcHJlZml4JGUiCgkgICAgfQoJICAgIHNldCBuIDEKCSAgICBpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIn0gewoJCXNldCBuICR0cmVlaGVpZ2h0KCRwcmVmaXgkZSkKCQlpZiB7JHkgKyAkbiA+ICRsfSB7CgkJICAgIGFwcGVuZCBwcmVmaXggJGUKCQkgICAgaW5jciB5CgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCSAgICBpbmNyIHkgJG4KCX0KICAgIH0KfQoKcHJvYyBoaWdobGlnaHRfdHJlZSB7eSBwcmVmaXh9IHsKICAgIGdsb2JhbCB0cmVlaGVpZ2h0IHRyZWVjb250ZW50cyBjZmxpc3QKCiAgICBmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkcHJlZml4KSB7CglzZXQgcGF0aCAkcHJlZml4JGUKCWlmIHtbaGlnaGxpZ2h0X3RhZyAkcGF0aF0gbmUge319IHsKCSAgICAkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkeS4wICIkeS4wIGxpbmVlbmQiCgl9CglpbmNyIHkKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8iICYmICR0cmVlaGVpZ2h0KCRwYXRoKSA+IDF9IHsKCSAgICBzZXQgeSBbaGlnaGxpZ2h0X3RyZWUgJHkgJHBhdGhdCgl9CiAgICB9CiAgICByZXR1cm4gJHkKfQoKcHJvYyB0cmVlY2xvc2VkaXIge3cgZGlyfSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAkdHJlZWluZGV4KCRkaXIpCiAgICAkdyBjb25mIC1zdGF0ZSBub3JtYWwKICAgICR3IGRlbGV0ZSBzOiRpeCBlOiRpeAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDAKICAgICR3IGltYWdlIGNvbmZpZ3VyZSBhOiRpeCAtaW1hZ2UgdHJpLXJ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IG4gW2V4cHIgezEgLSAkdHJlZWhlaWdodCgkZGlyKX1dCiAgICB3aGlsZSB7JGRpciBuZSB7fX0gewoJaW5jciB0cmVlaGVpZ2h0KCRkaXIpICRuCglzZXQgZGlyICR0cmVlcGFyZW50KCRkaXIpCiAgICB9Cn0KCnByb2MgdHJlZW9wZW5kaXIge3cgZGlyfSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVjb250ZW50cyB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1kbgogICAgJHcgbWFyayBzZXQgZTokaXggczokaXgKICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCByaWdodAogICAgc2V0IGxldiAwCiAgICBzZXQgc3RyICJcbiIKICAgIHNldCBuIFtsbGVuZ3RoICR0cmVlY29udGVudHMoJGRpcildCiAgICBmb3Ige3NldCB4ICRkaXJ9IHskeCBuZSB7fX0ge3NldCB4ICR0cmVlcGFyZW50KCR4KX0gewoJaW5jciBsZXYKCWFwcGVuZCBzdHIgIlx0IgoJaW5jciB0cmVlaGVpZ2h0KCR4KSAkbgogICAgfQogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJGRpcikgewoJc2V0IGRlICRkaXIkZQoJaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCSAgICBzZXQgaXkgJHRyZWVpbmRleCgkZGUpCgkgICAgJHcgbWFyayBzZXQgZDokaXkgZTokaXgKCSAgICAkdyBtYXJrIGdyYXZpdHkgZDokaXkgbGVmdAoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgc2V0IHRyZWVkaXJvcGVuKCRkZSkgMAoJICAgICR3IGltYWdlIGNyZWF0ZSBlOiRpeCAtYWxpZ24gY2VudGVyIC1pbWFnZSB0cmktcnQgLXBhZHggMSBcCgkJLW5hbWUgYTokaXkKCSAgICAkdyBpbnNlcnQgZTokaXggJGUgW2hpZ2hsaWdodF90YWcgJGRlXQoJICAgICR3IG1hcmsgc2V0IHM6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IHM6JGl5IGxlZnQKCSAgICBzZXQgdHJlZWhlaWdodCgkZGUpIDEKCX0gZWxzZSB7CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRzdHIKCSAgICAkdyBpbnNlcnQgZTokaXggJGUgW2hpZ2hsaWdodF90YWcgJGRlXQoJfQogICAgfQogICAgJHcgbWFyayBncmF2aXR5IGU6JGl4IGxlZnQKICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgdHJlZWRpcm9wZW4oJGRpcikgMQogICAgc2V0IHRvcCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQDAsMF0gLl0gMF0KICAgIHNldCBodCBbJHcgY2dldCAtaGVpZ2h0XQogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IHM6JGl4XSAuXSAwXQogICAgaWYgeyRsIDwgJHRvcH0gewoJJHcgeXZpZXcgJGwuMAogICAgfSBlbHNlaWYgeyRsICsgJG4gKyAxID4gJHRvcCArICRodH0gewoJc2V0IHRvcCBbZXhwciB7JGwgKyAkbiArIDIgLSAkaHR9XQoJaWYgeyRsIDwgJHRvcH0gewoJICAgIHNldCB0b3AgJGwKCX0KCSR3IHl2aWV3ICR0b3AuMAogICAgfQp9Cgpwcm9jIHRyZWVjbGljayB7dyB4IHl9IHsKICAgIGdsb2JhbCB0cmVlZGlyb3BlbiBjbWl0bW9kZSBjdGV4dCBjZmxpc3QgY2ZsaXN0X3RvcAoKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIGNmbGlzdF90b3BdfSByZXR1cm4KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAiQCR4LCR5Il0gIi4iXSAwXQogICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGhpZ2hsaWdodCAkY2ZsaXN0X3RvcC4wICIkY2ZsaXN0X3RvcC4wIGxpbmVlbmQiCiAgICAkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0ICRsLjAgIiRsLjAgbGluZWVuZCIKICAgIHNldCBjZmxpc3RfdG9wICRsCiAgICBpZiB7JGwgPT0gMX0gewoJJGN0ZXh0IHl2aWV3IDEuMAoJcmV0dXJuCiAgICB9CiAgICBzZXQgZSBbbGluZXRvZWx0ICRsXQogICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBuZSAiLyJ9IHsKCXNob3dmaWxlICRlCiAgICB9IGVsc2VpZiB7JHRyZWVkaXJvcGVuKCRlKX0gewoJdHJlZWNsb3NlZGlyICR3ICRlCiAgICB9IGVsc2UgewoJdHJlZW9wZW5kaXIgJHcgJGUKICAgIH0KfQoKcHJvYyBzZXRmaWxlbGlzdCB7aWR9IHsKICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgY2ZsaXN0CgogICAgdHJlZXZpZXcgJGNmbGlzdCAkdHJlZWZpbGVsaXN0KCRpZCkgMAp9CgppbWFnZSBjcmVhdGUgYml0bWFwIHRyaS1ydCAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCBibHVlIC1kYXRhIHsKICAgICNkZWZpbmUgdHJpLXJ0X3dpZHRoIDEzCiAgICAjZGVmaW5lIHRyaS1ydF9oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydF9iaXRzW10gPSB7CiAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDMwLCAweDAwLCAweDcwLCAweDAwLCAweGYwLCAweDAwLAogICAgICAgMHhmMCwgMHgwMSwgMHhmMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgICAgIDB4MDAsIDB4MDB9Owp9IC1tYXNrZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydC1tYXNrX3dpZHRoIDEzCiAgICAjZGVmaW5lIHRyaS1ydC1tYXNrX2hlaWdodCAxMwogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0LW1hc2tfYml0c1tdID0gewogICAgICAgMHgwOCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgzOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHhmOCwgMHgwMCwgMHhmOCwgMHgwMSwKICAgICAgIDB4ZjgsIDB4MDMsIDB4ZjgsIDB4MDEsIDB4ZjgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MTgsIDB4MDAsCiAgICAgICAweDA4LCAweDAwfTsKfQppbWFnZSBjcmVhdGUgYml0bWFwIHRyaS1kbiAtYmFja2dyb3VuZCBibGFjayAtZm9yZWdyb3VuZCBibHVlIC1kYXRhIHsKICAgICNkZWZpbmUgdHJpLWRuX3dpZHRoIDEzCiAgICAjZGVmaW5lIHRyaS1kbl9oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbl9iaXRzW10gPSB7CiAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDA3LCAweGY4LCAweDAzLAogICAgICAgMHhmMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgICAgIDB4MDAsIDB4MDB9Owp9IC1tYXNrZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbi1tYXNrX3dpZHRoIDEzCiAgICAjZGVmaW5lIHRyaS1kbi1tYXNrX2hlaWdodCAxMwogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuLW1hc2tfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgxZiwgMHhmZSwgMHgwZiwgMHhmYywgMHgwNywKICAgICAgIDB4ZjgsIDB4MDMsIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfQoKcHJvYyBpbml0X2ZsaXN0IHtmaXJzdH0gewogICAgZ2xvYmFsIGNmbGlzdCBjZmxpc3RfdG9wIHNlbGVjdGVkbGluZSBkaWZmZmlsZXN0YXJ0CgogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjZmxpc3QgZGVsZXRlIDAuMCBlbmQKICAgIGlmIHskZmlyc3QgbmUge319IHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZmlyc3QKCXNldCBjZmxpc3RfdG9wIDEKCSRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgMS4wICIxLjAgbGluZWVuZCIKICAgIH0gZWxzZSB7CgljYXRjaCB7dW5zZXQgY2ZsaXN0X3RvcH0KICAgIH0KICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBkaWZmZmlsZXN0YXJ0IHt9Cn0KCnByb2MgaGlnaGxpZ2h0X3RhZyB7Zn0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9wYXRocwoKICAgIGZvcmVhY2ggcCAkaGlnaGxpZ2h0X3BhdGhzIHsKCWlmIHtbc3RyaW5nIG1hdGNoICRwICRmXX0gewoJICAgIHJldHVybiAiYm9sZCIKCX0KICAgIH0KICAgIHJldHVybiB7fQp9Cgpwcm9jIGhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CiAgICBnbG9iYWwgY21pdG1vZGUgY2ZsaXN0CgogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CglzZXQgZW5kIFtsaW5kZXggW3NwbGl0IFskY2ZsaXN0IGluZGV4IGVuZF0gLl0gMF0KCWZvciB7c2V0IGwgMn0geyRsIDwgJGVuZH0ge2luY3IgbH0gewoJICAgIHNldCBsaW5lIFskY2ZsaXN0IGdldCAkbC4wICIkbC4wIGxpbmVlbmQiXQoJICAgIGlmIHtbaGlnaGxpZ2h0X3RhZyAkbGluZV0gbmUge319IHsKCQkkY2ZsaXN0IHRhZyBhZGQgYm9sZCAkbC4wICIkbC4wIGxpbmVlbmQiCgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWhpZ2hsaWdodF90cmVlIDIge30KICAgIH0KICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyB1bmhpZ2hsaWdodF9maWxlbGlzdCB7fSB7CiAgICBnbG9iYWwgY2ZsaXN0CgogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjZmxpc3QgdGFnIHJlbW92ZSBib2xkIDEuMCBlbmQKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBhZGRfZmxpc3Qge2ZsfSB7CiAgICBnbG9iYWwgY2ZsaXN0CgogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGZvcmVhY2ggZiAkZmwgewoJJGNmbGlzdCBpbnNlcnQgZW5kICJcbiIKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZiBbaGlnaGxpZ2h0X3RhZyAkZl0KICAgIH0KICAgICRjZmxpc3QgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzZWxfZmxpc3Qge3cgeCB5fSB7CiAgICBnbG9iYWwgY3RleHQgZGlmZmZpbGVzdGFydCBjZmxpc3QgY2ZsaXN0X3RvcCBjbWl0bW9kZQoKICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIGNmbGlzdF90b3BdfSByZXR1cm4KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAiQCR4LCR5Il0gIi4iXSAwXQogICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGhpZ2hsaWdodCAkY2ZsaXN0X3RvcC4wICIkY2ZsaXN0X3RvcC4wIGxpbmVlbmQiCiAgICAkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0ICRsLjAgIiRsLjAgbGluZWVuZCIKICAgIHNldCBjZmxpc3RfdG9wICRsCiAgICBpZiB7JGwgPT0gMX0gewoJJGN0ZXh0IHl2aWV3IDEuMAogICAgfSBlbHNlIHsKCWNhdGNoIHskY3RleHQgeXZpZXcgW2xpbmRleCAkZGlmZmZpbGVzdGFydCBbZXhwciB7JGwgLSAyfV1dfQogICAgfQp9CgojIEZ1bmN0aW9ucyBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBzaGVsbC10eXBlIHF1b3RpbmcKCnByb2Mgc2hlbGxxdW90ZSB7c3RyfSB7CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIipcWydcIlxcIFx0XSoiICRzdHJdfSB7CglyZXR1cm4gJHN0cgogICAgfQogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXF0qIiAkc3RyXX0gewoJcmV0dXJuICJcIiRzdHJcIiIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKicqIiAkc3RyXX0gewoJcmV0dXJuICInJHN0ciciCiAgICB9CiAgICByZXR1cm4gIlwiW3N0cmluZyBtYXAge1wiIFxcXCIgXFwgXFxcXH0gJHN0cl1cIiIKfQoKcHJvYyBzaGVsbGFyZ2xpc3Qge2x9IHsKICAgIHNldCBzdHIge30KICAgIGZvcmVhY2ggYSAkbCB7CglpZiB7JHN0ciBuZSB7fX0gewoJICAgIGFwcGVuZCBzdHIgIiAiCgl9CglhcHBlbmQgc3RyIFtzaGVsbHF1b3RlICRhXQogICAgfQogICAgcmV0dXJuICRzdHIKfQoKcHJvYyBzaGVsbGRlcXVvdGUge3N0cn0gewogICAgc2V0IHJldCB7fQogICAgc2V0IHVzZWQgLTEKICAgIHdoaWxlIHsxfSB7CglpbmNyIHVzZWQKCWlmIHshW3JlZ2V4cCAtc3RhcnQgJHVzZWQgLWluZGljZXMgIlxbJ1wiXFxcXCBcdF0iICRzdHIgZmlyc3RdfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgZW5kXQoJICAgIHNldCB1c2VkIFtzdHJpbmcgbGVuZ3RoICRzdHJdCgkgICAgYnJlYWsKCX0KCXNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJc2V0IGNoIFtzdHJpbmcgaW5kZXggJHN0ciAkZmlyc3RdCglpZiB7JGZpcnN0ID4gJHVzZWR9IHsKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBbZXhwciB7JGZpcnN0IC0gMX1dXQoJICAgIHNldCB1c2VkICRmaXJzdAoJfQoJaWYgeyRjaCBlcSAiICIgfHwgJGNoIGVxICJcdCJ9IGJyZWFrCglpbmNyIHVzZWQKCWlmIHskY2ggZXEgIicifSB7CgkgICAgc2V0IGZpcnN0IFtzdHJpbmcgZmlyc3QgIiciICRzdHIgJHVzZWRdCgkgICAgaWYgeyRmaXJzdCA8IDB9IHsKCQllcnJvciAidW5tYXRjaGVkIHNpbmdsZS1xdW90ZSIKCSAgICB9CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCSAgICBjb250aW51ZQoJfQoJaWYgeyRjaCBlcSAiXFwifSB7CgkgICAgaWYgeyR1c2VkID49IFtzdHJpbmcgbGVuZ3RoICRzdHJdfSB7CgkJZXJyb3IgInRyYWlsaW5nIGJhY2tzbGFzaCIKCSAgICB9CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIGluZGV4ICRzdHIgJHVzZWRdCgkgICAgY29udGludWUKCX0KCSMgaGVyZSBjaCA9PSAiXCIiCgl3aGlsZSB7MX0gewoJICAgIGlmIHshW3JlZ2V4cCAtc3RhcnQgJHVzZWQgLWluZGljZXMgIlxbXCJcXFxcXSIgJHN0ciBmaXJzdF19IHsKCQllcnJvciAidW5tYXRjaGVkIGRvdWJsZS1xdW90ZSIKCSAgICB9CgkgICAgc2V0IGZpcnN0IFtsaW5kZXggJGZpcnN0IDBdCgkgICAgc2V0IGNoIFtzdHJpbmcgaW5kZXggJHN0ciAkZmlyc3RdCgkgICAgaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkJYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCQlzZXQgdXNlZCAkZmlyc3QKCSAgICB9CgkgICAgaWYgeyRjaCBlcSAiXCIifSBicmVhawoJICAgIGluY3IgdXNlZAoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGluY3IgdXNlZAoJfQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR1c2VkICRyZXRdCn0KCnByb2Mgc2hlbGxzcGxpdCB7c3RyfSB7CiAgICBzZXQgbCB7fQogICAgd2hpbGUgezF9IHsKCXNldCBzdHIgW3N0cmluZyB0cmltbGVmdCAkc3RyXQoJaWYgeyRzdHIgZXEge319IGJyZWFrCglzZXQgZHEgW3NoZWxsZGVxdW90ZSAkc3RyXQoJc2V0IG4gW2xpbmRleCAkZHEgMF0KCXNldCB3b3JkIFtsaW5kZXggJGRxIDFdCglzZXQgc3RyIFtzdHJpbmcgcmFuZ2UgJHN0ciAkbiBlbmRdCglsYXBwZW5kIGwgJHdvcmQKICAgIH0KICAgIHJldHVybiAkbAp9CgojIENvZGUgdG8gaW1wbGVtZW50IG11bHRpcGxlIHZpZXdzCgpwcm9jIG5ld3ZpZXcge2lzaGlnaGxpZ2h0fSB7CiAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdWlmb250IG5ld2lzaGlnaGxpZ2h0CiAgICBnbG9iYWwgbmV3dmlld2FyZ3MgcmV2dHJlZWFyZ3MKCiAgICBzZXQgbmV3aXNoaWdobGlnaHQgJGlzaGlnaGxpZ2h0CiAgICBzZXQgdG9wIC5naXRrdmlldwogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IG5ld3ZpZXduYW1lKCRuZXh0dmlld251bSkgIlZpZXcgJG5leHR2aWV3bnVtIgogICAgc2V0IG5ld3ZpZXdwZXJtKCRuZXh0dmlld251bSkgMAogICAgc2V0IG5ld3ZpZXdhcmdzKCRuZXh0dmlld251bSkgW3NoZWxsYXJnbGlzdCAkcmV2dHJlZWFyZ3NdCiAgICB2aWV3ZWRpdG9yICR0b3AgJG5leHR2aWV3bnVtICJHaXRrIHZpZXcgZGVmaW5pdGlvbiIKfQoKcHJvYyBlZGl0dmlldyB7fSB7CiAgICBnbG9iYWwgY3VydmlldwogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtCiAgICBnbG9iYWwgdmlld2FyZ3MgbmV3dmlld2FyZ3MKCiAgICBzZXQgdG9wIC5naXRrdmVkaXQtJGN1cnZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkY3VydmlldykgJHZpZXduYW1lKCRjdXJ2aWV3KQogICAgc2V0IG5ld3ZpZXdwZXJtKCRjdXJ2aWV3KSAkdmlld3Blcm0oJGN1cnZpZXcpCiAgICBzZXQgbmV3dmlld2FyZ3MoJGN1cnZpZXcpIFtzaGVsbGFyZ2xpc3QgJHZpZXdhcmdzKCRjdXJ2aWV3KV0KICAgIHZpZXdlZGl0b3IgJHRvcCAkY3VydmlldyAiR2l0azogZWRpdCB2aWV3ICR2aWV3bmFtZSgkY3VydmlldykiCn0KCnByb2Mgdmlld2VkaXRvciB7dG9wIG4gdGl0bGV9IHsKICAgIGdsb2JhbCBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybSB2aWV3ZmlsZXMKICAgIGdsb2JhbCB1aWZvbnQKCiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICR0aXRsZQogICAgbGFiZWwgJHRvcC5ubCAtdGV4dCAiTmFtZSIgLWZvbnQgJHVpZm9udAogICAgZW50cnkgJHRvcC5uYW1lIC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXduYW1lKCRuKQogICAgZ3JpZCAkdG9wLm5sICR0b3AubmFtZSAtc3RpY2t5IHcgLXBhZHkgNQogICAgY2hlY2tidXR0b24gJHRvcC5wZXJtIC10ZXh0ICJSZW1lbWJlciB0aGlzIHZpZXciIC12YXJpYWJsZSBuZXd2aWV3cGVybSgkbikKICAgIGdyaWQgJHRvcC5wZXJtIC0gLXBhZHkgNSAtc3RpY2t5IHcKICAgIG1lc3NhZ2UgJHRvcC5hbCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiQ29tbWl0cyB0byBpbmNsdWRlIChhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0KToiCiAgICBncmlkICR0b3AuYWwgLSAtc3RpY2t5IHcgLXBhZHkgNQogICAgZW50cnkgJHRvcC5hcmdzIC13aWR0aCA1MCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXdhcmdzKCRuKSBcCgktYmFja2dyb3VuZCB3aGl0ZQogICAgZ3JpZCAkdG9wLmFyZ3MgLSAtc3RpY2t5IGV3IC1wYWR4IDUKICAgIG1lc3NhZ2UgJHRvcC5sIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKCS10ZXh0ICJFbnRlciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gaW5jbHVkZSwgb25lIHBlciBsaW5lOiIKICAgIGdyaWQgJHRvcC5sIC0gLXN0aWNreSB3CiAgICB0ZXh0ICR0b3AudCAtd2lkdGggNDAgLWhlaWdodCAxMCAtYmFja2dyb3VuZCB3aGl0ZQogICAgaWYge1tpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJZm9yZWFjaCBmICR2aWV3ZmlsZXMoJG4pIHsKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAkZgoJICAgICR0b3AudCBpbnNlcnQgZW5kICJcbiIKCX0KCSR0b3AudCBkZWxldGUge2VuZCAtIDFjfSBlbmQKCSR0b3AudCBtYXJrIHNldCBpbnNlcnQgMC4wCiAgICB9CiAgICBncmlkICR0b3AudCAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgW2xpc3QgbmV3dmlld29rICR0b3AgJG5dCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBbbGlzdCBkZXN0cm95ICR0b3BdCiAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50Cn0KCnByb2MgZG92aWV3bWVudSB7bSBmaXJzdCBjbWQgb3AgYXJndn0gewogICAgc2V0IG5tZW51IFskbSBpbmRleCBlbmRdCiAgICBmb3Ige3NldCBpICRmaXJzdH0geyRpIDw9ICRubWVudX0ge2luY3IgaX0gewoJaWYge1skbSBlbnRyeWNnZXQgJGkgLWNvbW1hbmRdIGVxICRjbWR9IHsKCSAgICBldmFsICRtICRvcCAkaSAkYXJndgoJICAgIGJyZWFrCgl9CiAgICB9Cn0KCnByb2MgYWxsdmlld21lbnVzIHtuIG9wIGFyZ3N9IHsKICAgIGdsb2JhbCB2aWV3aGxtZW51CgogICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNSBbbGlzdCBzaG93dmlldyAkbl0gJG9wICRhcmdzCiAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gJG9wICRhcmdzCn0KCnByb2MgbmV3dmlld29rIHt0b3Agbn0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld2lzaGlnaGxpZ2h0CiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdwZXJtIHNlbGVjdGVkdmlldyBjdXJ2aWV3CiAgICBnbG9iYWwgdmlld2FyZ3MgbmV3dmlld2FyZ3Mgdmlld2hsbWVudQoKICAgIGlmIHtbY2F0Y2ggewoJc2V0IG5ld2FyZ3MgW3NoZWxsc3BsaXQgJG5ld3ZpZXdhcmdzKCRuKV0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGluIGNvbW1pdCBzZWxlY3Rpb24gYXJndW1lbnRzOiAkZXJyIgoJd20gcmFpc2UgJHRvcAoJZm9jdXMgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlsZXMge30KICAgIGZvcmVhY2ggZiBbc3BsaXQgWyR0b3AudCBnZXQgMC4wIGVuZF0gIlxuIl0gewoJc2V0IGZ0IFtzdHJpbmcgdHJpbSAkZl0KCWlmIHskZnQgbmUge319IHsKCSAgICBsYXBwZW5kIGZpbGVzICRmdAoJfQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKCSMgY3JlYXRpbmcgYSBuZXcgdmlldwoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCglzZXQgdmlld3Blcm0oJG4pICRuZXd2aWV3cGVybSgkbikKCXNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcwoJc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncwoJYWRkdmlld21lbnUgJG4KCWlmIHshJG5ld2lzaGlnaGxpZ2h0fSB7CgkgICAgYWZ0ZXIgaWRsZSBzaG93dmlldyAkbgoJfSBlbHNlIHsKCSAgICBhZnRlciBpZGxlIGFkZHZoaWdobGlnaHQgJG4KCX0KICAgIH0gZWxzZSB7CgkjIGVkaXRpbmcgYW4gZXhpc3RpbmcgdmlldwoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglpZiB7JG5ld3ZpZXduYW1lKCRuKSBuZSAkdmlld25hbWUoJG4pfSB7CgkgICAgc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCgkgICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNSBbbGlzdCBzaG93dmlldyAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKV0KCSAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKSAtdmFsdWUgJHZpZXduYW1lKCRuKV0KCX0KCWlmIHskZmlsZXMgbmUgJHZpZXdmaWxlcygkbikgfHwgJG5ld2FyZ3MgbmUgJHZpZXdhcmdzKCRuKX0gewoJICAgIHNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcwoJICAgIHNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCSAgICBpZiB7JGN1cnZpZXcgPT0gJG59IHsKCQlhZnRlciBpZGxlIHVwZGF0ZWNvbW1pdHMKCSAgICB9Cgl9CiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQp9Cgpwcm9jIGRlbHZpZXcge30gewogICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld3Blcm0gaGx2aWV3IHNlbGVjdGVkaGx2aWV3CgogICAgaWYgeyRjdXJ2aWV3ID09IDB9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCgl1bnNldCBobHZpZXcKICAgIH0KICAgIGFsbHZpZXdtZW51cyAkY3VydmlldyBkZWxldGUKICAgIHNldCB2aWV3ZGF0YSgkY3Vydmlldykge30KICAgIHNldCB2aWV3cGVybSgkY3VydmlldykgMAogICAgc2hvd3ZpZXcgMAp9Cgpwcm9jIGFkZHZpZXdtZW51IHtufSB7CiAgICBnbG9iYWwgdmlld25hbWUgdmlld2hsbWVudQoKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAoJLWNvbW1hbmQgW2xpc3Qgc2hvd3ZpZXcgJG5dIC12YXJpYWJsZSBzZWxlY3RlZHZpZXcgLXZhbHVlICRuCiAgICAkdmlld2hsbWVudSBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAoJLWNvbW1hbmQgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkaGx2aWV3Cn0KCnByb2MgZmxhdHRlbiB7dmFyfSB7CiAgICBnbG9iYWwgJHZhcgoKICAgIHNldCByZXQge30KICAgIGZvcmVhY2ggaSBbYXJyYXkgbmFtZXMgJHZhcl0gewoJbGFwcGVuZCByZXQgJGkgW3NldCAkdmFyXCgkaVwpXQogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyB1bmZsYXR0ZW4ge3ZhciBsfSB7CiAgICBnbG9iYWwgJHZhcgoKICAgIGNhdGNoIHt1bnNldCAkdmFyfQogICAgZm9yZWFjaCB7aSB2fSAkbCB7CglzZXQgJHZhclwoJGlcKSAkdgogICAgfQp9Cgpwcm9jIHNob3d2aWV3IHtufSB7CiAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3ZmlsZXMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjaGlsZGxpc3Qgcm93aWRsaXN0IHJvd29mZnNldHMKICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eCBjb21taXRyb3cgbmV4dGNvbG9yIGNhbnZ4bWF4CiAgICBnbG9iYWwgbnVtY29tbWl0cyByb3dyYW5nZWxpc3QgY29tbWl0bGlzdGVkIGlkcm93cmFuZ2VzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjYW52IGNhbnZ5MAogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgdHJlZWRpZmZzCiAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QgcGhhc2UKICAgIGdsb2JhbCBjb21taXRpZHggcm93bGFpZG91dCByb3dvcHRpbSBsaW5lc2VnZW5kcwogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc2VsZWN0ZWR2aWV3CiAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmNoaWxkbGlzdCB2ZGlzcG9yZGVyIHZjbWl0bGlzdGVkCiAgICBnbG9iYWwgaGx2aWV3IHNlbGVjdGVkaGx2aWV3CgogICAgaWYgeyRuID09ICRjdXJ2aWV3fSByZXR1cm4KICAgIHNldCBzZWxpZCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgc2VsaWQgJGN1cnJlbnRpZAoJc2V0IHkgW3ljICRzZWxlY3RlZGxpbmVdCglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglzZXQgc3BhbiBbJGNhbnYgeXZpZXddCglzZXQgeXRvcCBbZXhwciB7W2xpbmRleCAkc3BhbiAwXSAqICR5bWF4fV0KCXNldCB5Ym90IFtleHByIHtbbGluZGV4ICRzcGFuIDFdICogJHltYXh9XQoJaWYgeyR5dG9wIDwgJHkgJiYgJHkgPCAkeWJvdH0gewoJICAgIHNldCB5c2NyZWVuIFtleHByIHskeSAtICR5dG9wfV0KCX0gZWxzZSB7CgkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeygkeWJvdCAtICR5dG9wKSAvIDJ9XQoJfQogICAgfQogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICBzdG9wZmluZHByb2MKICAgIGlmIHskY3VydmlldyA+PSAwfSB7CglzZXQgdnBhcmVudGxpc3QoJGN1cnZpZXcpICRwYXJlbnRsaXN0CglzZXQgdmNoaWxkbGlzdCgkY3VydmlldykgJGNoaWxkbGlzdAoJc2V0IHZkaXNwb3JkZXIoJGN1cnZpZXcpICRkaXNwbGF5b3JkZXIKCXNldCB2Y21pdGxpc3RlZCgkY3VydmlldykgJGNvbW1pdGxpc3RlZAoJaWYgeyRwaGFzZSBuZSB7fX0gewoJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAoJCVtsaXN0ICRwaGFzZSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3QgXAoJCSAgICAgW2ZsYXR0ZW4gaWRyb3dyYW5nZXNdIFtmbGF0dGVuIGlkaW5saXN0XSBcCgkJICAgICAkcm93bGFpZG91dCAkcm93b3B0aW0gJG51bWNvbW1pdHMgJGxpbmVzZWdlbmRzXQoJfSBlbHNlaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJGN1cnZpZXcpXQoJCSAgfHwgW2xpbmRleCAkdmlld2RhdGEoJGN1cnZpZXcpIDBdIG5lIHt9fSB7CgkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCgkJW2xpc3Qge30gJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0XQoJfQogICAgfQogICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgdHJlZWRpZmZzfQogICAgY2xlYXJfZGlzcGxheQogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJG59IHsKCXVuc2V0IGhsdmlldwoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKICAgIH0KCiAgICBzZXQgY3VydmlldyAkbgogICAgc2V0IHNlbGVjdGVkdmlldyAkbgogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRGVsZXRlKiAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CglzZXQgcGVuZGluZ19zZWxlY3QgJHNlbGlkCglnZXRjb21taXRzCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdiAkdmlld2RhdGEoJG4pCiAgICBzZXQgcGhhc2UgW2xpbmRleCAkdiAwXQogICAgc2V0IGRpc3BsYXlvcmRlciAkdmRpc3BvcmRlcigkbikKICAgIHNldCBwYXJlbnRsaXN0ICR2cGFyZW50bGlzdCgkbikKICAgIHNldCBjaGlsZGxpc3QgJHZjaGlsZGxpc3QoJG4pCiAgICBzZXQgY29tbWl0bGlzdGVkICR2Y21pdGxpc3RlZCgkbikKICAgIHNldCByb3dpZGxpc3QgW2xpbmRleCAkdiAxXQogICAgc2V0IHJvd29mZnNldHMgW2xpbmRleCAkdiAyXQogICAgc2V0IHJvd3JhbmdlbGlzdCBbbGluZGV4ICR2IDNdCiAgICBpZiB7JHBoYXNlIGVxIHt9fSB7CglzZXQgbnVtY29tbWl0cyBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQoJY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQogICAgfSBlbHNlIHsKCXVuZmxhdHRlbiBpZHJvd3JhbmdlcyBbbGluZGV4ICR2IDRdCgl1bmZsYXR0ZW4gaWRpbmxpc3QgW2xpbmRleCAkdiA1XQoJc2V0IHJvd2xhaWRvdXQgW2xpbmRleCAkdiA2XQoJc2V0IHJvd29wdGltIFtsaW5kZXggJHYgN10KCXNldCBudW1jb21taXRzIFtsaW5kZXggJHYgOF0KCXNldCBsaW5lc2VnZW5kcyBbbGluZGV4ICR2IDldCiAgICB9CgogICAgY2F0Y2gge3Vuc2V0IGNvbG9ybWFwfQogICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQogICAgc2V0IGN1cnZpZXcgJG4KICAgIHNldCByb3cgMAogICAgc2V0Y2FudnNjcm9sbAogICAgc2V0IHlmIDAKICAgIHNldCByb3cgMAogICAgaWYgeyRzZWxpZCBuZSB7fSAmJiBbaW5mbyBleGlzdHMgY29tbWl0cm93KCRuLCRzZWxpZCldfSB7CglzZXQgcm93ICRjb21taXRyb3coJG4sJHNlbGlkKQoJIyB0cnkgdG8gZ2V0IHRoZSBzZWxlY3RlZCByb3cgaW4gdGhlIHNhbWUgcG9zaXRpb24gb24gdGhlIHNjcmVlbgoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJc2V0IHl0b3AgW2V4cHIge1t5YyAkcm93XSAtICR5c2NyZWVufV0KCWlmIHskeXRvcCA8IDB9IHsKCSAgICBzZXQgeXRvcCAwCgl9CglzZXQgeWYgW2V4cHIgeyR5dG9wICogMS4wIC8gJHltYXh9XQogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZgogICAgZHJhd3Zpc2libGUKICAgIHNlbGVjdGxpbmUgJHJvdyAwCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0gewoJICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCgl9CglpZiB7W2luZm8gZXhpc3RzIGNvbW1mZCgkbildfSB7CgkgICAgbGF5b3V0bW9yZSB7fQoJfSBlbHNlIHsKCSAgICBmaW5pc2hjb21taXRzCgl9CiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPT0gMH0gewoJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCiAgICB9Cn0KCiMgU3R1ZmYgcmVsYXRpbmcgdG8gdGhlIGhpZ2hsaWdodGluZyBmYWNpbGl0eQoKcHJvYyBpc2hpZ2hsaWdodGVkIHtyb3d9IHsKICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwoKICAgIGlmIHtbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldICYmICRuaGlnaGxpZ2h0cygkcm93KSA+IDB9IHsKCXJldHVybiAkbmhpZ2hsaWdodHMoJHJvdykKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdmhpZ2hsaWdodHMoJHJvdyldICYmICR2aGlnaGxpZ2h0cygkcm93KSA+IDB9IHsKCXJldHVybiAkdmhpZ2hsaWdodHMoJHJvdykKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldICYmICRmaGlnaGxpZ2h0cygkcm93KSA+IDB9IHsKCXJldHVybiAkZmhpZ2hsaWdodHMoJHJvdykKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldICYmICRyaGlnaGxpZ2h0cygkcm93KSA+IDB9IHsKCXJldHVybiAkcmhpZ2hsaWdodHMoJHJvdykKICAgIH0KICAgIHJldHVybiAwCn0KCnByb2MgYm9sZGVuIHtyb3cgZm9udH0gewogICAgZ2xvYmFsIGNhbnYgbGluZWh0YWcgc2VsZWN0ZWRsaW5lIGJvbGRyb3dzCgogICAgbGFwcGVuZCBib2xkcm93cyAkcm93CiAgICAkY2FudiBpdGVtY29uZiAkbGluZWh0YWcoJHJvdykgLWZvbnQgJGZvbnQKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKCSRjYW52IGRlbGV0ZSBzZWNzZWwKCXNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkcm93KV0gXAoJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKCQkgICAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIGJvbGRlbl9uYW1lIHtyb3cgZm9udH0gewogICAgZ2xvYmFsIGNhbnYyIGxpbmVudGFnIHNlbGVjdGVkbGluZSBib2xkbmFtZXJvd3MKCiAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CiAgICAkY2FudjIgaXRlbWNvbmYgJGxpbmVudGFnKCRyb3cpIC1mb250ICRmb250CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkkY2FudjIgZGVsZXRlIHNlY3NlbAoJc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJHJvdyldIFwKCQkgICAtb3V0bGluZSB7e319IC10YWdzIHNlY3NlbCBcCgkJICAgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KCSRjYW52MiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVuYm9sZGVuIHt9IHsKICAgIGdsb2JhbCBtYWluZm9udCBib2xkcm93cwoKICAgIHNldCBzdGlsbGJvbGQge30KICAgIGZvcmVhY2ggcm93ICRib2xkcm93cyB7CglpZiB7IVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgJG1haW5mb250Cgl9IGVsc2UgewoJICAgIGxhcHBlbmQgc3RpbGxib2xkICRyb3cKCX0KICAgIH0KICAgIHNldCBib2xkcm93cyAkc3RpbGxib2xkCn0KCnByb2MgYWRkdmhpZ2hsaWdodCB7bn0gewogICAgZ2xvYmFsIGhsdmlldyBjdXJ2aWV3IHZpZXdkYXRhIHZobF9kb25lIHZoaWdobGlnaHRzIGNvbW1pdGlkeAoKICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XX0gewoJZGVsdmhpZ2hsaWdodAogICAgfQogICAgc2V0IGhsdmlldyAkbgogICAgaWYgeyRuICE9ICRjdXJ2aWV3ICYmICFbaW5mbyBleGlzdHMgdmlld2RhdGEoJG4pXX0gewoJc2V0IHZpZXdkYXRhKCRuKSBbbGlzdCBnZXRjb21taXRzIHt7fX0ge3t9fSB7fSB7fSB7fSAwIDAgMCB7fV0KCXNldCB2cGFyZW50bGlzdCgkbikge30KCXNldCB2Y2hpbGRsaXN0KCRuKSB7fQoJc2V0IHZkaXNwb3JkZXIoJG4pIHt9CglzZXQgdmNtaXRsaXN0ZWQoJG4pIHt9CglzdGFydF9yZXZfbGlzdCAkbgogICAgfQogICAgc2V0IHZobF9kb25lICRjb21taXRpZHgoJGhsdmlldykKICAgIGlmIHskdmhsX2RvbmUgPiAwfSB7CglkcmF3dmlzaWJsZQogICAgfQp9Cgpwcm9jIGRlbHZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGhsdmlld119IHJldHVybgogICAgdW5zZXQgaGx2aWV3CiAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgp9Cgpwcm9jIHZoaWdobGlnaHRtb3JlIHt9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhsX2RvbmUgY29tbWl0aWR4IHZoaWdobGlnaHRzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHZkaXNwb3JkZXIgY3VydmlldyBtYWluZm9udAoKICAgIHNldCBmb250IFtjb25jYXQgJG1haW5mb250IGJvbGRdCiAgICBzZXQgbWF4ICRjb21taXRpZHgoJGhsdmlldykKICAgIGlmIHskaGx2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgZGlzcCAkZGlzcGxheW9yZGVyCiAgICB9IGVsc2UgewoJc2V0IGRpc3AgJHZkaXNwb3JkZXIoJGhsdmlldykKICAgIH0KICAgIHNldCB2ciBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjAgW2xpbmRleCAkdnIgMF0KICAgIHNldCByMSBbbGluZGV4ICR2ciAxXQogICAgZm9yIHtzZXQgaSAkdmhsX2RvbmV9IHskaSA8ICRtYXh9IHtpbmNyIGl9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwICRpXQoJaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJICAgIGlmIHskcjAgPD0gJHJvdyAmJiAkcm93IDw9ICRyMX0gewoJCWlmIHshW2hpZ2hsaWdodGVkICRyb3ddfSB7CgkJICAgIGJvbGRlbiAkcm93ICRmb250CgkJfQoJCXNldCB2aGlnaGxpZ2h0cygkcm93KSAxCgkgICAgfQoJfQogICAgfQogICAgc2V0IHZobF9kb25lICRtYXgKfQoKcHJvYyBhc2t2aGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMgY29tbWl0cm93IGlkZHJhd24gbWFpbmZvbnQKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkaGx2aWV3LCRpZCldfSB7CglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV0gJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KCXNldCB2aGlnaGxpZ2h0cygkcm93KSAxCiAgICB9IGVsc2UgewoJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDAKICAgIH0KfQoKcHJvYyBoZmlsZXNfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmhfc2VyaWFsCiAgICBnbG9iYWwgbWFpbmZvbnQgaGlnaGxpZ2h0X3BhdGhzCgogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cwoJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQoJdW5zZXQgZmlsZWhpZ2hsaWdodAoJY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQoJdW5ib2xkZW4KCXVuaGlnaGxpZ2h0X2ZpbGVsaXN0CiAgICB9CiAgICBzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CiAgICBhZnRlciBjYW5jZWwgZG9fZmlsZV9obCAkZmhfc2VyaWFsCiAgICBpbmNyIGZoX3NlcmlhbAogICAgaWYgeyRoaWdobGlnaHRfZmlsZXMgbmUge319IHsKCWFmdGVyIDMwMCBkb19maWxlX2hsICRmaF9zZXJpYWwKICAgIH0KfQoKcHJvYyBtYWtlcGF0dGVybnMge2x9IHsKICAgIHNldCByZXQge30KICAgIGZvcmVhY2ggZSAkbCB7CglzZXQgZWUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9ICRlXQoJaWYge1tzdHJpbmcgaW5kZXggJGVlIGVuZF0gZXEgIi8ifSB7CgkgICAgbGFwcGVuZCByZXQgIiRlZSoiCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmV0ICRlZQoJICAgIGxhcHBlbmQgcmV0ICIkZWUvKiIKCX0KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgZG9fZmlsZV9obCB7c2VyaWFsfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgaGlnaGxpZ2h0X3BhdGhzIGdkdHR5cGUgZmhsX2xpc3QKCiAgICBpZiB7JGdkdHR5cGUgZXEgInRvdWNoaW5nIHBhdGhzOiJ9IHsKCWlmIHtbY2F0Y2gge3NldCBwYXRocyBbc2hlbGxzcGxpdCAkaGlnaGxpZ2h0X2ZpbGVzXX1dfSByZXR1cm4KCXNldCBoaWdobGlnaHRfcGF0aHMgW21ha2VwYXR0ZXJucyAkcGF0aHNdCgloaWdobGlnaHRfZmlsZWxpc3QKCXNldCBnZHRhcmdzIFtjb25jYXQgLS0gJHBhdGhzXQogICAgfSBlbHNlIHsKCXNldCBnZHRhcmdzIFtsaXN0ICItUyRoaWdobGlnaHRfZmlsZXMiXQogICAgfQogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0LWRpZmYtdHJlZSAtciAtcyAtLXN0ZGluICRnZHRhcmdzXQogICAgc2V0IGZpbGVoaWdobGlnaHQgW29wZW4gJGNtZCByK10KICAgIGZjb25maWd1cmUgJGZpbGVoaWdobGlnaHQgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZmlsZWhpZ2hsaWdodCByZWFkYWJsZSByZWFkZmhpZ2hsaWdodAogICAgc2V0IGZobF9saXN0IHt9CiAgICBkcmF3dmlzaWJsZQogICAgZmx1c2hoaWdobGlnaHRzCn0KCnByb2MgZmx1c2hoaWdobGlnaHRzIHt9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZobF9saXN0CgogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJbGFwcGVuZCBmaGxfbGlzdCB7fQoJcHV0cyAkZmlsZWhpZ2hsaWdodCAiIgoJZmx1c2ggJGZpbGVoaWdobGlnaHQKICAgIH0KfQoKcHJvYyBhc2tmaWxlaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZobF9saXN0CgogICAgbGFwcGVuZCBmaGxfbGlzdCAkaWQKICAgIHNldCBmaGlnaGxpZ2h0cygkcm93KSAtMQogICAgcHV0cyAkZmlsZWhpZ2hsaWdodCAkaWQKfQoKcHJvYyByZWFkZmhpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBjb21taXRyb3cgY3VydmlldyBtYWluZm9udCBpZGRyYXduCiAgICBnbG9iYWwgZmhsX2xpc3QKCiAgICB3aGlsZSB7W2dldHMgJGZpbGVoaWdobGlnaHQgbGluZV0gPj0gMH0gewoJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRmaGxfbGlzdCAkbGluZV0KCWlmIHskaSA8IDB9IGNvbnRpbnVlCglmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CgkgICAgc2V0IGlkIFtsaW5kZXggJGZobF9saXN0ICRqXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkJc2V0IGZoaWdobGlnaHRzKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgMAoJICAgIH0KCX0KCXNldCBmaGxfbGlzdCBbbHJhbmdlICRmaGxfbGlzdCBbZXhwciB7JGkrMX1dIGVuZF0KCWlmIHskbGluZSBlcSB7fX0gY29udGludWUKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbGluZSldfSBjb250aW51ZQoJc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKQoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRsaW5lKV0gJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KCXNldCBmaGlnaGxpZ2h0cygkcm93KSAxCiAgICB9CiAgICBpZiB7W2VvZiAkZmlsZWhpZ2hsaWdodF19IHsKCSMgc3RyYW5nZS4uLgoJcHV0cyAib29wcywgZ2l0LWRpZmYtdHJlZSBkaWVkIgoJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQoJdW5zZXQgZmlsZWhpZ2hsaWdodAogICAgfQogICAgbmV4dF9obGNvbnQKfQoKcHJvYyBmaW5kX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIG5oaWdobGlnaHRzIG1haW5mb250IGJvbGRuYW1lcm93cwogICAgZ2xvYmFsIGZpbmRzdHJpbmcgZmluZHBhdHRlcm4gZmluZHR5cGUKCiAgICAjIGRlbGV0ZSBwcmV2aW91cyBoaWdobGlnaHRzLCBpZiBhbnkKICAgIGZvcmVhY2ggcm93ICRib2xkbmFtZXJvd3MgewoJYm9sZGVuX25hbWUgJHJvdyAkbWFpbmZvbnQKICAgIH0KICAgIHNldCBib2xkbmFtZXJvd3Mge30KICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCiAgICBpZiB7JGZpbmR0eXBlIG5lICJSZWdleHAifSB7CglzZXQgZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gXAoJCSAgICRmaW5kc3RyaW5nXQoJc2V0IGZpbmRwYXR0ZXJuICIqJGUqIgogICAgfQogICAgZHJhd3Zpc2libGUKfQoKcHJvYyBhc2tmaW5kaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBjb21taXRpbmZvIGlkZHJhd24gbWFpbmZvbnQKICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmR0eXBlIGZpbmRsb2MgZmluZHBhdHRlcm4KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglnZXRjb21taXQgJGlkCiAgICB9CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgaXNib2xkIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CglpZiB7JGZpbmRsb2MgbmUgIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jIG5lICR0eX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7JGZpbmR0eXBlIGVxICJSZWdleHAifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbcmVnZXhwICRmaW5kc3RyaW5nICRmXQoJfSBlbHNlaWYgeyRmaW5kdHlwZSBlcSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkZmluZHBhdHRlcm4gJGZdCgl9IGVsc2UgewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkZmluZHBhdHRlcm4gJGZdCgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGlmIHskdHkgZXEgIkF1dGhvciJ9IHsKCQlzZXQgaXNib2xkIDIKCSAgICB9IGVsc2UgewoJCXNldCBpc2JvbGQgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJaWYgeyRpc2JvbGQgJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KCWlmIHskaXNib2xkID49IDJ9IHsKCSAgICBib2xkZW5fbmFtZSAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CiAgICB9CiAgICBzZXQgbmhpZ2hsaWdodHMoJHJvdykgJGlzYm9sZAp9Cgpwcm9jIHZyZWxfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICByaGlnaGxpZ2h0X25vbmUKICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CglhZnRlciBpZGxlIGRyYXd2aXNpYmxlCiAgICB9Cn0KCiMgcHJlcGFyZSBmb3IgdGVzdGluZyB3aGV0aGVyIGNvbW1pdHMgYXJlIGRlc2NlbmRlbnRzIG9yIGFuY2VzdG9ycyBvZiBhCnByb2MgcmhpZ2hsaWdodF9zZWwge2F9IHsKICAgIGdsb2JhbCBkZXNjZW5kZW50IGRlc2NfdG9kbyBhbmNlc3RvciBhbmNfdG9kbwogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkIHJoaWdobGlnaHRzCgogICAgY2F0Y2gge3Vuc2V0IGRlc2NlbmRlbnR9CiAgICBzZXQgZGVzY190b2RvIFtsaXN0ICRhXQogICAgY2F0Y2gge3Vuc2V0IGFuY2VzdG9yfQogICAgc2V0IGFuY190b2RvIFtsaXN0ICRhXQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCXJoaWdobGlnaHRfbm9uZQoJYWZ0ZXIgaWRsZSBkcmF3dmlzaWJsZQogICAgfQp9Cgpwcm9jIHJoaWdobGlnaHRfbm9uZSB7fSB7CiAgICBnbG9iYWwgcmhpZ2hsaWdodHMKCiAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgp9Cgpwcm9jIGlzX2Rlc2NlbmRlbnQge2F9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IGNoaWxkcmVuIGNvbW1pdHJvdyBkZXNjZW5kZW50IGRlc2NfdG9kbwoKICAgIHNldCB2ICRjdXJ2aWV3CiAgICBzZXQgbGEgJGNvbW1pdHJvdygkdiwkYSkKICAgIHNldCB0b2RvICRkZXNjX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyRjb21taXRyb3coJHYsJGRvKSA8ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbmsgJGNoaWxkcmVuKCR2LCRkbykgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJG5rKV19IHsKCQlzZXQgZGVzY2VuZGVudCgkbmspIDEKCQlsYXBwZW5kIHRvZG8gJG5rCgkJaWYgeyRuayBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBkZXNjX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgZGVzY2VuZGVudCgkYSkgMAogICAgc2V0IGRlc2NfdG9kbyAkbGVmdG92ZXIKfQoKcHJvYyBpc19hbmNlc3RvciB7YX0gewogICAgZ2xvYmFsIGN1cnZpZXcgcGFyZW50bGlzdCBjb21taXRyb3cgYW5jZXN0b3IgYW5jX3RvZG8KCiAgICBzZXQgdiAkY3VydmlldwogICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCiAgICBzZXQgdG9kbyAkYW5jX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCR2LCRkbyldIHx8ICRjb21taXRyb3coJHYsJGRvKSA+ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbnAgW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCR2LCRkbyldIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkbnApXX0gewoJCXNldCBhbmNlc3RvcigkbnApIDEKCQlsYXBwZW5kIHRvZG8gJG5wCgkJaWYgeyRucCBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBhbmNfdG9kbyBbY29uY2F0ICRsZWZ0b3ZlciBbbHJhbmdlICR0b2RvIFtleHByIHskaSsxfV0gZW5kXV0KCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBhbmNlc3RvcigkYSkgMAogICAgc2V0IGFuY190b2RvICRsZWZ0b3Zlcgp9Cgpwcm9jIGFza3JlbGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBoaWdobGlnaHRfcmVsYXRlZCBpZGRyYXduIG1haW5mb250IHJoaWdobGlnaHRzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGFuY2VzdG9yCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgaXNib2xkIDAKICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkRlc2NlbmRlbnQiIHx8CgkkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIk5vdCBkZXNjZW5kZW50In0gewoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkaWQpXX0gewoJICAgIGlzX2Rlc2NlbmRlbnQgJGlkCgl9CglpZiB7JGRlc2NlbmRlbnQoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50Iil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0gZWxzZWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIiB8fAoJICAgICAgJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJOb3QgYW5jZXN0b3IifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkaWQpXX0gewoJICAgIGlzX2FuY2VzdG9yICRpZAoJfQoJaWYgeyRhbmNlc3RvcigkaWQpID09ICgkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJaWYgeyRpc2JvbGQgJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KICAgIH0KICAgIHNldCByaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgbmV4dF9obGNvbnQge30gewogICAgZ2xvYmFsIGZobF9yb3cgZmhsX2Rpcm4gZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGxfZGlybl0gfHwgJGZobF9kaXJuID09IDB9IHJldHVybgogICAgc2V0IHJvdyAkZmhsX3JvdwogICAgd2hpbGUgezF9IHsKCWlmIHskcm93IDwgMCB8fCAkcm93ID49ICRudW1jb21taXRzfSB7CgkgICAgYmVsbAoJICAgIHNldCBmaGxfZGlybiAwCgkgICAgcmV0dXJuCgl9CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskdmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYgeyRmaW5kc3RyaW5nIG5lIHt9fSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JG5oaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskcmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0gewoJCSMgYXNrIGZvciBhIGZldyBtb3JlIHdoaWxlIHdlJ3JlIGF0IGl0Li4uCgkJc2V0IHIgJHJvdwoJCWZvciB7c2V0IG4gMH0geyRuIDwgMTAwfSB7aW5jciBufSB7CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyKV19IHsKCQkJYXNrZmlsZWhpZ2hsaWdodCAkciBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCgkJICAgIH0KCQkgICAgaW5jciByICRmaGxfZGlybgoJCSAgICBpZiB7JHIgPCAwIHx8ICRyID49ICRudW1jb21taXRzfSBicmVhawoJCX0KCQlmbHVzaGhpZ2hsaWdodHMKCSAgICB9CgkgICAgaWYgeyRmaGlnaGxpZ2h0cygkcm93KSA8IDB9IHsKCQlzZXQgZmhsX3JvdyAkcm93CgkJcmV0dXJuCgkgICAgfQoJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaW5jciByb3cgJGZobF9kaXJuCiAgICB9CiAgICBzZXQgZmhsX2Rpcm4gMAogICAgc2VsZWN0bGluZSAkcm93IDEKfQoKcHJvYyBuZXh0X2hpZ2hsaWdodCB7ZGlybn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBmaGxfcm93IGZobF9kaXJuCiAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyEoW2luZm8gZXhpc3RzIGhsdmlld10gfHwgJGZpbmRzdHJpbmcgbmUge30gfHwKCSAgJGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiB8fCBbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0pfSByZXR1cm4KICAgIHNldCBmaGxfcm93IFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcm59XQogICAgc2V0IGZobF9kaXJuICRkaXJuCiAgICBuZXh0X2hsY29udAp9Cgpwcm9jIGNhbmNlbF9uZXh0X2hpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgZmhsX2Rpcm4KCiAgICBzZXQgZmhsX2Rpcm4gMAp9CgojIEdyYXBoIGxheW91dCBmdW5jdGlvbnMKCnByb2Mgc2hvcnRpZHMge2lkc30gewogICAgc2V0IHJlcyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHtbbGxlbmd0aCAkaWRdID4gMX0gewoJICAgIGxhcHBlbmQgcmVzIFtzaG9ydGlkcyAkaWRdCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCSAgICBsYXBwZW5kIHJlcyBbc3RyaW5nIHJhbmdlICRpZCAwIDddCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmVzICRpZAoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKICAgIHNldCBuIFtsbGVuZ3RoICRsXQogICAgd2hpbGUgeyR4IDwgJG59IHsKCXNldCBlIFtsaW5kZXggJGwgJHhdCglpZiB7JGUgbmUge319IHsKCSAgICBsc2V0IGwgJHggW2V4cHIgeyRlICsgJG99XQoJfQoJaW5jciB4CiAgICB9CiAgICByZXR1cm4gJGwKfQoKcHJvYyBudGltZXMge24gb30gewogICAgc2V0IHJldCB7fQogICAgZm9yIHt9IHskbiA+IDB9IHtpbmNyIG4gLTF9IHsKCWxhcHBlbmQgcmV0ICRvCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVzZWRpbnJhbmdlIHtpZCBsMSBsMn0gewogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBjaGlsZGxpc3QgY3VydmlldwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CglzZXQgciAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKCWlmIHskbDEgPD0gJHIgJiYgJHIgPD0gJGwyfSB7CgkgICAgcmV0dXJuIFtleHByIHskciAtICRsMSArIDF9XQoJfQoJc2V0IGtpZHMgW2xpbmRleCAkY2hpbGRsaXN0ICRyXQogICAgfSBlbHNlIHsKCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCiAgICB9CiAgICBmb3JlYWNoIGMgJGtpZHMgewoJc2V0IHIgJGNvbW1pdHJvdygkY3VydmlldywkYykKCWlmIHskbDEgPD0gJHIgJiYgJHIgPD0gJGwyfSB7CgkgICAgcmV0dXJuIFtleHByIHskciAtICRsMSArIDF9XQoJfQogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyBzYW5pdHkge3JvdyB7ZnVsbCAwfX0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCgogICAgc2V0IGNvbCAtMQogICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpbmNyIGNvbAoJaWYgeyRpZCBlcSB7fX0gY29udGludWUKCWlmIHskY29sIDwgW2xsZW5ndGggJGlkc10gLSAxICYmCgkgICAgW2xzZWFyY2ggLWV4YWN0IC1zdGFydCBbZXhwciB7JGNvbCsxfV0gJGlkcyAkaWRdID49IDB9IHsKCSAgICBwdXRzICJvb3BzOiBbc2hvcnRpZHMgJGlkXSByZXBlYXRlZCBpbiByb3cgJHJvdyBjb2wgJGNvbDoge1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dfSIKCX0KCXNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkY29sXQoJc2V0IHkgJHJvdwoJc2V0IHggJGNvbAoJd2hpbGUgeyRvIG5lIHt9fSB7CgkgICAgaW5jciB5IC0xCgkgICAgaW5jciB4ICRvCgkgICAgaWYge1tsaW5kZXggJHJvd2lkbGlzdCAkeSAkeF0gIT0gJGlkfSB7CgkJcHV0cyAib29wczogcm93b2Zmc2V0cyB3cm9uZyBhdCByb3cgW2V4cHIgeyR5KzF9XSBjb2wgW2V4cHIgeyR4LSRvfV0iCgkJcHV0cyAiICBpZD1bc2hvcnRpZHMgJGlkXSBjaGVjayBzdGFydGVkIGF0IHJvdyAkcm93IgoJCWZvciB7c2V0IGkgJHJvd30geyRpID49ICR5fSB7aW5jciBpIC0xfSB7CgkJICAgIHB1dHMgIiAgcm93ICRpIGlkcz17W3Nob3J0aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkaV1dfSBvZmZzPXtbbGluZGV4ICRyb3dvZmZzZXRzICRpXX0iCgkJfQoJCWJyZWFrCgkgICAgfQoJICAgIGlmIHshJGZ1bGx9IGJyZWFrCgkgICAgc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkeSAkeF0KCX0KICAgIH0KfQoKcHJvYyBtYWtldXBhcnJvdyB7b2lkIHggeSB6fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgdXBhcnJvd2xlbiBpZHJvd3JhbmdlcwoKICAgIGZvciB7c2V0IGkgMX0geyRpIDwgJHVwYXJyb3dsZW4gJiYgJHkgPiAxfSB7aW5jciBpfSB7CglpbmNyIHkgLTEKCWluY3IgeCAkegoJc2V0IG9mZjAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0KCWZvciB7c2V0IHgwICR4fSB7MX0ge2luY3IgeDB9IHsKCSAgICBpZiB7JHgwID49IFtsbGVuZ3RoICRvZmYwXX0gewoJCXNldCB4MCBbbGxlbmd0aCBbbGluZGV4ICRyb3dvZmZzZXRzIFtleHByIHskeS0xfV1dXQoJCWJyZWFrCgkgICAgfQoJICAgIHNldCB6IFtsaW5kZXggJG9mZjAgJHgwXQoJICAgIGlmIHskeiBuZSB7fX0gewoJCWluY3IgeDAgJHoKCQlicmVhawoJICAgIH0KCX0KCXNldCB6IFtleHByIHskeDAgLSAkeH1dCglsc2V0IHJvd2lkbGlzdCAkeSBbbGluc2VydCBbbGluZGV4ICRyb3dpZGxpc3QgJHldICR4ICRvaWRdCglsc2V0IHJvd29mZnNldHMgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHpdCiAgICB9CiAgICBzZXQgdG1wIFtscmVwbGFjZSBbbGluZGV4ICRyb3dvZmZzZXRzICR5XSAkeCAkeCB7fV0KICAgIGxzZXQgcm93b2Zmc2V0cyAkeSBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JHgrMX1dIC0xXQogICAgbGFwcGVuZCBpZHJvd3Jhbmdlcygkb2lkKSAkeQp9Cgpwcm9jIGluaXRsYXlvdXQge30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGRpc3BsYXlvcmRlciBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltCiAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrIHJvd3JhbmdlbGlzdCBpZHJvd3JhbmdlcwogICAgZ2xvYmFsIG51bWNvbW1pdHMgY2FudnhtYXggY2FudgogICAgZ2xvYmFsIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNoaWxkcmVuCiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHgKICAgIGdsb2JhbCBsaW5lc2VnZW5kcwoKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBkaXNwbGF5b3JkZXIge30KICAgIHNldCBjb21taXRsaXN0ZWQge30KICAgIHNldCBwYXJlbnRsaXN0IHt9CiAgICBzZXQgY2hpbGRsaXN0IHt9CiAgICBzZXQgcm93cmFuZ2VsaXN0IHt9CiAgICBzZXQgbmV4dGNvbG9yIDAKICAgIHNldCByb3dpZGxpc3Qge3t9fQogICAgc2V0IHJvd29mZnNldHMge3t9fQogICAgY2F0Y2gge3Vuc2V0IGlkaW5saXN0fQogICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KICAgIHNldCByb3dsYWlkb3V0IDAKICAgIHNldCByb3dvcHRpbSAwCiAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQogICAgY2F0Y2gge3Vuc2V0IGNvbG9ybWFwfQogICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQogICAgY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQogICAgc2V0IGxpbmVzZWdlbmRzIHt9Cn0KCnByb2Mgc2V0Y2FudnNjcm9sbCB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBudW1jb21taXRzIGxpbmVzcGMgY2FudnhtYXggY2FudnkwCgogICAgc2V0IHltYXggW2V4cHIgeyRjYW52eTAgKyAoJG51bWNvbW1pdHMgLSAwLjUpICogJGxpbmVzcGMgKyAyfV0KICAgICRjYW52IGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgJGNhbnZ4bWF4ICR5bWF4XQogICAgJGNhbnYyIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KICAgICRjYW52MyBjb25mIC1zY3JvbGxyZWdpb24gW2xpc3QgMCAwIDAgJHltYXhdCn0KCnByb2MgdmlzaWJsZXJvd3Mge30gewogICAgZ2xvYmFsIGNhbnYgbnVtY29tbWl0cyBsaW5lc3BjCgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgogICAgc2V0IGYgWyRjYW52IHl2aWV3XQogICAgc2V0IHkwIFtleHByIHtpbnQoW2xpbmRleCAkZiAwXSAqICR5bWF4KX1dCiAgICBzZXQgcjAgW2V4cHIge2ludCgoJHkwIC0gMykgLyAkbGluZXNwYykgLSAxfV0KICAgIGlmIHskcjAgPCAwfSB7CglzZXQgcjAgMAogICAgfQogICAgc2V0IHkxIFtleHByIHtpbnQoW2xpbmRleCAkZiAxXSAqICR5bWF4KX1dCiAgICBzZXQgcjEgW2V4cHIge2ludCgoJHkxIC0gMykgLyAkbGluZXNwYykgKyAxfV0KICAgIGlmIHskcjEgPj0gJG51bWNvbW1pdHN9IHsKCXNldCByMSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkcjAgJHIxXQp9Cgpwcm9jIGxheW91dG1vcmUge3RtYXh9IHsKICAgIGdsb2JhbCByb3dsYWlkb3V0IHJvd29wdGltIGNvbW1pdGlkeCBudW1jb21taXRzIG9wdGltX2RlbGF5CiAgICBnbG9iYWwgdXBhcnJvd2xlbiBjdXJ2aWV3CgogICAgd2hpbGUgezF9IHsKCWlmIHskcm93b3B0aW0gLSAkb3B0aW1fZGVsYXkgPiAkbnVtY29tbWl0c30gewoJICAgIHNob3dzdHVmZiBbZXhwciB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5fV0KCX0gZWxzZWlmIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMSA+ICRyb3dvcHRpbX0gewoJICAgIHNldCBuciBbZXhwciB7JHJvd2xhaWRvdXQgLSAkdXBhcnJvd2xlbiAtIDEgLSAkcm93b3B0aW19XQoJICAgIGlmIHskbnIgPiAxMDB9IHsKCQlzZXQgbnIgMTAwCgkgICAgfQoJICAgIG9wdGltaXplX3Jvd3MgJHJvd29wdGltIDAgW2V4cHIgeyRyb3dvcHRpbSArICRucn1dCgkgICAgaW5jciByb3dvcHRpbSAkbnIKCX0gZWxzZWlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+ICRyb3dsYWlkb3V0fSB7CgkgICAgc2V0IG5yIFtleHByIHskY29tbWl0aWR4KCRjdXJ2aWV3KSAtICRyb3dsYWlkb3V0fV0KCSAgICAjIG1heSBuZWVkIHRvIGluY3JlYXNlIHRoaXMgdGhyZXNob2xkIGlmIHVwYXJyb3dsZW4gb3IKCSAgICAjIG1pbmdhcGxlbiBhcmUgaW5jcmVhc2VkLi4uCgkgICAgaWYgeyRuciA+IDE1MH0gewoJCXNldCBuciAxNTAKCSAgICB9CgkgICAgc2V0IHJvdyAkcm93bGFpZG91dAoJICAgIHNldCByb3dsYWlkb3V0IFtsYXlvdXRyb3dzICRyb3cgW2V4cHIgeyRyb3cgKyAkbnJ9XSAwXQoJICAgIGlmIHskcm93bGFpZG91dCA9PSAkcm93fSB7CgkJcmV0dXJuIDAKCSAgICB9Cgl9IGVsc2UgewoJICAgIHJldHVybiAwCgl9CglpZiB7JHRtYXggbmUge30gJiYgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkdG1heH0gewoJICAgIHJldHVybiAxCgl9CiAgICB9Cn0KCnByb2Mgc2hvd3N0dWZmIHtjYW5zaG93fSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgcGVuZGluZ19zZWxlY3Qgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZXNlZ2VuZHMgaWRyb3dyYW5nZXMgaWRyYW5nZWRyYXduIGN1cnZpZXcKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gewoJZ2xvYmFsIHBoYXNlCglzZXQgcGhhc2UgImluY3JkcmF3IgoJYWxsY2FudnMgZGVsZXRlIGFsbAogICAgfQogICAgc2V0IHJvdyAkbnVtY29tbWl0cwogICAgc2V0IG51bWNvbW1pdHMgJGNhbnNob3cKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCByb3dzIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICRyb3dzIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQogICAgc2V0IHNlbHJvdyAtMQogICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkY2Fuc2hvd30ge2luY3Igcn0gewoJZm9yZWFjaCBpZCBbbGluZGV4ICRsaW5lc2VnZW5kcyBbZXhwciB7JHIrMX1dXSB7CgkgICAgc2V0IGkgLTEKCSAgICBmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CgkJaW5jciBpCgkJaWYgeyRlIG5lIHt9ICYmICRlIDwgJG51bWNvbW1pdHMgJiYgJHMgPD0gJHIxICYmICRlID49ICRyMAoJCSAgICAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgeyRjYW5zaG93ID4gJHIxfSB7CglzZXQgY2Fuc2hvdyAkcjEKICAgIH0KICAgIHdoaWxlIHskcm93IDwgJGNhbnNob3d9IHsKCWRyYXdjbWl0cm93ICRyb3cKCWluY3Igcm93CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XSAmJgoJW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpXSAmJgoJJGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpIDwgJG51bWNvbW1pdHN9IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpIDEKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgIVtpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCXNlbGVjdGxpbmUgMCAxCiAgICB9Cn0KCnByb2MgbGF5b3V0cm93cyB7cm93IGVuZHJvdyBsYXN0fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgdXBhcnJvd2xlbiBkb3duYXJyb3dsZW4gbWF4d2lkdGggbWluZ2FwbGVuCiAgICBnbG9iYWwgY2hpbGRsaXN0IHBhcmVudGxpc3QKICAgIGdsb2JhbCBpZHJvd3JhbmdlcyBsaW5lc2VnZW5kcwogICAgZ2xvYmFsIGNvbW1pdGlkeCBjdXJ2aWV3CiAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrIHJvd3JhbmdlbGlzdAoKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCiAgICB3aGlsZSB7JHJvdyA8ICRlbmRyb3d9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCXNldCBvbGRvbGRzIHt9CglzZXQgbmV3b2xkcyB7fQoJZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGlkaW5saXN0KCRwKV19IHsKCQlsYXBwZW5kIG5ld29sZHMgJHAKCSAgICB9IGVsc2VpZiB7ISRpZGlubGlzdCgkcCl9IHsKCQlsYXBwZW5kIG9sZG9sZHMgJHAKCSAgICB9Cgl9CglzZXQgbHNlIHt9CglzZXQgbmV2IFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSArIFtsbGVuZ3RoICRuZXdvbGRzXQoJCSAgICAgICArIFtsbGVuZ3RoICRvbGRvbGRzXSAtICRtYXh3aWR0aCArIDF9XQoJaWYgeyRuZXYgPiAwfSB7CgkgICAgaWYgeyEkbGFzdCAmJgoJCSRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW4gPj0gJGNvbW1pdGlkeCgkY3Vydmlldyl9IGJyZWFrCgkgICAgZm9yIHtzZXQgeCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIHggLTFdID49IDB9IHt9IHsKCQlzZXQgaSBbbGluZGV4ICRpZGxpc3QgJHhdCgkJaWYgeyFbaW5mbyBleGlzdHMgcm93Y2hrKCRpKV0gfHwgJHJvdyA+PSAkcm93Y2hrKCRpKX0gewoJCSAgICBzZXQgciBbdXNlZGlucmFuZ2UgJGkgW2V4cHIgeyRyb3cgLSAkZG93bmFycm93bGVufV0gXAoJCQkgICAgICAgW2V4cHIgeyRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW59XV0KCQkgICAgaWYgeyRyID09IDB9IHsKCQkJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkeCAkeF0KCQkJc2V0IG9mZnMgW2xyZXBsYWNlICRvZmZzICR4ICR4XQoJCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJHggMV0KCQkJc2V0IGlkaW5saXN0KCRpKSAwCgkJCXNldCBybTEgW2V4cHIgeyRyb3cgLSAxfV0KCQkJbGFwcGVuZCBsc2UgJGkKCQkJbGFwcGVuZCBpZHJvd3JhbmdlcygkaSkgJHJtMQoJCQlpZiB7W2luY3IgbmV2IC0xXSA8PSAwfSBicmVhawoJCQljb250aW51ZQoJCSAgICB9CgkJICAgIHNldCByb3djaGsoJGlkKSBbZXhwciB7JHJvdyArICRyfV0KCQl9CgkgICAgfQoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgl9CglsYXBwZW5kIGxpbmVzZWdlbmRzICRsc2UKCXNldCBjb2wgW2xzZWFyY2ggLWV4YWN0ICRpZGxpc3QgJGlkXQoJaWYgeyRjb2wgPCAwfSB7CgkgICAgc2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XQoJICAgIGxhcHBlbmQgaWRsaXN0ICRpZAoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIHNldCB6IHt9CgkgICAgaWYge1tsaW5kZXggJGNoaWxkbGlzdCAkcm93XSBuZSB7fX0gewoJCXNldCB6IFtleHByIHtbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXV0gLSAkY29sfV0KCQl1bnNldCBpZGlubGlzdCgkaWQpCgkgICAgfQoJICAgIGxhcHBlbmQgb2ZmcyAkegoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJbWFrZXVwYXJyb3cgJGlkICRjb2wgJHJvdyAkegoJICAgIH0KCX0gZWxzZSB7CgkgICAgdW5zZXQgaWRpbmxpc3QoJGlkKQoJfQoJc2V0IHJhbmdlcyB7fQoJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJICAgIHNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKCSAgICBsYXBwZW5kIHJhbmdlcyAkcm93CgkgICAgdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJfQoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJHJhbmdlcwoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgW2xsZW5ndGggJGlkbGlzdF0gMF0KCXNldCBsIFtsbGVuZ3RoICRuZXdvbGRzXQoJc2V0IGlkbGlzdCBbZXZhbCBscmVwbGFjZSBcJGlkbGlzdCAkY29sICRjb2wgJG5ld29sZHNdCglzZXQgbyAwCglpZiB7JGwgIT0gMX0gewoJICAgIHNldCBvZmZzIFtscmFuZ2UgJG9mZnMgMCBbZXhwciB7JGNvbCAtIDF9XV0KCSAgICBmb3JlYWNoIHggJG5ld29sZHMgewoJCWxhcHBlbmQgb2ZmcyB7fQoJCWluY3IgbyAtMQoJICAgIH0KCSAgICBpbmNyIG8KCSAgICBzZXQgdG1wIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIFtsbGVuZ3RoICRvZmZzXX1dCgkgICAgaWYgeyR0bXAgPiAwfSB7CgkJc2V0IG9mZnMgW2NvbmNhdCAkb2ZmcyBbbnRpbWVzICR0bXAgJG9dXQoJICAgIH0KCX0gZWxzZSB7CgkgICAgbHNldCBvZmZzICRjb2wge30KCX0KCWZvcmVhY2ggaSAkbmV3b2xkcyB7CgkgICAgc2V0IGlkaW5saXN0KCRpKSAxCgkgICAgc2V0IGlkcm93cmFuZ2VzKCRpKSAkcm93Cgl9CglpbmNyIGNvbCAkbAoJZm9yZWFjaCBvaWQgJG9sZG9sZHMgewoJICAgIHNldCBpZGlubGlzdCgkb2lkKSAxCgkgICAgc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wgJG9pZF0KCSAgICBzZXQgb2ZmcyBbbGluc2VydCAkb2ZmcyAkY29sICRvXQoJICAgIG1ha2V1cGFycm93ICRvaWQgJGNvbCAkcm93ICRvCgkgICAgaW5jciBjb2wKCX0KCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcwogICAgfQogICAgcmV0dXJuICRyb3cKfQoKcHJvYyBhZGRleHRyYWlkIHtpZCByb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0cm93IGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb21taXRpZHggY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldwoKICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCiAgICBsYXBwZW5kIGNvbW1pdGxpc3RlZCAwCiAgICBsYXBwZW5kIHBhcmVudGxpc3Qge30KICAgIHNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcm93CiAgICByZWFkY29tbWl0ICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKCXNldCBjaGlsZHJlbigkY3VydmlldywkaWQpIHt9CiAgICB9CiAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQp9Cgpwcm9jIGxheW91dHRhaWwge30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkaW5saXN0IGNvbW1pdGlkeCBjdXJ2aWV3CiAgICBnbG9iYWwgaWRyb3dyYW5nZXMgcm93cmFuZ2VsaXN0CgogICAgc2V0IHJvdyAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHdoaWxlIHskaWRsaXN0IG5lIHt9fSB7CglzZXQgY29sIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIDF9XQoJc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJdW5zZXQgaWRpbmxpc3QoJGlkKQoJbGFwcGVuZCBpZHJvd3JhbmdlcygkaWQpICRyb3cKCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCgl1bnNldCBpZHJvd3JhbmdlcygkaWQpCglpbmNyIHJvdwoJc2V0IG9mZnMgW250aW1lcyAkY29sIDBdCglzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICRjb2wgJGNvbF0KCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcwogICAgfQoKICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkaW5saXN0XSB7CglhZGRleHRyYWlkICRpZCAkcm93Cglsc2V0IHJvd2lkbGlzdCAkcm93IFtsaXN0ICRpZF0KCWxzZXQgcm93b2Zmc2V0cyAkcm93IDAKCW1ha2V1cGFycm93ICRpZCAwICRyb3cgMAoJbGFwcGVuZCBpZHJvd3JhbmdlcygkaWQpICRyb3cKCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCgl1bnNldCBpZHJvd3JhbmdlcygkaWQpCglpbmNyIHJvdwoJbGFwcGVuZCByb3dpZGxpc3Qge30KCWxhcHBlbmQgcm93b2Zmc2V0cyB7fQogICAgfQp9Cgpwcm9jIGluc2VydF9wYWQge3JvdyBjb2wgbnBhZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCgogICAgc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQogICAgbHNldCByb3dpZGxpc3QgJHJvdyBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0gJGNvbCAkcGFkXQogICAgc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd29mZnNldHMgJHJvd11dICRjb2wgJHBhZF0KICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93IFtpbmNyYW5nZSAkdG1wIFtleHByIHskY29sICsgJG5wYWR9XSBbZXhwciB7LSRucGFkfV1dCn0KCnByb2Mgb3B0aW1pemVfcm93cyB7cm93IGNvbCBlbmRyb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZHJvd3JhbmdlcyBkaXNwbGF5b3JkZXIKCiAgICBmb3Ige30geyRyb3cgPCAkZW5kcm93fSB7aW5jciByb3d9IHsKCXNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCglzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCglzZXQgaGFzcGFkIDAKCWZvciB7fSB7JGNvbCA8IFtsbGVuZ3RoICRvZmZzXX0ge2luY3IgY29sfSB7CgkgICAgaWYge1tsaW5kZXggJGlkbGlzdCAkY29sXSBlcSB7fX0gewoJCXNldCBoYXNwYWQgMQoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCSAgICBpZiB7JHogZXEge319IGNvbnRpbnVlCgkgICAgc2V0IGlzYXJyb3cgMAoJICAgIHNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCSAgICBzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCSAgICBzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIGlmIHskejAgZXEge319IHsKCQlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KCQlpZiB7JHJhbmdlcyBuZSB7fSAmJiAkeTAgPiBbbGluZGV4ICRyYW5nZXMgMF19IHsKCQkgICAgc2V0IGlzYXJyb3cgMQoJCX0KCSAgICB9CgkgICAgaWYgeyR6IDwgLTEgfHwgKCR6IDwgMCAmJiAkaXNhcnJvdyl9IHsKCQlzZXQgbnBhZCBbZXhwciB7LTEgLSAkeiArICRpc2Fycm93fV0KCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJGNvbCAkbnBhZF0KCQlpbnNlcnRfcGFkICR5MCAkeDAgJG5wYWQKCQlpZiB7JHkwID4gMH0gewoJCSAgICBvcHRpbWl6ZV9yb3dzICR5MCAkeDAgJHJvdwoJCX0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IHgwIFtleHByIHskY29sICsgJHp9XQoJCXNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCgkgICAgfSBlbHNlaWYgeyR6ID4gMSB8fCAoJHogPiAwICYmICRpc2Fycm93KX0gewoJCXNldCBucGFkIFtleHByIHskeiAtIDEgKyAkaXNhcnJvd31dCgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGlmIHskeDEgKyAkeiA+ICRjb2x9IHsKCQkJaW5jciBucGFkCgkJICAgIH0KCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAkbnBhZF0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQoJCXNldCBpZGxpc3QgW2V2YWwgbGluc2VydCBcJGlkbGlzdCAkY29sICRwYWRdCgkJc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFwkb2ZmcyAkY29sICRwYWRdCgkJaW5jciBjb2wgJG5wYWQKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIFtleHByIHstJG5wYWR9XV0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IGhhc3BhZCAxCgkgICAgfQoJICAgIGlmIHskejAgZXEge30gJiYgISRpc2Fycm93fSB7CgkJIyB0aGlzIGxpbmUgbGlua3MgdG8gaXRzIGZpcnN0IGNoaWxkIG9uIHJvdyAkcm93LTIKCQlzZXQgcm0yIFtleHByIHskcm93IC0gMn1dCgkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm0yXQoJCXNldCB4YyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRybTJdICRpZF0KCQlpZiB7JHhjID49IDB9IHsKCQkgICAgc2V0IHowIFtleHByIHskeGMgLSAkeDB9XQoJCX0KCSAgICB9CgkgICAgaWYgeyR6MCBuZSB7fSAmJiAkeiA8IDAgJiYgJHowID4gMH0gewoJCWluc2VydF9wYWQgJHkwICR4MCAxCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgMV0KCQlvcHRpbWl6ZV9yb3dzICR5MCBbZXhwciB7JHgwICsgMX1dICRyb3cKCSAgICB9Cgl9CglpZiB7ISRoYXNwYWR9IHsKCSAgICBzZXQgbyB7fQoJICAgIGZvciB7c2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIGNvbCAtMV0gPj0gMH0ge30gewoJCXNldCBvIFtsaW5kZXggJG9mZnMgJGNvbF0KCQlpZiB7JG8gZXEge319IHsKCQkgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZAoJCSAgICBzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJICAgIGlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cgPT0gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJCSMgaXQgaXMsIHdvcmsgb3V0IG9mZnNldCB0byBjaGlsZAoJCQlzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCQkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeTBdCgkJCXNldCB4MCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICR5MF0gJGlkXQoJCQlpZiB7JHgwID49IDB9IHsKCQkJICAgIHNldCBvIFtleHByIHskeDAgLSAkY29sfV0KCQkJfQoJCSAgICB9CgkJfQoJCWlmIHskbyBlcSB7fSB8fCAkbyA8PSAwfSBicmVhawoJICAgIH0KCSAgICBpZiB7JG8gbmUge30gJiYgW2luY3IgY29sXSA8IFtsbGVuZ3RoICRpZGxpc3RdfSB7CgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGxzZXQgcm93b2Zmc2V0cyAkeTEgW2luY3JhbmdlICRvZmZzMiAkeDEgMV0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wge31dCgkJc2V0IHRtcCBbbGluc2VydCAkb2ZmcyAkY29sIHt9XQoJCWluY3IgY29sCgkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCAtMV0KCSAgICB9Cgl9Cglsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCglzZXQgY29sIDAKICAgIH0KfQoKcHJvYyB4YyB7cm93IGNvbH0gewogICAgZ2xvYmFsIGNhbnZ4MCBsaW5lc3BjCiAgICByZXR1cm4gW2V4cHIgeyRjYW52eDAgKyAkY29sICogJGxpbmVzcGN9XQp9Cgpwcm9jIHljIHtyb3d9IHsKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudnkwICsgJHJvdyAqICRsaW5lc3BjfV0KfQoKcHJvYyBsaW5ld2lkdGgge2lkfSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUgbHRoaWNrbmVzcwoKICAgIHNldCB3aWQgJGx0aGlja25lc3MKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdICYmICRpZCBlcSAkdGhpY2tlcmxpbmV9IHsKCXNldCB3aWQgW2V4cHIgezIgKiAkbHRoaWNrbmVzc31dCiAgICB9CiAgICByZXR1cm4gJHdpZAp9Cgpwcm9jIHJvd3JhbmdlcyB7aWR9IHsKICAgIGdsb2JhbCBwaGFzZSBpZHJvd3JhbmdlcyBjb21taXRyb3cgcm93bGFpZG91dCByb3dyYW5nZWxpc3QgY3VydmlldwoKICAgIHNldCByYW5nZXMge30KICAgIGlmIHskcGhhc2UgZXEge30gfHwKCShbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCgkgJiYgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDwgJHJvd2xhaWRvdXQpfSB7CglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGlkcm93cmFuZ2VzKCRpZCldfSB7CglzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCiAgICB9CiAgICByZXR1cm4gJHJhbmdlcwp9Cgpwcm9jIGRyYXdsaW5lc2VnIHtpZCBpfSB7CiAgICBnbG9iYWwgcm93b2Zmc2V0cyByb3dpZGxpc3QKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBjYW52IGNvbG9ybWFwIGxpbmVzcGMKICAgIGdsb2JhbCBudW1jb21taXRzIGNvbW1pdHJvdyBjdXJ2aWV3CgogICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KICAgIHNldCBkb3duYXJyb3cgMQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KCSYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRudW1jb21taXRzfSB7CglzZXQgZG93bmFycm93IFtleHByIHskaSA8IFtsbGVuZ3RoICRyYW5nZXNdIC8gMiAtIDF9XQogICAgfSBlbHNlIHsKCXNldCBkb3duYXJyb3cgMQogICAgfQogICAgc2V0IHN0YXJ0cm93IFtsaW5kZXggJHJhbmdlcyBbZXhwciB7MiAqICRpfV1dCiAgICBzZXQgcm93IFtsaW5kZXggJHJhbmdlcyBbZXhwciB7MiAqICRpICsgMX1dXQogICAgaWYgeyRzdGFydHJvdyA9PSAkcm93fSByZXR1cm4KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGNvb3JkcyB7fQogICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KICAgIGlmIHskY29sIDwgMH0gewoJcHV0cyAib29wczogZHJhd2xpbmU6IGlkICRpZCBub3Qgb24gcm93ICRyb3ciCglyZXR1cm4KICAgIH0KICAgIHNldCBsYXN0byB7fQogICAgc2V0IG5zIDAKICAgIHdoaWxlIHsxfSB7CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCWlmIHskbyBlcSB7fX0gYnJlYWsKCWlmIHskbyBuZSAkbGFzdG99IHsKCSAgICAjIGNoYW5naW5nIGRpcmVjdGlvbgoJICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCgkgICAgc2V0IHkgW3ljICRyb3ddCgkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKCSAgICBzZXQgbGFzdG8gJG8KCX0KCWluY3IgY29sICRvCglpbmNyIHJvdyAtMQogICAgfQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgbGFwcGVuZCBjb29yZHMgJHggJHkKICAgIGlmIHskaSA9PSAwfSB7CgkjIGRyYXcgdGhlIGxpbmsgdG8gdGhlIGZpcnN0IGNoaWxkIGFzIHBhcnQgb2YgdGhpcyBsaW5lCglpbmNyIHJvdyAtMQoJc2V0IGNoaWxkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJc2V0IGNjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCglpZiB7JGNjb2wgPj0gMH0gewoJICAgIHNldCB4IFt4YyAkcm93ICRjY29sXQoJICAgIHNldCB5IFt5YyAkcm93XQoJICAgIGlmIHskY2NvbCA8ICRjb2wgLSAxfSB7CgkJbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRjb2wgLSAxfV1dIFt5YyAkcm93XQoJICAgIH0gZWxzZWlmIHskY2NvbCA+ICRjb2wgKyAxfSB7CgkJbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRjb2wgKyAxfV1dIFt5YyAkcm93XQoJICAgIH0KCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRjb29yZHNdIDwgNH0gcmV0dXJuCiAgICBpZiB7JGRvd25hcnJvd30gewoJIyBUaGlzIGxpbmUgaGFzIGFuIGFycm93IGF0IHRoZSBsb3dlciBlbmQ6IGNoZWNrIGlmIHRoZSBhcnJvdyBpcwoJIyBvbiBhIGRpYWdvbmFsIHNlZ21lbnQsIGFuZCBpZiBzbywgd29yayBhcm91bmQgdGhlIFRrIDguNAoJIyByZWZ1c2FsIHRvIGRyYXcgYXJyb3dzIG9uIGRpYWdvbmFsIGxpbmVzLgoJc2V0IHgwIFtsaW5kZXggJGNvb3JkcyAwXQoJc2V0IHgxIFtsaW5kZXggJGNvb3JkcyAyXQoJaWYgeyR4MCAhPSAkeDF9IHsKCSAgICBzZXQgeTAgW2xpbmRleCAkY29vcmRzIDFdCgkgICAgc2V0IHkxIFtsaW5kZXggJGNvb3JkcyAzXQoJICAgIGlmIHskeTAgLSAkeTEgPD0gMiAqICRsaW5lc3BjICYmICR4MSA9PSBbbGluZGV4ICRjb29yZHMgNF19IHsKCQkjIHdlIGhhdmUgYSBuZWFyYnkgdmVydGljYWwgc2VnbWVudCwganVzdCB0cmltIG9mZiB0aGUgZGlhZyBiaXQKCQlzZXQgY29vcmRzIFtscmFuZ2UgJGNvb3JkcyAyIGVuZF0KCSAgICB9IGVsc2UgewoJCXNldCBzbG9wZSBbZXhwciB7KCR4MCAtICR4MSkgLyAoJHkwIC0gJHkxKX1dCgkJc2V0IHhpIFtleHByIHskeDAgLSAkc2xvcGUgKiAkbGluZXNwYyAvIDJ9XQoJCXNldCB5aSBbZXhwciB7JHkwIC0gJGxpbmVzcGMgLyAyfV0KCQlzZXQgY29vcmRzIFtscmVwbGFjZSAkY29vcmRzIDAgMSAkeGkgJHkwICR4aSAkeWldCgkgICAgfQoJfQogICAgfQogICAgc2V0IGFycm93IFtleHByIHsyICogKCRpID4gMCkgKyAkZG93bmFycm93fV0KICAgIHNldCBhcnJvdyBbbGluZGV4IHtub25lIGZpcnN0IGxhc3QgYm90aH0gJGFycm93XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLXdpZHRoIFtsaW5ld2lkdGggJGlkXSBcCgkgICAgICAgLWZpbGwgJGNvbG9ybWFwKCRpZCkgLXRhZ3MgbGluZXMuJGlkIC1hcnJvdyAkYXJyb3ddCiAgICAkY2FudiBsb3dlciAkdAogICAgYmluZGxpbmUgJHQgJGlkCn0KCnByb2MgZHJhd3BhcmVudGxpbmtzIHtpZCByb3cgY29sIG9sZHN9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgY2FudiBjb2xvcm1hcAoKICAgIHNldCByb3cyIFtleHByIHskcm93ICsgMX1dCiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBzZXQgeTIgW3ljICRyb3cyXQogICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvdzJdCiAgICAjIHJteCA9IHJpZ2h0LW1vc3QgWCBjb29yZCB1c2VkCiAgICBzZXQgcm14IDAKICAgIGZvcmVhY2ggcCAkb2xkcyB7CglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkcyAkcF0KCWlmIHskaSA8IDB9IHsKCSAgICBwdXRzICJvb3BzLCBwYXJlbnQgJHAgb2YgJGlkIG5vdCBpbiBsaXN0IgoJICAgIGNvbnRpbnVlCgl9CglzZXQgeDIgW3hjICRyb3cyICRpXQoJaWYgeyR4MiA+ICRybXh9IHsKCSAgICBzZXQgcm14ICR4MgoJfQoJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRwXQoJaWYgeyRyYW5nZXMgbmUge30gJiYgJHJvdzIgPT0gW2xpbmRleCAkcmFuZ2VzIDBdCgkgICAgJiYgJHJvdzIgPCBbbGluZGV4ICRyYW5nZXMgMV19IHsKCSAgICAjIGRyYXdsaW5lc2VnIHdpbGwgZG8gdGhpcyBvbmUgZm9yIHVzCgkgICAgY29udGludWUKCX0KCWFzc2lnbmNvbG9yICRwCgkjIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlZCBwYXJlbnRzIGhlcmUuLi4KCXNldCBjb29yZHMgW2xpc3QgJHggJHldCglpZiB7JGkgPCAkY29sIC0gMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSArIDF9XV0gJHkKCX0gZWxzZWlmIHskaSA+ICRjb2wgKyAxfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpIC0gMX1dXSAkeQoJfQoJbGFwcGVuZCBjb29yZHMgJHgyICR5MgoJc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLXdpZHRoIFtsaW5ld2lkdGggJHBdIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJHApIC10YWdzIGxpbmVzLiRwXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRwCiAgICB9CiAgICByZXR1cm4gJHJteAp9Cgpwcm9jIGRyYXdsaW5lcyB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjYW52CiAgICBnbG9iYWwgaWRyYW5nZWRyYXduCiAgICBnbG9iYWwgY2hpbGRyZW4gaWRkcmF3biBjb21taXRyb3cgcm93aWRsaXN0IGN1cnZpZXcKCiAgICAkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICBzZXQgbnIgW2V4cHIge1tsbGVuZ3RoIFtyb3dyYW5nZXMgJGlkXV0gLyAyfV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG5yfSB7aW5jciBpfSB7CglpZiB7W2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJICAgIGRyYXdsaW5lc2VnICRpZCAkaQoJfQogICAgfQogICAgZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7CglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGNoaWxkKV19IHsKCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKQoJICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCgkgICAgaWYgeyRjb2wgPj0gMH0gewoJCWRyYXdwYXJlbnRsaW5rcyAkY2hpbGQgJHJvdyAkY29sIFtsaXN0ICRpZF0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZHJhd2NtaXR0ZXh0IHtpZCByb3cgY29sIHJteH0gewogICAgZ2xvYmFsIGxpbmVzcGMgY2FudiBjYW52MiBjYW52MyBjYW52eTAgZmdjb2xvcgogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBjb21taXRpbmZvIHJvd2lkbGlzdAogICAgZ2xvYmFsIHJvd3RleHR4IGlkcG9zIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heCBib2xkcm93cyBib2xkbmFtZXJvd3MgZmdjb2xvcgoKICAgIHNldCBvZmlsbCBbZXhwciB7W2xpbmRleCAkY29tbWl0bGlzdGVkICRyb3ddPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkgLSAkb3JhZH1dIFwKCSAgICAgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSBbZXhwciB7JHkgKyAkb3JhZCAtIDF9XSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lICRmZ2NvbG9yIC13aWR0aCAxIC10YWdzIGNpcmNsZV0KICAgICRjYW52IHJhaXNlICR0CiAgICAkY2FudiBiaW5kICR0IDwxPiB7c2VsY2FudmxpbmUge30gJXggJXl9CiAgICBzZXQgeHQgW3hjICRyb3cgW2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXV0KICAgIGlmIHskeHQgPCAkcm14fSB7CglzZXQgeHQgJHJteAogICAgfQogICAgc2V0IHJvd3RleHR4KCRyb3cpICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5XQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV0gfHwgW2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV0KCXx8IFtpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5XQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGZvbnQgJG1haW5mb250CiAgICBzZXQgbmZvbnQgJG1haW5mb250CiAgICBzZXQgaXNib2xkIFtpc2hpZ2hsaWdodGVkICRyb3ddCiAgICBpZiB7JGlzYm9sZCA+IDB9IHsKCWxhcHBlbmQgYm9sZHJvd3MgJHJvdwoJbGFwcGVuZCBmb250IGJvbGQKCWlmIHskaXNib2xkID4gMX0gewoJICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKCSAgICBsYXBwZW5kIG5mb250IGJvbGQKCX0KICAgIH0KICAgIHNldCBsaW5laHRhZygkcm93KSBbJGNhbnYgY3JlYXRlIHRleHQgJHh0ICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJGZvbnQgLXRhZ3MgdGV4dF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRyb3cpIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRyb3cpIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5mb250IC10YWdzIHRleHRdCiAgICBzZXQgbGluZWR0YWcoJHJvdykgWyRjYW52MyBjcmVhdGUgdGV4dCAzICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dF0KICAgIHNldCB4ciBbZXhwciB7JHh0ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJGhlYWRsaW5lXX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9Cn0KCnByb2MgZHJhd2NtaXRyb3cge3Jvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciByb3dpZGxpc3QKICAgIGdsb2JhbCBpZHJhbmdlZHJhd24gaWRkcmF3bgogICAgZ2xvYmFsIGNvbW1pdGluZm8gcGFyZW50bGlzdCBudW1jb21taXRzCiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaW5kc3RyaW5nIG5oaWdobGlnaHRzCiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gcmV0dXJuCiAgICBmb3JlYWNoIGlkIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSB7CglpZiB7JGlkIGVxIHt9fSBjb250aW51ZQoJc2V0IGkgLTEKCWZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCSAgICBpbmNyIGkKCSAgICBpZiB7JHJvdyA8ICRzfSBjb250aW51ZQoJICAgIGlmIHskZSBlcSB7fX0gYnJlYWsKCSAgICBpZiB7JHJvdyA8PSAkZX0gewoJCWlmIHskZSA8ICRudW1jb21taXRzICYmICFbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CgkJICAgIGRyYXdsaW5lc2VnICRpZCAkaQoJCSAgICBzZXQgaWRyYW5nZWRyYXduKCRpZCwkaSkgMQoJCX0KCQlicmVhawoJICAgIH0KCX0KICAgIH0KCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgIVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0gJiYgIVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza2ZpbGVoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHskZmluZHN0cmluZyBuZSB7fSAmJiAhW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgJiYgIVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSByZXR1cm4KICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHsKCXB1dHMgIm9vcHMsIHJvdyAkcm93IGlkICRpZCBub3QgaW4gbGlzdCIKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCiAgICBpZiB7JG9sZHMgbmUge319IHsKCXNldCBybXggW2RyYXdwYXJlbnRsaW5rcyAkaWQgJHJvdyAkY29sICRvbGRzXQogICAgfSBlbHNlIHsKCXNldCBybXggMAogICAgfQogICAgZHJhd2NtaXR0ZXh0ICRpZCAkcm93ICRjb2wgJHJteAogICAgc2V0IGlkZHJhd24oJGlkKSAxCn0KCnByb2MgZHJhd2ZyYWMge2YwIGYxfSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52CiAgICBnbG9iYWwgbGluZXNwYwoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCB5MCBbZXhwciB7aW50KCRmMCAqICR5bWF4KX1dCiAgICBzZXQgcm93IFtleHByIHtpbnQoKCR5MCAtIDMpIC8gJGxpbmVzcGMpIC0gMX1dCiAgICBpZiB7JHJvdyA8IDB9IHsKCXNldCByb3cgMAogICAgfQogICAgc2V0IHkxIFtleHByIHtpbnQoJGYxICogJHltYXgpfV0KICAgIHNldCBlbmRyb3cgW2V4cHIge2ludCgoJHkxIC0gMykgLyAkbGluZXNwYykgKyAxfV0KICAgIGlmIHskZW5kcm93ID49ICRudW1jb21taXRzfSB7CglzZXQgZW5kcm93IFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgZm9yIHt9IHskcm93IDw9ICRlbmRyb3d9IHtpbmNyIHJvd30gewoJZHJhd2NtaXRyb3cgJHJvdwogICAgfQp9Cgpwcm9jIGRyYXd2aXNpYmxlIHt9IHsKICAgIGdsb2JhbCBjYW52CiAgICBldmFsIGRyYXdmcmFjIFskY2FudiB5dmlld10KfQoKcHJvYyBjbGVhcl9kaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBpZGRyYXduIGlkcmFuZ2VkcmF3bgogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgY2F0Y2gge3Vuc2V0IGlkZHJhd259CiAgICBjYXRjaCB7dW5zZXQgaWRyYW5nZWRyYXdufQogICAgY2F0Y2gge3Vuc2V0IHZoaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IHJoaWdobGlnaHRzfQp9Cgpwcm9jIGZpbmRjcm9zc2luZ3Mge2lkfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHBhcmVudGxpc3QgbnVtY29tbWl0cyByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgoKICAgIHNldCBjcm9zcyB7fQogICAgc2V0IGNjcm9zcyB7fQogICAgZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0gewoJaWYgeyRlID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGUgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCgl9CglpZiB7JGUgPD0gJHN9IGNvbnRpbnVlCglzZXQgeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRlXSAkaWRdCglpZiB7JHggPCAwfSB7CgkgICAgcHV0cyAiZmluZGNyb3NzaW5nczogb29wcywgbm8gW3Nob3J0aWRzICRpZF0gaW4gcm93ICRlIgoJICAgIGNvbnRpbnVlCgl9Cglmb3Ige3NldCByb3cgJGV9IHtbaW5jciByb3cgLTFdID49ICRzfSB7fSB7CgkgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQoJICAgIHNldCBraWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCgkgICAgc2V0IGtpZHggW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAka2lkXQoJICAgIGlmIHska2lkeCA8IDB9IGNvbnRpbnVlCgkgICAgc2V0IG5leHRyb3cgW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93ICsgMX1dXQoJICAgIGZvcmVhY2ggcCAkb2xkcyB7CgkJc2V0IHB4IFtsc2VhcmNoIC1leGFjdCAkbmV4dHJvdyAkcF0KCQlpZiB7JHB4IDwgMH0gY29udGludWUKCQlpZiB7KCRraWR4IDwgJHggJiYgJHggPCAkcHgpIHx8ICgkcHggPCAkeCAmJiAkeCA8ICRraWR4KX0gewoJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjY3Jvc3MgJHBdID49IDB9IGNvbnRpbnVlCgkJICAgIGlmIHskeCA9PSAkcHggKyAoJGtpZHggPCAkcHg/IC0xOiAxKX0gewoJCQlsYXBwZW5kIGNjcm9zcyAkcAoJCSAgICB9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjcm9zcyAkcF0gPCAwfSB7CgkJCWxhcHBlbmQgY3Jvc3MgJHAKCQkgICAgfQoJCX0KCSAgICB9CgkgICAgc2V0IGluYyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJHhdCgkgICAgaWYgeyRpbmMgZXEge319IGJyZWFrCgkgICAgaW5jciB4ICRpbmMKCX0KICAgIH0KICAgIHJldHVybiBbY29uY2F0ICRjY3Jvc3Mge3t9fSAkY3Jvc3NdCn0KCnByb2MgYXNzaWduY29sb3Ige2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIGNvbW1pdHJvdyBwYXJlbnRsaXN0IGNoaWxkcmVuIGNoaWxkcmVuIGN1cnZpZXcKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRpZCldfSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCldfSB7CglzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgfSBlbHNlIHsKCXNldCBraWRzIHt9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGtpZHNdID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRraWRzIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgW2xsZW5ndGggW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCldXSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIHNldCBvcmlnYmFkIHt9CiAgICBmb3JlYWNoIHggW2ZpbmRjcm9zc2luZ3MgJGlkXSB7CglpZiB7JHggZXEge319IHsKCSAgICAjIGRlbGltaXRlciBiZXR3ZWVuIGNvcm5lciBjcm9zc2luZ3MgYW5kIG90aGVyIGNyb3NzaW5ncwoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9ycyAtIDF9IGJyZWFrCgkgICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwoJfQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CglzZXQgYmFkY29sb3JzICRvcmlnYmFkCiAgICB9CiAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGtpZHMgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXSB7CgkJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkcCldCgkJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkcCldIDwgMH0gewoJCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHApCgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBiaW5kbGluZSB7dCBpZH0gewogICAgZ2xvYmFsIGNhbnYKCiAgICAkY2FudiBiaW5kICR0IDxFbnRlcj4gImxpbmVlbnRlciAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxNb3Rpb24+ICJsaW5lbW90aW9uICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPExlYXZlPiAibGluZWxlYXZlICRpZCIKICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0xPiAibGluZWNsaWNrICV4ICV5ICRpZCAxIgp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMgbWFpbmhlYWQKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGNvbW1pdHJvdyByb3d0ZXh0eCBjdXJ2aWV3IGZnY29sb3IgYmdjb2xvcgoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByIHskeTEgLSAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgeWIgW2V4cHIgeyR5dCArICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB7CglpbmNyIGkKCWlmIHskaSA+PSAkbnRhZ3MgJiYgJGkgPCAkbnRhZ3MgKyAkbmhlYWRzICYmICR0YWcgZXEgJG1haW5oZWFkfSB7CgkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlIFtjb25jYXQgJG1haW5mb250IGJvbGRdICR0YWddCgl9IGVsc2UgewoJICAgIHNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCX0KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByIHskeCArICRkZWx0YX1dCglzZXQgeHIgW2V4cHIgeyR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzfV0KCXNldCBmb250ICRtYWluZm9udAoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uICR4IFtleHByIHskeXQgKyAkZGVsdGF9XSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgeyR5YiAtICRkZWx0YX1dIFwKCQkgICAgICAgLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWRdCgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgkgICAgc2V0IHJvd3RleHR4KCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CgkJc2V0IGNvbCBncmVlbgoJCWlmIHskdGFnIGVxICRtYWluaGVhZH0gewoJCSAgICBsYXBwZW5kIGZvbnQgYm9sZAoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciB7JHhsIC0gJGRlbHRhLzJ9XQoJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKCQktd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCAkY29sIC10YWdzIHRhZy4kaWQKCSAgICBpZiB7W3JlZ2V4cCB7XihyZW1vdGVzLy4qL3xyZW1vdGVzLyl9ICR0YWcgbWF0Y2ggcmVtb3RlcHJlZml4XX0gewoJICAgICAgICBzZXQgcndpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkcmVtb3RlcHJlZml4XQoJCXNldCB4aSBbZXhwciB7JHggKyAxfV0KCQlzZXQgeXRpIFtleHByIHskeXQgKyAxfV0KCQlzZXQgeHJpIFtleHByIHskeCArICRyd2lkfV0KCQkkY2FudiBjcmVhdGUgcG9seWdvbiAkeGkgJHl0aSAkeHJpICR5dGkgJHhyaSAkeWIgJHhpICR5YiBcCgkJCS13aWR0aCAwIC1maWxsICIjZmZkZGFhIiAtdGFncyB0YWcuJGlkCgkgICAgfQoJfQoJc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgLWZpbGwgJGZnY29sb3IgXAoJCSAgIC1mb250ICRmb250IC10YWdzIFtsaXN0IHRhZy4kaWQgdGV4dF1dCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0gZWxzZWlmIHskbmhlYWRzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMz4gW2xpc3QgaGVhZG1lbnUgJVggJVkgJGlkICR0YWddCgl9CiAgICB9CiAgICByZXR1cm4gJHh0Cn0KCnByb2MgeGNvb3JkIHtpIGxldmVsIGxufSB7CiAgICBnbG9iYWwgY2FudngwIHhzcGMxIHhzcGMyCgogICAgc2V0IHggW2V4cHIgeyRjYW52eDAgKyAkaSAqICR4c3BjMSgkbG4pfV0KICAgIGlmIHskaSA+IDAgJiYgJGkgPT0gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAwLjUgKiAoJHhzcGMyIC0gJHhzcGMxKCRsbikpfV0KICAgIH0gZWxzZWlmIHskaSA+ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgJHhzcGMyIC0gJHhzcGMxKCRsbil9XQogICAgfQogICAgcmV0dXJuICR4Cn0KCnByb2Mgc2hvd19zdGF0dXMge21zZ30gewogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgZmdjb2xvcgoKICAgIGNsZWFyX2Rpc3BsYXkKICAgICRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICRtc2cgLWZvbnQgJG1haW5mb250IFwKCS10YWdzIHRleHQgLWZpbGwgJGZnY29sb3IKfQoKcHJvYyBmaW5pc2hjb21taXRzIHt9IHsKICAgIGdsb2JhbCBjb21taXRpZHggcGhhc2UgY3VydmlldwogICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0CgogICAgaWYgeyRjb21taXRpZHgoJGN1cnZpZXcpID4gMH0gewoJZHJhd3Jlc3QKICAgIH0gZWxzZSB7CglzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKICAgIH0KICAgIHNldCBwaGFzZSB7fQogICAgY2F0Y2gge3Vuc2V0IHBlbmRpbmdfc2VsZWN0fQp9CgojIEluc2VydCBhIG5ldyBjb21taXQgYXMgdGhlIGNoaWxkIG9mIHRoZSBjb21taXQgb24gcm93ICRyb3cuCiMgVGhlIG5ldyBjb21taXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gcm93ICRyb3cgYW5kIHRoZSBjb21taXRzCiMgb24gdGhhdCByb3cgYW5kIGJlbG93IHdpbGwgbW92ZSBkb3duIG9uZSByb3cuCnByb2MgaW5zZXJ0cm93IHtyb3cgbmV3Y21pdH0gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldyByb3dpZGxpc3Qgcm93b2Zmc2V0cyBudW1jb21taXRzCiAgICBnbG9iYWwgcm93cmFuZ2VsaXN0IGlkcm93cmFuZ2VzIHJvd2xhaWRvdXQgcm93b3B0aW0gbnVtY29tbWl0cwogICAgZ2xvYmFsIGxpbmVzZWdlbmRzIHNlbGVjdGVkbGluZQoKICAgIGlmIHskcm93ID49ICRudW1jb21taXRzfSB7CglwdXRzICJvb3BzLCBpbnNlcnRpbmcgbmV3IHJvdyAkcm93IGJ1dCBvbmx5IGhhdmUgJG51bWNvbW1pdHMgcm93cyIKCXJldHVybgogICAgfQogICAgc2V0IHAgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBzZXQgZGlzcGxheW9yZGVyIFtsaW5zZXJ0ICRkaXNwbGF5b3JkZXIgJHJvdyAkbmV3Y21pdF0KICAgIHNldCBwYXJlbnRsaXN0IFtsaW5zZXJ0ICRwYXJlbnRsaXN0ICRyb3cgJHBdCiAgICBzZXQga2lkcyBbbGluZGV4ICRjaGlsZGxpc3QgJHJvd10KICAgIGxhcHBlbmQga2lkcyAkbmV3Y21pdAogICAgbHNldCBjaGlsZGxpc3QgJHJvdyAka2lkcwogICAgc2V0IGNoaWxkbGlzdCBbbGluc2VydCAkY2hpbGRsaXN0ICRyb3cge31dCiAgICBzZXQgY29tbWl0bGlzdGVkIFtsaW5zZXJ0ICRjb21taXRsaXN0ZWQgJHJvdyAxXQogICAgc2V0IGwgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KICAgIGZvciB7c2V0IHIgJHJvd30geyRyIDwgJGx9IHtpbmNyIHJ9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCglzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHIKICAgIH0KCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQogICAgc2V0IG5ld29mZnMge30KICAgIGZvcmVhY2ggeCAkaWRsaXN0IHsKCWlmIHskeCBlcSB7fSB8fCAoJHggZXEgJHAgJiYgW2xsZW5ndGggJGtpZHNdID09IDEpfSB7CgkgICAgbGFwcGVuZCBuZXdvZmZzIHt9Cgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbmV3b2ZmcyAwCgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGtpZHNdID09IDF9IHsKCXNldCBjb2wgW2xzZWFyY2ggLWV4YWN0ICRpZGxpc3QgJHBdCglsc2V0IGlkbGlzdCAkY29sICRuZXdjbWl0CiAgICB9IGVsc2UgewoJc2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XQoJbGFwcGVuZCBpZGxpc3QgJG5ld2NtaXQKCWxhcHBlbmQgb2ZmcyB7fQoJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKICAgIH0KICAgIHNldCByb3dpZGxpc3QgW2xpbnNlcnQgJHJvd2lkbGlzdCAkcm93ICRpZGxpc3RdCiAgICBzZXQgcm93b2Zmc2V0cyBbbGluc2VydCAkcm93b2Zmc2V0cyBbZXhwciB7JHJvdysxfV0gJG5ld29mZnNdCgogICAgc2V0IHJvd3JhbmdlbGlzdCBbbGluc2VydCAkcm93cmFuZ2VsaXN0ICRyb3cge31dCiAgICBzZXQgbCBbbGxlbmd0aCAkcm93cmFuZ2VsaXN0XQogICAgZm9yIHtzZXQgciAwfSB7JHIgPCAkbH0ge2luY3Igcn0gewoJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJHJdCglpZiB7JHJhbmdlcyBuZSB7fSAmJiBbbGluZGV4ICRyYW5nZXMgZW5kXSA+PSAkcm93fSB7CgkgICAgc2V0IG5ld3JhbmdlcyB7fQoJICAgIGZvcmVhY2ggeCAkcmFuZ2VzIHsKCQlpZiB7JHggPj0gJHJvd30gewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyBbZXhwciB7JHggKyAxfV0KCQl9IGVsc2UgewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyAkeAoJCX0KCSAgICB9CgkgICAgbHNldCByb3dyYW5nZWxpc3QgJHIgJG5ld3JhbmdlcwoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA+IDF9IHsKCXNldCBycDEgW2V4cHIgeyRyb3cgKyAxfV0KCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRycDFdCglpZiB7JHJhbmdlcyBlcSB7fX0gewoJICAgIHNldCByYW5nZXMgW2xpc3QgJHJvdyAkcnAxXQoJfSBlbHNlaWYge1tsaW5kZXggJHJhbmdlcyBlbmQtMV0gPT0gJHJwMX0gewoJICAgIGxzZXQgcmFuZ2VzIGVuZC0xICRyb3cKCX0KCWxzZXQgcm93cmFuZ2VsaXN0ICRycDEgJHJhbmdlcwogICAgfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgaWRyb3dyYW5nZXNdIHsKCXNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKCWlmIHskcmFuZ2VzIG5lIHt9ICYmIFtsaW5kZXggJHJhbmdlcyBlbmRdID49ICRyb3d9IHsKCSAgICBzZXQgbmV3cmFuZ2VzIHt9CgkgICAgZm9yZWFjaCB4ICRyYW5nZXMgewoJCWlmIHskeCA+PSAkcm93fSB7CgkJICAgIGxhcHBlbmQgbmV3cmFuZ2VzIFtleHByIHskeCArIDF9XQoJCX0gZWxzZSB7CgkJICAgIGxhcHBlbmQgbmV3cmFuZ2VzICR4CgkJfQoJICAgIH0KCSAgICBzZXQgaWRyb3dyYW5nZXMoJGlkKSAkbmV3cmFuZ2VzCgl9CiAgICB9CgogICAgc2V0IGxpbmVzZWdlbmRzIFtsaW5zZXJ0ICRsaW5lc2VnZW5kcyAkcm93IHt9XQoKICAgIGluY3Igcm93bGFpZG91dAogICAgaW5jciByb3dvcHRpbQogICAgaW5jciBudW1jb21taXRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPj0gJHJvd30gewoJaW5jciBzZWxlY3RlZGxpbmUKICAgIH0KICAgIHJlZGlzcGxheQp9CgojIERvbid0IGNoYW5nZSB0aGUgdGV4dCBwYW5lIGN1cnNvciBpZiBpdCBpcyBjdXJyZW50bHkgdGhlIGhhbmQgY3Vyc29yLAojIHNob3dpbmcgdGhhdCB3ZSBhcmUgb3ZlciBhIHNoYTEgSUQgbGluay4KcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CiAgICBnbG9iYWwgY3RleHQgY3VydGV4dGN1cnNvcgoKICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKCSRjdGV4dCBjb25maWcgLWN1cnNvciAkYwogICAgfQogICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKfQoKcHJvYyBub3didXN5IHt3aGF0fSB7CiAgICBnbG9iYWwgaXNidXN5CgogICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CgkuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCglzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICB9CiAgICBzZXQgaXNidXN5KCR3aGF0KSAxCn0KCnByb2Mgbm90YnVzeSB7d2hhdH0gewogICAgZ2xvYmFsIGlzYnVzeSBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBjYXRjaCB7dW5zZXQgaXNidXN5KCR3aGF0KX0KICAgIGlmIHtbYXJyYXkgbmFtZXMgaXNidXN5XSBlcSB7fX0gewoJLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgogICAgfQp9Cgpwcm9jIGRyYXdyZXN0IHt9IHsKICAgIGdsb2JhbCBzdGFydG1zZWNzCiAgICBnbG9iYWwgcm93bGFpZG91dCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0CgogICAgc2V0IHJvdyAkcm93bGFpZG91dAogICAgbGF5b3V0cm93cyAkcm93bGFpZG91dCAkY29tbWl0aWR4KCRjdXJ2aWV3KSAxCiAgICBsYXlvdXR0YWlsCiAgICBvcHRpbWl6ZV9yb3dzICRyb3cgMCAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgc2hvd3N0dWZmICRjb21taXRpZHgoJGN1cnZpZXcpCiAgICBpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XX0gewoJc2VsZWN0bGluZSAwIDEKICAgIH0KCiAgICBzZXQgZHJhd21zZWNzIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXNlY3N9XQogICAgI2dsb2JhbCBudW1jb21taXRzCiAgICAjcHV0cyAib3ZlcmFsbCAkZHJhd21zZWNzIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgp9Cgpwcm9jIGZpbmRtYXRjaGVzIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KICAgIGlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCXNldCBtYXRjaGVzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lICRmb3VuZHN0cmluZyAkZl0KICAgIH0gZWxzZSB7CglpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJICAgIHNldCBzdHIgW3N0cmluZyB0b2xvd2VyICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgc3RyICRmCgl9CglzZXQgbWF0Y2hlcyB7fQoJc2V0IGkgMAoJd2hpbGUge1tzZXQgaiBbc3RyaW5nIGZpcnN0ICRmb3VuZHN0cmluZyAkc3RyICRpXV0gPj0gMH0gewoJICAgIGxhcHBlbmQgbWF0Y2hlcyBbbGlzdCAkaiBbZXhwciB7JGorJGZvdW5kc3RybGVuLTF9XV0KCSAgICBzZXQgaSBbZXhwciB7JGogKyAkZm91bmRzdHJsZW59XQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCiAgICBnbG9iYWwgbnVtY29tbWl0cyBkaXNwbGF5b3JkZXIgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4gbWF0Y2hzdHJpbmcKICAgIGdsb2JhbCBjb21taXRkYXRhCgogICAgc3RvcGZpbmRwcm9jCiAgICB1bm1hcmttYXRjaGVzCiAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICByZWdzdWIgLWFsbCB7Wyo/XFtcXF19ICRmb3VuZHN0cmluZyB7XFwmfSBtYXRjaHN0cmluZwogICAgc2V0IG1hdGNoc3RyaW5nICIqJG1hdGNoc3RyaW5nKiIKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudHN9CiAgICBzZXQgbCAtMQogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBkICRjb21taXRkYXRhKCRpZCkKCWluY3IgbAoJaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZm91bmRzdHJpbmcgJGRdCgl9IGVsc2VpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAtbm9jYXNlICRtYXRjaHN0cmluZyAkZF0KCX0gZWxzZSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRtYXRjaHN0cmluZyAkZF0KCX0KCWlmIHshJGRvZXNtYXRjaH0gY29udGludWUKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBnZXRjb21taXQgJGlkCgl9CglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglzZXQgZG9lc21hdGNoIDAKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJICAgIGlmIHskbWF0Y2hlcyA9PSB7fX0gY29udGludWUKCSAgICBzZXQgZG9lc21hdGNoIDEKCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52ICRsICRmICRsaW5laHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiQXV0aG9yIn0gewoJCWRyYXdjbWl0cm93ICRsCgkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgkgICAgaWYgeyEkZGlkc2VsICYmICRsID4gJG9sZHNlbH0gewoJCWZpbmRzZWxlY3RsaW5lICRsCgkJc2V0IGRpZHNlbCAxCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRtYXRjaGluZ2xpbmVzID09IHt9fSB7CgliZWxsCiAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lIFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF0KICAgIH0KfQoKcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0gewogICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAogICAgc2VsZWN0bGluZSAkbCAxCiAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cwoJc2V0IGYgWyRjdGV4dCBnZXQgMS4wICRjb21tZW50ZW5kXQoJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCgkgICAgc2V0IGVuZCBbZXhwciB7W2xpbmRleCAkbWF0Y2ggMV0gKyAxfV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGNhdGNoIHt1bnNldCBmaW5kaW5wcm9ncmVzc30KICAgIG5vdGJ1c3kgZmluZAp9CgojIG1hcmsgYSBjb21taXQgYXMgbWF0Y2hpbmcgYnkgcHV0dGluZyBhIHllbGxvdyBiYWNrZ3JvdW5kCiMgYmVoaW5kIHRoZSBoZWFkbGluZQpwcm9jIG1hcmtoZWFkbGluZSB7bCBpZH0gewogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgbGluZWh0YWcKCiAgICBkcmF3Y21pdHJvdyAkbAogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JHN0YXJ0LTF9XV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskZW5kfV1dXQoJc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0IFtleHByIHskeDArJHhvZmZ9XSAkeTAgXAoJCSAgIFtleHByIHskeDArJHhsZW4rMn1dICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIGNvbW1pdF9kZXNjcmlwdG9yIHtwfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CglnZXRjb21taXQgJHAKICAgIH0KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2xsZW5ndGggJGNvbW1pdGluZm8oJHApXSA+IDF9IHsKCXNldCBsIFtsaW5kZXggJGNvbW1pdGluZm8oJHApIDBdCiAgICB9CiAgICByZXR1cm4gIiRwICgkbClcbiIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0IHRhZ3N9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3CgogICAgc2V0IHN0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KICAgICRjdGV4dCBpbnNlcnQgZW5kICR0ZXh0ICR0YWdzCiAgICBzZXQgbGlua3MgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUge1swLTlhLWZdezQwfX0gJHRleHRdCiAgICBmb3JlYWNoIGwgJGxpbmtzIHsKCXNldCBzIFtsaW5kZXggJGwgMF0KCXNldCBlIFtsaW5kZXggJGwgMV0KCXNldCBsaW5raWQgW3N0cmluZyByYW5nZSAkdGV4dCAkcyAkZV0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKV19IGNvbnRpbnVlCglpbmNyIGUKCSRjdGV4dCB0YWcgYWRkIGxpbmsgIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBhZGQgbGluayRsaW5rbnVtICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYmluZCBsaW5rJGxpbmtudW0gPDE+IFwKCSAgICBbbGlzdCBzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCkgMV0KCWluY3IgbGlua251bQogICAgfQogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQp9Cgpwcm9jIHZpZXduZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgY2FudiBsaW5lc3BjCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KICAgIHNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGRpciAqICRsaW5lc3BjfV0KICAgIGlmIHskbmV3dG9wIDwgMH0gewoJc2V0IG5ld3RvcCAwCiAgICB9IGVsc2VpZiB7JG5ld3RvcCA+ICR5bWF4fSB7CglzZXQgbmV3dG9wICR5bWF4CiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCn0KCiMgYWRkIGEgbGlzdCBvZiB0YWcgb3IgYnJhbmNoIG5hbWVzIGF0IHBvc2l0aW9uIHBvcwojIHJldHVybnMgdGhlIG51bWJlciBvZiBuYW1lcyBpbnNlcnRlZApwcm9jIGFwcGVuZHJlZnMge3BvcyB0YWdzIHZhcn0gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdHJvdyBsaW5rbnVtIGN1cnZpZXcgJHZhcgoKICAgIGlmIHtbY2F0Y2ggeyRjdGV4dCBpbmRleCAkcG9zfV19IHsKCXJldHVybiAwCiAgICB9CiAgICBzZXQgdGFncyBbbHNvcnQgJHRhZ3NdCiAgICBzZXQgc2VwIHt9CiAgICBmb3JlYWNoIHRhZyAkdGFncyB7CglzZXQgaWQgW3NldCAkdmFyXCgkdGFnXCldCglzZXQgbGsgbGluayRsaW5rbnVtCglpbmNyIGxpbmtudW0KCSRjdGV4dCBpbnNlcnQgJHBvcyAkc2VwCgkkY3RleHQgaW5zZXJ0ICRwb3MgJHRhZyAkbGsKCSRjdGV4dCB0YWcgY29uZiAkbGsgLWZvcmVncm91bmQgYmx1ZQoJaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDwxPiBcCgkJW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMV0KCSAgICAkY3RleHQgdGFnIGNvbmYgJGxrIC11bmRlcmxpbmUgMQoJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cgl9CglzZXQgc2VwICIsICIKICAgIH0KICAgIHJldHVybiBbbGxlbmd0aCAkdGFnc10KfQoKcHJvYyB0YWdsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCBpZHRhZ3MKCiAgICBzZXQgdGFncyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgbGFwcGVuZCB0YWdzICR0YWcKCX0KICAgIH0KICAgIHJldHVybiAkdGFncwp9CgojIGNhbGxlZCB3aGVuIHdlIGhhdmUgZmluaXNoZWQgY29tcHV0aW5nIHRoZSBuZWFyYnkgdGFncwpwcm9jIGRpc3BuZWFydGFncyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjdGV4dCBhbmNfdGFncyBkZXNjX3RhZ3Mgc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgZGVzY19oZWFkcwoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgISRzaG93bmVhcnRhZ3N9IHJldHVybgogICAgc2V0IGlkICRjdXJyZW50aWQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkaWQpXX0gewoJaWYge1thcHBlbmRyZWZzIGJyYW5jaCAkZGVzY19oZWFkcygkaWQpIGhlYWRpZHNdID4gMX0gewoJICAgICRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHsKCWFwcGVuZHJlZnMgZm9sbG93cyBbdGFnbGlzdCAkYW5jX3RhZ3MoJGlkKV0gdGFnaWRzCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGRlc2NfdGFncygkaWQpXX0gewoJYXBwZW5kcmVmcyBwcmVjZWRlcyBbdGFnbGlzdCAkZGVzY190YWdzKCRpZCldIHRhZ2lkcwogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsZWN0bGluZSB7bCBpc25ld30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY29tbWl0aW5mbyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYyBwYXJlbnRsaXN0IGNoaWxkbGlzdAogICAgZ2xvYmFsIGN1cnJlbnRpZCBzaGExZW50cnkKICAgIGdsb2JhbCBjb21tZW50ZW5kIGlkdGFncyBsaW5rbnVtCiAgICBnbG9iYWwgbWVyZ2VtYXggbnVtY29tbWl0cyBwZW5kaW5nX3NlbGVjdAogICAgZ2xvYmFsIGNtaXRtb2RlIGRlc2NfdGFncyBhbmNfdGFncyBzaG93bmVhcnRhZ3MgYWxsY29tbWl0cyBkZXNjX2hlYWRzCgogICAgY2F0Y2gge3Vuc2V0IHBlbmRpbmdfc2VsZWN0fQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBub3JtYWxsaW5lCiAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKICAgIGlmIHskbCA8IDAgfHwgJGwgPj0gJG51bWNvbW1pdHN9IHJldHVybgogICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCiAgICBzZXQgd2JvdCBbZXhwciB7W2xpbmRleCAkd25vdyAxXSAqICR5bWF4fV0KICAgIHNldCB3aCBbZXhwciB7JHdib3QgLSAkd3RvcH1dCiAgICBzZXQgbmV3dG9wICR3dG9wCiAgICBpZiB7JHl0b3AgPCAkd3RvcH0gewoJaWYgeyR5Ym90IDwgJHd0b3B9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgJHl0b3AKCSAgICBpZiB7JG5ld3RvcCA+ICR3dG9wIC0gJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCAtICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9IGVsc2VpZiB7JHlib3QgPiAkd2JvdH0gewoJaWYgeyR5dG9wID4gJHdib3R9IHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeSAtICR3aCAvIDIuMH1dCgl9IGVsc2UgewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5Ym90IC0gJHdofV0KCSAgICBpZiB7JG5ld3RvcCA8ICR3dG9wICsgJGxpbmVzcGN9IHsKCQlzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRsaW5lc3BjfV0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG5ld3RvcCAhPSAkd3RvcH0gewoJaWYgeyRuZXd0b3AgPCAwfSB7CgkgICAgc2V0IG5ld3RvcCAwCgl9CglhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCglkcmF3dmlzaWJsZQogICAgfQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVodGFnKCRsKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52IGxvd2VyICR0CiAgICAkY2FudjIgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MiBsb3dlciAkdAogICAgJGNhbnYzIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MyBjcmVhdGUgcmVjdCBbJGNhbnYzIGJib3ggJGxpbmVkdGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjMgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjMgbG93ZXIgJHQKCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2VsZWN0bGluZSAkbCAwXQogICAgfQoKICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQogICAgc2V0IGN1cnJlbnRpZCAkaWQKICAgICRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICAkc2hhMWVudHJ5IGluc2VydCAwICRpZAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gZnJvbSAwCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiB0byBlbmQKICAgIHJoaWdobGlnaHRfc2VsICRpZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBzZXQgbGlua251bSAwCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgJGRhdGVcbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gNF1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICAkZGF0ZVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQoKICAgIHNldCBoZWFkZXJzIHt9CiAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXQogICAgaWYge1tsbGVuZ3RoICRvbGRzXSA+IDF9IHsKCXNldCBucCAwCglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGlmIHskbnAgPj0gJG1lcmdlbWF4fSB7CgkJc2V0IHRhZyBtbWF4CgkgICAgfSBlbHNlIHsKCQlzZXQgdGFnIG0kbnAKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDogIiAkdGFnCgkgICAgYXBwZW5kd2l0aGxpbmtzIFtjb21taXRfZGVzY3JpcHRvciAkcF0ge30KCSAgICBpbmNyIG5wCgl9CiAgICB9IGVsc2UgewoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBhcHBlbmQgaGVhZGVycyAiUGFyZW50OiBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdIgoJfQogICAgfQoKICAgIGZvcmVhY2ggYyBbbGluZGV4ICRjaGlsZGxpc3QgJGxdIHsKCWFwcGVuZCBoZWFkZXJzICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY10iCiAgICB9CgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRoZWFkZXJzIHt9CiAgICBpZiB7JHNob3duZWFydGFnc30gewoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHsKCSAgICBnZXRhbGxjb21taXRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiQnJhbmNoOiAiCgkkY3RleHQgbWFyayBzZXQgYnJhbmNoICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBicmFuY2ggbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRpZCldfSB7CgkgICAgaWYge1thcHBlbmRyZWZzIGJyYW5jaCAkZGVzY19oZWFkcygkaWQpIGhlYWRpZHNdID4gMX0gewoJCSMgdHVybiAiQnJhbmNoIiBpbnRvICJCcmFuY2hlcyIKCQkkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCgkgICAgfQoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuRm9sbG93czogIgoJJGN0ZXh0IG1hcmsgc2V0IGZvbGxvd3MgImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGZvbGxvd3MgbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gewoJICAgIGFwcGVuZHJlZnMgZm9sbG93cyBbdGFnbGlzdCAkYW5jX3RhZ3MoJGlkKV0gdGFnaWRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5QcmVjZWRlczogIgoJJGN0ZXh0IG1hcmsgc2V0IHByZWNlZGVzICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBwcmVjZWRlcyBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGRlc2NfdGFncygkaWQpXX0gewoJICAgIGFwcGVuZHJlZnMgcHJlY2VkZXMgW3RhZ2xpc3QgJGRlc2NfdGFncygkaWQpXSB0YWdpZHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIGFwcGVuZHdpdGhsaW5rcyBbbGluZGV4ICRpbmZvIDVdIHtjb21tZW50fQoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICBpbml0X2ZsaXN0ICJDb21tZW50cyIKICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CglnZXR0cmVlICRpZAogICAgfSBlbHNlaWYge1tsbGVuZ3RoICRvbGRzXSA8PSAxfSB7CglzdGFydGRpZmYgJGlkCiAgICB9IGVsc2UgewoJbWVyZ2VkaWZmICRpZCAkbAogICAgfQp9Cgpwcm9jIHNlbGZpcnN0bGluZSB7fSB7CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lIDAgMQp9Cgpwcm9jIHNlbGxhc3RsaW5lIHt9IHsKICAgIGdsb2JhbCBudW1jb21taXRzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbCBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRwYWdlIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKCiAgICBzZXQgbHBwIFtleHByIHsoW3dpbmZvIGhlaWdodCAkY2Fudl0gLSAyKSAvICRsaW5lc3BjfV0KICAgIGlmIHskbHBwIDwgMX0gewoJc2V0IGxwcCAxCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgW2V4cHIgeyRkaXIgKiAkbHBwfV0gdW5pdHMKICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpciAqICRscHB9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfSBlbHNlaWYgeyRsID49ICRudW1jb21taXRzfSB7CiAgICAgICAgc2V0IGwgW2V4cHIgJG51bWNvbW1pdHMgLSAxXQogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkCgogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCBjdXJyZW50aWR9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCiAgICByaGlnaGxpZ2h0X25vbmUKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAp9Cgpwcm9jIHJlc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXggY3VydmlldwoKICAgIHNldCBlbHQgW2xpc3QgJGN1cnZpZXcgJGNtZF0KICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGVsdH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkZWx0XQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkZWx0CiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkudGYuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAudGYuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29kbyB7ZWx0fSB7CiAgICBnbG9iYWwgY3VydmlldwoKICAgIHNldCB2aWV3IFtsaW5kZXggJGVsdCAwXQogICAgc2V0IGNtZCBbbGluZGV4ICRlbHQgMV0KICAgIGlmIHskY3VydmlldyAhPSAkdmlld30gewoJc2hvd3ZpZXcgJHZpZXcKICAgIH0KICAgIGV2YWwgJGNtZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglnb2RvIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCgkudGYuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0gewoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ29mb3J3IHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KCWluY3IgaGlzdG9yeWluZGV4Cglnb2RvICRjbWQKCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4ID49IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdldHRyZWUge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcyBkaWZmbWVyZ2VpZCB0cmVlcGVuZGluZwoKICAgIHNldCBkaWZmaWRzICRpZAogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWZpbGVsaXN0KCRpZCldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBpZiB7W2NhdGNoIHtzZXQgZ3RmIFtvcGVuIFtjb25jYXQgfCBnaXQgbHMtdHJlZSAtciAkaWRdIHJdfV19IHsKCQlyZXR1cm4KCSAgICB9CgkgICAgc2V0IHRyZWVwZW5kaW5nICRpZAoJICAgIHNldCB0cmVlZmlsZWxpc3QoJGlkKSB7fQoJICAgIHNldCB0cmVlaWRsaXN0KCRpZCkge30KCSAgICBmY29uZmlndXJlICRndGYgLWJsb2NraW5nIDAKCSAgICBmaWxlZXZlbnQgJGd0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlbGluZSAkZ3RmICRpZF0KCX0KICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KfQoKcHJvYyBnZXR0cmVlbGluZSB7Z3RmIGlkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgdHJlZXBlbmRpbmcgY21pdG1vZGUgZGlmZmlkcwoKICAgIHdoaWxlIHtbZ2V0cyAkZ3RmIGxpbmVdID49IDB9IHsKCWlmIHtbbGluZGV4ICRsaW5lIDFdIG5lICJibG9iIn0gY29udGludWUKCXNldCBzaGExIFtsaW5kZXggJGxpbmUgMl0KCXNldCBmbmFtZSBbbGluZGV4ICRsaW5lIDNdCglsYXBwZW5kIHRyZWVmaWxlbGlzdCgkaWQpICRmbmFtZQoJbGFwcGVuZCB0cmVlaWRsaXN0KCRpZCkgJHNoYTEKICAgIH0KICAgIGlmIHshW2VvZiAkZ3RmXX0gcmV0dXJuCiAgICBjbG9zZSAkZ3RmCiAgICB1bnNldCB0cmVlcGVuZGluZwogICAgaWYgeyRjbWl0bW9kZSBuZSAidHJlZSJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfQogICAgfSBlbHNlaWYgeyRpZCBuZSAkZGlmZmlkc30gewoJZ2V0dHJlZSAkZGlmZmlkcwogICAgfSBlbHNlIHsKCXNldGZpbGVsaXN0ICRpZAogICAgfQp9Cgpwcm9jIHNob3dmaWxlIHtmfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcwogICAgZ2xvYmFsIGN0ZXh0IGNvbW1lbnRlbmQKCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVmaWxlbGlzdCgkZGlmZmlkcykgJGZdCiAgICBpZiB7JGkgPCAwfSB7CglwdXRzICJvb3BzLCAkZiBub3QgaW4gbGlzdCBmb3IgaWQgJGRpZmZpZHMiCglyZXR1cm4KICAgIH0KICAgIHNldCBibG9iIFtsaW5kZXggJHRyZWVpZGxpc3QoJGRpZmZpZHMpICRpXQogICAgaWYge1tjYXRjaCB7c2V0IGJmIFtvcGVuIFtjb25jYXQgfCBnaXQgY2F0LWZpbGUgYmxvYiAkYmxvYl0gcl19IGVycl19IHsKCXB1dHMgIm9vcHMsIGVycm9yIHJlYWRpbmcgYmxvYiAkYmxvYjogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkYmYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkYmYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmxpbmUgJGJmICRkaWZmaWRzXQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dCAkY29tbWVudGVuZAogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIiRmXG4iIGZpbGVzZXAKICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgeXZpZXcgJGNvbW1lbnRlbmQKfQoKcHJvYyBnZXRibG9ibGluZSB7YmYgaWR9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGNtaXRtb2RlIGN0ZXh0CgogICAgaWYgeyRpZCBuZSAkZGlmZmlkcyB8fCAkY21pdG1vZGUgbmUgInRyZWUifSB7CgljYXRjaCB7Y2xvc2UgJGJmfQoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBub3JtYWwKICAgIHdoaWxlIHtbZ2V0cyAkYmYgbGluZV0gPj0gMH0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCiAgICB9CiAgICBpZiB7W2VvZiAkYmZdfSB7CgkjIGRlbGV0ZSBsYXN0IG5ld2xpbmUKCSRjdGV4dCBkZWxldGUgImVuZCAtIDJjIiAiZW5kIC0gMWMiCgljbG9zZSAkYmYKICAgIH0KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbWVyZ2VkaWZmIHtpZCBsfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZm9wdHMgbWRpZmZmZAogICAgZ2xvYmFsIGRpZmZpZHMKICAgIGdsb2JhbCBwYXJlbnRsaXN0CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgc2V0IGRpZmZpZHMgJGlkCiAgICAjIHRoaXMgZG9lc24ndCBzZWVtIHRvIGFjdHVhbGx5IGFmZmVjdCBhbnl0aGluZy4uLgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLS1jYyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgbWRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIG1lcmdlIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBmY29uZmlndXJlICRtZGYgLWJsb2NraW5nIDAKICAgIHNldCBtZGlmZmZkKCRpZCkgJG1kZgogICAgc2V0IG5wIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdXQogICAgZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZCAkbnBdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7bWRmIGlkIG5wfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgY3RleHQgY2ZsaXN0IG5leHR1cGRhdGUgbWVyZ2VtYXgKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG1kaWZmZmQKCiAgICBzZXQgbiBbZ2V0cyAkbWRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkbWRmXX0gewoJICAgIGNsb3NlICRtZGYKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdIHx8ICRpZCAhPSAkZGlmZm1lcmdlaWQKCXx8ICRtZGYgIT0gJG1kaWZmZmQoJGlkKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1jYyAoLiopfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJbGFwcGVuZCBkaWZmZmlsZXN0YXJ0ICRoZXJlCglhZGRfZmxpc3QgW2xpc3QgJGZuYW1lXQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkZm5hbWUgJHBhZFxuIiBmaWxlc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAfSAkbGluZV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRsaW5lXSB8fCBbcmVnZXhwIHteaW5kZXh9ICRsaW5lXX0gewoJIyBkbyBub3RoaW5nCiAgICB9IGVsc2UgewoJIyBwYXJzZSB0aGUgcHJlZml4IC0gb25lICcgJywgJy0nIG9yICcrJyBmb3IgZWFjaCBwYXJlbnQKCXNldCBzcGFjZXMge30KCXNldCBtaW51c2VzIHt9CglzZXQgcGx1c2VzIHt9CglzZXQgaXNiYWQgMAoJZm9yIHtzZXQgaiAwfSB7JGogPCAkbnB9IHtpbmNyIGp9IHsKCSAgICBzZXQgYyBbc3RyaW5nIHJhbmdlICRsaW5lICRqICRqXQoJICAgIGlmIHskYyA9PSAiICJ9IHsKCQlsYXBwZW5kIHNwYWNlcyAkagoJICAgIH0gZWxzZWlmIHskYyA9PSAiLSJ9IHsKCQlsYXBwZW5kIG1pbnVzZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIisifSB7CgkJbGFwcGVuZCBwbHVzZXMgJGoKCSAgICB9IGVsc2UgewoJCXNldCBpc2JhZCAxCgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgdGFncyB7fQoJc2V0IG51bSB7fQoJaWYgeyEkaXNiYWQgJiYgJG1pbnVzZXMgbmUge30gJiYgJHBsdXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBkb2Vzbid0IGFwcGVhciBpbiByZXN1bHQsIHBhcmVudHMgaW4gJG1pbnVzZXMgaGF2ZSB0aGUgbGluZQoJICAgIHNldCBudW0gW2xpbmRleCAkbWludXNlcyAwXQoJfSBlbHNlaWYgeyEkaXNiYWQgJiYgJHBsdXNlcyBuZSB7fSAmJiAkbWludXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBhcHBlYXJzIGluIHJlc3VsdCwgcGFyZW50cyBpbiAkcGx1c2VzIGRvbid0IGhhdmUgdGhlIGxpbmUKCSAgICBsYXBwZW5kIHRhZ3MgbXJlc3VsdAoJICAgIHNldCBudW0gW2xpbmRleCAkc3BhY2VzIDBdCgl9CglpZiB7JG51bSBuZSB7fX0gewoJICAgIGlmIHskbnVtID49ICRtZXJnZW1heH0gewoJCXNldCBudW0gIm1heCIKCSAgICB9CgkgICAgbGFwcGVuZCB0YWdzIG0kbnVtCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgJHRhZ3MKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQogICAgfQp9Cgpwcm9jIHN0YXJ0ZGlmZiB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGRpZmZpZHMgdHJlZXBlbmRpbmcgZGlmZm1lcmdlaWQKCiAgICBzZXQgZGlmZmlkcyAkaWRzCiAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBnZXR0cmVlZGlmZnMgJGlkcwoJfQogICAgfSBlbHNlIHsKCWFkZHRvY2ZsaXN0ICRpZHMKICAgIH0KfQoKcHJvYyBhZGR0b2NmbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGNmbGlzdAogICAgYWRkX2ZsaXN0ICR0cmVlZGlmZnMoJGlkcykKICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlcGVuZGluZwogICAgc2V0IHRyZWVwZW5kaW5nICRpZHMKICAgIHNldCB0cmVlZGlmZiB7fQogICAgaWYge1tjYXRjaCBcCgkge3NldCBnZHRmIFtvcGVuIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yICRpZHNdIHJdfSBcCgldfSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKICAgIGdsb2JhbCBjbWl0bW9kZQoKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCglzZXQgdHJlZWRpZmZzKCRpZHMpICR0cmVlZGlmZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CgkgICAgZ2V0dHJlZSAkZGlmZmlkcwoJfSBlbHNlaWYgeyRpZHMgIT0gJGRpZmZpZHN9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCQlnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCSAgICB9Cgl9IGVsc2UgewoJICAgIGFkZHRvY2ZsaXN0ICRpZHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkc10KICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJcHV0cyAiZXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgc2V0IGRpZmZpbmhkciAwCiAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKICAgIHNldCBjdXJkaWZmdGFnIENvbW1lbnRzCiAgICBzZXQgY3VydGFnc3RhcnQgMC4wCiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBzZXRpbmxpc3Qge3ZhciBpIHZhbH0gewogICAgZ2xvYmFsICR2YXIKCiAgICB3aGlsZSB7W2xsZW5ndGggW3NldCAkdmFyXV0gPCAkaX0gewoJbGFwcGVuZCAkdmFyIHt9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggW3NldCAkdmFyXV0gPT0gJGl9IHsKCWxhcHBlbmQgJHZhciAkdmFsCiAgICB9IGVsc2UgewoJbHNldCAkdmFyICRpICR2YWwKICAgIH0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgY3VydGFnc3RhcnQgJGhlcmUKCXNldCBoZWFkZXIgJG5ld25hbWUKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGhlcmUKCX0KCWlmIHskbmV3bmFtZSBuZSAkZm5hbWV9IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkbmV3bmFtZV0KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIi0tLSJdID09IDB9IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlaWYgeyRkaWZmaW5oZHIgJiYgW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiKysrIl0gPT0gMH0gewoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlIHsKCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQoJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCSAgICBzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJfSBlbHNlaWYgeyRkaWZmaW5oZHIgfHwgJHggPT0gIlxcIn0gewoJICAgICMgZS5nLiAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9IGVsc2UgewoJICAgICMgU29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplCgkgICAgaWYgeyRjdXJkaWZmdGFnICE9ICJDb21tZW50cyJ9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgkJc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlICJnZXRibG9iZGlmZmxpbmUgJGJkZiB7JGlkc30iCiAgICB9Cn0KCnByb2MgcHJldmZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBwcmV2IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgMF0KICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvcmVhY2ggbG9jICRkaWZmZmlsZXN0YXJ0IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGxvYyA+PSAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJHByZXYKCSAgICByZXR1cm4KCX0KCXNldCBwcmV2ICRsb2MKICAgIH0KICAgICRjdGV4dCB5dmlldyAkcHJldgp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPiAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJGxvYwoJICAgIHJldHVybgoJfQogICAgfQp9Cgpwcm9jIGNsZWFyX2N0ZXh0IHt7Zmlyc3QgMS4wfX0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgJGZpcnN0IC5dIDBdCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya3RvcF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya3RvcC4wXX0gewoJc2V0IHNtYXJrdG9wICRsCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya2JvdF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya2JvdC4wXX0gewoJc2V0IHNtYXJrYm90ICRsCiAgICB9CiAgICAkY3RleHQgZGVsZXRlICRmaXJzdCBlbmQKfQoKcHJvYyBpbmNyc2VhcmNoIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggYW5jaG9yfV19IHsKCSMgbm8gYW5jaG9yIHNldCwgdXNlIHN0YXJ0IG9mIHNlbGVjdGlvbiwgb3Igb2YgdmlzaWJsZSBhcmVhCglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7JHNlYXJjaGRpcm4gZXEgIi1mb3J3YXJkcyJ9IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLDAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KICAgIH0KICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgaGVyZSBbJGN0ZXh0IHNlYXJjaCAkc2VhcmNoZGlybiAtLSAkc2VhcmNoc3RyaW5nIGFuY2hvcl0KCWlmIHskaGVyZSBuZSB7fX0gewoJICAgICRjdGV4dCBzZWUgJGhlcmUKCX0KCXNlYXJjaG1hcmt2aXNpYmxlIDEKICAgIH0KfQoKcHJvYyBkb3NlYXJjaCB7fSB7CiAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgIGZvY3VzICRzc3RyaW5nCiAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAogICAgc2V0IHNlYXJjaGRpcm4gLWZvcndhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgIltsaW5kZXggJHNlbCAwXSArIDFjIgoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CgkgICAgc2V0IHN0YXJ0ICJAMCwwIgoJfQoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQoJJGN0ZXh0IHRhZyByZW1vdmUgc2VsIDEuMCBlbmQKCWlmIHskbWF0Y2ggZXEge319IHsKCSAgICBiZWxsCgkgICAgcmV0dXJuCgl9CgkkY3RleHQgc2VlICRtYXRjaAoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBkb3NlYXJjaGJhY2sge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1iYWNrd2FyZHMKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRzZWwgMF0KCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtYmFja3dhcmRzIC1jb3VudCBtbCAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWwgYyIKCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmsge2ZpcnN0IGxhc3R9IHsKICAgIGdsb2JhbCBjdGV4dCBzZWFyY2hzdHJpbmcKCiAgICBzZXQgbWVuZCAkZmlyc3QuMAogICAgd2hpbGUgezF9IHsKCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRtZW5kICRsYXN0LmVuZF0KCWlmIHskbWF0Y2ggZXEge319IGJyZWFrCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKCSRjdGV4dCB0YWcgYWRkIGZvdW5kICRtYXRjaCAkbWVuZAogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmt2aXNpYmxlIHtkb2FsbH0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IHRvcGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCwwXSAuXSAwXQogICAgc2V0IGJvdGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF1dIC5dIDBdCiAgICBpZiB7JGRvYWxsIHx8ICRib3RsaW5lIDwgJHNtYXJrdG9wIHx8ICR0b3BsaW5lID4gJHNtYXJrYm90fSB7CgkjIG5vIG92ZXJsYXAgd2l0aCBwcmV2aW91cwoJc2VhcmNobWFyayAkdG9wbGluZSAkYm90bGluZQoJc2V0IHNtYXJrdG9wICR0b3BsaW5lCglzZXQgc21hcmtib3QgJGJvdGxpbmUKICAgIH0gZWxzZSB7CglpZiB7JHRvcGxpbmUgPCAkc21hcmt0b3B9IHsKCSAgICBzZWFyY2htYXJrICR0b3BsaW5lIFtleHByIHskc21hcmt0b3AtMX1dCgkgICAgc2V0IHNtYXJrdG9wICR0b3BsaW5lCgl9CglpZiB7JGJvdGxpbmUgPiAkc21hcmtib3R9IHsKCSAgICBzZWFyY2htYXJrIFtleHByIHskc21hcmtib3QrMX1dICRib3RsaW5lCgkgICAgc2V0IHNtYXJrYm90ICRib3RsaW5lCgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsdGV4dCB7ZjAgZjF9IHsKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcKCiAgICAuYmxlZnQuc2Igc2V0ICRmMCAkZjEKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZWFyY2htYXJrdmlzaWJsZSAwCiAgICB9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBzcGFuIFskY2FudiB5dmlld10KICAgIGNsZWFyX2Rpc3BsYXkKICAgIHNldGNhbnZzY3JvbGwKICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICBkcmF3dmlzaWJsZQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQogICAgZ2xvYmFsIHN0b3BwZWQgZW50cmllcwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGNvbW1pdHJvdyB0YWdpZHMgaGVhZGlkcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIGN1cnZpZXcKCiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJHRhZ2lkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJGhlYWRpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3JlYWNoIGkgJGRpc3BsYXlvcmRlciB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkaV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZy9IZWFkIgogICAgfQogICAgZXJyb3JfcG9wdXAgIiR0eXBlICRzaGExc3RyaW5nIGlzIG5vdCBrbm93biIKfQoKcHJvYyBsaW5lZW50ZXIge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjYW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3ZlciBcCgkgICAgICAgLWZvbnQgJG1haW5mb250XQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIGx0aGlja25lc3MKCiAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQogICAgc2V0IHRocmVzaCBbZXhwciB7MiAqICRsdGhpY2tuZXNzICsgNn1dCiAgICBzZXQgbiBbZXhwciB7W2xsZW5ndGggJHJhbmdlc10gLSAxfV0KICAgIGZvciB7c2V0IGkgMX0geyRpIDwgJG59IHtpbmNyIGl9IHsKCXNldCByb3cgW2xpbmRleCAkcmFuZ2VzICRpXQoJaWYge2FicyhbeWMgJHJvd10gLSAkeSkgPCAkdGhyZXNofSB7CgkgICAgcmV0dXJuICRpCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBhcnJvd2p1bXAge2lkIG4geX0gewogICAgZ2xvYmFsIGNhbnYKCiAgICAjIDEgPC0+IDIsIDMgPC0+IDQsIGV0Yy4uLgogICAgc2V0IG4gW2V4cHIgeygoJG4gLSAxKSBeIDEpICsgMX1dCiAgICBzZXQgcm93IFtsaW5kZXggW3Jvd3JhbmdlcyAkaWRdICRuXQogICAgc2V0IHl0IFt5YyAkcm93XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2FudiB0aGlja2VybGluZSBjdXJ2aWV3CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KICAgIHVubWFya21hdGNoZXMKICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGRyYXcgdGhpcyBsaW5lIHRoaWNrZXIgdGhhbiBub3JtYWwKICAgIHNldCB0aGlja2VybGluZSAkaWQKICAgIGRyYXdsaW5lcyAkaWQKICAgIGlmIHskaXNuZXd9IHsKCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCWlmIHskeW1heCBlcSB7fX0gcmV0dXJuCglzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCglzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICB9CiAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQogICAgaWYgeyRkaXJuIG5lIHt9fSB7CglhcnJvd2p1bXAgJGlkICRkaXJuICR5CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQogICAgfQogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKICAgIHNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCiAgICBpZiB7JGtpZHMgbmUge319IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCXNldCBpIDAKCWZvcmVhY2ggY2hpbGQgJGtpZHMgewoJICAgIGluY3IgaQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGNoaWxkKV0gJiYgIVtnZXRjb21taXQgJGNoaWxkXX0gY29udGludWUKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpbml0X2ZsaXN0IHt9Cn0KCnByb2Mgbm9ybWFsbGluZSB7fSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdfSB7CglzZXQgaWQgJHRoaWNrZXJsaW5lCgl1bnNldCB0aGlja2VybGluZQoJZHJhd2xpbmVzICRpZAogICAgfQp9Cgpwcm9jIHNlbGJ5aWQge2lkfSB7CiAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgY29tbWl0cm93IHNlbGVjdGVkbGluZSByb3dtZW51aWQgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0KCXx8ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAiRGlmZiB0aGlzKiIgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgc2VsZWN0ZWQqIiAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAiTWFrZSBwYXRjaCIgLXN0YXRlICRzdGF0ZQogICAgc2V0IHJvd21lbnVpZCAkaWQKICAgIHRrX3BvcHVwICRyb3djdHhtZW51ICR4ICR5Cn0KCnByb2MgZGlmZnZzc2VsIHtkaXJufSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBkaXNwbGF5b3JkZXIKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHskZGlybn0gewoJc2V0IG9sZGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkc2VsZWN0ZWRsaW5lXQoJc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIH0gZWxzZSB7CglzZXQgb2xkaWQgJHJvd21lbnVpZAoJc2V0IG5ld2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkc2VsZWN0ZWRsaW5lXQogICAgfQogICAgYWRkdG9oaXN0b3J5IFtsaXN0IGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkXQogICAgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWQKfQoKcHJvYyBkb3NlbGRpZmYge29sZGlkIG5ld2lkfSB7CiAgICBnbG9iYWwgY3RleHQKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIGluaXRfZmxpc3QgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkb2xkaWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkb2xkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgIgogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRuZXdpZCBbbGlzdCBsaW5rIGxpbmsxXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgIHN0YXJ0ZGlmZiBbbGlzdCAkb2xkaWQgJG5ld2lkXQp9Cgpwcm9jIG1rcGF0Y2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IG9sZGlkICRjdXJyZW50aWQKICAgIHNldCBvbGRoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgc2V0IHRvcCAucGF0Y2gKICAgIHNldCBwYXRjaHRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiR2VuZXJhdGUgcGF0Y2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mcm9tIC10ZXh0ICJGcm9tOiIKICAgIGVudHJ5ICR0b3AuZnJvbXNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKICAgICR0b3AuZnJvbXNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5mcm9tICR0b3AuZnJvbXNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbWhlYWQgaW5zZXJ0IDAgJG9sZGhlYWQKICAgICR0b3AuZnJvbWhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50byAtdGV4dCAiVG86IgogICAgZW50cnkgJHRvcC50b3NoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCiAgICAkdG9wLnRvc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLnRvICR0b3AudG9zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b2hlYWQgaW5zZXJ0IDAgJG5ld2hlYWQKICAgICR0b3AudG9oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CiAgICBidXR0b24gJHRvcC5yZXYgLXRleHQgIlJldmVyc2UiIC1jb21tYW5kIG1rcGF0Y2hyZXYgLXBhZHggNQogICAgZ3JpZCAkdG9wLnJldiB4IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAicGF0Y2gkcGF0Y2hudW0ucGF0Y2giXQogICAgaW5jciBwYXRjaG51bQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rcGF0Y2hjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIG1rcGF0Y2hyZXYge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG9sZGhlYWQgWyRwYXRjaHRvcC5mcm9taGVhZCBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQogICAgZm9yZWFjaCBlIFtsaXN0IGZyb21zaGExIGZyb21oZWFkIHRvc2hhMSB0b2hlYWRdIFwKCSAgICB2IFtsaXN0ICRuZXdpZCAkbmV3aGVhZCAkb2xkaWQgJG9sZGhlYWRdIHsKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKCSRwYXRjaHRvcC4kZSBkZWxldGUgMCBlbmQKCSRwYXRjaHRvcC4kZSBpbnNlcnQgMCAkdgoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICB9Cn0KCnByb2MgbWtwYXRjaGdvIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdCBkaWZmLXRyZWUgLXAgJG9sZGlkICRuZXdpZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyBwYXRjaDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWtwYXRjaGNhbiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rdGFnIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWt0YWd0b3AgY29tbWl0aW5mbwoKICAgIHNldCB0b3AgLm1ha2V0YWcKICAgIHNldCBta3RhZ3RvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIHRhZyIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCiAgICBlbnRyeSAkdG9wLnRhZyAtd2lkdGggNjAKICAgIGdyaWQgJHRvcC50bGFiICR0b3AudGFnIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBta3RhZ2dvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3RhZ2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnRhZwp9Cgpwcm9jIGRvbWt0YWcge30gewogICAgZ2xvYmFsIG1rdGFndG9wIGVudiB0YWdpZHMgaWR0YWdzCgogICAgc2V0IGlkIFskbWt0YWd0b3Auc2hhMSBnZXRdCiAgICBzZXQgdGFnIFskbWt0YWd0b3AudGFnIGdldF0KICAgIGlmIHskdGFnID09IHt9fSB7CgllcnJvcl9wb3B1cCAiTm8gdGFnIG5hbWUgc3BlY2lmaWVkIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkdGFnKV19IHsKCWVycm9yX3BvcHVwICJUYWcgXCIkdGFnXCIgYWxyZWFkeSBleGlzdHMiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbY2F0Y2ggewoJc2V0IGRpciBbZ2l0ZGlyXQoJc2V0IGZuYW1lIFtmaWxlIGpvaW4gJGRpciAicmVmcy90YWdzIiAkdGFnXQoJc2V0IGYgW29wZW4gJGZuYW1lIHddCglwdXRzICRmICRpZAoJY2xvc2UgJGYKICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCB0YWdpZHMoJHRhZykgJGlkCiAgICBsYXBwZW5kIGlkdGFncygkaWQpICR0YWcKICAgIHJlZHJhd3RhZ3MgJGlkCiAgICBhZGRlZHRhZyAkaWQKfQoKcHJvYyByZWRyYXd0YWdzIHtpZH0gewogICAgZ2xvYmFsIGNhbnYgbGluZWh0YWcgY29tbWl0cm93IGlkcG9zIHNlbGVjdGVkbGluZSBjdXJ2aWV3CiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXgKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHJldHVybgogICAgZHJhd2NtaXRyb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgc2V0IHRleHQgWyRjYW52IGl0ZW1jZ2V0ICRsaW5laHRhZygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIC10ZXh0XQogICAgc2V0IHhyIFtleHByIHskeHQgKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF19XQogICAgaWYgeyR4ciA+ICRjYW52eG1heH0gewoJc2V0IGNhbnZ4bWF4ICR4cgoJc2V0Y2FudnNjcm9sbAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdCgkmJiAkc2VsZWN0ZWRsaW5lID09ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBta2JyYW5jaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rYnJ0b3AKCiAgICBzZXQgdG9wIC5tYWtlYnJhbmNoCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIG5ldyBicmFuY2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm5sYWIgLXRleHQgIk5hbWU6IgogICAgZW50cnkgJHRvcC5uYW1lIC13aWR0aCA0MAogICAgZ3JpZCAkdG9wLm5sYWIgJHRvcC5uYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdvIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIFtsaXN0IG1rYnJnbyAkdG9wXQogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgImNhdGNoIHtkZXN0cm95ICR0b3B9IgogICAgZ3JpZCAkdG9wLmJ1dHMuZ28gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AubmFtZQp9Cgpwcm9jIG1rYnJnbyB7dG9wfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IG5hbWUgWyR0b3AubmFtZSBnZXRdCiAgICBzZXQgaWQgWyR0b3Auc2hhMSBnZXRdCiAgICBpZiB7JG5hbWUgZXEge319IHsKCWVycm9yX3BvcHVwICJQbGVhc2Ugc3BlY2lmeSBhIG5hbWUgZm9yIHRoZSBuZXcgYnJhbmNoIgoJcmV0dXJuCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgbm93YnVzeSBuZXdicmFuY2gKICAgIHVwZGF0ZQogICAgaWYge1tjYXRjaCB7CglleGVjIGdpdCBicmFuY2ggJG5hbWUgJGlkCiAgICB9IGVycl19IHsKCW5vdGJ1c3kgbmV3YnJhbmNoCgllcnJvcl9wb3B1cCAkZXJyCiAgICB9IGVsc2UgewoJYWRkZWRoZWFkICRpZCAkbmFtZQoJIyBYWFggc2hvdWxkIHVwZGF0ZSBsaXN0IG9mIGhlYWRzIGRpc3BsYXllZCBmb3Igc2VsZWN0ZWQgY29tbWl0Cglub3RidXN5IG5ld2JyYW5jaAoJcmVkcmF3dGFncyAkaWQKICAgIH0KfQoKcHJvYyBjaGVycnlwaWNrIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VydmlldyBjb21taXRyb3cKICAgIGdsb2JhbCBtYWluaGVhZCBkZXNjX2hlYWRzIGFuY190YWdzIGRlc2NfdGFncyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuCgogICAgaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRyb3dtZW51aWQpXQoJJiYgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRyb3dtZW51aWQpICRtYWluaGVhZF0gPj0gMH0gewoJc2V0IG9rIFtjb25maXJtX3BvcHVwICJDb21taXQgW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgN10gaXMgYWxyZWFkeVwKCQkJaW5jbHVkZWQgaW4gYnJhbmNoICRtYWluaGVhZCAtLSByZWFsbHkgcmUtYXBwbHkgaXQ/Il0KCWlmIHshJG9rfSByZXR1cm4KICAgIH0KICAgIG5vd2J1c3kgY2hlcnJ5cGljawogICAgdXBkYXRlCiAgICBzZXQgb2xkaGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICAjIFVuZm9ydHVuYXRlbHkgZ2l0LWNoZXJyeS1waWNrIHdyaXRlcyBzdHVmZiB0byBzdGRlcnIgZXZlbiB3aGVuCiAgICAjIG5vIGVycm9yIG9jY3VycywgYW5kIGV4ZWMgdGFrZXMgdGhhdCBhcyBhbiBpbmRpY2F0aW9uIG9mIGVycm9yLi4uCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICJnaXQgY2hlcnJ5LXBpY2sgLXIgJHJvd21lbnVpZCAyPiYxIn0gZXJyXX0gewoJbm90YnVzeSBjaGVycnlwaWNrCgllcnJvcl9wb3B1cCAkZXJyCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXdoZWFkIFtleGVjIGdpdCByZXYtcGFyc2UgSEVBRF0KICAgIGlmIHskbmV3aGVhZCBlcSAkb2xkaGVhZH0gewoJbm90YnVzeSBjaGVycnlwaWNrCgllcnJvcl9wb3B1cCAiTm8gY2hhbmdlcyBjb21taXR0ZWQiCglyZXR1cm4KICAgIH0KICAgIHNldCBhbGxwYXJlbnRzKCRuZXdoZWFkKSAkb2xkaGVhZAogICAgbGFwcGVuZCBhbGxjaGlsZHJlbigkb2xkaGVhZCkgJG5ld2hlYWQKICAgIHNldCBkZXNjX2hlYWRzKCRuZXdoZWFkKSAkbWFpbmhlYWQKICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJG9sZGhlYWQpXX0gewoJc2V0IGFuY190YWdzKCRuZXdoZWFkKSAkYW5jX3RhZ3MoJG9sZGhlYWQpCiAgICB9CiAgICBzZXQgZGVzY190YWdzKCRuZXdoZWFkKSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJG9sZGhlYWQpXX0gewoJaW5zZXJ0cm93ICRjb21taXRyb3coJGN1cnZpZXcsJG9sZGhlYWQpICRuZXdoZWFkCglpZiB7JG1haW5oZWFkIG5lIHt9fSB7CgkgICAgbW92ZWRoZWFkICRuZXdoZWFkICRtYWluaGVhZAoJfQoJcmVkcmF3dGFncyAkb2xkaGVhZAoJcmVkcmF3dGFncyAkbmV3aGVhZAogICAgfQogICAgbm90YnVzeSBjaGVycnlwaWNrCn0KCiMgY29udGV4dCBtZW51IGZvciBhIGhlYWQKcHJvYyBoZWFkbWVudSB7eCB5IGlkIGhlYWR9IHsKICAgIGdsb2JhbCBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBoZWFkY3R4bWVudQoKICAgIHNldCBoZWFkbWVudWlkICRpZAogICAgc2V0IGhlYWRtZW51aGVhZCAkaGVhZAogICAgdGtfcG9wdXAgJGhlYWRjdHhtZW51ICR4ICR5Cn0KCnByb2MgY29icmFuY2gge30gewogICAgZ2xvYmFsIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIG1haW5oZWFkIGhlYWRpZHMKCiAgICAjIGNoZWNrIHRoZSB0cmVlIGlzIGNsZWFuIGZpcnN0Pz8KICAgIHNldCBvbGRtYWluaGVhZCAkbWFpbmhlYWQKICAgIG5vd2J1c3kgY2hlY2tvdXQKICAgIHVwZGF0ZQogICAgaWYge1tjYXRjaCB7CglleGVjIGdpdCBjaGVja291dCAkaGVhZG1lbnVoZWFkCiAgICB9IGVycl19IHsKCW5vdGJ1c3kgY2hlY2tvdXQKCWVycm9yX3BvcHVwICRlcnIKICAgIH0gZWxzZSB7Cglub3RidXN5IGNoZWNrb3V0CglzZXQgbWFpbmhlYWQgJGhlYWRtZW51aGVhZAoJaWYge1tpbmZvIGV4aXN0cyBoZWFkaWRzKCRvbGRtYWluaGVhZCldfSB7CgkgICAgcmVkcmF3dGFncyAkaGVhZGlkcygkb2xkbWFpbmhlYWQpCgl9CglyZWRyYXd0YWdzICRoZWFkbWVudWlkCiAgICB9Cn0KCnByb2Mgcm1icmFuY2gge30gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgaGVhZCAkaGVhZG1lbnVoZWFkCiAgICBzZXQgaWQgJGhlYWRtZW51aWQKICAgIGlmIHskaGVhZCBlcSAkbWFpbmhlYWR9IHsKCWVycm9yX3BvcHVwICJDYW5ub3QgZGVsZXRlIHRoZSBjdXJyZW50bHkgY2hlY2tlZC1vdXQgYnJhbmNoIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGRlc2NfaGVhZHMoJGlkKSBlcSAkaGVhZH0gewoJIyB0aGUgc3R1ZmYgb24gdGhpcyBicmFuY2ggaXNuJ3Qgb24gYW55IG90aGVyIGJyYW5jaAoJaWYgeyFbY29uZmlybV9wb3B1cCAiVGhlIGNvbW1pdHMgb24gYnJhbmNoICRoZWFkIGFyZW4ndCBvbiBhbnkgb3RoZXJcCgkJCWJyYW5jaC5cblJlYWxseSBkZWxldGUgYnJhbmNoICRoZWFkPyJdfSByZXR1cm4KICAgIH0KICAgIG5vd2J1c3kgcm1icmFuY2gKICAgIHVwZGF0ZQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgYnJhbmNoIC1EICRoZWFkfSBlcnJdfSB7Cglub3RidXN5IHJtYnJhbmNoCgllcnJvcl9wb3B1cCAkZXJyCglyZXR1cm4KICAgIH0KICAgIHJlbW92ZWRoZWFkICRpZCAkaGVhZAogICAgcmVkcmF3dGFncyAkaWQKICAgIG5vdGJ1c3kgcm1icmFuY2gKfQoKIyBTdHVmZiBmb3IgZmluZGluZyBuZWFyYnkgdGFncwpwcm9jIGdldGFsbGNvbW1pdHMge30gewogICAgZ2xvYmFsIGFsbGNzdGFydCBhbGxjb21taXRzIGFsbGNmZCBhbGxpZHMKCiAgICBzZXQgYWxsaWRzIHt9CiAgICBzZXQgZmQgW29wZW4gW2NvbmNhdCB8IGdpdCByZXYtbGlzdCAtLWFsbCAtLXRvcG8tb3JkZXIgLS1wYXJlbnRzXSByXQogICAgc2V0IGFsbGNmZCAkZmQKICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCiAgICBzZXQgYWxsY29tbWl0cyAicmVhZGluZyIKICAgIG5vd2J1c3kgYWxsY29tbWl0cwogICAgcmVzdGFydGdldGFsbCAkZmQKfQoKcHJvYyBkaXNjYXJkYWxsY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgYWxscGFyZW50cyBhbGxjaGlsZHJlbiBhbGxjb21taXRzIGFsbGNmZAogICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBhbGxkdGFncyB0YWdpc2Rlc2MgYWxsaWRzIGRlc2NfaGVhZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gcmV0dXJuCiAgICBpZiB7JGFsbGNvbW1pdHMgZXEgInJlYWRpbmcifSB7CgljYXRjaCB7Y2xvc2UgJGFsbGNmZH0KICAgIH0KICAgIGZvcmVhY2ggdiB7YWxsY29tbWl0cyBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGFsbGlkcyBkZXNjX3RhZ3MgYW5jX3RhZ3MKCQlhbGxkdGFncyB0YWdpc2Rlc2MgZGVzY19oZWFkc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQp9Cgpwcm9jIHJlc3RhcnRnZXRhbGwge2ZkfSB7CiAgICBnbG9iYWwgYWxsY3N0YXJ0CgogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRhbGxjbGluZXMgJGZkXQogICAgc2V0IGFsbGNzdGFydCBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCn0KCnByb2MgY29tYmluZV9kdGFncyB7bDEgbDJ9IHsKICAgIGdsb2JhbCB0YWdpc2Rlc2Mgbm90Zmlyc3RkCgogICAgc2V0IHJlcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRsMSAkbDJdXQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkcmVzXX0ge2luY3IgaX0gewoJc2V0IHggW2xpbmRleCAkcmVzICRpXQoJZm9yIHtzZXQgaiBbZXhwciB7JGkrMX1dfSB7JGogPCBbbGxlbmd0aCAkcmVzXX0ge30gewoJICAgIHNldCB5IFtsaW5kZXggJHJlcyAkal0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lzZGVzYygkeCwkeSldfSB7CgkJaWYgeyR0YWdpc2Rlc2MoJHgsJHkpID4gMH0gewoJCSAgICAjIHggaXMgYSBkZXNjZW5kZW50IG9mIHksIGV4Y2x1ZGUgeAoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRpICRpXQoJCSAgICBpbmNyIGkgLTEKCQkgICAgYnJlYWsKCQl9IGVsc2UgewoJCSAgICAjIHkgaXMgYSBkZXNjZW5kZW50IG9mIHgsIGV4Y2x1ZGUgeQoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRqICRqXQoJCX0KCSAgICB9IGVsc2UgewoJCSMgbm8gcmVsYXRpb24sIGtlZXAgZ29pbmcKCQlpbmNyIGoKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJHJlcwp9Cgpwcm9jIGNvbWJpbmVfYXRhZ3Mge2wxIGwyfSB7CiAgICBnbG9iYWwgdGFnaXNkZXNjCgogICAgc2V0IHJlcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRsMSAkbDJdXQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkcmVzXX0ge2luY3IgaX0gewoJc2V0IHggW2xpbmRleCAkcmVzICRpXQoJZm9yIHtzZXQgaiBbZXhwciB7JGkrMX1dfSB7JGogPCBbbGxlbmd0aCAkcmVzXX0ge30gewoJICAgIHNldCB5IFtsaW5kZXggJHJlcyAkal0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lzZGVzYygkeCwkeSldfSB7CgkJaWYgeyR0YWdpc2Rlc2MoJHgsJHkpIDwgMH0gewoJCSAgICAjIHggaXMgYW4gYW5jZXN0b3Igb2YgeSwgZXhjbHVkZSB4CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGkgJGldCgkJICAgIGluY3IgaSAtMQoJCSAgICBicmVhawoJCX0gZWxzZSB7CgkJICAgICMgeSBpcyBhbiBhbmNlc3RvciBvZiB4LCBleGNsdWRlIHkKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaiAkal0KCQl9CgkgICAgfSBlbHNlIHsKCQkjIG5vIHJlbGF0aW9uLCBrZWVwIGdvaW5nCgkJaW5jciBqCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBmb3J3YXJkX3Bhc3Mge2lkIGNoaWxkcmVufSB7CiAgICBnbG9iYWwgaWR0YWdzIGRlc2NfdGFncyBpZGhlYWRzIGRlc2NfaGVhZHMgYWxsZHRhZ3MgdGFnaXNkZXNjCgogICAgc2V0IGR0YWdzIHt9CiAgICBzZXQgZGhlYWRzIHt9CiAgICBmb3JlYWNoIGNoaWxkICRjaGlsZHJlbiB7CglpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkY2hpbGQpXX0gewoJICAgIHNldCBjdGFncyBbbGlzdCAkY2hpbGRdCgl9IGVsc2UgewoJICAgIHNldCBjdGFncyAkZGVzY190YWdzKCRjaGlsZCkKCX0KCWlmIHskZHRhZ3MgZXEge319IHsKCSAgICBzZXQgZHRhZ3MgJGN0YWdzCgl9IGVsc2VpZiB7JGN0YWdzIG5lICRkdGFnc30gewoJICAgIHNldCBkdGFncyBbY29tYmluZV9kdGFncyAkZHRhZ3MgJGN0YWdzXQoJfQoJc2V0IGNoZWFkcyAkZGVzY19oZWFkcygkY2hpbGQpCglpZiB7JGRoZWFkcyBlcSB7fX0gewoJICAgIHNldCBkaGVhZHMgJGNoZWFkcwoJfSBlbHNlaWYgeyRjaGVhZHMgbmUgJGRoZWFkc30gewoJICAgIHNldCBkaGVhZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkZGhlYWRzICRjaGVhZHNdXQoJfQogICAgfQogICAgc2V0IGRlc2NfdGFncygkaWQpICRkdGFncwogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBhZHQgJGR0YWdzCglmb3JlYWNoIHRhZyAkZHRhZ3MgewoJICAgIHNldCBhZHQgW2NvbmNhdCAkYWR0ICRhbGxkdGFncygkdGFnKV0KCX0KCXNldCBhZHQgW2xzb3J0IC11bmlxdWUgJGFkdF0KCXNldCBhbGxkdGFncygkaWQpICRhZHQKCWZvcmVhY2ggdGFnICRhZHQgewoJICAgIHNldCB0YWdpc2Rlc2MoJGlkLCR0YWcpIC0xCgkgICAgc2V0IHRhZ2lzZGVzYygkdGFnLCRpZCkgMQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgZGhlYWRzIFtjb25jYXQgJGRoZWFkcyAkaWRoZWFkcygkaWQpXQogICAgfQogICAgc2V0IGRlc2NfaGVhZHMoJGlkKSAkZGhlYWRzCn0KCnByb2MgZ2V0YWxsY2xpbmVzIHtmZH0gewogICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjc3RhcnQKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgaWR0YWdzIHRhZ2lzZGVzYyBhbGxpZHMKICAgIGdsb2JhbCBpZGhlYWRzIHRyYXZpbmRleAoKICAgIHdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0gewoJc2V0IGlkIFtsaW5kZXggJGxpbmUgMF0KCWxhcHBlbmQgYWxsaWRzICRpZAoJc2V0IG9sZHMgW2xyYW5nZSAkbGluZSAxIGVuZF0KCXNldCBhbGxwYXJlbnRzKCRpZCkgJG9sZHMKCWlmIHshW2luZm8gZXhpc3RzIGFsbGNoaWxkcmVuKCRpZCldfSB7CgkgICAgc2V0IGFsbGNoaWxkcmVuKCRpZCkge30KCX0KCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgbGFwcGVuZCBhbGxjaGlsZHJlbigkcCkgJGlkCgl9CgkjIGNvbXB1dGUgbmVhcmVzdCB0YWdnZWQgZGVzY2VuZGVudHMgYXMgd2UgZ28KCSMgYWxzbyBjb21wdXRlIGRlc2NlbmRlbnQgaGVhZHMKCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJGFsbGNzdGFydCA+PSA1MH0gewoJICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUge30KCSAgICBhZnRlciBpZGxlIHJlc3RhcnRnZXRhbGwgJGZkCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBpZiB7W2VvZiAkZmRdfSB7CglzZXQgdHJhdmluZGV4IFtsbGVuZ3RoICRhbGxpZHNdCglzZXQgYWxsY29tbWl0cyAidHJhdmVyc2luZyIKCWFmdGVyIGlkbGUgcmVzdGFydGF0YWdzCglpZiB7W2NhdGNoIHtjbG9zZSAkZmR9IGVycl19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3IgcmVhZGluZyBmdWxsIGNvbW1pdCBncmFwaDogJGVyci5cblwKCQkJIFJlc3VsdHMgbWF5IGJlIGluY29tcGxldGUuIgoJfQogICAgfQp9CgojIHdhbGsgYmFja3dhcmQgdGhyb3VnaCB0aGUgdHJlZSBhbmQgY29tcHV0ZSBuZWFyZXN0IHRhZ2dlZCBhbmNlc3RvcnMKcHJvYyByZXN0YXJ0YXRhZ3Mge30gewogICAgZ2xvYmFsIGFsbGlkcyBhbGxwYXJlbnRzIGlkdGFncyBhbmNfdGFncyB0cmF2aW5kZXgKCiAgICBzZXQgdDAgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IGkgJHRyYXZpbmRleAogICAgd2hpbGUge1tpbmNyIGkgLTFdID49IDB9IHsKCXNldCBpZCBbbGluZGV4ICRhbGxpZHMgJGldCglzZXQgYXRhZ3Mge30KCWZvcmVhY2ggcCAkYWxscGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkcCldfSB7CgkJc2V0IHB0YWdzIFtsaXN0ICRwXQoJICAgIH0gZWxzZSB7CgkJc2V0IHB0YWdzICRhbmNfdGFncygkcCkKCSAgICB9CgkgICAgaWYgeyRhdGFncyBlcSB7fX0gewoJCXNldCBhdGFncyAkcHRhZ3MKCSAgICB9IGVsc2VpZiB7JHB0YWdzIG5lICRhdGFnc30gewoJCXNldCBhdGFncyBbY29tYmluZV9hdGFncyAkYXRhZ3MgJHB0YWdzXQoJICAgIH0KCX0KCXNldCBhbmNfdGFncygkaWQpICRhdGFncwoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkdDAgPj0gNTB9IHsKCSAgICBzZXQgdHJhdmluZGV4ICRpCgkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0YXRhZ3MKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBhbGxjb21taXRzICJkb25lIgogICAgc2V0IHRyYXZpbmRleCAwCiAgICBub3RidXN5IGFsbGNvbW1pdHMKICAgIGRpc3BuZWFydGFncwp9CgojIHVwZGF0ZSB0aGUgZGVzY190YWdzIGFuZCBhbmNfdGFncyBhcnJheXMgZm9yIGEgbmV3IHRhZyBqdXN0IGFkZGVkCnByb2MgYWRkZWR0YWcge2lkfSB7CiAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cwogICAgZ2xvYmFsIGlkdGFncyB0YWdpc2Rlc2MgYWxsZHRhZ3MKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHJldHVybgogICAgc2V0IGFkdCAkZGVzY190YWdzKCRpZCkKICAgIGZvcmVhY2ggdCAkZGVzY190YWdzKCRpZCkgewoJc2V0IGFkdCBbY29uY2F0ICRhZHQgJGFsbGR0YWdzKCR0KV0KICAgIH0KICAgIHNldCBhZHQgW2xzb3J0IC11bmlxdWUgJGFkdF0KICAgIHNldCBhbGxkdGFncygkaWQpICRhZHQKICAgIGZvcmVhY2ggdCAkYWR0IHsKCXNldCB0YWdpc2Rlc2MoJGlkLCR0KSAtMQoJc2V0IHRhZ2lzZGVzYygkdCwkaWQpIDEKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHsKCXNldCB0b2RvICRhbmNfdGFncygkaWQpCgl3aGlsZSB7JHRvZG8gbmUge319IHsKCSAgICBzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQoJICAgIHNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJGlkLCRkbyldfSBjb250aW51ZQoJICAgIHNldCB0YWdpc2Rlc2MoJGRvLCRpZCkgLTEKCSAgICBzZXQgdGFnaXNkZXNjKCRpZCwkZG8pIDEKCSAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRkbyldfSB7CgkJc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYW5jX3RhZ3MoJGRvKV0KCSAgICB9Cgl9CiAgICB9CgogICAgc2V0IGxhc3RvbGQgJGRlc2NfdGFncygkaWQpCiAgICBzZXQgbGFzdG5ldyBbbGlzdCAkaWRdCiAgICBzZXQgbnVwIDAKICAgIHNldCBuY2ggMAogICAgc2V0IHRvZG8gJGFsbHBhcmVudHMoJGlkKQogICAgd2hpbGUgeyR0b2RvIG5lIHt9fSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQoJc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KCWlmIHshW2luZm8gZXhpc3RzIGRlc2NfdGFncygkZG8pXX0gY29udGludWUKCWlmIHskZGVzY190YWdzKCRkbykgbmUgJGxhc3RvbGR9IHsKCSAgICBzZXQgbGFzdG9sZCAkZGVzY190YWdzKCRkbykKCSAgICBzZXQgbGFzdG5ldyBbY29tYmluZV9kdGFncyAkbGFzdG9sZCBbbGlzdCAkaWRdXQoJICAgIGluY3IgbmNoCgl9CglpZiB7JGxhc3RvbGQgZXEgJGxhc3RuZXd9IGNvbnRpbnVlCglzZXQgZGVzY190YWdzKCRkbykgJGxhc3RuZXcKCWluY3IgbnVwCglpZiB7IVtpbmZvIGV4aXN0cyBpZHRhZ3MoJGRvKV19IHsKCSAgICBzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbGxwYXJlbnRzKCRkbyldCgl9CiAgICB9CgogICAgaWYgeyFbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHJldHVybgogICAgc2V0IGxhc3RvbGQgJGFuY190YWdzKCRpZCkKICAgIHNldCBsYXN0bmV3IFtsaXN0ICRpZF0KICAgIHNldCBudXAgMAogICAgc2V0IG5jaCAwCiAgICBzZXQgdG9kbyAkYWxsY2hpbGRyZW4oJGlkKQogICAgd2hpbGUgeyR0b2RvIG5lIHt9fSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQoJc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KCWlmIHshW2luZm8gZXhpc3RzIGFuY190YWdzKCRkbyldfSBjb250aW51ZQoJaWYgeyRhbmNfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CgkgICAgc2V0IGxhc3RvbGQgJGFuY190YWdzKCRkbykKCSAgICBzZXQgbGFzdG5ldyBbY29tYmluZV9hdGFncyAkbGFzdG9sZCBbbGlzdCAkaWRdXQoJICAgIGluY3IgbmNoCgl9CglpZiB7JGxhc3RvbGQgZXEgJGxhc3RuZXd9IGNvbnRpbnVlCglzZXQgYW5jX3RhZ3MoJGRvKSAkbGFzdG5ldwoJaW5jciBudXAKCWlmIHshW2luZm8gZXhpc3RzIGlkdGFncygkZG8pXX0gewoJICAgIHNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFsbGNoaWxkcmVuKCRkbyldCgl9CiAgICB9Cn0KCiMgdXBkYXRlIHRoZSBkZXNjX2hlYWRzIGFycmF5IGZvciBhIG5ldyBoZWFkIGp1c3QgYWRkZWQKcHJvYyBhZGRlZGhlYWQge2hpZCBoZWFkfSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBhbGxwYXJlbnRzIGhlYWRpZHMgaWRoZWFkcwoKICAgIHNldCBoZWFkaWRzKCRoZWFkKSAkaGlkCiAgICBsYXBwZW5kIGlkaGVhZHMoJGhpZCkgJGhlYWQKCiAgICBzZXQgdG9kbyBbbGlzdCAkaGlkXQogICAgd2hpbGUgeyR0b2RvIG5lIHt9fSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQoJc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KCWlmIHshW2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGRvKV0gfHwKCSAgICBbbHNlYXJjaCAtZXhhY3QgJGRlc2NfaGVhZHMoJGRvKSAkaGVhZF0gPj0gMH0gY29udGludWUKCXNldCBvbGRoZWFkcyAkZGVzY19oZWFkcygkZG8pCglsYXBwZW5kIGRlc2NfaGVhZHMoJGRvKSAkaGVhZAoJc2V0IGhlYWRzICRkZXNjX2hlYWRzKCRkbykKCXdoaWxlIHsxfSB7CgkgICAgc2V0IHAgJGFsbHBhcmVudHMoJGRvKQoJICAgIGlmIHtbbGxlbmd0aCAkcF0gIT0gMSB8fCAhW2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJHApXSB8fAoJCSRkZXNjX2hlYWRzKCRwKSBuZSAkb2xkaGVhZHN9IGJyZWFrCgkgICAgc2V0IGRvICRwCgkgICAgc2V0IGRlc2NfaGVhZHMoJGRvKSAkaGVhZHMKCX0KCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJHBdCiAgICB9Cn0KCiMgdXBkYXRlIHRoZSBkZXNjX2hlYWRzIGFycmF5IGZvciBhIGhlYWQganVzdCByZW1vdmVkCnByb2MgcmVtb3ZlZGhlYWQge2hpZCBoZWFkfSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBhbGxwYXJlbnRzIGhlYWRpZHMgaWRoZWFkcwoKICAgIHVuc2V0IGhlYWRpZHMoJGhlYWQpCiAgICBpZiB7JGlkaGVhZHMoJGhpZCkgZXEgJGhlYWR9IHsKCXVuc2V0IGlkaGVhZHMoJGhpZCkKICAgIH0gZWxzZSB7CglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkaGVhZHMoJGhpZCkgJGhlYWRdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldCBpZGhlYWRzKCRoaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkaGlkKSAkaSAkaV0KCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbGlzdCAkaGlkXQogICAgd2hpbGUgeyR0b2RvIG5lIHt9fSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAwXQoJc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KCWlmIHshW2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGRvKV19IGNvbnRpbnVlCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGRlc2NfaGVhZHMoJGRvKSAkaGVhZF0KCWlmIHskaSA8IDB9IGNvbnRpbnVlCglzZXQgb2xkaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQoJc2V0IGhlYWRzIFtscmVwbGFjZSAkZGVzY19oZWFkcygkZG8pICRpICRpXQoJd2hpbGUgezF9IHsKCSAgICBzZXQgZGVzY19oZWFkcygkZG8pICRoZWFkcwoJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKCSAgICBpZiB7W2xsZW5ndGggJHBdICE9IDEgfHwgIVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRwKV0gfHwKCQkkZGVzY19oZWFkcygkcCkgbmUgJG9sZGhlYWRzfSBicmVhawoJICAgIHNldCBkbyAkcAoJfQoJc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkcF0KICAgIH0KfQoKIyB1cGRhdGUgdGhpbmdzIGZvciBhIGhlYWQgbW92ZWQgdG8gYSBjaGlsZCBvZiBpdHMgcHJldmlvdXMgbG9jYXRpb24KcHJvYyBtb3ZlZGhlYWQge2lkIG5hbWV9IHsKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgb2xkaWQgJGhlYWRpZHMoJG5hbWUpCiAgICBzZXQgaGVhZGlkcygkbmFtZSkgJGlkCiAgICBpZiB7JGlkaGVhZHMoJG9sZGlkKSBlcSAkbmFtZX0gewoJdW5zZXQgaWRoZWFkcygkb2xkaWQpCiAgICB9IGVsc2UgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRvbGRpZCkgJG5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldCBpZGhlYWRzKCRvbGRpZCkgW2xyZXBsYWNlICRpZGhlYWRzKCRvbGRpZCkgJGkgJGldCgl9CiAgICB9CiAgICBsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQp9Cgpwcm9jIGNoYW5nZWRyZWZzIHt9IHsKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGRlc2NfdGFncyBhbmNfdGFncyBhbGxjb21taXRzIGFsbGlkcwogICAgZ2xvYmFsIGFsbGNoaWxkcmVuIGFsbHBhcmVudHMgaWR0YWdzIHRyYXZpbmRleAoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbGNvbW1pdHNdfSByZXR1cm4KICAgIGNhdGNoIHt1bnNldCBkZXNjX2hlYWRzfQogICAgY2F0Y2gge3Vuc2V0IGRlc2NfdGFnc30KICAgIGNhdGNoIHt1bnNldCBhbmNfdGFnc30KICAgIGNhdGNoIHt1bnNldCBhbGxkdGFnc30KICAgIGNhdGNoIHt1bnNldCB0YWdpc2Rlc2N9CiAgICBmb3JlYWNoIGlkICRhbGxpZHMgewoJZm9yd2FyZF9wYXNzICRpZCAkYWxsY2hpbGRyZW4oJGlkKQogICAgfQogICAgaWYgeyRhbGxjb21taXRzIG5lICJyZWFkaW5nIn0gewoJc2V0IHRyYXZpbmRleCBbbGxlbmd0aCAkYWxsaWRzXQoJaWYgeyRhbGxjb21taXRzIG5lICJ0cmF2ZXJzaW5nIn0gewoJICAgIHNldCBhbGxjb21taXRzICJ0cmF2ZXJzaW5nIgoJICAgIGFmdGVyIGlkbGUgcmVzdGFydGF0YWdzCgl9CiAgICB9Cn0KCnByb2MgcmVyZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMgbWFpbmhlYWQKCiAgICBzZXQgcmVmaWRzIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCSAgICBbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV19IHsKCSAgICBzZXQgcmVmKCRpZCkgW2xpc3RyZWZzICRpZF0KCX0KICAgIH0KICAgIHNldCBvbGRtYWluaGVhZCAkbWFpbmhlYWQKICAgIHJlYWRyZWZzCiAgICBjaGFuZ2VkcmVmcwogICAgc2V0IHJlZmlkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRyZWZpZHMgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJc2V0IHYgW2xpc3RyZWZzICRpZF0KCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHYgfHwKCSAgICAoJGlkIGVxICRvbGRtYWluaGVhZCAmJiAkaWQgbmUgJG1haW5oZWFkKSB8fAoJICAgICgkaWQgZXEgJG1haW5oZWFkICYmICRpZCBuZSAkb2xkbWFpbmhlYWQpfSB7CgkgICAgcmVkcmF3dGFncyAkaWQKCX0KICAgIH0KfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyBzaG93dGFnIHt0YWcgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0IHt9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGluaXRfZmxpc3Qge30KfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgc2F2ZXN0dWZmIC4KICAgIGRlc3Ryb3kgLgp9Cgpwcm9jIGRvcHJlZnMge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgYmdjb2xvciBmZ2NvbG9yIGN0ZXh0IGRpZmZjb2xvcnMKCiAgICBzZXQgdG9wIC5naXRrcHJlZnMKICAgIHNldCBwcmVmc3RvcCAkdG9wCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30gewoJc2V0IG9sZHByZWZzKCR2KSBbc2V0ICR2XQogICAgfQogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAiR2l0ayBwcmVmZXJlbmNlcyIKICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5sZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5zcGFjZXIgLXRleHQgIiAiCiAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4d2lkdGggLWZyb20gMCAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4d2lkdGgKICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubWF4cGN0bCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAoJSBvZiBwYW5lKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAogICAgZ3JpZCB4ICR0b3AubWF4cGN0bCAkdG9wLm1heHBjdCAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5kZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCgktZm9udCBvcHRpb25mb250CiAgICBlbnRyeSAkdG9wLmRpZmZvcHQgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZGlmZm9wdHMKICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AubnRhZwogICAgbGFiZWwgJHRvcC5udGFnLmwgLXRleHQgIkRpc3BsYXkgbmVhcmJ5IHRhZ3MiIC1mb250IG9wdGlvbmZvbnQKICAgIGNoZWNrYnV0dG9uICR0b3AubnRhZy5iIC12YXJpYWJsZSBzaG93bmVhcnRhZ3MKICAgIHBhY2sgJHRvcC5udGFnLmIgJHRvcC5udGFnLmwgLXNpZGUgbGVmdAogICAgZ3JpZCB4ICR0b3AubnRhZyAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmNkaXNwIC10ZXh0ICJDb2xvcnM6IHByZXNzIHRvIGNob29zZSIKICAgIGdyaWQgJHRvcC5jZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5iZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGJnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmJnYnV0IC10ZXh0ICJCYWNrZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGJnY29sb3IgMCAkdG9wLmJnIGJhY2tncm91bmQgc2V0YmddCiAgICBncmlkIHggJHRvcC5iZ2J1dCAkdG9wLmJnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5mZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGZnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmZnYnV0IC10ZXh0ICJGb3JlZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGZnY29sb3IgMCAkdG9wLmZnIGZvcmVncm91bmQgc2V0ZmddCiAgICBncmlkIHggJHRvcC5mZ2J1dCAkdG9wLmZnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmb2xkIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICBidXR0b24gJHRvcC5kaWZmb2xkYnV0IC10ZXh0ICJEaWZmOiBvbGQgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAwICR0b3AuZGlmZm9sZCAiZGlmZiBvbGQgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm9sZGJ1dCAkdG9wLmRpZmZvbGQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRpZmZuZXcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgIGJ1dHRvbiAkdG9wLmRpZmZuZXdidXQgLXRleHQgIkRpZmY6IG5ldyBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDEgJHRvcC5kaWZmbmV3ICJkaWZmIG5ldyBsaW5lcyIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5kaWZmbmV3YnV0ICR0b3AuZGlmZm5ldyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuaHVua3NlcCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgYnV0dG9uICR0b3AuaHVua3NlcGJ1dCAtdGV4dCAiRGlmZjogaHVuayBoZWFkZXIiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAyICR0b3AuaHVua3NlcCBcCgkJICAgICAgImRpZmYgaHVuayBoZWFkZXIiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5odW5rc2VwYnV0ICR0b3AuaHVua3NlcCAtc3RpY2t5IHcKCiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBwcmVmc2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC0gLXBhZHkgMTAgLXN0aWNreSBldwp9Cgpwcm9jIGNob29zZWNvbG9yIHt2IHZpIHcgeCBjbWR9IHsKICAgIGdsb2JhbCAkdgoKICAgIHNldCBjIFt0a19jaG9vc2VDb2xvciAtaW5pdGlhbGNvbG9yIFtsaW5kZXggW3NldCAkdl0gJHZpXSBcCgkgICAgICAgLXRpdGxlICJHaXRrOiBjaG9vc2UgY29sb3IgZm9yICR4Il0KICAgIGlmIHskYyBlcSB7fX0gcmV0dXJuCiAgICAkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICBsc2V0ICR2ICR2aSAkYwogICAgZXZhbCAkY21kICRjCn0KCnByb2Mgc2V0Ymcge2N9IHsKICAgIGdsb2JhbCBiZ2xpc3QKCiAgICBmb3JlYWNoIHcgJGJnbGlzdCB7CgkkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICB9Cn0KCnByb2Mgc2V0Zmcge2N9IHsKICAgIGdsb2JhbCBmZ2xpc3QgY2FudgoKICAgIGZvcmVhY2ggdyAkZmdsaXN0IHsKCSR3IGNvbmYgLWZvcmVncm91bmQgJGMKICAgIH0KICAgIGFsbGNhbnZzIGl0ZW1jb25mIHRleHQgLWZpbGwgJGMKICAgICRjYW52IGl0ZW1jb25mIGNpcmNsZSAtb3V0bGluZSAkYwp9Cgpwcm9jIHByZWZzY2FuIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCiAgICBpZiB7JG1heHdpZHRoICE9ICRvbGRwcmVmcyhtYXh3aWR0aCkKCXx8ICRtYXhncmFwaHBjdCAhPSAkb2xkcHJlZnMobWF4Z3JhcGhwY3QpfSB7CglyZWRpc3BsYXkKICAgIH0gZWxzZWlmIHskc2hvd25lYXJ0YWdzICE9ICRvbGRwcmVmcyhzaG93bmVhcnRhZ3MpfSB7CglyZXNlbGVjdGxpbmUKICAgIH0KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICByZXR1cm4gW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCn0KCiMgVGhpcyBsaXN0IG9mIGVuY29kaW5nIG5hbWVzIGFuZCBhbGlhc2VzIGlzIGRpc3RpbGxlZCBmcm9tCiMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy4KIyBOb3QgYWxsIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCBieSBUY2wuCnNldCBlbmNvZGluZ19hbGlhc2VzIHsKICAgIHsgQU5TSV9YMy40LTE5NjggaXNvLWlyLTYgQU5TSV9YMy40LTE5ODYgSVNPXzY0Ni5pcnY6MTk5MSBBU0NJSQogICAgICBJU082NDYtVVMgVVMtQVNDSUkgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVVRGLTEgY3NJU08xMDY0NlVURjEgfQogICAgeyBJU09fNjQ2LmJhc2ljOjE5ODMgcmVmIGNzSVNPNjQ2YmFzaWMxOTgzIH0KICAgIHsgSU5WQVJJQU5UIGNzSU5WQVJJQU5UIH0KICAgIHsgSVNPXzY0Ni5pcnY6MTk4MyBpc28taXItMiBpcnYgY3NJU08ySW50bFJlZlZlcnNpb24gfQogICAgeyBCU180NzMwIGlzby1pci00IElTTzY0Ni1HQiBnYiB1ayBjc0lTTzRVbml0ZWRLaW5nZG9tIH0KICAgIHsgTkFUUy1TRUZJIGlzby1pci04LTEgY3NOQVRTU0VGSSB9CiAgICB7IE5BVFMtU0VGSS1BREQgaXNvLWlyLTgtMiBjc05BVFNTRUZJQUREIH0KICAgIHsgTkFUUy1EQU5PIGlzby1pci05LTEgY3NOQVRTREFOTyB9CiAgICB7IE5BVFMtREFOTy1BREQgaXNvLWlyLTktMiBjc05BVFNEQU5PQUREIH0KICAgIHsgU0VOXzg1MDIwMF9CIGlzby1pci0xMCBGSSBJU082NDYtRkkgSVNPNjQ2LVNFIHNlIGNzSVNPMTBTd2VkaXNoIH0KICAgIHsgU0VOXzg1MDIwMF9DIGlzby1pci0xMSBJU082NDYtU0UyIHNlMiBjc0lTTzExU3dlZGlzaEZvck5hbWVzIH0KICAgIHsgS1NfQ181NjAxLTE5ODcgaXNvLWlyLTE0OSBLU19DXzU2MDEtMTk4OSBLU0NfNTYwMSBrb3JlYW4gY3NLU0M1NjAxMTk4NyB9CiAgICB7IElTTy0yMDIyLUtSIGNzSVNPMjAyMktSIH0KICAgIHsgRVVDLUtSIGNzRVVDS1IgfQogICAgeyBJU08tMjAyMi1KUCBjc0lTTzIwMjJKUCB9CiAgICB7IElTTy0yMDIyLUpQLTIgY3NJU08yMDIySlAyIH0KICAgIHsgSklTX0M2MjIwLTE5NjktanAgSklTX0M2MjIwLTE5NjkgaXNvLWlyLTEzIGthdGFrYW5hIHgwMjAxLTcKICAgICAgY3NJU08xM0pJU0M2MjIwanAgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1ybyBpc28taXItMTQganAgSVNPNjQ2LUpQIGNzSVNPMTRKSVNDNjIyMHJvIH0KICAgIHsgSVQgaXNvLWlyLTE1IElTTzY0Ni1JVCBjc0lTTzE1SXRhbGlhbiB9CiAgICB7IFBUIGlzby1pci0xNiBJU082NDYtUFQgY3NJU08xNlBvcnR1Z3Vlc2UgfQogICAgeyBFUyBpc28taXItMTcgSVNPNjQ2LUVTIGNzSVNPMTdTcGFuaXNoIH0KICAgIHsgZ3JlZWs3LW9sZCBpc28taXItMTggY3NJU08xOEdyZWVrN09sZCB9CiAgICB7IGxhdGluLWdyZWVrIGlzby1pci0xOSBjc0lTTzE5TGF0aW5HcmVlayB9CiAgICB7IERJTl82NjAwMyBpc28taXItMjEgZGUgSVNPNjQ2LURFIGNzSVNPMjFHZXJtYW4gfQogICAgeyBORl9aXzYyLTAxMF8oMTk3MykgaXNvLWlyLTI1IElTTzY0Ni1GUjEgY3NJU08yNUZyZW5jaCB9CiAgICB7IExhdGluLWdyZWVrLTEgaXNvLWlyLTI3IGNzSVNPMjdMYXRpbkdyZWVrMSB9CiAgICB7IElTT181NDI3IGlzby1pci0zNyBjc0lTTzU0MjdDeXJpbGxpYyB9CiAgICB7IEpJU19DNjIyNi0xOTc4IGlzby1pci00MiBjc0lTTzQySklTQzYyMjYxOTc4IH0KICAgIHsgQlNfdmlld2RhdGEgaXNvLWlyLTQ3IGNzSVNPNDdCU1ZpZXdkYXRhIH0KICAgIHsgSU5JUyBpc28taXItNDkgY3NJU080OUlOSVMgfQogICAgeyBJTklTLTggaXNvLWlyLTUwIGNzSVNPNTBJTklTOCB9CiAgICB7IElOSVMtY3lyaWxsaWMgaXNvLWlyLTUxIGNzSVNPNTFJTklTQ3lyaWxsaWMgfQogICAgeyBJU09fNTQyNzoxOTgxIGlzby1pci01NCBJU081NDI3Q3lyaWxsaWMxOTgxIH0KICAgIHsgSVNPXzU0Mjg6MTk4MCBpc28taXItNTUgY3NJU081NDI4R3JlZWsgfQogICAgeyBHQl8xOTg4LTgwIGlzby1pci01NyBjbiBJU082NDYtQ04gY3NJU081N0dCMTk4OCB9CiAgICB7IEdCXzIzMTItODAgaXNvLWlyLTU4IGNoaW5lc2UgY3NJU081OEdCMjMxMjgwIH0KICAgIHsgTlNfNDU1MS0xIGlzby1pci02MCBJU082NDYtTk8gbm8gY3NJU082MERhbmlzaE5vcndlZ2lhbgogICAgICBjc0lTTzYwTm9yd2VnaWFuMSB9CiAgICB7IE5TXzQ1NTEtMiBJU082NDYtTk8yIGlzby1pci02MSBubzIgY3NJU082MU5vcndlZ2lhbjIgfQogICAgeyBORl9aXzYyLTAxMCBpc28taXItNjkgSVNPNjQ2LUZSIGZyIGNzSVNPNjlGcmVuY2ggfQogICAgeyB2aWRlb3RleC1zdXBwbCBpc28taXItNzAgY3NJU083MFZpZGVvdGV4U3VwcDEgfQogICAgeyBQVDIgaXNvLWlyLTg0IElTTzY0Ni1QVDIgY3NJU084NFBvcnR1Z3Vlc2UyIH0KICAgIHsgRVMyIGlzby1pci04NSBJU082NDYtRVMyIGNzSVNPODVTcGFuaXNoMiB9CiAgICB7IE1TWl83Nzk1LjMgaXNvLWlyLTg2IElTTzY0Ni1IVSBodSBjc0lTTzg2SHVuZ2FyaWFuIH0KICAgIHsgSklTX0M2MjI2LTE5ODMgaXNvLWlyLTg3IHgwMjA4IEpJU19YMDIwOC0xOTgzIGNzSVNPODdKSVNYMDIwOCB9CiAgICB7IGdyZWVrNyBpc28taXItODggY3NJU084OEdyZWVrNyB9CiAgICB7IEFTTU9fNDQ5IElTT185MDM2IGFyYWJpYzcgaXNvLWlyLTg5IGNzSVNPODlBU01PNDQ5IH0KICAgIHsgaXNvLWlyLTkwIGNzSVNPOTAgfQogICAgeyBKSVNfQzYyMjktMTk4NC1hIGlzby1pci05MSBqcC1vY3ItYSBjc0lTTzkxSklTQzYyMjkxOTg0YSB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWIgaXNvLWlyLTkyIElTTzY0Ni1KUC1PQ1ItQiBqcC1vY3ItYgogICAgICBjc0lTTzkySklTQzYyOTkxOTg0YiB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWItYWRkIGlzby1pci05MyBqcC1vY3ItYi1hZGQgY3NJU085M0pJUzYyMjkxOTg0YmFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQgaXNvLWlyLTk0IGpwLW9jci1oYW5kIGNzSVNPOTRKSVM2MjI5MTk4NGhhbmQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCBpc28taXItOTUganAtb2NyLWhhbmQtYWRkCiAgICAgIGNzSVNPOTVKSVM2MjI5MTk4NGhhbmRhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1rYW5hIGlzby1pci05NiBjc0lTTzk2SklTQzYyMjkxOTg0a2FuYSB9CiAgICB7IElTT18yMDMzLTE5ODMgaXNvLWlyLTk4IGUxM2IgY3NJU08yMDMzIH0KICAgIHsgQU5TSV9YMy4xMTAtMTk4MyBpc28taXItOTkgQ1NBX1Q1MDAtMTk4MyBOQVBMUFMgY3NJU085OU5BUExQUyB9CiAgICB7IElTT184ODU5LTE6MTk4NyBpc28taXItMTAwIElTT184ODU5LTEgSVNPLTg4NTktMSBsYXRpbjEgbDEgSUJNODE5CiAgICAgIENQODE5IGNzSVNPTGF0aW4xIH0KICAgIHsgSVNPXzg4NTktMjoxOTg3IGlzby1pci0xMDEgSVNPXzg4NTktMiBJU08tODg1OS0yIGxhdGluMiBsMiBjc0lTT0xhdGluMiB9CiAgICB7IFQuNjEtN2JpdCBpc28taXItMTAyIGNzSVNPMTAyVDYxN2JpdCB9CiAgICB7IFQuNjEtOGJpdCBULjYxIGlzby1pci0xMDMgY3NJU08xMDNUNjE4Yml0IH0KICAgIHsgSVNPXzg4NTktMzoxOTg4IGlzby1pci0xMDkgSVNPXzg4NTktMyBJU08tODg1OS0zIGxhdGluMyBsMyBjc0lTT0xhdGluMyB9CiAgICB7IElTT184ODU5LTQ6MTk4OCBpc28taXItMTEwIElTT184ODU5LTQgSVNPLTg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgfQogICAgeyBFQ01BLWN5cmlsbGljIGlzby1pci0xMTEgS09JOC1FIGNzSVNPMTExRUNNQUN5cmlsbGljIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTEgaXNvLWlyLTEyMSBJU082NDYtQ0EgY3NhNy0xIGNhIGNzSVNPMTIxQ2FuYWRpYW4xIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTIgaXNvLWlyLTEyMiBJU082NDYtQ0EyIGNzYTctMiBjc0lTTzEyMkNhbmFkaWFuMiB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS1nciBpc28taXItMTIzIGNzSVNPMTIzQ1NBWjI0MzQxOTg1Z3IgfQogICAgeyBJU09fODg1OS02OjE5ODcgaXNvLWlyLTEyNyBJU09fODg1OS02IElTTy04ODU5LTYgRUNNQS0xMTQgQVNNTy03MDgKICAgICAgYXJhYmljIGNzSVNPTGF0aW5BcmFiaWMgfQogICAgeyBJU09fODg1OS02LUUgY3NJU084ODU5NkUgSVNPLTg4NTktNi1FIH0KICAgIHsgSVNPXzg4NTktNi1JIGNzSVNPODg1OTZJIElTTy04ODU5LTYtSSB9CiAgICB7IElTT184ODU5LTc6MTk4NyBpc28taXItMTI2IElTT184ODU5LTcgSVNPLTg4NTktNyBFTE9UXzkyOCBFQ01BLTExOAogICAgICBncmVlayBncmVlazggY3NJU09MYXRpbkdyZWVrIH0KICAgIHsgVC4xMDEtRzIgaXNvLWlyLTEyOCBjc0lTTzEyOFQxMDFHMiB9CiAgICB7IElTT184ODU5LTg6MTk4OCBpc28taXItMTM4IElTT184ODU5LTggSVNPLTg4NTktOCBoZWJyZXcKICAgICAgY3NJU09MYXRpbkhlYnJldyB9CiAgICB7IElTT184ODU5LTgtRSBjc0lTTzg4NTk4RSBJU08tODg1OS04LUUgfQogICAgeyBJU09fODg1OS04LUkgY3NJU084ODU5OEkgSVNPLTg4NTktOC1JIH0KICAgIHsgQ1NOXzM2OTEwMyBpc28taXItMTM5IGNzSVNPMTM5Q1NOMzY5MTAzIH0KICAgIHsgSlVTX0kuQjEuMDAyIGlzby1pci0xNDEgSVNPNjQ2LVlVIGpzIHl1IGNzSVNPMTQxSlVTSUIxMDAyIH0KICAgIHsgSVNPXzY5MzctMi1hZGQgaXNvLWlyLTE0MiBjc0lTT1RleHRDb21tIH0KICAgIHsgSUVDX1AyNy0xIGlzby1pci0xNDMgY3NJU08xNDNJRUNQMjcxIH0KICAgIHsgSVNPXzg4NTktNToxOTg4IGlzby1pci0xNDQgSVNPXzg4NTktNSBJU08tODg1OS01IGN5cmlsbGljCiAgICAgIGNzSVNPTGF0aW5DeXJpbGxpYyB9CiAgICB7IEpVU19JLkIxLjAwMy1zZXJiIGlzby1pci0xNDYgc2VyYmlhbiBjc0lTTzE0NlNlcmJpYW4gfQogICAgeyBKVVNfSS5CMS4wMDMtbWFjIG1hY2Vkb25pYW4gaXNvLWlyLTE0NyBjc0lTTzE0N01hY2Vkb25pYW4gfQogICAgeyBJU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IElTTy04ODU5LTkgbGF0aW41IGw1IGNzSVNPTGF0aW41IH0KICAgIHsgZ3JlZWstY2NpdHQgaXNvLWlyLTE1MCBjc0lTTzE1MCBjc0lTTzE1MEdyZWVrQ0NJVFQgfQogICAgeyBOQ19OQzAwLTEwOjgxIGN1YmEgaXNvLWlyLTE1MSBJU082NDYtQ1UgY3NJU08xNTFDdWJhIH0KICAgIHsgSVNPXzY5MzctMi0yNSBpc28taXItMTUyIGNzSVNPNjkzN0FkZCB9CiAgICB7IEdPU1RfMTk3NjgtNzQgU1RfU0VWXzM1OC04OCBpc28taXItMTUzIGNzSVNPMTUzR09TVDE5NzY4NzQgfQogICAgeyBJU09fODg1OS1zdXBwIGlzby1pci0xNTQgbGF0aW4xLTItNSBjc0lTTzg4NTlTdXBwIH0KICAgIHsgSVNPXzEwMzY3LWJveCBpc28taXItMTU1IGNzSVNPMTAzNjdCb3ggfQogICAgeyBJU08tODg1OS0xMCBpc28taXItMTU3IGw2IElTT184ODU5LTEwOjE5OTIgY3NJU09MYXRpbjYgbGF0aW42IH0KICAgIHsgbGF0aW4tbGFwIGxhcCBpc28taXItMTU4IGNzSVNPMTU4TGFwIH0KICAgIHsgSklTX1gwMjEyLTE5OTAgeDAyMTIgaXNvLWlyLTE1OSBjc0lTTzE1OUpJU1gwMjEyMTk5MCB9CiAgICB7IERTXzIwODkgRFMyMDg5IElTTzY0Ni1ESyBkayBjc0lTTzY0NkRhbmlzaCB9CiAgICB7IHVzLWRrIGNzVVNESyB9CiAgICB7IGRrLXVzIGNzREtVUyB9CiAgICB7IEpJU19YMDIwMSBYMDIwMSBjc0hhbGZXaWR0aEthdGFrYW5hIH0KICAgIHsgS1NDNTYzNiBJU082NDYtS1IgY3NLU0M1NjM2IH0KICAgIHsgSVNPLTEwNjQ2LVVDUy0yIGNzVW5pY29kZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtNCBjc1VDUzQgfQogICAgeyBERUMtTUNTIGRlYyBjc0RFQ01DUyB9CiAgICB7IGhwLXJvbWFuOCByb21hbjggcjggY3NIUFJvbWFuOCB9CiAgICB7IG1hY2ludG9zaCBtYWMgY3NNYWNpbnRvc2ggfQogICAgeyBJQk0wMzcgY3AwMzcgZWJjZGljLWNwLXVzIGViY2RpYy1jcC1jYSBlYmNkaWMtY3Atd3QgZWJjZGljLWNwLW5sCiAgICAgIGNzSUJNMDM3IH0KICAgIHsgSUJNMDM4IEVCQ0RJQy1JTlQgY3AwMzggY3NJQk0wMzggfQogICAgeyBJQk0yNzMgQ1AyNzMgY3NJQk0yNzMgfQogICAgeyBJQk0yNzQgRUJDRElDLUJFIENQMjc0IGNzSUJNMjc0IH0KICAgIHsgSUJNMjc1IEVCQ0RJQy1CUiBjcDI3NSBjc0lCTTI3NSB9CiAgICB7IElCTTI3NyBFQkNESUMtQ1AtREsgRUJDRElDLUNQLU5PIGNzSUJNMjc3IH0KICAgIHsgSUJNMjc4IENQMjc4IGViY2RpYy1jcC1maSBlYmNkaWMtY3Atc2UgY3NJQk0yNzggfQogICAgeyBJQk0yODAgQ1AyODAgZWJjZGljLWNwLWl0IGNzSUJNMjgwIH0KICAgIHsgSUJNMjgxIEVCQ0RJQy1KUC1FIGNwMjgxIGNzSUJNMjgxIH0KICAgIHsgSUJNMjg0IENQMjg0IGViY2RpYy1jcC1lcyBjc0lCTTI4NCB9CiAgICB7IElCTTI4NSBDUDI4NSBlYmNkaWMtY3AtZ2IgY3NJQk0yODUgfQogICAgeyBJQk0yOTAgY3AyOTAgRUJDRElDLUpQLWthbmEgY3NJQk0yOTAgfQogICAgeyBJQk0yOTcgY3AyOTcgZWJjZGljLWNwLWZyIGNzSUJNMjk3IH0KICAgIHsgSUJNNDIwIGNwNDIwIGViY2RpYy1jcC1hcjEgY3NJQk00MjAgfQogICAgeyBJQk00MjMgY3A0MjMgZWJjZGljLWNwLWdyIGNzSUJNNDIzIH0KICAgIHsgSUJNNDI0IGNwNDI0IGViY2RpYy1jcC1oZSBjc0lCTTQyNCB9CiAgICB7IElCTTQzNyBjcDQzNyA0MzcgY3NQQzhDb2RlUGFnZTQzNyB9CiAgICB7IElCTTUwMCBDUDUwMCBlYmNkaWMtY3AtYmUgZWJjZGljLWNwLWNoIGNzSUJNNTAwIH0KICAgIHsgSUJNNzc1IGNwNzc1IGNzUEM3NzVCYWx0aWMgfQogICAgeyBJQk04NTAgY3A4NTAgODUwIGNzUEM4NTBNdWx0aWxpbmd1YWwgfQogICAgeyBJQk04NTEgY3A4NTEgODUxIGNzSUJNODUxIH0KICAgIHsgSUJNODUyIGNwODUyIDg1MiBjc1BDcDg1MiB9CiAgICB7IElCTTg1NSBjcDg1NSA4NTUgY3NJQk04NTUgfQogICAgeyBJQk04NTcgY3A4NTcgODU3IGNzSUJNODU3IH0KICAgIHsgSUJNODYwIGNwODYwIDg2MCBjc0lCTTg2MCB9CiAgICB7IElCTTg2MSBjcDg2MSA4NjEgY3AtaXMgY3NJQk04NjEgfQogICAgeyBJQk04NjIgY3A4NjIgODYyIGNzUEM4NjJMYXRpbkhlYnJldyB9CiAgICB7IElCTTg2MyBjcDg2MyA4NjMgY3NJQk04NjMgfQogICAgeyBJQk04NjQgY3A4NjQgY3NJQk04NjQgfQogICAgeyBJQk04NjUgY3A4NjUgODY1IGNzSUJNODY1IH0KICAgIHsgSUJNODY2IGNwODY2IDg2NiBjc0lCTTg2NiB9CiAgICB7IElCTTg2OCBDUDg2OCBjcC1hciBjc0lCTTg2OCB9CiAgICB7IElCTTg2OSBjcDg2OSA4NjkgY3AtZ3IgY3NJQk04NjkgfQogICAgeyBJQk04NzAgQ1A4NzAgZWJjZGljLWNwLXJvZWNlIGViY2RpYy1jcC15dSBjc0lCTTg3MCB9CiAgICB7IElCTTg3MSBDUDg3MSBlYmNkaWMtY3AtaXMgY3NJQk04NzEgfQogICAgeyBJQk04ODAgY3A4ODAgRUJDRElDLUN5cmlsbGljIGNzSUJNODgwIH0KICAgIHsgSUJNODkxIGNwODkxIGNzSUJNODkxIH0KICAgIHsgSUJNOTAzIGNwOTAzIGNzSUJNOTAzIH0KICAgIHsgSUJNOTA0IGNwOTA0IDkwNCBjc0lCQk05MDQgfQogICAgeyBJQk05MDUgQ1A5MDUgZWJjZGljLWNwLXRyIGNzSUJNOTA1IH0KICAgIHsgSUJNOTE4IENQOTE4IGViY2RpYy1jcC1hcjIgY3NJQk05MTggfQogICAgeyBJQk0xMDI2IENQMTAyNiBjc0lCTTEwMjYgfQogICAgeyBFQkNESUMtQVQtREUgY3NJQk1FQkNESUNBVERFIH0KICAgIHsgRUJDRElDLUFULURFLUEgY3NFQkNESUNBVERFQSB9CiAgICB7IEVCQ0RJQy1DQS1GUiBjc0VCQ0RJQ0NBRlIgfQogICAgeyBFQkNESUMtREstTk8gY3NFQkNESUNES05PIH0KICAgIHsgRUJDRElDLURLLU5PLUEgY3NFQkNESUNES05PQSB9CiAgICB7IEVCQ0RJQy1GSS1TRSBjc0VCQ0RJQ0ZJU0UgfQogICAgeyBFQkNESUMtRkktU0UtQSBjc0VCQ0RJQ0ZJU0VBIH0KICAgIHsgRUJDRElDLUZSIGNzRUJDRElDRlIgfQogICAgeyBFQkNESUMtSVQgY3NFQkNESUNJVCB9CiAgICB7IEVCQ0RJQy1QVCBjc0VCQ0RJQ1BUIH0KICAgIHsgRUJDRElDLUVTIGNzRUJDRElDRVMgfQogICAgeyBFQkNESUMtRVMtQSBjc0VCQ0RJQ0VTQSB9CiAgICB7IEVCQ0RJQy1FUy1TIGNzRUJDRElDRVNTIH0KICAgIHsgRUJDRElDLVVLIGNzRUJDRElDVUsgfQogICAgeyBFQkNESUMtVVMgY3NFQkNESUNVUyB9CiAgICB7IFVOS05PV04tOEJJVCBjc1Vua25vd244QmlUIH0KICAgIHsgTU5FTU9OSUMgY3NNbmVtb25pYyB9CiAgICB7IE1ORU0gY3NNbmVtIH0KICAgIHsgVklTQ0lJIGNzVklTQ0lJIH0KICAgIHsgVklRUiBjc1ZJUVIgfQogICAgeyBLT0k4LVIgY3NLT0k4UiB9CiAgICB7IElCTTAwODU4IENDU0lEMDA4NTggQ1AwMDg1OCBQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8gfQogICAgeyBJQk0wMDkyNCBDQ1NJRDAwOTI0IENQMDA5MjQgZWJjZGljLUxhdGluOS0tZXVybyB9CiAgICB7IElCTTAxMTQwIENDU0lEMDExNDAgQ1AwMTE0MCBlYmNkaWMtdXMtMzcrZXVybyB9CiAgICB7IElCTTAxMTQxIENDU0lEMDExNDEgQ1AwMTE0MSBlYmNkaWMtZGUtMjczK2V1cm8gfQogICAgeyBJQk0wMTE0MiBDQ1NJRDAxMTQyIENQMDExNDIgZWJjZGljLWRrLTI3NytldXJvIGViY2RpYy1uby0yNzcrZXVybyB9CiAgICB7IElCTTAxMTQzIENDU0lEMDExNDMgQ1AwMTE0MyBlYmNkaWMtZmktMjc4K2V1cm8gZWJjZGljLXNlLTI3OCtldXJvIH0KICAgIHsgSUJNMDExNDQgQ0NTSUQwMTE0NCBDUDAxMTQ0IGViY2RpYy1pdC0yODArZXVybyB9CiAgICB7IElCTTAxMTQ1IENDU0lEMDExNDUgQ1AwMTE0NSBlYmNkaWMtZXMtMjg0K2V1cm8gfQogICAgeyBJQk0wMTE0NiBDQ1NJRDAxMTQ2IENQMDExNDYgZWJjZGljLWdiLTI4NStldXJvIH0KICAgIHsgSUJNMDExNDcgQ0NTSUQwMTE0NyBDUDAxMTQ3IGViY2RpYy1mci0yOTcrZXVybyB9CiAgICB7IElCTTAxMTQ4IENDU0lEMDExNDggQ1AwMTE0OCBlYmNkaWMtaW50ZXJuYXRpb25hbC01MDArZXVybyB9CiAgICB7IElCTTAxMTQ5IENDU0lEMDExNDkgQ1AwMTE0OSBlYmNkaWMtaXMtODcxK2V1cm8gfQogICAgeyBJQk0xMDQ3IElCTS0xMDQ3IH0KICAgIHsgUFRDUDE1NCBjc1BUQ1AxNTQgUFQxNTQgQ1AxNTQgQ3lyaWxsaWMtQXNpYW4gfQogICAgeyBBbWlnYS0xMjUxIEFtaTEyNTEgQW1pZ2ExMjUxIEFtaS0xMjUxIH0KICAgIHsgVU5JQ09ERS0xLTEgY3NVbmljb2RlMTEgfQogICAgeyBDRVNVLTggY3NDRVNVLTggfQogICAgeyBCT0NVLTEgY3NCT0NVLTEgfQogICAgeyBVTklDT0RFLTEtMS1VVEYtNyBjc1VuaWNvZGUxMVVURjcgfQogICAgeyBJU08tODg1OS0xNCBpc28taXItMTk5IElTT184ODU5LTE0OjE5OTggSVNPXzg4NTktMTQgbGF0aW44IGlzby1jZWx0aWMKICAgICAgbDggfQogICAgeyBJU08tODg1OS0xNSBJU09fODg1OS0xNSBMYXRpbi05IH0KICAgIHsgSVNPLTg4NTktMTYgaXNvLWlyLTIyNiBJU09fODg1OS0xNjoyMDAxIElTT184ODU5LTE2IGxhdGluMTAgbDEwIH0KICAgIHsgR0JLIENQOTM2IE1TOTM2IHdpbmRvd3MtOTM2IH0KICAgIHsgSklTX0VuY29kaW5nIGNzSklTRW5jb2RpbmcgfQogICAgeyBTaGlmdF9KSVMgTVNfS2FuamkgY3NTaGlmdEpJUyB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9QYWNrZWRfRm9ybWF0X2Zvcl9KYXBhbmVzZSBjc0VVQ1BrZEZtdEphcGFuZXNlCiAgICAgIEVVQy1KUCB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UgY3NFVUNGaXhXaWRKYXBhbmVzZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtQmFzaWMgY3NVbmljb2RlQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEgY3NVbmljb2RlTGF0aW4xIElTTy0xMDY0NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjYxIGNzVW5pY29kZUlCTTEyNjEgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2OCBjc1VuaWNvZGVJQk0xMjY4IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNzYgY3NVbmljb2RlSUJNMTI3NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY0IGNzVW5pY29kZUlCTTEyNjQgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NSBjc1VuaWNvZGVJQk0xMjY1IH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xIGNzV2luZG93czMwTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xIGNzV2luZG93czMxTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTIgY3NXaW5kb3dzMzFMYXRpbjIgfQogICAgeyBJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSBjc1dpbmRvd3MzMUxhdGluNSB9CiAgICB7IEFkb2JlLVN0YW5kYXJkLUVuY29kaW5nIGNzQWRvYmVTdGFuZGFyZEVuY29kaW5nIH0KICAgIHsgVmVudHVyYS1VUyBjc1ZlbnR1cmFVUyB9CiAgICB7IFZlbnR1cmEtSW50ZXJuYXRpb25hbCBjc1ZlbnR1cmFJbnRlcm5hdGlvbmFsIH0KICAgIHsgUEM4LURhbmlzaC1Ob3J3ZWdpYW4gY3NQQzhEYW5pc2hOb3J3ZWdpYW4gfQogICAgeyBQQzgtVHVya2lzaCBjc1BDOFR1cmtpc2ggfQogICAgeyBJQk0tU3ltYm9scyBjc0lCTVN5bWJvbHMgfQogICAgeyBJQk0tVGhhaSBjc0lCTVRoYWkgfQogICAgeyBIUC1MZWdhbCBjc0hQTGVnYWwgfQogICAgeyBIUC1QaS1mb250IGNzSFBQaUZvbnQgfQogICAgeyBIUC1NYXRoOCBjc0hQTWF0aDggfQogICAgeyBBZG9iZS1TeW1ib2wtRW5jb2RpbmcgY3NIUFBTTWF0aCB9CiAgICB7IEhQLURlc2tUb3AgY3NIUERlc2t0b3AgfQogICAgeyBWZW50dXJhLU1hdGggY3NWZW50dXJhTWF0aCB9CiAgICB7IE1pY3Jvc29mdC1QdWJsaXNoaW5nIGNzTWljcm9zb2Z0UHVibGlzaGluZyB9CiAgICB7IFdpbmRvd3MtMzFKIGNzV2luZG93czMxSiB9CiAgICB7IEdCMjMxMiBjc0dCMjMxMiB9CiAgICB7IEJpZzUgY3NCaWc1IH0KfQoKcHJvYyB0Y2xfZW5jb2Rpbmcge2VuY30gewogICAgZ2xvYmFsIGVuY29kaW5nX2FsaWFzZXMKICAgIHNldCBuYW1lcyBbZW5jb2RpbmcgbmFtZXNdCiAgICBzZXQgbGNuYW1lcyBbc3RyaW5nIHRvbG93ZXIgJG5hbWVzXQogICAgc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgJGVuY10KICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jXQogICAgaWYgeyRpIDwgMH0gewoJIyBsb29rIGZvciAiaXNvbm5uIiBpbnN0ZWFkIG9mICJpc28tbm5uIiBvciAiaXNvX25ubiIKCWlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGVuYyBpc28gZW5jeF19IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY3hdCgl9CiAgICB9CiAgICBpZiB7JGkgPCAwfSB7Cglmb3JlYWNoIGwgJGVuY29kaW5nX2FsaWFzZXMgewoJICAgIHNldCBsbCBbc3RyaW5nIHRvbG93ZXIgJGxdCgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbGwgJGVuY10gPCAwfSBjb250aW51ZQoJICAgICMgbG9vayB0aHJvdWdoIHRoZSBhbGlhc2VzIGZvciBvbmUgdGhhdCB0Y2wga25vd3MgYWJvdXQKCSAgICBmb3JlYWNoIGUgJGxsIHsKCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVdCgkJaWYgeyRpIDwgMH0gewoJCSAgICBpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlIGlzbyBleF19IHsKCQkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRleF0KCQkgICAgfQoJCX0KCQlpZiB7JGkgPj0gMH0gYnJlYWsKCSAgICB9CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGlmIHskaSA+PSAwfSB7CglyZXR1cm4gW2xpbmRleCAkbmFtZXMgJGldCiAgICB9CiAgICByZXR1cm4ge30KfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0IGRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IGdpdGVuY29kaW5nIHt9CmNhdGNoIHsKICAgIHNldCBnaXRlbmNvZGluZyBbZXhlYyBnaXQgY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewogICAgc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQpzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCmlmIHskdGNsZW5jb2RpbmcgPT0ge319IHsKICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCn0KCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgdWlmb250IHtIZWx2ZXRpY2EgOSBib2xkfQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMApzZXQgdXBhcnJvd2xlbiA3CnNldCBkb3duYXJyb3dsZW4gNwpzZXQgbWluZ2FwbGVuIDMwCnNldCBjbWl0bW9kZSAicGF0Y2giCnNldCB3cmFwY29tbWVudCAibm9uZSIKc2V0IHNob3duZWFydGFncyAxCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0Kc2V0IGJnY29sb3Igd2hpdGUKc2V0IGZnY29sb3IgYmxhY2sKc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCmZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCiMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgpzZXQgZ2l0ZGlyIFtnaXRkaXJdCmlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCBjbWRsaW5lX2ZpbGVzIHt9CnNldCBpIFtsc2VhcmNoIC1leGFjdCAkcmV2dHJlZWFyZ3MgIi0tIl0KaWYgeyRpID49IDB9IHsKICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJHJldnRyZWVhcmdzIFtleHByIHskaSArIDF9XSBlbmRdCiAgICBzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBbZXhwciB7JGkgLSAxfV1dCn0gZWxzZWlmIHskcmV2dHJlZWFyZ3MgbmUge319IHsKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW2V2YWwgZXhlYyBnaXQgcmV2LXBhcnNlIC0tbm8tcmV2cyAtLW5vLWZsYWdzICRyZXZ0cmVlYXJnc10KCXNldCBjbWRsaW5lX2ZpbGVzIFtzcGxpdCAkZiAiXG4iXQoJc2V0IG4gW2xsZW5ndGggJGNtZGxpbmVfZmlsZXNdCglzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBlbmQtJG5dCiAgICB9IGVycl19IHsKCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAoJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KCXNldCBpIFtzdHJpbmcgZmlyc3QgImZhdGFsOiIgJGVycl0KCWlmIHskaSA+IDB9IHsKCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQoJfQoJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgoJZXhpdCAxCiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMApzZXQgZmhfc2VyaWFsIDAKc2V0IG5obF9uYW1lcyB7fQpzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CnNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwpzZXQgYm9sZHJvd3Mge30Kc2V0IGJvbGRuYW1lcm93cyB7fQoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgbmV4dHZpZXdudW0gMQpzZXQgY3VydmlldyAwCnNldCBzZWxlY3RlZHZpZXcgMApzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQpzZXQgdmlld2ZpbGVzKDApIHt9CnNldCB2aWV3cGVybSgwKSAwCnNldCB2aWV3YXJncygwKSB7fQoKc2V0IGNtZGxpbmVvayAwCnNldCBzdG9wcGVkIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwp3bSB0aXRsZSAuICJbZmlsZSB0YWlsICRhcmd2MF06IFtmaWxlIHRhaWwgW3B3ZF1dIgpyZWFkcmVmcwoKaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0gewogICAgIyBjcmVhdGUgYSB2aWV3IGZvciB0aGUgZmlsZXMvZGlycyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQogICAgc2V0IGN1cnZpZXcgMQogICAgc2V0IHNlbGVjdGVkdmlldyAxCiAgICBzZXQgbmV4dHZpZXdudW0gMgogICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCiAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCiAgICBzZXQgdmlld2FyZ3MoMSkgJHJldnRyZWVhcmdzCiAgICBzZXQgdmlld3Blcm0oMSkgMAogICAgYWRkdmlld21lbnUgMQogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgbm9ybWFsCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIG5vcm1hbAp9CgppZiB7W2luZm8gZXhpc3RzIHBlcm12aWV3c119IHsKICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKCXNldCBuICRuZXh0dmlld251bQoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCglzZXQgdmlld2ZpbGVzKCRuKSBbbGluZGV4ICR2IDFdCglzZXQgdmlld2FyZ3MoJG4pIFtsaW5kZXggJHYgMl0KCXNldCB2aWV3cGVybSgkbikgMQoJYWRkdmlld21lbnUgJG4KICAgIH0KfQpnZXRjb21taXRzCg==