IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9CgojIEEgc2ltcGxlIHNjaGVkdWxlciBmb3IgY29tcHV0ZS1pbnRlbnNpdmUgc3R1ZmYuCiMgVGhlIGFpbSBpcyB0byBtYWtlIHN1cmUgdGhhdCBldmVudCBoYW5kbGVycyBmb3IgR1VJIGFjdGlvbnMgY2FuCiMgcnVuIGF0IGxlYXN0IGV2ZXJ5IDUwLTEwMCBtcy4gIFVuZm9ydHVuYXRlbHkgZmlsZWV2ZW50IGhhbmRsZXJzIGFyZQojIHJ1biBiZWZvcmUgWCBldmVudCBoYW5kbGVycywgc28gcmVhZGluZyBmcm9tIGEgZmFzdCBzb3VyY2UgY2FuCiMgbWFrZSB0aGUgR1VJIGNvbXBsZXRlbHkgdW5yZXNwb25zaXZlLgpwcm9jIHJ1biBhcmdzIHsKICAgIGdsb2JhbCBpc29ucnVucSBydW5xCgogICAgc2V0IHNjcmlwdCAkYXJncwogICAgaWYge1tpbmZvIGV4aXN0cyBpc29ucnVucSgkc2NyaXB0KV19IHJldHVybgogICAgaWYgeyRydW5xIGVxIHt9fSB7CglhZnRlciBpZGxlIGRvcnVucQogICAgfQogICAgbGFwcGVuZCBydW5xIFtsaXN0IHt9ICRzY3JpcHRdCiAgICBzZXQgaXNvbnJ1bnEoJHNjcmlwdCkgMQp9Cgpwcm9jIGZpbGVydW4ge2ZkIHNjcmlwdH0gewogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBmaWxlcmVhZGFibGUgJGZkICRzY3JpcHRdCn0KCnByb2MgZmlsZXJlYWRhYmxlIHtmZCBzY3JpcHR9IHsKICAgIGdsb2JhbCBydW5xCgogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSB7fQogICAgaWYgeyRydW5xIGVxIHt9fSB7CglhZnRlciBpZGxlIGRvcnVucQogICAgfQogICAgbGFwcGVuZCBydW5xIFtsaXN0ICRmZCAkc2NyaXB0XQp9Cgpwcm9jIGRvcnVucSB7fSB7CiAgICBnbG9iYWwgaXNvbnJ1bnEgcnVucQoKICAgIHNldCB0c3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IHQwICR0c3RhcnQKICAgIHdoaWxlIHskcnVucSBuZSB7fX0gewoJc2V0IGZkIFtsaW5kZXggJHJ1bnEgMCAwXQoJc2V0IHNjcmlwdCBbbGluZGV4ICRydW5xIDAgMV0KCXNldCByZXBlYXQgW2V2YWwgJHNjcmlwdF0KCXNldCB0MSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCglzZXQgdCBbZXhwciB7JHQxIC0gJHQwfV0KCXNldCBydW5xIFtscmFuZ2UgJHJ1bnEgMSBlbmRdCglpZiB7JHJlcGVhdCBuZSB7fSAmJiAkcmVwZWF0fSB7CgkgICAgaWYgeyRmZCBlcSB7fSB8fCAkcmVwZWF0ID09IDJ9IHsKCQkjIHNjcmlwdCByZXR1cm5zIDEgaWYgaXQgd2FudHMgdG8gYmUgcmVhZGRlZAoJCSMgZmlsZSByZWFkZXJzIHJldHVybiAyIGlmIHRoZXkgY291bGQgZG8gbW9yZSBzdHJhaWdodCBhd2F5CgkJbGFwcGVuZCBydW5xIFtsaXN0ICRmZCAkc2NyaXB0XQoJICAgIH0gZWxzZSB7CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBmaWxlcmVhZGFibGUgJGZkICRzY3JpcHRdCgkgICAgfQoJfSBlbHNlaWYgeyRmZCBlcSB7fX0gewoJICAgIHVuc2V0IGlzb25ydW5xKCRzY3JpcHQpCgl9CglzZXQgdDAgJHQxCglpZiB7JHQxIC0gJHRzdGFydCA+PSA4MH0gYnJlYWsKICAgIH0KICAgIGlmIHskcnVucSBuZSB7fX0gewoJYWZ0ZXIgaWRsZSBkb3J1bnEKICAgIH0KfQoKIyBTdGFydCBvZmYgYSBnaXQgcmV2LWxpc3QgcHJvY2VzcyBhbmQgYXJyYW5nZSB0byByZWFkIGl0cyBvdXRwdXQKcHJvYyBzdGFydF9yZXZfbGlzdCB7dmlld30gewogICAgZ2xvYmFsIHN0YXJ0bXNlY3MKICAgIGdsb2JhbCBjb21tZmQgbGVmdG92ZXIgdGNsZW5jb2RpbmcgZGF0ZW1vZGUKICAgIGdsb2JhbCB2aWV3YXJncyB2aWV3ZmlsZXMgY29tbWl0aWR4CiAgICBnbG9iYWwgbG9va2luZ2ZvcmhlYWQgc2hvd2xvY2FsY2hhbmdlcwoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBjb21taXRpZHgoJHZpZXcpIDAKICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IGxvZyAteiAtLXByZXR0eT1yYXcgJG9yZGVyIC0tcGFyZW50cyBcCgkJCSAtLWJvdW5kYXJ5ICR2aWV3YXJncygkdmlldykgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0gcl0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGV4ZWN1dGluZyBnaXQgcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBjb21tZmQoJHZpZXcpICRmZAogICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQogICAgc2V0IGxvb2tpbmdmb3JoZWFkICRzaG93bG9jYWxjaGFuZ2VzCiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVvZmNoYXIge30KICAgIGlmIHskdGNsZW5jb2RpbmcgIT0ge319IHsKCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkdGNsZW5jb2RpbmcKICAgIH0KICAgIGZpbGVydW4gJGZkIFtsaXN0IGdldGNvbW1pdGxpbmVzICRmZCAkdmlld10KICAgIG5vd2J1c3kgJHZpZXcKfQoKcHJvYyBzdG9wX3Jldl9saXN0IHt9IHsKICAgIGdsb2JhbCBjb21tZmQgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1mZCgkY3VydmlldyldfSByZXR1cm4KICAgIHNldCBmZCAkY29tbWZkKCRjdXJ2aWV3KQogICAgY2F0Y2ggewoJc2V0IHBpZCBbcGlkICRmZF0KCWV4ZWMga2lsbCAkcGlkCiAgICB9CiAgICBjYXRjaCB7Y2xvc2UgJGZkfQogICAgdW5zZXQgY29tbWZkKCRjdXJ2aWV3KQp9Cgpwcm9jIGdldGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlIGNhbnYgbWFpbmZvbnQgY3VydmlldwoKICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBpbml0bGF5b3V0CiAgICBzdGFydF9yZXZfbGlzdCAkY3VydmlldwogICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKfQoKcHJvYyBnZXRjb21taXRsaW5lcyB7ZmQgdmlld30gIHsKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZHJlbiBjdXJ2aWV3IGhsdmlldwogICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgICMgZ2l0IGxvZyBkb2Vzbid0IHRlcm1pbmF0ZSB0aGUgbGFzdCBjb21taXQgd2l0aCBhIG51bGwuLi4KICAgIGlmIHskc3R1ZmYgPT0ge30gJiYgJGxlZnRvdmVyKCR2aWV3KSBuZSB7fSAmJiBbZW9mICRmZF19IHsKCXNldCBzdHVmZiAiXDAiCiAgICB9CiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGZkXX0gewoJICAgIHJldHVybiAxCgl9CglnbG9iYWwgdmlld25hbWUKCXVuc2V0IGNvbW1mZCgkdmlldykKCW5vdGJ1c3kgJHZpZXcKCSMgc2V0IGl0IGJsb2NraW5nIHNvIHdlIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZQoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0gewoJICAgIHNldCBmdiB7fQoJICAgIGlmIHskdmlldyAhPSAkY3Vydmlld30gewoJCXNldCBmdiAiIGZvciB0aGUgXCIkdmlld25hbWUoJHZpZXcpXCIgdmlldyIKCSAgICB9CgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGVyciAwIDRdID09ICJ1c2FnZSJ9IHsKCQlzZXQgZXJyICJHaXRrOiBlcnJvciByZWFkaW5nIGNvbW1pdHMkZnY6XAoJCQliYWQgYXJndW1lbnRzIHRvIGdpdCByZXYtbGlzdC4iCgkJaWYgeyR2aWV3bmFtZSgkdmlldykgZXEgIkNvbW1hbmQgbGluZSJ9IHsKCQkgICAgYXBwZW5kIGVyciBcCgkJCSIgIChOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdCByZXYtbGlzdFwKCQkJIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pIgoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBlcnIgIkVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjogJGVyciIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgJGVycgoJfQoJaWYgeyR2aWV3ID09ICRjdXJ2aWV3fSB7CgkgICAgcnVuIGNoZXdjb21taXRzICR2aWV3Cgl9CglyZXR1cm4gMAogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDAgJiYgW3N0cmluZyBtYXRjaCAiY29tbWl0ICoiICRjbWl0XX0gewoJICAgIHNldCBpZHMgW3N0cmluZyByYW5nZSAkY21pdCA3IFtleHByIHskaiAtIDF9XV0KCSAgICBpZiB7W3N0cmluZyBtYXRjaCB7Wy08Pl0qfSAkaWRzXX0gewoJCXN3aXRjaCAtLSBbc3RyaW5nIGluZGV4ICRpZHMgMF0gewoJCSAgICAiLSIge3NldCBsaXN0ZWQgMH0KCQkgICAgIjwiIHtzZXQgbGlzdGVkIDJ9CgkJICAgICI+IiB7c2V0IGxpc3RlZCAzfQoJCX0KCQlzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGlkcyAxIGVuZF0KCSAgICB9CgkgICAgc2V0IG9rIDEKCSAgICBmb3JlYWNoIGlkICRpZHMgewoJCWlmIHtbc3RyaW5nIGxlbmd0aCAkaWRdICE9IDQwfSB7CgkJICAgIHNldCBvayAwCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0KCWlmIHshJG9rfSB7CgkgICAgc2V0IHNob3J0Y21pdCAkY21pdAoJICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hvcnRjbWl0XSA+IDgwfSB7CgkJc2V0IHNob3J0Y21pdCAiW3N0cmluZyByYW5nZSAkc2hvcnRjbWl0IDAgODBdLi4uIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0IGxvZyBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBpZCBbbGluZGV4ICRpZHMgMF0KCWlmIHskbGlzdGVkfSB7CgkgICAgc2V0IG9sZHMgW2xyYW5nZSAkaWRzIDEgZW5kXQoJICAgIHNldCBpIDAKCSAgICBmb3JlYWNoIHAgJG9sZHMgewoJCWlmIHskaSA9PSAwIHx8IFtsc2VhcmNoIC1leGFjdCAkb2xkcyAkcF0gPj0gJGl9IHsKCQkgICAgbGFwcGVuZCBjaGlsZHJlbigkdmlldywkcCkgJGlkCgkJfQoJCWluY3IgaQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IG9sZHMge30KCX0KCWlmIHshW2luZm8gZXhpc3RzIGNoaWxkcmVuKCR2aWV3LCRpZCldfSB7CgkgICAgc2V0IGNoaWxkcmVuKCR2aWV3LCRpZCkge30KCX0KCXNldCBjb21taXRkYXRhKCRpZCkgW3N0cmluZyByYW5nZSAkY21pdCBbZXhwciB7JGogKyAxfV0gZW5kXQoJc2V0IGNvbW1pdHJvdygkdmlldywkaWQpICRjb21taXRpZHgoJHZpZXcpCglpbmNyIGNvbW1pdGlkeCgkdmlldykKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIGxhcHBlbmQgcGFyZW50bGlzdCAkb2xkcwoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZkaXNwb3JkZXIoJHZpZXcpICRpZAoJICAgIGxhcHBlbmQgdmNtaXRsaXN0ZWQoJHZpZXcpICRsaXN0ZWQKCX0KCXNldCBnb3Rzb21lIDEKICAgIH0KICAgIGlmIHskZ290c29tZX0gewoJcnVuIGNoZXdjb21taXRzICR2aWV3CiAgICB9CiAgICByZXR1cm4gMgp9Cgpwcm9jIGNoZXdjb21taXRzIHt2aWV3fSB7CiAgICBnbG9iYWwgY3VydmlldyBobHZpZXcgY29tbWZkCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIHBlbmRpbmdfc2VsZWN0CgogICAgc2V0IG1vcmUgMAogICAgaWYgeyR2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgYWxscmVhZCBbZXhwciB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJHZpZXcpXX1dCglzZXQgdGxpbWl0IFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgNTB9XQoJc2V0IG1vcmUgW2xheW91dG1vcmUgJHRsaW1pdCAkYWxscmVhZF0KCWlmIHskYWxscmVhZCAmJiAhJG1vcmV9IHsKCSAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdGlkeCBwaGFzZQoJICAgIGdsb2JhbCBudW1jb21taXRzIHN0YXJ0bXNlY3MKCgkgICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCQlzZXQgcm93IFtmaXJzdF9yZWFsX3Jvd10KCQlzZWxlY3RsaW5lICRyb3cgMQoJICAgIH0KCSAgICBpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAwfSB7CgkJI3NldCBtcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KCQkjcHV0cyAib3ZlcmFsbCAkbXMgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCgkgICAgfSBlbHNlIHsKCQlzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKCSAgICB9CgkgICAgbm90YnVzeSBsYXlvdXQKCSAgICBzZXQgcGhhc2Uge30KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkdmlldyA9PSAkaGx2aWV3fSB7Cgl2aGlnaGxpZ2h0bW9yZQogICAgfQogICAgcmV0dXJuICRtb3JlCn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUgc2hvd25lYXJ0YWdzCgogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJc3RvcF9yZXZfbGlzdAoJc2V0IHBoYXNlIHt9CiAgICB9CiAgICBzZXQgbiAkY3VydmlldwogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCWNhdGNoIHt1bnNldCBjaGlsZHJlbigkbiwkaWQpfQoJY2F0Y2gge3Vuc2V0IGNvbW1pdHJvdygkbiwkaWQpfQogICAgfQogICAgc2V0IGN1cnZpZXcgLTEKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdGhpY2tlcmxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdmlld2RhdGEoJG4pfQogICAgcmVhZHJlZnMKICAgIGNoYW5nZWRyZWZzCiAgICBpZiB7JHNob3duZWFydGFnc30gewoJZ2V0YWxsY29tbWl0cwogICAgfQogICAgc2hvd3ZpZXcgJG4KfQoKcHJvYyBwYXJzZWNvbW1pdCB7aWQgY29udGVudHMgbGlzdGVkfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQogICAgaWYgeyRoZHJlbmQgPCAwfSB7CgkjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQogICAgfQogICAgc2V0IGhlYWRlciBbc3RyaW5nIHJhbmdlICRjb250ZW50cyAwIFtleHByIHskaGRyZW5kIC0gMX1dXQogICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVhZGVyICJcbiJdIHsKCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKCSAgICBzZXQgYXVkYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0gewoJICAgIHNldCBjb21kYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfQogICAgfQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICAjIHRha2UgdGhlIGZpcnN0IG5vbi1ibGFuayBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbWxlZnQgJGNvbW1lbnRdCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJGhlYWRsaW5lXQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHJhbmdlICRoZWFkbGluZSAwICRpXQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbXJpZ2h0ICRoZWFkbGluZV0KICAgIHNldCBpIFtzdHJpbmcgZmlyc3QgIlxyIiAkaGVhZGxpbmVdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbXJpZ2h0IFtzdHJpbmcgcmFuZ2UgJGhlYWRsaW5lIDAgJGldXQogICAgfQogICAgaWYgeyEkbGlzdGVkfSB7CgkjIGdpdCByZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0IGNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCglzZXQgbmV3Y29tbWVudCB7fQoJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29tbWVudCAiXG4iXSB7CgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgJGxpbmUKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiXG4iCgl9CglzZXQgY29tbWVudCAkbmV3Y29tbWVudAogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQogICAgfQogICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKCQkJICAgICAkY29tbmFtZSAkY29tZGF0ZSAkY29tbWVudF0KfQoKcHJvYyBnZXRjb21taXQge2lkfSB7CiAgICBnbG9iYWwgY29tbWl0ZGF0YSBjb21taXRpbmZvCgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRkYXRhKCRpZCldfSB7CglwYXJzZWNvbW1pdCAkaWQgJGNvbW1pdGRhdGEoJGlkKSAxCiAgICB9IGVsc2UgewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9Cgl9CiAgICB9CiAgICByZXR1cm4gMQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdvYmppZAogICAgZ2xvYmFsIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkIG1haW5oZWFkaWQKCiAgICBmb3JlYWNoIHYge3RhZ2lkcyBpZHRhZ3MgaGVhZGlkcyBpZGhlYWRzIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzfSB7CgljYXRjaCB7dW5zZXQgJHZ9CiAgICB9CiAgICBzZXQgcmVmZCBbb3BlbiBbbGlzdCB8IGdpdCBzaG93LXJlZiAtZF0gcl0KICAgIHdoaWxlIHtbZ2V0cyAkcmVmZCBsaW5lXSA+PSAwfSB7CglpZiB7W3N0cmluZyBpbmRleCAkbGluZSA0MF0gbmUgIiAifSBjb250aW51ZQoJc2V0IGlkIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAzOV0KCXNldCByZWYgW3N0cmluZyByYW5nZSAkbGluZSA0MSBlbmRdCglpZiB7IVtzdHJpbmcgbWF0Y2ggInJlZnMvKiIgJHJlZl19IGNvbnRpbnVlCglzZXQgbmFtZSBbc3RyaW5nIHJhbmdlICRyZWYgNSBlbmRdCglpZiB7W3N0cmluZyBtYXRjaCAicmVtb3Rlcy8qIiAkbmFtZV19IHsKCSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiovSEVBRCIgJG5hbWVdfSB7CgkJc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJCWxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgkgICAgfQoJfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggImhlYWRzLyoiICRuYW1lXX0gewoJICAgIHNldCBuYW1lIFtzdHJpbmcgcmFuZ2UgJG5hbWUgNiBlbmRdCgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCAidGFncy8qIiAkbmFtZV19IHsKCSAgICAjIHRoaXMgbGV0cyByZWZzL3RhZ3MvZm9vXnt9IG92ZXJ3cml0ZSByZWZzL3RhZ3MvZm9vLAoJICAgICMgd2hpY2ggaXMgd2hhdCB3ZSB3YW50IHNpbmNlIHRoZSBmb3JtZXIgaXMgdGhlIGNvbW1pdCBJRAoJICAgIHNldCBuYW1lIFtzdHJpbmcgcmFuZ2UgJG5hbWUgNSBlbmRdCgkgICAgaWYge1tzdHJpbmcgbWF0Y2ggIipee30iICRuYW1lXX0gewoJCXNldCBuYW1lIFtzdHJpbmcgcmFuZ2UgJG5hbWUgMCBlbmQtM10KCSAgICB9IGVsc2UgewoJCXNldCB0YWdvYmppZCgkbmFtZSkgJGlkCgkgICAgfQoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCX0gZWxzZSB7CgkgICAgc2V0IG90aGVycmVmaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKCX0KICAgIH0KICAgIGNhdGNoIHtjbG9zZSAkcmVmZH0KICAgIHNldCBtYWluaGVhZCB7fQogICAgc2V0IG1haW5oZWFkaWQge30KICAgIGNhdGNoIHsKCXNldCB0aGVoZWFkIFtleGVjIGdpdCBzeW1ib2xpYy1yZWYgSEVBRF0KCWlmIHtbc3RyaW5nIG1hdGNoICJyZWZzL2hlYWRzLyoiICR0aGVoZWFkXX0gewoJICAgIHNldCBtYWluaGVhZCBbc3RyaW5nIHJhbmdlICR0aGVoZWFkIDExIGVuZF0KCSAgICBpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJG1haW5oZWFkKV19IHsKCQlzZXQgbWFpbmhlYWRpZCAkaGVhZGlkcygkbWFpbmhlYWQpCgkgICAgfQoJfQogICAgfQp9CgojIHNraXAgb3ZlciBmYWtlIGNvbW1pdHMKcHJvYyBmaXJzdF9yZWFsX3JvdyB7fSB7CiAgICBnbG9iYWwgbnVsbGlkIG51bGxpZDIgZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKCiAgICBmb3Ige3NldCByb3cgMH0geyRyb3cgPCAkbnVtY29tbWl0c30ge2luY3Igcm93fSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglpZiB7JGlkIG5lICRudWxsaWQgJiYgJGlkIG5lICRudWxsaWQyfSB7CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIHJldHVybiAkcm93Cn0KCiMgdXBkYXRlIHRoaW5ncyBmb3IgYSBoZWFkIG1vdmVkIHRvIGEgY2hpbGQgb2YgaXRzIHByZXZpb3VzIGxvY2F0aW9uCnByb2MgbW92ZWhlYWQge2lkIG5hbWV9IHsKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICByZW1vdmVoZWFkICRoZWFkaWRzKCRuYW1lKSAkbmFtZQogICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAogICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKfQoKIyB1cGRhdGUgdGhpbmdzIHdoZW4gYSBoZWFkIGhhcyBiZWVuIHJlbW92ZWQKcHJvYyByZW1vdmVoZWFkIHtpZCBuYW1lfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgaWYgeyRpZGhlYWRzKCRpZCkgZXEgJG5hbWV9IHsKCXVuc2V0IGlkaGVhZHMoJGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkaWQpICRuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkaWQpICRpICRpXQoJfQogICAgfQogICAgdW5zZXQgaGVhZGlkcygkbmFtZSkKfQoKcHJvYyBzaG93X2Vycm9yIHt3IHRvcCBtc2d9IHsKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHRvcCIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHRvcCA8VmlzaWJpbGl0eT4gImdyYWIgJHRvcDsgZm9jdXMgJHRvcCIKICAgIGJpbmQgJHRvcCA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHRvcCIKICAgIHRrd2FpdCB3aW5kb3cgJHRvcAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgc2hvd19lcnJvciAkdyAkdyAkbXNnCn0KCnByb2MgY29uZmlybV9wb3B1cCBtc2cgewogICAgZ2xvYmFsIGNvbmZpcm1fb2sKICAgIHNldCBjb25maXJtX29rIDAKICAgIHNldCB3IC5jb25maXJtCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgInNldCBjb25maXJtX29rIDE7IGRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGxlZnQgLWZpbGwgeAogICAgYnV0dG9uICR3LmNhbmNlbCAtdGV4dCBDYW5jZWwgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3LmNhbmNlbCAtc2lkZSByaWdodCAtZmlsbCB4CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3CiAgICByZXR1cm4gJGNvbmZpcm1fb2sKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCB0ZXh0Zm9udCBtYWluZm9udCB1aWZvbnQgdGFic3RvcAogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmR0eXBlbWVudSBmaW5kbG9jIGZpbmRzdHJpbmcgZnN0cmluZyBnZW9tZXRyeQogICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAogICAgZ2xvYmFsIGRpZmZjb250ZXh0c3RyaW5nIGRpZmZjb250ZXh0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IGZha2Vyb3dtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGdkdHR5cGUKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcgc3N0cmluZwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMgc2VsZWN0Ymdjb2xvcgogICAgZ2xvYmFsIGhlYWRjdHhtZW51CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICAuYmFyIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiVXBkYXRlIiAtY29tbWFuZCB1cGRhdGVjb21taXRzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZXJlYWQgcmVmZXJlbmNlcyIgLWNvbW1hbmQgcmVyZWFkcmVmcwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiTGlzdCByZWZlcmVuY2VzIiAtY29tbWFuZCBzaG93cmVmcwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUXVpdCIgLWNvbW1hbmQgZG9xdWl0CiAgICAuYmFyLmZpbGUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIG1lbnUgLmJhci5lZGl0CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRWRpdCIgLW1lbnUgLmJhci5lZGl0CiAgICAuYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQcmVmZXJlbmNlcyIgLWNvbW1hbmQgZG9wcmVmcwogICAgLmJhci5lZGl0IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CgogICAgbWVudSAuYmFyLnZpZXcgLWZvbnQgJHVpZm9udAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIlZpZXciIC1tZW51IC5iYXIudmlldwogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiTmV3IHZpZXcuLi4iIC1jb21tYW5kIHtuZXd2aWV3IDB9CiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJFZGl0IHZpZXcuLi4iIC1jb21tYW5kIGVkaXR2aWV3IFwKCS1zdGF0ZSBkaXNhYmxlZAogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiRGVsZXRlIHZpZXciIC1jb21tYW5kIGRlbHZpZXcgLXN0YXRlIGRpc2FibGVkCiAgICAuYmFyLnZpZXcgYWRkIHNlcGFyYXRvcgogICAgLmJhci52aWV3IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgIkFsbCBmaWxlcyIgLWNvbW1hbmQge3Nob3d2aWV3IDB9IFwKCS12YXJpYWJsZSBzZWxlY3RlZHZpZXcgLXZhbHVlIDAKCiAgICBtZW51IC5iYXIuaGVscAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAogICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgZ2l0ayIgLWNvbW1hbmQgYWJvdXQKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIktleSBiaW5kaW5ncyIgLWNvbW1hbmQga2V5cwogICAgLmJhci5oZWxwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgIyB0aGUgZ3VpIGhhcyB1cHBlciBhbmQgbG93ZXIgaGFsZiwgcGFydHMgb2YgYSBwYW5lZCB3aW5kb3cuCiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCgogICAgIyBwb3NzaWJseSB1c2UgYXNzdW1lZCBnZW9tZXRyeQogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkocHdzYXNoMCldfSB7CiAgICAgICAgc2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW2V4cHIgezE1ICogJGxpbmVzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeSh0b3B3aWR0aCkgW2V4cHIgezgwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShib3RoZWlnaHQpIFtleHByIHsxNSAqICRsaW5lc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFtleHByIHs1MCAqICRjaGFyc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkocHdzYXNoMCkgIltleHByIHs0MCAqICRjaGFyc3BjfV0gMiIKICAgICAgICBzZXQgZ2VvbWV0cnkocHdzYXNoMSkgIltleHByIHs2MCAqICRjaGFyc3BjfV0gMiIKICAgIH0KCiAgICAjIHRoZSB1cHBlciBoYWxmIHdpbGwgaGF2ZSBhIHBhbmVkIHdpbmRvdywgYSBzY3JvbGwgYmFyIHRvIHRoZSByaWdodCwgYW5kIHNvbWUgc3R1ZmYgYmVsb3cKICAgIGZyYW1lIC50ZiAtaGVpZ2h0ICRnZW9tZXRyeSh0b3BoZWlnaHQpIC13aWR0aCAkZ2VvbWV0cnkodG9wd2lkdGgpCiAgICBmcmFtZSAudGYuaGlzdGZyYW1lCiAgICBwYW5lZHdpbmRvdyAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgLW9yaWVudCBob3Jpem9udGFsIC1zYXNocGFkIDAgLWhhbmRsZXNpemUgNAoKICAgICMgY3JlYXRlIHRocmVlIGNhbnZhc2VzCiAgICBzZXQgY3Njcm9sbCAudGYuaGlzdGZyYW1lLmNzYgogICAgc2V0IGNhbnYgLnRmLmhpc3RmcmFtZS5wd2NsaXN0LmNhbnYKICAgIGNhbnZhcyAkY2FudiBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICJzY3JvbGxjYW52ICRjc2Nyb2xsIgogICAgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IGFkZCAkY2FudgogICAgc2V0IGNhbnYyIC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52MgogICAgY2FudmFzICRjYW52MiBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLnRmLmhpc3RmcmFtZS5wd2NsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIFwKCS1zZWxlY3RiYWNrZ3JvdW5kICRzZWxlY3RiZ2NvbG9yIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IGFkZCAkY2FudjMKICAgIGV2YWwgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IHNhc2ggcGxhY2UgMCAkZ2VvbWV0cnkocHdzYXNoMCkKICAgIGV2YWwgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IHNhc2ggcGxhY2UgMSAkZ2VvbWV0cnkocHdzYXNoMSkKCiAgICAjIGEgc2Nyb2xsIGJhciB0byBydWxlIHRoZW0KICAgIHNjcm9sbGJhciAkY3Njcm9sbCAtY29tbWFuZCB7YWxsY2FudnMgeXZpZXd9IC1oaWdobGlnaHR0aGlja25lc3MgMAogICAgcGFjayAkY3Njcm9sbCAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBiaW5kIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KICAgIGxhcHBlbmQgYmdsaXN0ICRjYW52ICRjYW52MiAkY2FudjMKICAgIHBhY2sgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1zaWRlIGxlZnQKCiAgICAjIHdlIGhhdmUgdHdvIGJ1dHRvbiBiYXJzIGF0IGJvdHRvbSBvZiB0b3AgZnJhbWUuIEJhciAxCiAgICBmcmFtZSAudGYuYmFyCiAgICBmcmFtZSAudGYubGJhciAtaGVpZ2h0IDE1CgogICAgc2V0IHNoYTFlbnRyeSAudGYuYmFyLnNoYTEKICAgIHNldCBlbnRyaWVzICRzaGExZW50cnkKICAgIHNldCBzaGExYnV0IC50Zi5iYXIuc2hhMWxhYmVsCiAgICBidXR0b24gJHNoYTFidXQgLXRleHQgIlNIQTEgSUQ6ICIgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCBcCgktY29tbWFuZCBnb3RvY29tbWl0IC13aWR0aCA4IC1mb250ICR1aWZvbnQKICAgICRzaGExYnV0IGNvbmYgLWRpc2FibGVkZm9yZWdyb3VuZCBbJHNoYTFidXQgY2dldCAtZm9yZWdyb3VuZF0KICAgIHBhY2sgLnRmLmJhci5zaGExbGFiZWwgLXNpZGUgbGVmdAogICAgZW50cnkgJHNoYTFlbnRyeSAtd2lkdGggNDAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2hhMXN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNoYTFzdHJpbmcgd3JpdGUgc2hhMWNoYW5nZQogICAgcGFjayAkc2hhMWVudHJ5IC1zaWRlIGxlZnQgLXBhZHkgMgoKICAgIGltYWdlIGNyZWF0ZSBiaXRtYXAgYm0tbGVmdCAtZGF0YSB7CgkjZGVmaW5lIGxlZnRfd2lkdGggMTYKCSNkZWZpbmUgbGVmdF9oZWlnaHQgMTYKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxlZnRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MGUsIDB4MDAsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MGUsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDM4LCAweDAwLCAweDcwLCAweDAwLCAweGUwLCAweDAwLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGltYWdlIGNyZWF0ZSBiaXRtYXAgYm0tcmlnaHQgLWRhdGEgewoJI2RlZmluZSByaWdodF93aWR0aCAxNgoJI2RlZmluZSByaWdodF9oZWlnaHQgMTYKCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJpZ2h0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ODAsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MWMsCgkweDAwLCAweDM4LCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDAwLCAweDM4LCAweDAwLCAweDFjLAoJMHgwMCwgMHgwZSwgMHgwMCwgMHgwNywgMHg4MCwgMHgwMywgMHhjMCwgMHgwMX07CiAgICB9CiAgICBidXR0b24gLnRmLmJhci5sZWZ0YnV0IC1pbWFnZSBibS1sZWZ0IC1jb21tYW5kIGdvYmFjayBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC50Zi5iYXIubGVmdGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGJ1dHRvbiAudGYuYmFyLnJpZ2h0YnV0IC1pbWFnZSBibS1yaWdodCAtY29tbWFuZCBnb2ZvcncgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAudGYuYmFyLnJpZ2h0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQoKICAgIGJ1dHRvbiAudGYuYmFyLmZpbmRidXQgLXRleHQgIkZpbmQiIC1jb21tYW5kIGRvZmluZCAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLnRmLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZHN0cmluZyB3cml0ZSBmaW5kX2NoYW5nZQogICAgcGFjayAkZnN0cmluZyAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4IC1pbiAudGYuYmFyCiAgICBzZXQgZmluZHR5cGUgRXhhY3QKICAgIHNldCBmaW5kdHlwZW1lbnUgW3RrX29wdGlvbk1lbnUgLnRmLmJhci5maW5kdHlwZSBcCgkJICAgICAgZmluZHR5cGUgRXhhY3QgSWduQ2FzZSBSZWdleHBdCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZHR5cGUgd3JpdGUgZmluZF9jaGFuZ2UKICAgIC50Zi5iYXIuZmluZHR5cGUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIC50Zi5iYXIuZmluZHR5cGUubWVudSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCiAgICB0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCglDb21tZW50cyBBdXRob3IgQ29tbWl0dGVyCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgZmluZGxvYyB3cml0ZSBmaW5kX2NoYW5nZQogICAgLnRmLmJhci5maW5kbG9jIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAudGYuYmFyLmZpbmRsb2MubWVudSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYuYmFyLmZpbmRsb2MgLXNpZGUgcmlnaHQKICAgIHBhY2sgLnRmLmJhci5maW5kdHlwZSAtc2lkZSByaWdodAoKICAgICMgYnVpbGQgdXAgdGhlIGJvdHRvbSBiYXIgb2YgdXBwZXIgd2luZG93CiAgICBsYWJlbCAudGYubGJhci5mbGFiZWwgLXRleHQgIkhpZ2hsaWdodDogIENvbW1pdHMgIiBcCiAgICAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLmZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIHNldCBnZHR0eXBlICJ0b3VjaGluZyBwYXRoczoiCiAgICBzZXQgZ20gW3RrX29wdGlvbk1lbnUgLnRmLmxiYXIuZ2R0dHlwZSBnZHR0eXBlICJ0b3VjaGluZyBwYXRoczoiIFwKCSJhZGRpbmcvcmVtb3Zpbmcgc3RyaW5nOiJdCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgZ2R0dHlwZSB3cml0ZSBoZmlsZXNfY2hhbmdlCiAgICAkZ20gY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci5nZHR0eXBlIGNvbmYgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5nZHR0eXBlIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZW50cnkgLnRmLmxiYXIuZmVudCAtd2lkdGggMjUgLWZvbnQgJHRleHRmb250IFwKCS10ZXh0dmFyaWFibGUgaGlnaGxpZ2h0X2ZpbGVzCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X2ZpbGVzIHdyaXRlIGhmaWxlc19jaGFuZ2UKICAgIGxhcHBlbmQgZW50cmllcyAudGYubGJhci5mZW50CiAgICBwYWNrIC50Zi5sYmFyLmZlbnQgLXNpZGUgbGVmdCAtZmlsbCB4IC1leHBhbmQgMQogICAgbGFiZWwgLnRmLmxiYXIudmxhYmVsIC10ZXh0ICIgT1IgaW4gdmlldyIgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci52bGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBnbG9iYWwgdmlld2hsbWVudSBzZWxlY3RlZGhsdmlldwogICAgc2V0IHZpZXdobG1lbnUgW3RrX29wdGlvbk1lbnUgLnRmLmxiYXIudmhsIHNlbGVjdGVkaGx2aWV3IE5vbmVdCiAgICAkdmlld2hsbWVudSBlbnRyeWNvbmYgTm9uZSAtY29tbWFuZCBkZWx2aGlnaGxpZ2h0CiAgICAkdmlld2hsbWVudSBjb25mIC1mb250ICR1aWZvbnQKICAgIC50Zi5sYmFyLnZobCBjb25mIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIudmhsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgbGFiZWwgLnRmLmxiYXIucmxhYmVsIC10ZXh0ICIgT1IgIiAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLnJsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAogICAgc2V0IG0gW3RrX29wdGlvbk1lbnUgLnRmLmxiYXIucmVsbSBoaWdobGlnaHRfcmVsYXRlZCBOb25lIFwKCSJEZXNjZW5kZW50IiAiTm90IGRlc2NlbmRlbnQiICJBbmNlc3RvciIgIk5vdCBhbmNlc3RvciJdCiAgICAkbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC50Zi5sYmFyLnJlbG0gY29uZiAtZm9udCAkdWlmb250CiAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X3JlbGF0ZWQgd3JpdGUgdnJlbF9jaGFuZ2UKICAgIHBhY2sgLnRmLmxiYXIucmVsbSAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICAjIEZpbmlzaCBwdXR0aW5nIHRoZSB1cHBlciBoYWxmIG9mIHRoZSB2aWV3ZXIgdG9nZXRoZXIKICAgIHBhY2sgLnRmLmxiYXIgLWluIC50ZiAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgcGFjayAudGYuYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLnRmLmhpc3RmcmFtZSAtZmlsbCBib3RoIC1zaWRlIHRvcCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAudGYKICAgIC5jdG9wIHBhbmVjb25maWd1cmUgLnRmIC1oZWlnaHQgJGdlb21ldHJ5KHRvcGhlaWdodCkKICAgIC5jdG9wIHBhbmVjb25maWd1cmUgLnRmIC13aWR0aCAkZ2VvbWV0cnkodG9wd2lkdGgpCgogICAgIyBub3cgYnVpbGQgdXAgdGhlIGJvdHRvbQogICAgcGFuZWR3aW5kb3cgLnB3Ym90dG9tIC1vcmllbnQgaG9yaXpvbnRhbAoKICAgICMgbG93ZXIgbGVmdCwgYSB0ZXh0IGJveCBvdmVyIHNlYXJjaCBiYXIsIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0CiAgICAjIGlmIHdlIGtub3cgd2luZG93IGhlaWdodCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBsb3dlciB0ZXh0IGhlaWdodCwgb3RoZXJ3aXNlCiAgICAjIHdlIHNldCBsb3dlciB0ZXh0IGhlaWdodCB3aGljaCB3aWxsIGRyaXZlIHdpbmRvdyBoZWlnaHQKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkobWFpbildfSB7CiAgICAgICAgZnJhbWUgLmJsZWZ0IC13aWR0aCAkZ2VvbWV0cnkoYm90d2lkdGgpCiAgICB9IGVsc2UgewogICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShib3RoZWlnaHQpCiAgICB9CiAgICBmcmFtZSAuYmxlZnQudG9wCiAgICBmcmFtZSAuYmxlZnQubWlkCgogICAgYnV0dG9uIC5ibGVmdC50b3Auc2VhcmNoIC10ZXh0ICJTZWFyY2giIC1jb21tYW5kIGRvc2VhcmNoIFwKCS1mb250ICR1aWZvbnQKICAgIHBhY2sgLmJsZWZ0LnRvcC5zZWFyY2ggLXNpZGUgbGVmdCAtcGFkeCA1CiAgICBzZXQgc3N0cmluZyAuYmxlZnQudG9wLnNzdHJpbmcKICAgIGVudHJ5ICRzc3RyaW5nIC13aWR0aCAyMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzZWFyY2hzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkc3N0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNlYXJjaHN0cmluZyB3cml0ZSBpbmNyc2VhcmNoCiAgICBwYWNrICRzc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHJhZGlvYnV0dG9uIC5ibGVmdC5taWQuZGlmZiAtdGV4dCAiRGlmZiIgXAoJLWNvbW1hbmQgY2hhbmdlZGlmZmRpc3AgLXZhcmlhYmxlIGRpZmZlbGlkZSAtdmFsdWUgezAgMH0KICAgIHJhZGlvYnV0dG9uIC5ibGVmdC5taWQub2xkIC10ZXh0ICJPbGQgdmVyc2lvbiIgXAoJLWNvbW1hbmQgY2hhbmdlZGlmZmRpc3AgLXZhcmlhYmxlIGRpZmZlbGlkZSAtdmFsdWUgezAgMX0KICAgIHJhZGlvYnV0dG9uIC5ibGVmdC5taWQubmV3IC10ZXh0ICJOZXcgdmVyc2lvbiIgXAoJLWNvbW1hbmQgY2hhbmdlZGlmZmRpc3AgLXZhcmlhYmxlIGRpZmZlbGlkZSAtdmFsdWUgezEgMH0KICAgIGxhYmVsIC5ibGVmdC5taWQubGFiZWxkaWZmY29udGV4dCAtdGV4dCAiICAgICAgTGluZXMgb2YgY29udGV4dDogIiBcCgktZm9udCAkdWlmb250CiAgICBwYWNrIC5ibGVmdC5taWQuZGlmZiAuYmxlZnQubWlkLm9sZCAuYmxlZnQubWlkLm5ldyAtc2lkZSBsZWZ0CiAgICBzcGluYm94IC5ibGVmdC5taWQuZGlmZmNvbnRleHQgLXdpZHRoIDUgLWZvbnQgJHRleHRmb250IFwKCS1mcm9tIDEgLWluY3JlbWVudCAxIC10byAxMDAwMDAwMCBcCgktdmFsaWRhdGUgYWxsIC12YWxpZGF0ZWNvbW1hbmQgImRpZmZjb250ZXh0dmFsaWRhdGUgJVAiIFwKCS10ZXh0dmFyaWFibGUgZGlmZmNvbnRleHRzdHJpbmcKICAgIC5ibGVmdC5taWQuZGlmZmNvbnRleHQgc2V0ICRkaWZmY29udGV4dAogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGRpZmZjb250ZXh0c3RyaW5nIHdyaXRlIGRpZmZjb250ZXh0Y2hhbmdlCiAgICBsYXBwZW5kIGVudHJpZXMgLmJsZWZ0Lm1pZC5kaWZmY29udGV4dAogICAgcGFjayAuYmxlZnQubWlkLmxhYmVsZGlmZmNvbnRleHQgLmJsZWZ0Lm1pZC5kaWZmY29udGV4dCAtc2lkZSBsZWZ0CiAgICBzZXQgY3RleHQgLmJsZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktdGFicyAiW2V4cHIgeyR0YWJzdG9wICogJGNoYXJzcGN9XSIgXAoJLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmJsZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5ibGVmdC50b3AgLXNpZGUgdG9wIC1maWxsIHgKICAgIHBhY2sgLmJsZWZ0Lm1pZCAtc2lkZSB0b3AgLWZpbGwgeAogICAgcGFjayAuYmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY3RleHQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgbGFwcGVuZCBiZ2xpc3QgJGN0ZXh0CiAgICBsYXBwZW5kIGZnbGlzdCAkY3RleHQKCiAgICAkY3RleHQgdGFnIGNvbmYgY29tbWVudCAtd3JhcCAkd3JhcGNvbW1lbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgogICAgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMF0KICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICAkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCiAgICAkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQogICAgJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCiAgICAkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCiAgICAkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KICAgICRjdGV4dCB0YWcgY29uZiBtNSAtZm9yZSAiIzAwOTA5MCIKICAgICRjdGV4dCB0YWcgY29uZiBtNiAtZm9yZSBtYWdlbnRhCiAgICAkY3RleHQgdGFnIGNvbmYgbTcgLWZvcmUgIiM4MDgwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTggLWZvcmUgIiMwMDkwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTkgLWZvcmUgIiNmZjAwODAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEwIC1mb3JlIGN5YW4KICAgICRjdGV4dCB0YWcgY29uZiBtMTEgLWZvcmUgIiNiMDcwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEyIC1mb3JlICIjNzBiMGYwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMyAtZm9yZSAiIzcwZjBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTQgLWZvcmUgIiNmMGIwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE1IC1mb3JlICIjZmY3MGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKICAgIHNldCBtZXJnZW1heCAxNgogICAgJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CgogICAgLnB3Ym90dG9tIGFkZCAuYmxlZnQKICAgIC5wd2JvdHRvbSBwYW5lY29uZmlndXJlIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQoKICAgICMgbG93ZXIgcmlnaHQKICAgIGZyYW1lIC5icmlnaHQKICAgIGZyYW1lIC5icmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgLmJyaWdodC5tb2RlLnBhdGNoIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICByYWRpb2J1dHRvbiAuYnJpZ2h0Lm1vZGUudHJlZSAtdGV4dCAiVHJlZSIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInRyZWUiCiAgICAuYnJpZ2h0Lm1vZGUudHJlZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuYnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmJyaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktZm9udCAkbWFpbmZvbnQgXAoJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAoJLXlzY3JvbGxjb21tYW5kICIuYnJpZ2h0LnNiIHNldCIgXAoJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY2ZsaXN0CiAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CiAgICBzY3JvbGxiYXIgLmJyaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmJyaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGhpZ2hsaWdodCBcCgktYmFja2dyb3VuZCBbJGNmbGlzdCBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCiAgICAucHdib3R0b20gYWRkIC5icmlnaHQKICAgIC5jdG9wIGFkZCAucHdib3R0b20KCiAgICAjIHJlc3RvcmUgd2luZG93IHBvc2l0aW9uIGlmIGtub3duCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIHdtIGdlb21ldHJ5IC4gIiRnZW9tZXRyeShtYWluKSIKICAgIH0KCiAgICBpZiB7W3RrIHdpbmRvd2luZ3N5c3RlbV0gZXEge2FxdWF9fSB7CiAgICAgICAgc2V0IE0xQiBNMQogICAgfSBlbHNlIHsKICAgICAgICBzZXQgTTFCIENvbnRyb2wKICAgIH0KCiAgICBiaW5kIC5wd2JvdHRvbSA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQogICAgcGFjayAuY3RvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgaWYge1t0ayB3aW5kb3dpbmdzeXN0ZW1dID09ICJ3aW4zMiJ9IHsKCWJpbmQgLiA8TW91c2VXaGVlbD4geyB3aW5kb3dzX21vdXNld2hlZWxfcmVkaXJlY3RvciAlVyAlWCAlWSAlRCB9CgliaW5kICRjdGV4dCA8TW91c2VXaGVlbD4geyB3aW5kb3dzX21vdXNld2hlZWxfcmVkaXJlY3RvciAlVyAlWCAlWSAlRCA7IGJyZWFrIH0KICAgIH0gZWxzZSB7CgliaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCgliaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIH0KICAgIGJpbmRhbGwgPDI+ICJjYW52c2NhbiBtYXJrICVXICV4ICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgogICAgYmluZGtleSA8SG9tZT4gc2VsZmlyc3RsaW5lCiAgICBiaW5ka2V5IDxFbmQ+IHNlbGxhc3RsaW5lCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPFNoaWZ0LUtleS1VcD4gIm5leHRfaGlnaGxpZ2h0IC0xIgogICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCiAgICBiaW5ka2V5IDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5ka2V5IDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAic2VsbmV4dHBhZ2UgMSIKICAgIGJpbmQgLiA8JE0xQi1Ib21lPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDAuMCIKICAgIGJpbmQgLiA8JE0xQi1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgogICAgYmluZCAuIDwkTTFCLUtleS1VcD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSB1bml0cyIKICAgIGJpbmQgLiA8JE0xQi1LZXktRG93bj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHVuaXRzIgogICAgYmluZCAuIDwkTTFCLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8JE0xQi1LZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZGtleSA8RjU+IHVwZGF0ZWNvbW1pdHMKICAgIGJpbmQgLiA8JE0xQi1xPiBkb3F1aXQKICAgIGJpbmQgLiA8JE0xQi1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8JE0xQi1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8JE0xQi1yPiBkb3NlYXJjaGJhY2sKICAgIGJpbmQgLiA8JE0xQi1zPiBkb3NlYXJjaAogICAgYmluZCAuIDwkTTFCLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8JE0xQi1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDwkTTFCLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPCRNMUItS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIHdtIHByb3RvY29sIC4gV01fREVMRVRFX1dJTkRPVyBkb3F1aXQKICAgIGJpbmQgLiA8QnV0dG9uLTE+ICJjbGljayAlVyIKICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAogICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CiAgICBiaW5kICRzaGExZW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IGNsZWFyc2hhMQogICAgYmluZCAkY2ZsaXN0IDwxPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QjEtTW90aW9uPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QnV0dG9uUmVsZWFzZS0xPiB7dHJlZWNsaWNrICVXICV4ICV5fQogICAgYmluZCAkY2ZsaXN0IDxCdXR0b24tMz4ge3BvcF9mbGlzdF9tZW51ICVXICVYICVZICV4ICV5fQoKICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KICAgIHNldCB0ZXh0Y3Vyc29yIFskY3RleHQgY2dldCAtY3Vyc29yXQogICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIG5ldyBicmFuY2giIC1jb21tYW5kIG1rYnJhbmNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNoZXJyeS1waWNrIHRoaXMgY29tbWl0IiBcCgktY29tbWFuZCBjaGVycnlwaWNrCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlc2V0IEhFQUQgYnJhbmNoIHRvIGhlcmUiIFwKCS1jb21tYW5kIHJlc2V0aGVhZAoKICAgIHNldCBmYWtlcm93bWVudSAuZmFrZXJvd21lbnUKICAgIG1lbnUgJGZha2Vyb3dtZW51IC10ZWFyb2ZmIDAKICAgICRmYWtlcm93bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJGZha2Vyb3dtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkZmFrZXJvd21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiMgICAgJGZha2Vyb3dtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ29tbWl0IiAtY29tbWFuZCB7bWtjb21taXQgMH0KIyAgICAkZmFrZXJvd21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDb21taXQgYWxsIiAtY29tbWFuZCB7bWtjb21taXQgMX0KIyAgICAkZmFrZXJvd21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZXZlcnQgbG9jYWwgY2hhbmdlcyIgLWNvbW1hbmQgcmV2ZXJ0bG9jYWwKCiAgICBzZXQgaGVhZGN0eG1lbnUgLmhlYWRjdHhtZW51CiAgICBtZW51ICRoZWFkY3R4bWVudSAtdGVhcm9mZiAwCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDaGVjayBvdXQgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIGNvYnJhbmNoCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZW1vdmUgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIHJtYnJhbmNoCgogICAgZ2xvYmFsIGZsaXN0X21lbnUKICAgIHNldCBmbGlzdF9tZW51IC5mbGlzdGN0eG1lbnUKICAgIG1lbnUgJGZsaXN0X21lbnUgLXRlYXJvZmYgMAogICAgJGZsaXN0X21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJIaWdobGlnaHQgdGhpcyB0b28iIFwKCS1jb21tYW5kIHtmbGlzdF9obCAwfQogICAgJGZsaXN0X21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJIaWdobGlnaHQgdGhpcyBvbmx5IiBcCgktY29tbWFuZCB7Zmxpc3RfaGwgMX0KfQoKIyBXaW5kb3dzIHNlbmRzIGFsbCBtb3VzZSB3aGVlbCBldmVudHMgdG8gdGhlIGN1cnJlbnQgZm9jdXNlZCB3aW5kb3csIG5vdAojIHRoZSBvbmUgd2hlcmUgdGhlIG1vdXNlIGhvdmVycywgc28gYmluZCB0aG9zZSBldmVudHMgaGVyZSBhbmQgcmVkaXJlY3QKIyB0byB0aGUgY29ycmVjdCB3aW5kb3cKcHJvYyB3aW5kb3dzX21vdXNld2hlZWxfcmVkaXJlY3RvciB7VyBYIFkgRH0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIHNldCB3IFt3aW5mbyBjb250YWluaW5nIC1kaXNwbGF5b2YgJFcgJFggJFldCiAgICBpZiB7JHcgbmUgIiJ9IHsKCXNldCB1IFtleHByIHskRCA8IDAgPyA1IDogLTV9XQoJaWYgeyR3ID09ICRjYW52IHx8ICR3ID09ICRjYW52MiB8fCAkdyA9PSAkY2FudjN9IHsKCSAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgJHUgdW5pdHMKCX0gZWxzZSB7CgkgICAgY2F0Y2ggewoJCSR3IHl2aWV3IHNjcm9sbCAkdSB1bml0cwoJICAgIH0KCX0KICAgIH0KfQoKIyBtb3VzZS0yIG1ha2VzIGFsbCB3aW5kb3dzIHNjYW4gdmVydGljYWxseSwgYnV0IG9ubHkgdGhlIG9uZQojIHRoZSBjdXJzb3IgaXMgaW4gc2NhbnMgaG9yaXpvbnRhbGx5CnByb2MgY2FudnNjYW4ge29wIHcgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZm9yZWFjaCBjIFtsaXN0ICRjYW52ICRjYW52MiAkY2FudjNdIHsKCWlmIHskYyA9PSAkd30gewoJICAgICRjIHNjYW4gJG9wICR4ICR5Cgl9IGVsc2UgewoJICAgICRjIHNjYW4gJG9wIDAgJHkKCX0KICAgIH0KfQoKcHJvYyBzY3JvbGxjYW52IHtjc2Nyb2xsIGYwIGYxfSB7CiAgICAkY3Njcm9sbCBzZXQgJGYwICRmMQogICAgZHJhd2ZyYWMgJGYwICRmMQogICAgZmx1c2hoaWdobGlnaHRzCn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgY3RleHQgZW50cmllcwogICAgZm9yZWFjaCBlIFtjb25jYXQgJGVudHJpZXMgJGN0ZXh0XSB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250IHVpZm9udCB0YWJzdG9wCiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoIHNob3duZWFydGFncyBzaG93bG9jYWxjaGFuZ2VzCiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdhcmdzIHZpZXdwZXJtIG5leHR2aWV3bnVtCiAgICBnbG9iYWwgY21pdG1vZGUgd3JhcGNvbW1lbnQgZGF0ZXRpbWVmb3JtYXQKICAgIGdsb2JhbCBjb2xvcnMgYmdjb2xvciBmZ2NvbG9yIGRpZmZjb2xvcnMgZGlmZmNvbnRleHQgc2VsZWN0Ymdjb2xvcgoKICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCiAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAuXX0gcmV0dXJuCiAgICBjYXRjaCB7CglzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCglwdXRzICRmIFtsaXN0IHNldCBtYWluZm9udCAkbWFpbmZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0ZXh0Zm9udCAkdGV4dGZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB1aWZvbnQgJHVpZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRhYnN0b3AgJHRhYnN0b3BdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBtYXhncmFwaHBjdCAkbWF4Z3JhcGhwY3RdCglwdXRzICRmIFtsaXN0IHNldCBtYXh3aWR0aCAkbWF4d2lkdGhdCglwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCglwdXRzICRmIFtsaXN0IHNldCB3cmFwY29tbWVudCAkd3JhcGNvbW1lbnRdCglwdXRzICRmIFtsaXN0IHNldCBzaG93bmVhcnRhZ3MgJHNob3duZWFydGFnc10KCXB1dHMgJGYgW2xpc3Qgc2V0IHNob3dsb2NhbGNoYW5nZXMgJHNob3dsb2NhbGNoYW5nZXNdCglwdXRzICRmIFtsaXN0IHNldCBkYXRldGltZWZvcm1hdCAkZGF0ZXRpbWVmb3JtYXRdCglwdXRzICRmIFtsaXN0IHNldCBiZ2NvbG9yICRiZ2NvbG9yXQoJcHV0cyAkZiBbbGlzdCBzZXQgZmdjb2xvciAkZmdjb2xvcl0KCXB1dHMgJGYgW2xpc3Qgc2V0IGNvbG9ycyAkY29sb3JzXQoJcHV0cyAkZiBbbGlzdCBzZXQgZGlmZmNvbG9ycyAkZGlmZmNvbG9yc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGRpZmZjb250ZXh0ICRkaWZmY29udGV4dF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHNlbGVjdGJnY29sb3IgJHNlbGVjdGJnY29sb3JdCgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KG1haW4pIFt3bSBnZW9tZXRyeSAuXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeSh0b3B3aWR0aCkgW3dpbmZvIHdpZHRoIC50Zl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkodG9waGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC50Zl0iCiAgICAgICAgcHV0cyAkZiAic2V0IGdlb21ldHJ5KHB3c2FzaDApIFwiWy50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIGNvb3JkIDBdXCIiCiAgICAgICAgcHV0cyAkZiAic2V0IGdlb21ldHJ5KHB3c2FzaDEpIFwiWy50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIGNvb3JkIDFdXCIiCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFt3aW5mbyB3aWR0aCAuYmxlZnRdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGJvdGhlaWdodCkgW3dpbmZvIGhlaWdodCAuYmxlZnRdIgoKCXB1dHMgLW5vbmV3bGluZSAkZiAic2V0IHBlcm12aWV3cyB7IgoJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKCSAgICBpZiB7JHZpZXdwZXJtKCR2KX0gewoJCXB1dHMgJGYgIntbbGlzdCAkdmlld25hbWUoJHYpICR2aWV3ZmlsZXMoJHYpICR2aWV3YXJncygkdildfSIKCSAgICB9Cgl9CglwdXRzICRmICJ9IgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgZ2xvYmFsIHVpZm9udAogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAoKQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwIC1ib3JkZXIgMiAtYmcgd2hpdGUgLXJlbGllZiBncm9vdmUKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyIC1wYWR5IDIKICAgICR3Lm0gY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIgLWRlZmF1bHQgYWN0aXZlCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQogICAgJHcub2sgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJmb2N1cyAkdy5vayIKICAgIGJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgogICAgYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCn0KCnByb2Mga2V5cyB7fSB7CiAgICBnbG9iYWwgdWlmb250CiAgICBzZXQgdyAua2V5cwogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3RrIHdpbmRvd2luZ3N5c3RlbV0gZXEge2FxdWF9fSB7CglzZXQgTTFUIENtZAogICAgfSBlbHNlIHsKCXNldCBNMVQgQ3RybAogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJHaXRrIGtleSBiaW5kaW5ncyIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAiCkdpdGsga2V5IGJpbmRpbmdzOgoKPCRNMVQtUT4JCVF1aXQKPEhvbWU+CQlNb3ZlIHRvIGZpcnN0IGNvbW1pdAo8RW5kPgkJTW92ZSB0byBsYXN0IGNvbW1pdAo8VXA+LCBwLCBpCU1vdmUgdXAgb25lIGNvbW1pdAo8RG93bj4sIG4sIGsJTW92ZSBkb3duIG9uZSBjb21taXQKPExlZnQ+LCB6LCBqCUdvIGJhY2sgaW4gaGlzdG9yeSBsaXN0CjxSaWdodD4sIHgsIGwJR28gZm9yd2FyZCBpbiBoaXN0b3J5IGxpc3QKPFBhZ2VVcD4JTW92ZSB1cCBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8UGFnZURvd24+CU1vdmUgZG93biBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8JE0xVC1Ib21lPglTY3JvbGwgdG8gdG9wIG9mIGNvbW1pdCBsaXN0CjwkTTFULUVuZD4JU2Nyb2xsIHRvIGJvdHRvbSBvZiBjb21taXQgbGlzdAo8JE0xVC1VcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBsaW5lCjwkTTFULURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBsaW5lCjwkTTFULVBhZ2VVcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBwYWdlCjwkTTFULVBhZ2VEb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgcGFnZQo8U2hpZnQtVXA+CU1vdmUgdG8gcHJldmlvdXMgaGlnaGxpZ2h0ZWQgbGluZQo8U2hpZnQtRG93bj4JTW92ZSB0byBuZXh0IGhpZ2hsaWdodGVkIGxpbmUKPERlbGV0ZT4sIGIJU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQo8QmFja3NwYWNlPglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxTcGFjZT4JCVNjcm9sbCBkaWZmIHZpZXcgZG93biBvbmUgcGFnZQp1CQlTY3JvbGwgZGlmZiB2aWV3IHVwIDE4IGxpbmVzCmQJCVNjcm9sbCBkaWZmIHZpZXcgZG93biAxOCBsaW5lcwo8JE0xVC1GPgkJRmluZAo8JE0xVC1HPgkJTW92ZSB0byBuZXh0IGZpbmQgaGl0CjxSZXR1cm4+CU1vdmUgdG8gbmV4dCBmaW5kIGhpdAovCQlNb3ZlIHRvIG5leHQgZmluZCBoaXQsIG9yIHJlZG8gZmluZAo/CQlNb3ZlIHRvIHByZXZpb3VzIGZpbmQgaGl0CmYJCVNjcm9sbCBkaWZmIHZpZXcgdG8gbmV4dCBmaWxlCjwkTTFULVM+CQlTZWFyY2ggZm9yIG5leHQgaGl0IGluIGRpZmYgdmlldwo8JE0xVC1SPgkJU2VhcmNoIGZvciBwcmV2aW91cyBoaXQgaW4gZGlmZiB2aWV3CjwkTTFULUtQKz4JSW5jcmVhc2UgZm9udCBzaXplCjwkTTFULXBsdXM+CUluY3JlYXNlIGZvbnQgc2l6ZQo8JE0xVC1LUC0+CURlY3JlYXNlIGZvbnQgc2l6ZQo8JE0xVC1taW51cz4JRGVjcmVhc2UgZm9udCBzaXplCjxGNT4JCVVwZGF0ZQoiIFwKCSAgICAtanVzdGlmeSBsZWZ0IC1iZyB3aGl0ZSAtYm9yZGVyIDIgLXJlbGllZiBncm9vdmUKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgYm90aCAtcGFkeCAyIC1wYWR5IDIKICAgICR3Lm0gY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIgLWRlZmF1bHQgYWN0aXZlCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQogICAgJHcub2sgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJmb2N1cyAkdy5vayIKICAgIGJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgogICAgYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KCXNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCXNldCBwcmVmZW5kc3RhY2sgW2xyZXBsYWNlICRwcmVmZW5kc3RhY2sgZW5kIGVuZF0KCXNldCBwcmVmaXggW3N0cmluZyByYW5nZSAkcHJlZml4IDAgJHByZWZpeGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCmltYWdlIGNyZWF0ZSBiaXRtYXAgcmVmaWNvbi1UIC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIHllbGxvdyAtZGF0YSB7CiAgICAjZGVmaW5lIHRhZ2ljb25fd2lkdGggMTMKICAgICNkZWZpbmUgdGFnaWNvbl9oZWlnaHQgOQogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFnaWNvbl9iaXRzW10gPSB7CiAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDA3LCAweGY4LCAweDA3LAogICAgICAgMHhmYywgMHgwNywgMHhmOCwgMHgwNywgMHhmMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Cn0gLW1hc2tkYXRhIHsKICAgICNkZWZpbmUgdGFnaWNvbi1tYXNrX3dpZHRoIDEzCiAgICAjZGVmaW5lIHRhZ2ljb24tbWFza19oZWlnaHQgOQogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFnaWNvbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MGYsIDB4ZjgsIDB4MGYsIDB4ZmMsIDB4MGYsCiAgICAgICAweGZlLCAweDBmLCAweGZjLCAweDBmLCAweGY4LCAweDBmLCAweGYwLCAweDBmLCAweDAwLCAweDAwfTsKfQpzZXQgcmVjdGRhdGEgewogICAgI2RlZmluZSBoZWFkaWNvbl93aWR0aCAxMwogICAgI2RlZmluZSBoZWFkaWNvbl9oZWlnaHQgOQogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZGljb25fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmOCwgMHgwNywgMHhmOCwgMHgwNywKICAgICAgIDB4ZjgsIDB4MDcsIDB4ZjgsIDB4MDcsIDB4ZjgsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Owp9CnNldCByZWN0bWFzayB7CiAgICAjZGVmaW5lIGhlYWRpY29uLW1hc2tfd2lkdGggMTMKICAgICNkZWZpbmUgaGVhZGljb24tbWFza19oZWlnaHQgOQogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZGljb24tbWFza19iaXRzW10gPSB7CiAgICAgICAweDAwLCAweDAwLCAweGZjLCAweDBmLCAweGZjLCAweDBmLCAweGZjLCAweDBmLAogICAgICAgMHhmYywgMHgwZiwgMHhmYywgMHgwZiwgMHhmYywgMHgwZiwgMHhmYywgMHgwZiwgMHgwMCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCByZWZpY29uLUggLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgZ3JlZW4gXAogICAgLWRhdGEgJHJlY3RkYXRhIC1tYXNrZGF0YSAkcmVjdG1hc2sKaW1hZ2UgY3JlYXRlIGJpdG1hcCByZWZpY29uLW8gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgIiNkZGRkZmYiIFwKICAgIC1kYXRhICRyZWN0ZGF0YSAtbWFza2RhdGEgJHJlY3RtYXNrCgpwcm9jIGluaXRfZmxpc3Qge2ZpcnN0fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGNmbGlzdF90b3Agc2VsZWN0ZWRsaW5lIGRpZmZmaWxlc3RhcnQKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGNmbGlzdCBkZWxldGUgMC4wIGVuZAogICAgaWYgeyRmaXJzdCBuZSB7fX0gewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmaXJzdAoJc2V0IGNmbGlzdF90b3AgMQoJJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAxLjAgIjEuMCBsaW5lZW5kIgogICAgfSBlbHNlIHsKCWNhdGNoIHt1bnNldCBjZmxpc3RfdG9wfQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGRpZmZmaWxlc3RhcnQge30KfQoKcHJvYyBoaWdobGlnaHRfdGFnIHtmfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3BhdGhzCgogICAgZm9yZWFjaCBwICRoaWdobGlnaHRfcGF0aHMgewoJaWYge1tzdHJpbmcgbWF0Y2ggJHAgJGZdfSB7CgkgICAgcmV0dXJuICJib2xkIgoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgaGlnaGxpZ2h0X2ZpbGVsaXN0IHt9IHsKICAgIGdsb2JhbCBjbWl0bW9kZSBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYgeyRjbWl0bW9kZSBuZSAidHJlZSJ9IHsKCXNldCBlbmQgW2xpbmRleCBbc3BsaXQgWyRjZmxpc3QgaW5kZXggZW5kXSAuXSAwXQoJZm9yIHtzZXQgbCAyfSB7JGwgPCAkZW5kfSB7aW5jciBsfSB7CgkgICAgc2V0IGxpbmUgWyRjZmxpc3QgZ2V0ICRsLjAgIiRsLjAgbGluZWVuZCJdCgkgICAgaWYge1toaWdobGlnaHRfdGFnICRsaW5lXSBuZSB7fX0gewoJCSRjZmxpc3QgdGFnIGFkZCBib2xkICRsLjAgIiRsLjAgbGluZWVuZCIKCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJaGlnaGxpZ2h0X3RyZWUgMiB7fQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHVuaGlnaGxpZ2h0X2ZpbGVsaXN0IHt9IHsKICAgIGdsb2JhbCBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGJvbGQgMS4wIGVuZAogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGFkZF9mbGlzdCB7Zmx9IHsKICAgIGdsb2JhbCBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgZm9yZWFjaCBmICRmbCB7CgkkY2ZsaXN0IGluc2VydCBlbmQgIlxuIgoJJGNmbGlzdCBpbnNlcnQgZW5kICRmIFtoaWdobGlnaHRfdGFnICRmXQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNlbF9mbGlzdCB7dyB4IHl9IHsKICAgIGdsb2JhbCBjdGV4dCBkaWZmZmlsZXN0YXJ0IGNmbGlzdCBjZmxpc3RfdG9wIGNtaXRtb2RlCgogICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgY2ZsaXN0X3RvcF19IHJldHVybgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgaGlnaGxpZ2h0ICRjZmxpc3RfdG9wLjAgIiRjZmxpc3RfdG9wLjAgbGluZWVuZCIKICAgICRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgJGwuMCAiJGwuMCBsaW5lZW5kIgogICAgc2V0IGNmbGlzdF90b3AgJGwKICAgIGlmIHskbCA9PSAxfSB7CgkkY3RleHQgeXZpZXcgMS4wCiAgICB9IGVsc2UgewoJY2F0Y2ggeyRjdGV4dCB5dmlldyBbbGluZGV4ICRkaWZmZmlsZXN0YXJ0IFtleHByIHskbCAtIDJ9XV19CiAgICB9Cn0KCnByb2MgcG9wX2ZsaXN0X21lbnUge3cgWCBZIHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCBjbWl0bW9kZSBmbGlzdF9tZW51IGZsaXN0X21lbnVfZmlsZQogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzCgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCiAgICBpZiB7JGwgPD0gMX0gcmV0dXJuCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJc2V0IGUgW2xpbmV0b2VsdCAkbF0KCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSByZXR1cm4KICAgIH0gZWxzZSB7CglzZXQgZSBbbGluZGV4ICR0cmVlZGlmZnMoJGRpZmZpZHMpIFtleHByIHskbC0yfV1dCiAgICB9CiAgICBzZXQgZmxpc3RfbWVudV9maWxlICRlCiAgICB0a19wb3B1cCAkZmxpc3RfbWVudSAkWCAkWQp9Cgpwcm9jIGZsaXN0X2hsIHtvbmx5fSB7CiAgICBnbG9iYWwgZmxpc3RfbWVudV9maWxlIGhpZ2hsaWdodF9maWxlcwoKICAgIHNldCB4IFtzaGVsbHF1b3RlICRmbGlzdF9tZW51X2ZpbGVdCiAgICBpZiB7JG9ubHkgfHwgJGhpZ2hsaWdodF9maWxlcyBlcSB7fX0gewoJc2V0IGhpZ2hsaWdodF9maWxlcyAkeAogICAgfSBlbHNlIHsKCWFwcGVuZCBoaWdobGlnaHRfZmlsZXMgIiAiICR4CiAgICB9Cn0KCiMgRnVuY3Rpb25zIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIHNoZWxsLXR5cGUgcXVvdGluZwoKcHJvYyBzaGVsbHF1b3RlIHtzdHJ9IHsKICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFwgXHRdKiIgJHN0cl19IHsKCXJldHVybiAkc3RyCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIipcWydcIlxcXSoiICRzdHJdfSB7CglyZXR1cm4gIlwiJHN0clwiIgogICAgfQogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqJyoiICRzdHJdfSB7CglyZXR1cm4gIickc3RyJyIKICAgIH0KICAgIHJldHVybiAiXCJbc3RyaW5nIG1hcCB7XCIgXFxcIiBcXCBcXFxcfSAkc3RyXVwiIgp9Cgpwcm9jIHNoZWxsYXJnbGlzdCB7bH0gewogICAgc2V0IHN0ciB7fQogICAgZm9yZWFjaCBhICRsIHsKCWlmIHskc3RyIG5lIHt9fSB7CgkgICAgYXBwZW5kIHN0ciAiICIKCX0KCWFwcGVuZCBzdHIgW3NoZWxscXVvdGUgJGFdCiAgICB9CiAgICByZXR1cm4gJHN0cgp9Cgpwcm9jIHNoZWxsZGVxdW90ZSB7c3RyfSB7CiAgICBzZXQgcmV0IHt9CiAgICBzZXQgdXNlZCAtMQogICAgd2hpbGUgezF9IHsKCWluY3IgdXNlZAoJaWYgeyFbcmVnZXhwIC1zdGFydCAkdXNlZCAtaW5kaWNlcyAiXFsnXCJcXFxcIFx0XSIgJHN0ciBmaXJzdF19IHsKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBlbmRdCgkgICAgc2V0IHVzZWQgW3N0cmluZyBsZW5ndGggJHN0cl0KCSAgICBicmVhawoJfQoJc2V0IGZpcnN0IFtsaW5kZXggJGZpcnN0IDBdCglzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KCWlmIHskZmlyc3QgPiAkdXNlZH0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0Cgl9CglpZiB7JGNoIGVxICIgIiB8fCAkY2ggZXEgIlx0In0gYnJlYWsKCWluY3IgdXNlZAoJaWYgeyRjaCBlcSAiJyJ9IHsKCSAgICBzZXQgZmlyc3QgW3N0cmluZyBmaXJzdCAiJyIgJHN0ciAkdXNlZF0KCSAgICBpZiB7JGZpcnN0IDwgMH0gewoJCWVycm9yICJ1bm1hdGNoZWQgc2luZ2xlLXF1b3RlIgoJICAgIH0KCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBbZXhwciB7JGZpcnN0IC0gMX1dXQoJICAgIHNldCB1c2VkICRmaXJzdAoJICAgIGNvbnRpbnVlCgl9CglpZiB7JGNoIGVxICJcXCJ9IHsKCSAgICBpZiB7JHVzZWQgPj0gW3N0cmluZyBsZW5ndGggJHN0cl19IHsKCQllcnJvciAidHJhaWxpbmcgYmFja3NsYXNoIgoJICAgIH0KCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBjb250aW51ZQoJfQoJIyBoZXJlIGNoID09ICJcIiIKCXdoaWxlIHsxfSB7CgkgICAgaWYgeyFbcmVnZXhwIC1zdGFydCAkdXNlZCAtaW5kaWNlcyAiXFtcIlxcXFxdIiAkc3RyIGZpcnN0XX0gewoJCWVycm9yICJ1bm1hdGNoZWQgZG91YmxlLXF1b3RlIgoJICAgIH0KCSAgICBzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCSAgICBzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KCSAgICBpZiB7JGZpcnN0ID4gJHVzZWR9IHsKCQlhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBbZXhwciB7JGZpcnN0IC0gMX1dXQoJCXNldCB1c2VkICRmaXJzdAoJICAgIH0KCSAgICBpZiB7JGNoIGVxICJcIiJ9IGJyZWFrCgkgICAgaW5jciB1c2VkCgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIGluZGV4ICRzdHIgJHVzZWRdCgkgICAgaW5jciB1c2VkCgl9CiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHVzZWQgJHJldF0KfQoKcHJvYyBzaGVsbHNwbGl0IHtzdHJ9IHsKICAgIHNldCBsIHt9CiAgICB3aGlsZSB7MX0gewoJc2V0IHN0ciBbc3RyaW5nIHRyaW1sZWZ0ICRzdHJdCglpZiB7JHN0ciBlcSB7fX0gYnJlYWsKCXNldCBkcSBbc2hlbGxkZXF1b3RlICRzdHJdCglzZXQgbiBbbGluZGV4ICRkcSAwXQoJc2V0IHdvcmQgW2xpbmRleCAkZHEgMV0KCXNldCBzdHIgW3N0cmluZyByYW5nZSAkc3RyICRuIGVuZF0KCWxhcHBlbmQgbCAkd29yZAogICAgfQogICAgcmV0dXJuICRsCn0KCiMgQ29kZSB0byBpbXBsZW1lbnQgbXVsdGlwbGUgdmlld3MKCnByb2MgbmV3dmlldyB7aXNoaWdobGlnaHR9IHsKICAgIGdsb2JhbCBuZXh0dmlld251bSBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybSB1aWZvbnQgbmV3aXNoaWdobGlnaHQKICAgIGdsb2JhbCBuZXd2aWV3YXJncyByZXZ0cmVlYXJncwoKICAgIHNldCBuZXdpc2hpZ2hsaWdodCAkaXNoaWdobGlnaHQKICAgIHNldCB0b3AgLmdpdGt2aWV3CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3dmlld25hbWUoJG5leHR2aWV3bnVtKSAiVmlldyAkbmV4dHZpZXdudW0iCiAgICBzZXQgbmV3dmlld3Blcm0oJG5leHR2aWV3bnVtKSAwCiAgICBzZXQgbmV3dmlld2FyZ3MoJG5leHR2aWV3bnVtKSBbc2hlbGxhcmdsaXN0ICRyZXZ0cmVlYXJnc10KICAgIHZpZXdlZGl0b3IgJHRvcCAkbmV4dHZpZXdudW0gIkdpdGsgdmlldyBkZWZpbml0aW9uIgp9Cgpwcm9jIGVkaXR2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3CiAgICBnbG9iYWwgdmlld25hbWUgdmlld3Blcm0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0KICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncwoKICAgIHNldCB0b3AgLmdpdGt2ZWRpdC0kY3VydmlldwogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IG5ld3ZpZXduYW1lKCRjdXJ2aWV3KSAkdmlld25hbWUoJGN1cnZpZXcpCiAgICBzZXQgbmV3dmlld3Blcm0oJGN1cnZpZXcpICR2aWV3cGVybSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3YXJncygkY3VydmlldykgW3NoZWxsYXJnbGlzdCAkdmlld2FyZ3MoJGN1cnZpZXcpXQogICAgdmlld2VkaXRvciAkdG9wICRjdXJ2aWV3ICJHaXRrOiBlZGl0IHZpZXcgJHZpZXduYW1lKCRjdXJ2aWV3KSIKfQoKcHJvYyB2aWV3ZWRpdG9yIHt0b3AgbiB0aXRsZX0gewogICAgZ2xvYmFsIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHZpZXdmaWxlcwogICAgZ2xvYmFsIHVpZm9udAoKICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgJHRpdGxlCiAgICBsYWJlbCAkdG9wLm5sIC10ZXh0ICJOYW1lIiAtZm9udCAkdWlmb250CiAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgbmV3dmlld25hbWUoJG4pIC1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5ubCAkdG9wLm5hbWUgLXN0aWNreSB3IC1wYWR5IDUKICAgIGNoZWNrYnV0dG9uICR0b3AucGVybSAtdGV4dCAiUmVtZW1iZXIgdGhpcyB2aWV3IiAtdmFyaWFibGUgbmV3dmlld3Blcm0oJG4pIFwKCS1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5wZXJtIC0gLXBhZHkgNSAtc3RpY2t5IHcKICAgIG1lc3NhZ2UgJHRvcC5hbCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiQ29tbWl0cyB0byBpbmNsdWRlIChhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0KToiCiAgICBncmlkICR0b3AuYWwgLSAtc3RpY2t5IHcgLXBhZHkgNQogICAgZW50cnkgJHRvcC5hcmdzIC13aWR0aCA1MCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXdhcmdzKCRuKSBcCgktYmFja2dyb3VuZCB3aGl0ZSAtZm9udCAkdWlmb250CiAgICBncmlkICR0b3AuYXJncyAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgbWVzc2FnZSAkdG9wLmwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAoJLXRleHQgIkVudGVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBpbmNsdWRlLCBvbmUgcGVyIGxpbmU6IgogICAgZ3JpZCAkdG9wLmwgLSAtc3RpY2t5IHcKICAgIHRleHQgJHRvcC50IC13aWR0aCA0MCAtaGVpZ2h0IDEwIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb250ICR1aWZvbnQKICAgIGlmIHtbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKCWZvcmVhY2ggZiAkdmlld2ZpbGVzKCRuKSB7CgkgICAgJHRvcC50IGluc2VydCBlbmQgJGYKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAiXG4iCgl9CgkkdG9wLnQgZGVsZXRlIHtlbmQgLSAxY30gZW5kCgkkdG9wLnQgbWFyayBzZXQgaW5zZXJ0IDAuMAogICAgfQogICAgZ3JpZCAkdG9wLnQgLSAtc3RpY2t5IGV3IC1wYWR4IDUKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIFtsaXN0IG5ld3ZpZXdvayAkdG9wICRuXSBcCgktZm9udCAkdWlmb250CiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBbbGlzdCBkZXN0cm95ICR0b3BdIFwKCS1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnQKfQoKcHJvYyBkb3ZpZXdtZW51IHttIGZpcnN0IGNtZCBvcCBhcmd2fSB7CiAgICBzZXQgbm1lbnUgWyRtIGluZGV4IGVuZF0KICAgIGZvciB7c2V0IGkgJGZpcnN0fSB7JGkgPD0gJG5tZW51fSB7aW5jciBpfSB7CglpZiB7WyRtIGVudHJ5Y2dldCAkaSAtY29tbWFuZF0gZXEgJGNtZH0gewoJICAgIGV2YWwgJG0gJG9wICRpICRhcmd2CgkgICAgYnJlYWsKCX0KICAgIH0KfQoKcHJvYyBhbGx2aWV3bWVudXMge24gb3AgYXJnc30gewogICAgZ2xvYmFsIHZpZXdobG1lbnUKCiAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA1IFtsaXN0IHNob3d2aWV3ICRuXSAkb3AgJGFyZ3MKICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAkb3AgJGFyZ3MKfQoKcHJvYyBuZXd2aWV3b2sge3RvcCBufSB7CiAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld3Blcm0gbmV3dmlld25hbWUgbmV3aXNoaWdobGlnaHQKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld3Blcm0gc2VsZWN0ZWR2aWV3IGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncyB2aWV3aGxtZW51CgogICAgaWYge1tjYXRjaCB7CglzZXQgbmV3YXJncyBbc2hlbGxzcGxpdCAkbmV3dmlld2FyZ3MoJG4pXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgaW4gY29tbWl0IHNlbGVjdGlvbiBhcmd1bWVudHM6ICRlcnIiCgl3bSByYWlzZSAkdG9wCglmb2N1cyAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlcyB7fQogICAgZm9yZWFjaCBmIFtzcGxpdCBbJHRvcC50IGdldCAwLjAgZW5kXSAiXG4iXSB7CglzZXQgZnQgW3N0cmluZyB0cmltICRmXQoJaWYgeyRmdCBuZSB7fX0gewoJICAgIGxhcHBlbmQgZmlsZXMgJGZ0Cgl9CiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJIyBjcmVhdGluZyBhIG5ldyB2aWV3CglpbmNyIG5leHR2aWV3bnVtCglzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQoJc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCglzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCglhZGR2aWV3bWVudSAkbgoJaWYgeyEkbmV3aXNoaWdobGlnaHR9IHsKCSAgICBydW4gc2hvd3ZpZXcgJG4KCX0gZWxzZSB7CgkgICAgcnVuIGFkZHZoaWdobGlnaHQgJG4KCX0KICAgIH0gZWxzZSB7CgkjIGVkaXRpbmcgYW4gZXhpc3RpbmcgdmlldwoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglpZiB7JG5ld3ZpZXduYW1lKCRuKSBuZSAkdmlld25hbWUoJG4pfSB7CgkgICAgc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCgkgICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNSBbbGlzdCBzaG93dmlldyAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKV0KCSAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKSAtdmFsdWUgJHZpZXduYW1lKCRuKV0KCX0KCWlmIHskZmlsZXMgbmUgJHZpZXdmaWxlcygkbikgfHwgJG5ld2FyZ3MgbmUgJHZpZXdhcmdzKCRuKX0gewoJICAgIHNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcwoJICAgIHNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCSAgICBpZiB7JGN1cnZpZXcgPT0gJG59IHsKCQlydW4gdXBkYXRlY29tbWl0cwoJICAgIH0KCX0KICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9Cn0KCnByb2MgZGVsdmlldyB7fSB7CiAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3cGVybSBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JGN1cnZpZXcgPT0gMH0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKCXVuc2V0IGhsdmlldwogICAgfQogICAgYWxsdmlld21lbnVzICRjdXJ2aWV3IGRlbGV0ZQogICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSB7fQogICAgc2V0IHZpZXdwZXJtKCRjdXJ2aWV3KSAwCiAgICBzaG93dmlldyAwCn0KCnByb2MgYWRkdmlld21lbnUge259IHsKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3aGxtZW51CgogICAgLmJhci52aWV3IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBzaG93dmlldyAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgJG4KICAgICR2aWV3aGxtZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWRobHZpZXcKfQoKcHJvYyBmbGF0dGVuIHt2YXJ9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBpIFthcnJheSBuYW1lcyAkdmFyXSB7CglsYXBwZW5kIHJldCAkaSBbc2V0ICR2YXJcKCRpXCldCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVuZmxhdHRlbiB7dmFyIGx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgY2F0Y2gge3Vuc2V0ICR2YXJ9CiAgICBmb3JlYWNoIHtpIHZ9ICRsIHsKCXNldCAkdmFyXCgkaVwpICR2CiAgICB9Cn0KCnByb2Mgc2hvd3ZpZXcge259IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdmaWxlcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IHJvd2lkbGlzdCByb3dvZmZzZXRzCiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHggY29tbWl0cm93IG5leHRjb2xvciBjYW52eG1heAogICAgZ2xvYmFsIG51bWNvbW1pdHMgcm93cmFuZ2VsaXN0IGNvbW1pdGxpc3RlZCBpZHJvd3JhbmdlcyByb3djaGsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkIGNhbnYgY2FudnkwCiAgICBnbG9iYWwgdHJlZWRpZmZzCiAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QgcGhhc2UKICAgIGdsb2JhbCBjb21taXRpZHggcm93bGFpZG91dCByb3dvcHRpbQogICAgZ2xvYmFsIGNvbW1mZAogICAgZ2xvYmFsIHNlbGVjdGVkdmlldyBzZWxlY3RmaXJzdAogICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKICAgIGdsb2JhbCBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JG4gPT0gJGN1cnZpZXd9IHJldHVybgogICAgc2V0IHNlbGlkIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBzZWxpZCAkY3VycmVudGlkCglzZXQgeSBbeWMgJHNlbGVjdGVkbGluZV0KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCBzcGFuIFskY2FudiB5dmlld10KCXNldCB5dG9wIFtleHByIHtbbGluZGV4ICRzcGFuIDBdICogJHltYXh9XQoJc2V0IHlib3QgW2V4cHIge1tsaW5kZXggJHNwYW4gMV0gKiAkeW1heH1dCglpZiB7JHl0b3AgPCAkeSAmJiAkeSA8ICR5Ym90fSB7CgkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeyR5IC0gJHl0b3B9XQoJfSBlbHNlIHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7KCR5Ym90IC0gJHl0b3ApIC8gMn1dCgl9CiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XX0gewoJc2V0IHNlbGlkICRwZW5kaW5nX3NlbGVjdAoJdW5zZXQgcGVuZGluZ19zZWxlY3QKICAgIH0KICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgaWYgeyRjdXJ2aWV3ID49IDB9IHsKCXNldCB2cGFyZW50bGlzdCgkY3VydmlldykgJHBhcmVudGxpc3QKCXNldCB2ZGlzcG9yZGVyKCRjdXJ2aWV3KSAkZGlzcGxheW9yZGVyCglzZXQgdmNtaXRsaXN0ZWQoJGN1cnZpZXcpICRjb21taXRsaXN0ZWQKCWlmIHskcGhhc2UgbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCAkcGhhc2UgJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0IFwKCQkgICAgIFtmbGF0dGVuIGlkcm93cmFuZ2VzXSBbZmxhdHRlbiBpZGlubGlzdF0gXAoJCSAgICAgJHJvd2xhaWRvdXQgJHJvd29wdGltICRudW1jb21taXRzXQoJfSBlbHNlaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJGN1cnZpZXcpXQoJCSAgfHwgW2xpbmRleCAkdmlld2RhdGEoJGN1cnZpZXcpIDBdIG5lIHt9fSB7CgkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCgkJW2xpc3Qge30gJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0XQoJfQogICAgfQogICAgY2F0Y2gge3Vuc2V0IHRyZWVkaWZmc30KICAgIGNsZWFyX2Rpc3BsYXkKICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRufSB7Cgl1bnNldCBobHZpZXcKCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCiAgICB9CgogICAgc2V0IGN1cnZpZXcgJG4KICAgIHNldCBzZWxlY3RlZHZpZXcgJG4KICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCgogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJG4pXX0gewoJaWYgeyRzZWxpZCBuZSB7fX0gewoJICAgIHNldCBwZW5kaW5nX3NlbGVjdCAkc2VsaWQKCX0KCWdldGNvbW1pdHMKCXJldHVybgogICAgfQoKICAgIHNldCB2ICR2aWV3ZGF0YSgkbikKICAgIHNldCBwaGFzZSBbbGluZGV4ICR2IDBdCiAgICBzZXQgZGlzcGxheW9yZGVyICR2ZGlzcG9yZGVyKCRuKQogICAgc2V0IHBhcmVudGxpc3QgJHZwYXJlbnRsaXN0KCRuKQogICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCiAgICBzZXQgcm93aWRsaXN0IFtsaW5kZXggJHYgMV0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5kZXggJHYgMl0KICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQogICAgaWYgeyRwaGFzZSBlcSB7fX0gewoJc2V0IG51bWNvbW1pdHMgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIH0gZWxzZSB7Cgl1bmZsYXR0ZW4gaWRyb3dyYW5nZXMgW2xpbmRleCAkdiA0XQoJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KCXNldCByb3dsYWlkb3V0IFtsaW5kZXggJHYgNl0KCXNldCByb3dvcHRpbSBbbGluZGV4ICR2IDddCglzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCgljYXRjaCB7dW5zZXQgcm93Y2hrfQogICAgfQoKICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgcm93IDAKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCB5ZiAwCiAgICBzZXQgcm93IHt9CiAgICBzZXQgc2VsZWN0Zmlyc3QgMAogICAgaWYgeyRzZWxpZCBuZSB7fSAmJiBbaW5mbyBleGlzdHMgY29tbWl0cm93KCRuLCRzZWxpZCldfSB7CglzZXQgcm93ICRjb21taXRyb3coJG4sJHNlbGlkKQoJIyB0cnkgdG8gZ2V0IHRoZSBzZWxlY3RlZCByb3cgaW4gdGhlIHNhbWUgcG9zaXRpb24gb24gdGhlIHNjcmVlbgoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJc2V0IHl0b3AgW2V4cHIge1t5YyAkcm93XSAtICR5c2NyZWVufV0KCWlmIHskeXRvcCA8IDB9IHsKCSAgICBzZXQgeXRvcCAwCgl9CglzZXQgeWYgW2V4cHIgeyR5dG9wICogMS4wIC8gJHltYXh9XQogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZgogICAgZHJhd3Zpc2libGUKICAgIGlmIHskcm93IG5lIHt9fSB7CglzZWxlY3RsaW5lICRyb3cgMAogICAgfSBlbHNlaWYgeyRzZWxpZCBuZSB7fX0gewoJc2V0IHBlbmRpbmdfc2VsZWN0ICRzZWxpZAogICAgfSBlbHNlIHsKCXNldCByb3cgW2ZpcnN0X3JlYWxfcm93XQoJaWYgeyRyb3cgPCAkbnVtY29tbWl0c30gewoJICAgIHNlbGVjdGxpbmUgJHJvdyAwCgl9IGVsc2UgewoJICAgIHNldCBzZWxlY3RmaXJzdCAxCgl9CiAgICB9CiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0gewoJICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCgl9CglydW4gY2hld2NvbW1pdHMgJG4KICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKICAgIH0KICAgIHJ1biByZWZpbGxfcmVmbGlzdAp9CgojIFN0dWZmIHJlbGF0aW5nIHRvIHRoZSBoaWdobGlnaHRpbmcgZmFjaWxpdHkKCnByb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJG5oaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJGZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHJoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIHNlbGVjdGVkbGluZSBib2xkcm93cwoKICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdwogICAgJGNhbnYgaXRlbWNvbmYgJGxpbmVodGFnKCRyb3cpIC1mb250ICRmb250CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkkY2FudiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJHJvdyldIFwKCQkgICAtb3V0bGluZSB7e319IC10YWdzIHNlY3NlbCBcCgkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyBib2xkZW5fbmFtZSB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCgogICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdwogICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYyIGRlbGV0ZSBzZWNzZWwKCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCgkkY2FudjIgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bmJvbGRlbiB7fSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgYm9sZHJvd3MKCiAgICBzZXQgc3RpbGxib2xkIHt9CiAgICBmb3JlYWNoIHJvdyAkYm9sZHJvd3MgewoJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93ICRtYWluZm9udAoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93Cgl9CiAgICB9CiAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAp9Cgpwcm9jIGFkZHZoaWdobGlnaHQge259IHsKICAgIGdsb2JhbCBobHZpZXcgY3VydmlldyB2aWV3ZGF0YSB2aGxfZG9uZSB2aGlnaGxpZ2h0cyBjb21taXRpZHgKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCWRlbHZoaWdobGlnaHQKICAgIH0KICAgIHNldCBobHZpZXcgJG4KICAgIGlmIHskbiAhPSAkY3VydmlldyAmJiAhW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCB2aWV3ZGF0YSgkbikgW2xpc3QgZ2V0Y29tbWl0cyB7e319IHt7fX0ge30ge30ge30gMCAwIDAge31dCglzZXQgdnBhcmVudGxpc3QoJG4pIHt9CglzZXQgdmRpc3BvcmRlcigkbikge30KCXNldCB2Y21pdGxpc3RlZCgkbikge30KCXN0YXJ0X3Jldl9saXN0ICRuCiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyR2aGxfZG9uZSA+IDB9IHsKCWRyYXd2aXNpYmxlCiAgICB9Cn0KCnByb2MgZGVsdmhpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgaGx2aWV3XX0gcmV0dXJuCiAgICB1bnNldCBobHZpZXcKICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCn0KCnByb2MgdmhpZ2hsaWdodG1vcmUge30gewogICAgZ2xvYmFsIGhsdmlldyB2aGxfZG9uZSBjb21taXRpZHggdmhpZ2hsaWdodHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgdmRpc3BvcmRlciBjdXJ2aWV3IG1haW5mb250CgogICAgc2V0IGZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KICAgIHNldCBtYXggJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyRobHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBkaXNwICRkaXNwbGF5b3JkZXIKICAgIH0gZWxzZSB7CglzZXQgZGlzcCAkdmRpc3BvcmRlcigkaGx2aWV3KQogICAgfQogICAgc2V0IHZyIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICR2ciAwXQogICAgc2V0IHIxIFtsaW5kZXggJHZyIDFdCiAgICBmb3Ige3NldCBpICR2aGxfZG9uZX0geyRpIDwgJG1heH0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3AgJGldCglpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJICAgIHNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCgkgICAgaWYgeyRyMCA8PSAkcm93ICYmICRyb3cgPD0gJHIxfSB7CgkJaWYgeyFbaGlnaGxpZ2h0ZWQgJHJvd119IHsKCQkgICAgYm9sZGVuICRyb3cgJGZvbnQKCQl9CgkJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJG1heAp9Cgpwcm9jIGFza3ZoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cyBjb21taXRyb3cgaWRkcmF3biBtYWluZm9udAoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRobHZpZXcsJGlkKV19IHsKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0gZWxzZSB7CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMAogICAgfQp9Cgpwcm9jIGhmaWxlc19jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaF9zZXJpYWwKICAgIGdsb2JhbCBtYWluZm9udCBoaWdobGlnaHRfcGF0aHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CgkjIGRlbGV0ZSBwcmV2aW91cyBoaWdobGlnaHRzCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CgljYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9Cgl1bmJvbGRlbgoJdW5oaWdobGlnaHRfZmlsZWxpc3QKICAgIH0KICAgIHNldCBoaWdobGlnaHRfcGF0aHMge30KICAgIGFmdGVyIGNhbmNlbCBkb19maWxlX2hsICRmaF9zZXJpYWwKICAgIGluY3IgZmhfc2VyaWFsCiAgICBpZiB7JGhpZ2hsaWdodF9maWxlcyBuZSB7fX0gewoJYWZ0ZXIgMzAwIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgfQp9Cgpwcm9jIG1ha2VwYXR0ZXJucyB7bH0gewogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBlICRsIHsKCXNldCBlZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gJGVdCglpZiB7W3N0cmluZyBpbmRleCAkZWUgZW5kXSBlcSAiLyJ9IHsKCSAgICBsYXBwZW5kIHJldCAiJGVlKiIKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCByZXQgJGVlCgkgICAgbGFwcGVuZCByZXQgIiRlZS8qIgoJfQogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyBkb19maWxlX2hsIHtzZXJpYWx9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBoaWdobGlnaHRfcGF0aHMgZ2R0dHlwZSBmaGxfbGlzdAoKICAgIGlmIHskZ2R0dHlwZSBlcSAidG91Y2hpbmcgcGF0aHM6In0gewoJaWYge1tjYXRjaCB7c2V0IHBhdGhzIFtzaGVsbHNwbGl0ICRoaWdobGlnaHRfZmlsZXNdfV19IHJldHVybgoJc2V0IGhpZ2hsaWdodF9wYXRocyBbbWFrZXBhdHRlcm5zICRwYXRoc10KCWhpZ2hsaWdodF9maWxlbGlzdAoJc2V0IGdkdGFyZ3MgW2NvbmNhdCAtLSAkcGF0aHNdCiAgICB9IGVsc2UgewoJc2V0IGdkdGFyZ3MgW2xpc3QgIi1TJGhpZ2hsaWdodF9maWxlcyJdCiAgICB9CiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC1yIC1zIC0tc3RkaW4gJGdkdGFyZ3NdCiAgICBzZXQgZmlsZWhpZ2hsaWdodCBbb3BlbiAkY21kIHIrXQogICAgZmNvbmZpZ3VyZSAkZmlsZWhpZ2hsaWdodCAtYmxvY2tpbmcgMAogICAgZmlsZXJ1biAkZmlsZWhpZ2hsaWdodCByZWFkZmhpZ2hsaWdodAogICAgc2V0IGZobF9saXN0IHt9CiAgICBkcmF3dmlzaWJsZQogICAgZmx1c2hoaWdobGlnaHRzCn0KCnByb2MgZmx1c2hoaWdobGlnaHRzIHt9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZobF9saXN0CgogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJbGFwcGVuZCBmaGxfbGlzdCB7fQoJcHV0cyAkZmlsZWhpZ2hsaWdodCAiIgoJZmx1c2ggJGZpbGVoaWdobGlnaHQKICAgIH0KfQoKcHJvYyBhc2tmaWxlaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZobF9saXN0CgogICAgbGFwcGVuZCBmaGxfbGlzdCAkaWQKICAgIHNldCBmaGlnaGxpZ2h0cygkcm93KSAtMQogICAgcHV0cyAkZmlsZWhpZ2hsaWdodCAkaWQKfQoKcHJvYyByZWFkZmhpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBjb21taXRyb3cgY3VydmlldyBtYWluZm9udCBpZGRyYXduCiAgICBnbG9iYWwgZmhsX2xpc3QKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJcmV0dXJuIDAKICAgIH0KICAgIHNldCBuciAwCiAgICB3aGlsZSB7W2luY3IgbnJdIDw9IDEwMCAmJiBbZ2V0cyAkZmlsZWhpZ2hsaWdodCBsaW5lXSA+PSAwfSB7CglzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGZobF9saXN0ICRsaW5lXQoJaWYgeyRpIDwgMH0gY29udGludWUKCWZvciB7c2V0IGogMH0geyRqIDwgJGl9IHtpbmNyIGp9IHsKCSAgICBzZXQgaWQgW2xpbmRleCAkZmhsX2xpc3QgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCQlzZXQgZmhpZ2hsaWdodHMoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAwCgkgICAgfQoJfQoJc2V0IGZobF9saXN0IFtscmFuZ2UgJGZobF9saXN0IFtleHByIHskaSsxfV0gZW5kXQoJaWYgeyRsaW5lIGVxIHt9fSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKV19IGNvbnRpbnVlCglzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpCglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGxpbmUpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IGZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0KICAgIGlmIHtbZW9mICRmaWxlaGlnaGxpZ2h0XX0gewoJIyBzdHJhbmdlLi4uCglwdXRzICJvb3BzLCBnaXQgZGlmZi10cmVlIGRpZWQiCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CglyZXR1cm4gMAogICAgfQogICAgbmV4dF9obGNvbnQKICAgIHJldHVybiAxCn0KCnByb2MgZmluZF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmR0eXBlCgogICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CiAgICBmb3JlYWNoIHJvdyAkYm9sZG5hbWVyb3dzIHsKCWJvbGRlbl9uYW1lICRyb3cgJG1haW5mb250CiAgICB9CiAgICBzZXQgYm9sZG5hbWVyb3dzIHt9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgogICAgdW5tYXJrbWF0Y2hlcwogICAgaWYgeyRmaW5kdHlwZSBuZSAiUmVnZXhwIn0gewoJc2V0IGUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9IFwKCQkgICAkZmluZHN0cmluZ10KCXNldCBmaW5kcGF0dGVybiAiKiRlKiIKICAgIH0KICAgIGRyYXd2aXNpYmxlCn0KCnByb2MgZG9lc21hdGNoIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHN0cmluZyBmaW5kcGF0dGVybgoKICAgIGlmIHskZmluZHR5cGUgZXEgIlJlZ2V4cCJ9IHsKCXJldHVybiBbcmVnZXhwICRmaW5kc3RyaW5nICRmXQogICAgfSBlbHNlaWYgeyRmaW5kdHlwZSBlcSAiSWduQ2FzZSJ9IHsKCXJldHVybiBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJGZpbmRwYXR0ZXJuICRmXQogICAgfSBlbHNlIHsKCXJldHVybiBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KICAgIH0KfQoKcHJvYyBhc2tmaW5kaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBjb21taXRpbmZvIGlkZHJhd24gbWFpbmZvbnQKICAgIGdsb2JhbCBmaW5kbG9jCiAgICBnbG9iYWwgbWFya2luZ21hdGNoZXMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglnZXRjb21taXQgJGlkCiAgICB9CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgaXNib2xkIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CglpZiB7KCRmaW5kbG9jIGVxICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyBlcSAkdHkpICYmCgkgICAgW2RvZXNtYXRjaCAkZl19IHsKCSAgICBpZiB7JHR5IGVxICJBdXRob3IifSB7CgkJc2V0IGlzYm9sZCAyCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9CiAgICBpZiB7JGlzYm9sZCAmJiBbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJc2V0IGYgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCWlmIHshW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyAkZgoJICAgIGlmIHskaXNib2xkID4gMX0gewoJCWJvbGRlbl9uYW1lICRyb3cgJGYKCSAgICB9Cgl9CglpZiB7JG1hcmtpbmdtYXRjaGVzfSB7CgkgICAgbWFya3Jvd21hdGNoZXMgJHJvdyAkaWQKCX0KICAgIH0KICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgbWFya3Jvd21hdGNoZXMge3JvdyBpZH0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgbGluZWh0YWcgbGluZW50YWcgY29tbWl0aW5mbyBmaW5kbG9jCgogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IGF1dGhvciBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgICRjYW52IGRlbGV0ZSBtYXRjaCRyb3cKICAgICRjYW52MiBkZWxldGUgbWF0Y2gkcm93CiAgICBpZiB7JGZpbmRsb2MgZXEgIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jIGVxICJIZWFkbGluZSJ9IHsKCXNldCBtIFtmaW5kbWF0Y2hlcyAkaGVhZGxpbmVdCglpZiB7JG0gbmUge319IHsKCSAgICBtYXJrbWF0Y2hlcyAkY2FudiAkcm93ICRoZWFkbGluZSAkbGluZWh0YWcoJHJvdykgJG0gXAoJCVskY2FudiBpdGVtY2dldCAkbGluZWh0YWcoJHJvdykgLWZvbnRdICRyb3cKCX0KICAgIH0KICAgIGlmIHskZmluZGxvYyBlcSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgZXEgIkF1dGhvciJ9IHsKCXNldCBtIFtmaW5kbWF0Y2hlcyAkYXV0aG9yXQoJaWYgeyRtIG5lIHt9fSB7CgkgICAgbWFya21hdGNoZXMgJGNhbnYyICRyb3cgJGF1dGhvciAkbGluZW50YWcoJHJvdykgJG0gXAoJCVskY2FudjIgaXRlbWNnZXQgJGxpbmVudGFnKCRyb3cpIC1mb250XSAkcm93Cgl9CiAgICB9Cn0KCnByb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAoKICAgIHJoaWdobGlnaHRfbm9uZQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCXJ1biBkcmF3dmlzaWJsZQogICAgfQp9CgojIHByZXBhcmUgZm9yIHRlc3Rpbmcgd2hldGhlciBjb21taXRzIGFyZSBkZXNjZW5kZW50cyBvciBhbmNlc3RvcnMgb2YgYQpwcm9jIHJoaWdobGlnaHRfc2VsIHthfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQogICAgc2V0IGRlc2NfdG9kbyBbbGlzdCAkYV0KICAgIGNhdGNoIHt1bnNldCBhbmNlc3Rvcn0KICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CglyaGlnaGxpZ2h0X25vbmUKCXJ1biBkcmF3dmlzaWJsZQogICAgfQp9Cgpwcm9jIHJoaWdobGlnaHRfbm9uZSB7fSB7CiAgICBnbG9iYWwgcmhpZ2hsaWdodHMKCiAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgp9Cgpwcm9jIGlzX2Rlc2NlbmRlbnQge2F9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IGNoaWxkcmVuIGNvbW1pdHJvdyBkZXNjZW5kZW50IGRlc2NfdG9kbwoKICAgIHNldCB2ICRjdXJ2aWV3CiAgICBzZXQgbGEgJGNvbW1pdHJvdygkdiwkYSkKICAgIHNldCB0b2RvICRkZXNjX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyRjb21taXRyb3coJHYsJGRvKSA8ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbmsgJGNoaWxkcmVuKCR2LCRkbykgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJG5rKV19IHsKCQlzZXQgZGVzY2VuZGVudCgkbmspIDEKCQlsYXBwZW5kIHRvZG8gJG5rCgkJaWYgeyRuayBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBkZXNjX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgZGVzY2VuZGVudCgkYSkgMAogICAgc2V0IGRlc2NfdG9kbyAkbGVmdG92ZXIKfQoKcHJvYyBpc19hbmNlc3RvciB7YX0gewogICAgZ2xvYmFsIGN1cnZpZXcgcGFyZW50bGlzdCBjb21taXRyb3cgYW5jZXN0b3IgYW5jX3RvZG8KCiAgICBzZXQgdiAkY3VydmlldwogICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCiAgICBzZXQgdG9kbyAkYW5jX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCR2LCRkbyldIHx8ICRjb21taXRyb3coJHYsJGRvKSA+ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbnAgW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCR2LCRkbyldIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkbnApXX0gewoJCXNldCBhbmNlc3RvcigkbnApIDEKCQlsYXBwZW5kIHRvZG8gJG5wCgkJaWYgeyRucCBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBhbmNfdG9kbyBbY29uY2F0ICRsZWZ0b3ZlciBbbHJhbmdlICR0b2RvIFtleHByIHskaSsxfV0gZW5kXV0KCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBhbmNlc3RvcigkYSkgMAogICAgc2V0IGFuY190b2RvICRsZWZ0b3Zlcgp9Cgpwcm9jIGFza3JlbGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBoaWdobGlnaHRfcmVsYXRlZCBpZGRyYXduIG1haW5mb250IHJoaWdobGlnaHRzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGFuY2VzdG9yCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgaXNib2xkIDAKICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkRlc2NlbmRlbnQiIHx8CgkkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIk5vdCBkZXNjZW5kZW50In0gewoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkaWQpXX0gewoJICAgIGlzX2Rlc2NlbmRlbnQgJGlkCgl9CglpZiB7JGRlc2NlbmRlbnQoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50Iil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0gZWxzZWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIiB8fAoJICAgICAgJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJOb3QgYW5jZXN0b3IifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkaWQpXX0gewoJICAgIGlzX2FuY2VzdG9yICRpZAoJfQoJaWYgeyRhbmNlc3RvcigkaWQpID09ICgkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJaWYgeyRpc2JvbGQgJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KICAgIH0KICAgIHNldCByaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgbmV4dF9obGNvbnQge30gewogICAgZ2xvYmFsIGZobF9yb3cgZmhsX2Rpcm4gZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGxfZGlybl0gfHwgJGZobF9kaXJuID09IDB9IHJldHVybgogICAgc2V0IHJvdyAkZmhsX3JvdwogICAgd2hpbGUgezF9IHsKCWlmIHskcm93IDwgMCB8fCAkcm93ID49ICRudW1jb21taXRzfSB7CgkgICAgYmVsbAoJICAgIHNldCBmaGxfZGlybiAwCgkgICAgcmV0dXJuCgl9CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskdmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYgeyRmaW5kc3RyaW5nIG5lIHt9fSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JG5oaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskcmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0gewoJCSMgYXNrIGZvciBhIGZldyBtb3JlIHdoaWxlIHdlJ3JlIGF0IGl0Li4uCgkJc2V0IHIgJHJvdwoJCWZvciB7c2V0IG4gMH0geyRuIDwgMTAwfSB7aW5jciBufSB7CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyKV19IHsKCQkJYXNrZmlsZWhpZ2hsaWdodCAkciBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCgkJICAgIH0KCQkgICAgaW5jciByICRmaGxfZGlybgoJCSAgICBpZiB7JHIgPCAwIHx8ICRyID49ICRudW1jb21taXRzfSBicmVhawoJCX0KCQlmbHVzaGhpZ2hsaWdodHMKCSAgICB9CgkgICAgaWYgeyRmaGlnaGxpZ2h0cygkcm93KSA8IDB9IHsKCQlzZXQgZmhsX3JvdyAkcm93CgkJcmV0dXJuCgkgICAgfQoJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaW5jciByb3cgJGZobF9kaXJuCiAgICB9CiAgICBzZXQgZmhsX2Rpcm4gMAogICAgc2VsZWN0bGluZSAkcm93IDEKfQoKcHJvYyBuZXh0X2hpZ2hsaWdodCB7ZGlybn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBmaGxfcm93IGZobF9kaXJuCiAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyEoW2luZm8gZXhpc3RzIGhsdmlld10gfHwgJGZpbmRzdHJpbmcgbmUge30gfHwKCSAgJGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiB8fCBbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0pfSByZXR1cm4KICAgIHNldCBmaGxfcm93IFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcm59XQogICAgc2V0IGZobF9kaXJuICRkaXJuCiAgICBuZXh0X2hsY29udAp9Cgpwcm9jIGNhbmNlbF9uZXh0X2hpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgZmhsX2Rpcm4KCiAgICBzZXQgZmhsX2Rpcm4gMAp9CgojIEdyYXBoIGxheW91dCBmdW5jdGlvbnMKCnByb2Mgc2hvcnRpZHMge2lkc30gewogICAgc2V0IHJlcyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHtbbGxlbmd0aCAkaWRdID4gMX0gewoJICAgIGxhcHBlbmQgcmVzIFtzaG9ydGlkcyAkaWRdCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCSAgICBsYXBwZW5kIHJlcyBbc3RyaW5nIHJhbmdlICRpZCAwIDddCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmVzICRpZAoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKICAgIHNldCBuIFtsbGVuZ3RoICRsXQogICAgd2hpbGUgeyR4IDwgJG59IHsKCXNldCBlIFtsaW5kZXggJGwgJHhdCglpZiB7JGUgbmUge319IHsKCSAgICBsc2V0IGwgJHggW2V4cHIgeyRlICsgJG99XQoJfQoJaW5jciB4CiAgICB9CiAgICByZXR1cm4gJGwKfQoKcHJvYyBudGltZXMge24gb30gewogICAgc2V0IHJldCB7fQogICAgZm9yIHt9IHskbiA+IDB9IHtpbmNyIG4gLTF9IHsKCWxhcHBlbmQgcmV0ICRvCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVzZWRpbnJhbmdlIHtpZCBsMSBsMn0gewogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CiAgICB9CiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgZm9yZWFjaCBjICRraWRzIHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGMpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2FuaXR5IHtyb3cge2Z1bGwgMH19IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBjb2wgLTEKICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBmb3JlYWNoIGlkICRpZHMgewoJaW5jciBjb2wKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgoJICAgIFtsc2VhcmNoIC1leGFjdCAtc3RhcnQgW2V4cHIgeyRjb2wrMX1dICRpZHMgJGlkXSA+PSAwfSB7CgkgICAgcHV0cyAib29wczogW3Nob3J0aWRzICRpZF0gcmVwZWF0ZWQgaW4gcm93ICRyb3cgY29sICRjb2w6IHtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXX0iCgl9CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCXNldCB5ICRyb3cKCXNldCB4ICRjb2wKCXdoaWxlIHskbyBuZSB7fX0gewoJICAgIGluY3IgeSAtMQoJICAgIGluY3IgeCAkbwoJICAgIGlmIHtbbGluZGV4ICRyb3dpZGxpc3QgJHkgJHhdICE9ICRpZH0gewoJCXB1dHMgIm9vcHM6IHJvd29mZnNldHMgd3JvbmcgYXQgcm93IFtleHByIHskeSsxfV0gY29sIFtleHByIHskeC0kb31dIgoJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKCQlmb3Ige3NldCBpICRyb3d9IHskaSA+PSAkeX0ge2luY3IgaSAtMX0gewoJCSAgICBwdXRzICIgIHJvdyAkaSBpZHM9e1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJGldXX0gb2Zmcz17W2xpbmRleCAkcm93b2Zmc2V0cyAkaV19IgoJCX0KCQlicmVhawoJICAgIH0KCSAgICBpZiB7ISRmdWxsfSBicmVhawoJICAgIHNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHkgJHhdCgl9CiAgICB9Cn0KCnByb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIHVwYXJyb3dsZW4gaWRyb3dyYW5nZXMgZGlzcGxheW9yZGVyCgogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkdXBhcnJvd2xlbiAmJiAkeSA+IDF9IHtpbmNyIGl9IHsKCWluY3IgeSAtMQoJaW5jciB4ICR6CglzZXQgb2ZmMCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XQoJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0gewoJICAgIGlmIHskeDAgPj0gW2xsZW5ndGggJG9mZjBdfSB7CgkJc2V0IHgwIFtsbGVuZ3RoIFtsaW5kZXggJHJvd29mZnNldHMgW2V4cHIgeyR5LTF9XV1dCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IHogW2xpbmRleCAkb2ZmMCAkeDBdCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJaW5jciB4MCAkegoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHogW2V4cHIgeyR4MCAtICR4fV0KCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KCWxzZXQgcm93b2Zmc2V0cyAkeSBbbGluc2VydCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XSAkeCAkel0KICAgIH0KICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQogICAgbHNldCByb3dvZmZzZXRzICR5IFtpbmNyYW5nZSAkdG1wIFtleHByIHskeCsxfV0gLTFdCiAgICBsYXBwZW5kIGlkcm93cmFuZ2VzKCRvaWQpIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeV0KfQoKcHJvYyBpbml0bGF5b3V0IHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbQogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnZ4bWF4IGNhbnYKICAgIGdsb2JhbCBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRsaXN0CiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHgKICAgIGdsb2JhbCBzZWxlY3RmaXJzdAoKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBkaXNwbGF5b3JkZXIge30KICAgIHNldCBjb21taXRsaXN0ZWQge30KICAgIHNldCBwYXJlbnRsaXN0IHt9CiAgICBzZXQgcm93cmFuZ2VsaXN0IHt9CiAgICBzZXQgbmV4dGNvbG9yIDAKICAgIHNldCByb3dpZGxpc3Qge3t9fQogICAgc2V0IHJvd29mZnNldHMge3t9fQogICAgY2F0Y2gge3Vuc2V0IGlkaW5saXN0fQogICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KICAgIHNldCByb3dsYWlkb3V0IDAKICAgIHNldCByb3dvcHRpbSAwCiAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQogICAgY2F0Y2gge3Vuc2V0IGNvbG9ybWFwfQogICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQogICAgY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQogICAgc2V0IHNlbGVjdGZpcnN0IDEKfQoKcHJvYyBzZXRjYW52c2Nyb2xsIHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKCiAgICBzZXQgeW1heCBbZXhwciB7JGNhbnZ5MCArICgkbnVtY29tbWl0cyAtIDAuNSkgKiAkbGluZXNwYyArIDJ9XQogICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCiAgICAkY2FudjIgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQogICAgJGNhbnYzIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KfQoKcHJvYyB2aXNpYmxlcm93cyB7fSB7CiAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgZiBbJGNhbnYgeXZpZXddCiAgICBzZXQgeTAgW2V4cHIge2ludChbbGluZGV4ICRmIDBdICogJHltYXgpfV0KICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyMCA8IDB9IHsKCXNldCByMCAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludChbbGluZGV4ICRmIDFdICogJHltYXgpfV0KICAgIHNldCByMSBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30gewoJc2V0IHIxIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCn0KCnByb2MgbGF5b3V0bW9yZSB7dG1heCBhbGxyZWFkfSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldyByb3dpZGxpc3QgaWRpbmxpc3QKCiAgICBzZXQgc2hvd2xhc3QgMAogICAgc2V0IHNob3dkZWxheSAkb3B0aW1fZGVsYXkKICAgIHNldCBvcHRkZWxheSBbZXhwciB7JHVwYXJyb3dsZW4gKyAxfV0KICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvd29wdGltIC0gJHNob3dkZWxheSA+ICRudW1jb21taXRzfSB7CgkgICAgc2hvd3N0dWZmIFtleHByIHskcm93b3B0aW0gLSAkc2hvd2RlbGF5fV0gJHNob3dsYXN0Cgl9IGVsc2VpZiB7JHJvd2xhaWRvdXQgLSAkb3B0ZGVsYXkgPiAkcm93b3B0aW19IHsKCSAgICBzZXQgbnIgW2V4cHIgeyRyb3dsYWlkb3V0IC0gJG9wdGRlbGF5IC0gJHJvd29wdGltfV0KCSAgICBpZiB7JG5yID4gMTAwfSB7CgkJc2V0IG5yIDEwMAoJICAgIH0KCSAgICBvcHRpbWl6ZV9yb3dzICRyb3dvcHRpbSAwIFtleHByIHskcm93b3B0aW0gKyAkbnJ9XQoJICAgIGluY3Igcm93b3B0aW0gJG5yCgl9IGVsc2VpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAkcm93bGFpZG91dH0gewoJICAgIHNldCBuciBbZXhwciB7JGNvbW1pdGlkeCgkY3VydmlldykgLSAkcm93bGFpZG91dH1dCgkgICAgIyBtYXkgbmVlZCB0byBpbmNyZWFzZSB0aGlzIHRocmVzaG9sZCBpZiB1cGFycm93bGVuIG9yCgkgICAgIyBtaW5nYXBsZW4gYXJlIGluY3JlYXNlZC4uLgoJICAgIGlmIHskbnIgPiAxNTB9IHsKCQlzZXQgbnIgMTUwCgkgICAgfQoJICAgIHNldCByb3cgJHJvd2xhaWRvdXQKCSAgICBzZXQgcm93bGFpZG91dCBbbGF5b3V0cm93cyAkcm93IFtleHByIHskcm93ICsgJG5yfV0gJGFsbHJlYWRdCgkgICAgaWYgeyRyb3dsYWlkb3V0ID09ICRyb3d9IHsKCQlyZXR1cm4gMAoJICAgIH0KCX0gZWxzZWlmIHskYWxscmVhZH0gewoJICAgIHNldCBvcHRkZWxheSAwCgkgICAgc2V0IG5yb3dzICRjb21taXRpZHgoJGN1cnZpZXcpCgkgICAgaWYge1tsaW5kZXggJHJvd2lkbGlzdCAkbnJvd3NdIG5lIHt9IHx8CgkJW2FycmF5IG5hbWVzIGlkaW5saXN0XSBuZSB7fX0gewoJCWxheW91dHRhaWwKCQlzZXQgcm93bGFpZG91dCAkY29tbWl0aWR4KCRjdXJ2aWV3KQoJICAgIH0gZWxzZWlmIHskcm93b3B0aW0gPT0gJG5yb3dzfSB7CgkJc2V0IHNob3dkZWxheSAwCgkJc2V0IHNob3dsYXN0IDEKCQlpZiB7JG51bWNvbW1pdHMgPT0gJG5yb3dzfSB7CgkJICAgIHJldHVybiAwCgkJfQoJICAgIH0KCX0gZWxzZSB7CgkgICAgcmV0dXJuIDAKCX0KCWlmIHskdG1heCBuZSB7fSAmJiBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICR0bWF4fSB7CgkgICAgcmV0dXJuIDEKCX0KICAgIH0KfQoKcHJvYyBzaG93c3R1ZmYge2NhbnNob3cgbGFzdH0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY29tbWl0cm93IHBlbmRpbmdfc2VsZWN0IHNlbGVjdGVkbGluZSBjdXJ2aWV3CiAgICBnbG9iYWwgbG9va2luZ2ZvcmhlYWQgbWFpbmhlYWRpZCBkaXNwbGF5b3JkZXIgc2VsZWN0Zmlyc3QKICAgIGdsb2JhbCBsYXN0c2Nyb2xsc2V0IGNvbW1pdGludGVyZXN0CgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHsKCWdsb2JhbCBwaGFzZQoJc2V0IHBoYXNlICJpbmNyZHJhdyIKCWFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIH0KICAgIGZvciB7c2V0IGwgJG51bWNvbW1pdHN9IHskbCA8ICRjYW5zaG93fSB7aW5jciBsfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQoJaWYge1tpbmZvIGV4aXN0cyBjb21taXRpbnRlcmVzdCgkaWQpXX0gewoJICAgIGZvcmVhY2ggc2NyaXB0ICRjb21taXRpbnRlcmVzdCgkaWQpIHsKCQlldmFsIFtzdHJpbmcgbWFwIFtsaXN0ICIlSSIgJGlkXSAkc2NyaXB0XQoJICAgIH0KCSAgICB1bnNldCBjb21taXRpbnRlcmVzdCgkaWQpCgl9CiAgICB9CiAgICBzZXQgcjAgJG51bWNvbW1pdHMKICAgIHNldCBwcmV2ICRudW1jb21taXRzCiAgICBzZXQgbnVtY29tbWl0cyAkY2Fuc2hvdwogICAgc2V0IHQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgaWYgeyRwcmV2IDwgMTAwIHx8ICRsYXN0IHx8ICR0IC0gJGxhc3RzY3JvbGxzZXQgPiA1MDB9IHsKCXNldCBsYXN0c2Nyb2xsc2V0ICR0CglzZXRjYW52c2Nyb2xsCiAgICB9CiAgICBzZXQgcm93cyBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQogICAgaWYgeyRyMSA+PSAkY2Fuc2hvd30gewoJc2V0IHIxIFtleHByIHskY2Fuc2hvdyAtIDF9XQogICAgfQogICAgaWYgeyRyMCA8PSAkcjF9IHsKCWRyYXdjb21taXRzICRyMCAkcjEKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdICYmCglbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCldICYmCgkkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgPCAkbnVtY29tbWl0c30gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgMQogICAgfQogICAgaWYgeyRzZWxlY3RmaXJzdH0gewoJaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8IFtpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCSAgICBzZXQgc2VsZWN0Zmlyc3QgMAoJfSBlbHNlIHsKCSAgICBzZXQgbCBbZmlyc3RfcmVhbF9yb3ddCgkgICAgc2VsZWN0bGluZSAkbCAxCgkgICAgc2V0IHNlbGVjdGZpcnN0IDAKCX0KICAgIH0KICAgIGlmIHskbG9va2luZ2ZvcmhlYWQgJiYgW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbWFpbmhlYWRpZCldCgkmJiAoJGxhc3QgfHwgJGNvbW1pdHJvdygkY3VydmlldywkbWFpbmhlYWRpZCkgPCAkbnVtY29tbWl0cyAtIDEpfSB7CglzZXQgbG9va2luZ2ZvcmhlYWQgMAoJZG9kaWZmaW5kZXgKICAgIH0KfQoKcHJvYyBkb3Nob3dsb2NhbGNoYW5nZXMge30gewogICAgZ2xvYmFsIGxvb2tpbmdmb3JoZWFkIGN1cnZpZXcgbWFpbmhlYWRpZCBwaGFzZSBjb21taXRyb3cKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbWFpbmhlYWRpZCldICYmCgkoJHBoYXNlIGVxIHt9IHx8ICRjb21taXRyb3coJGN1cnZpZXcsJG1haW5oZWFkaWQpIDwgJG51bWNvbW1pdHMgLSAxKX0gewoJZG9kaWZmaW5kZXgKICAgIH0gZWxzZWlmIHskcGhhc2UgbmUge319IHsKCXNldCBsb29raW5nZm9yaGVhZCAxCiAgICB9Cn0KCnByb2MgZG9oaWRlbG9jYWxjaGFuZ2VzIHt9IHsKICAgIGdsb2JhbCBsb29raW5nZm9yaGVhZCBsb2NhbGZyb3cgbG9jYWxpcm93IGxzZXJpYWwKCiAgICBzZXQgbG9va2luZ2ZvcmhlYWQgMAogICAgaWYgeyRsb2NhbGZyb3cgPj0gMH0gewoJcmVtb3Zlcm93ICRsb2NhbGZyb3cKCXNldCBsb2NhbGZyb3cgLTEKCWlmIHskbG9jYWxpcm93ID4gMH0gewoJICAgIGluY3IgbG9jYWxpcm93IC0xCgl9CiAgICB9CiAgICBpZiB7JGxvY2FsaXJvdyA+PSAwfSB7CglyZW1vdmVyb3cgJGxvY2FsaXJvdwoJc2V0IGxvY2FsaXJvdyAtMQogICAgfQogICAgaW5jciBsc2VyaWFsCn0KCiMgc3Bhd24gb2ZmIGEgcHJvY2VzcyB0byBkbyBnaXQgZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFECnByb2MgZG9kaWZmaW5kZXgge30gewogICAgZ2xvYmFsIGxvY2FsaXJvdyBsb2NhbGZyb3cgbHNlcmlhbAoKICAgIGluY3IgbHNlcmlhbAogICAgc2V0IGxvY2FsZnJvdyAtMQogICAgc2V0IGxvY2FsaXJvdyAtMQogICAgc2V0IGZkIFtvcGVuICJ8Z2l0IGRpZmYtaW5kZXggLS1jYWNoZWQgSEVBRCIgcl0KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCiAgICBmaWxlcnVuICRmZCBbbGlzdCByZWFkZGlmZmluZGV4ICRmZCAkbHNlcmlhbF0KfQoKcHJvYyByZWFkZGlmZmluZGV4IHtmZCBzZXJpYWx9IHsKICAgIGdsb2JhbCBsb2NhbGlyb3cgY29tbWl0cm93IG1haW5oZWFkaWQgbnVsbGlkMiBjdXJ2aWV3CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjb21taXRkYXRhIGxzZXJpYWwKCiAgICBzZXQgaXNkaWZmIDEKICAgIGlmIHtbZ2V0cyAkZmQgbGluZV0gPCAwfSB7CglpZiB7IVtlb2YgJGZkXX0gewoJICAgIHJldHVybiAxCgl9CglzZXQgaXNkaWZmIDAKICAgIH0KICAgICMgd2Ugb25seSBuZWVkIHRvIHNlZSBvbmUgbGluZSBhbmQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgd2hhdCBpdCBzYXlzLi4uCiAgICBjbG9zZSAkZmQKCiAgICAjIG5vdyBzZWUgaWYgdGhlcmUgYXJlIGFueSBsb2NhbCBjaGFuZ2VzIG5vdCBjaGVja2VkIGluIHRvIHRoZSBpbmRleAogICAgaWYgeyRzZXJpYWwgPT0gJGxzZXJpYWx9IHsKCXNldCBmZCBbb3BlbiAifGdpdCBkaWZmLWZpbGVzIiByXQoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKCWZpbGVydW4gJGZkIFtsaXN0IHJlYWRkaWZmZmlsZXMgJGZkICRzZXJpYWxdCiAgICB9CgogICAgaWYgeyRpc2RpZmYgJiYgJHNlcmlhbCA9PSAkbHNlcmlhbCAmJiAkbG9jYWxpcm93ID09IC0xfSB7CgkjIGFkZCB0aGUgbGluZSBmb3IgdGhlIGNoYW5nZXMgaW4gdGhlIGluZGV4IHRvIHRoZSBncmFwaAoJc2V0IGxvY2FsaXJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRtYWluaGVhZGlkKQoJc2V0IGhsICJMb2NhbCBjaGFuZ2VzIGNoZWNrZWQgaW4gdG8gaW5kZXggYnV0IG5vdCBjb21taXR0ZWQiCglzZXQgY29tbWl0aW5mbygkbnVsbGlkMikgW2xpc3QgICRobCB7fSB7fSB7fSB7fSAiICAgICRobFxuIl0KCXNldCBjb21taXRkYXRhKCRudWxsaWQyKSAiXG4gICAgJGhsXG4iCglpbnNlcnRyb3cgJGxvY2FsaXJvdyAkbnVsbGlkMgogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyByZWFkZGlmZmZpbGVzIHtmZCBzZXJpYWx9IHsKICAgIGdsb2JhbCBsb2NhbGlyb3cgbG9jYWxmcm93IGNvbW1pdHJvdyBtYWluaGVhZGlkIG51bGxpZCBjdXJ2aWV3CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjb21taXRkYXRhIGxzZXJpYWwKCiAgICBzZXQgaXNkaWZmIDEKICAgIGlmIHtbZ2V0cyAkZmQgbGluZV0gPCAwfSB7CglpZiB7IVtlb2YgJGZkXX0gewoJICAgIHJldHVybiAxCgl9CglzZXQgaXNkaWZmIDAKICAgIH0KICAgICMgd2Ugb25seSBuZWVkIHRvIHNlZSBvbmUgbGluZSBhbmQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgd2hhdCBpdCBzYXlzLi4uCiAgICBjbG9zZSAkZmQKCiAgICBpZiB7JGlzZGlmZiAmJiAkc2VyaWFsID09ICRsc2VyaWFsICYmICRsb2NhbGZyb3cgPT0gLTF9IHsKCSMgYWRkIHRoZSBsaW5lIGZvciB0aGUgbG9jYWwgZGlmZiB0byB0aGUgZ3JhcGgKCWlmIHskbG9jYWxpcm93ID49IDB9IHsKCSAgICBzZXQgbG9jYWxmcm93ICRsb2NhbGlyb3cKCSAgICBpbmNyIGxvY2FsaXJvdwoJfSBlbHNlIHsKCSAgICBzZXQgbG9jYWxmcm93ICRjb21taXRyb3coJGN1cnZpZXcsJG1haW5oZWFkaWQpCgl9CglzZXQgaGwgIkxvY2FsIHVuY29tbWl0dGVkIGNoYW5nZXMsIG5vdCBjaGVja2VkIGluIHRvIGluZGV4IgoJc2V0IGNvbW1pdGluZm8oJG51bGxpZCkgW2xpc3QgICRobCB7fSB7fSB7fSB7fSAiICAgICRobFxuIl0KCXNldCBjb21taXRkYXRhKCRudWxsaWQpICJcbiAgICAkaGxcbiIKCWluc2VydHJvdyAkbG9jYWxmcm93ICRudWxsaWQKICAgIH0KICAgIHJldHVybiAwCn0KCnByb2MgbGF5b3V0cm93cyB7cm93IGVuZHJvdyBsYXN0fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgdXBhcnJvd2xlbiBkb3duYXJyb3dsZW4gbWF4d2lkdGggbWluZ2FwbGVuCiAgICBnbG9iYWwgY2hpbGRyZW4gcGFyZW50bGlzdAogICAgZ2xvYmFsIGlkcm93cmFuZ2VzCiAgICBnbG9iYWwgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBpZGlubGlzdCByb3djaGsgcm93cmFuZ2VsaXN0CgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHdoaWxlIHskcm93IDwgJGVuZHJvd30gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJc2V0IG5ldiBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSAkbWF4d2lkdGggKyAxfV0KCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGlubGlzdCgkcCldIHx8ICEkaWRpbmxpc3QoJHApfSB7CgkJaW5jciBuZXYKCSAgICB9Cgl9CglpZiB7JG5ldiA+IDB9IHsKCSAgICBpZiB7ISRsYXN0ICYmCgkJJHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbiA+PSAkY29tbWl0aWR4KCRjdXJ2aWV3KX0gYnJlYWsKCSAgICBmb3Ige3NldCB4IFtsbGVuZ3RoICRpZGxpc3RdfSB7W2luY3IgeCAtMV0gPj0gMH0ge30gewoJCXNldCBpIFtsaW5kZXggJGlkbGlzdCAkeF0KCQlpZiB7IVtpbmZvIGV4aXN0cyByb3djaGsoJGkpXSB8fCAkcm93ID49ICRyb3djaGsoJGkpfSB7CgkJICAgIHNldCByIFt1c2VkaW5yYW5nZSAkaSBbZXhwciB7JHJvdyAtICRkb3duYXJyb3dsZW59XSBcCgkJCSAgICAgICBbZXhwciB7JHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbn1dXQoJCSAgICBpZiB7JHIgPT0gMH0gewoJCQlzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICR4ICR4XQoJCQlzZXQgb2ZmcyBbbHJlcGxhY2UgJG9mZnMgJHggJHhdCgkJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkeCAxXQoJCQlzZXQgaWRpbmxpc3QoJGkpIDAKCQkJc2V0IHJtMSBbZXhwciB7JHJvdyAtIDF9XQoJCQlsYXBwZW5kIGlkcm93cmFuZ2VzKCRpKSBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJtMV0KCQkJaWYge1tpbmNyIG5ldiAtMV0gPD0gMH0gYnJlYWsKCQkJY29udGludWUKCQkgICAgfQoJCSAgICBzZXQgcm93Y2hrKCRpKSBbZXhwciB7JHJvdyArICRyfV0KCQl9CgkgICAgfQoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgl9CglzZXQgb2xkb2xkcyB7fQoJc2V0IG5ld29sZHMge30KCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGlubGlzdCgkcCldfSB7CgkJbGFwcGVuZCBuZXdvbGRzICRwCgkgICAgfSBlbHNlaWYgeyEkaWRpbmxpc3QoJHApfSB7CgkJbGFwcGVuZCBvbGRvbGRzICRwCgkgICAgfQoJICAgIHNldCBpZGlubGlzdCgkcCkgMQoJfQoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkaWRdCglpZiB7JGNvbCA8IDB9IHsKCSAgICBzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdCgkgICAgbGFwcGVuZCBpZGxpc3QgJGlkCgkgICAgbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CgkgICAgc2V0IHoge30KCSAgICBpZiB7JGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkgbmUge319IHsKCQlzZXQgeiBbZXhwciB7W2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93LTF9XV1dIC0gJGNvbH1dCgkJdW5zZXQgaWRpbmxpc3QoJGlkKQoJICAgIH0KCSAgICBsYXBwZW5kIG9mZnMgJHoKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJICAgIGlmIHskeiBuZSB7fX0gewoJCW1ha2V1cGFycm93ICRpZCAkY29sICRyb3cgJHoKCSAgICB9Cgl9IGVsc2UgewoJICAgIHVuc2V0IGlkaW5saXN0KCRpZCkKCX0KCXNldCByYW5nZXMge30KCWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKCSAgICBzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCgkgICAgbGFwcGVuZCByYW5nZXMgJGlkCgkgICAgdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJfQoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJHJhbmdlcwoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgW2xsZW5ndGggJGlkbGlzdF0gMF0KCXNldCBsIFtsbGVuZ3RoICRuZXdvbGRzXQoJc2V0IGlkbGlzdCBbZXZhbCBscmVwbGFjZSBcJGlkbGlzdCAkY29sICRjb2wgJG5ld29sZHNdCglzZXQgbyAwCglpZiB7JGwgIT0gMX0gewoJICAgIHNldCBvZmZzIFtscmFuZ2UgJG9mZnMgMCBbZXhwciB7JGNvbCAtIDF9XV0KCSAgICBmb3JlYWNoIHggJG5ld29sZHMgewoJCWxhcHBlbmQgb2ZmcyB7fQoJCWluY3IgbyAtMQoJICAgIH0KCSAgICBpbmNyIG8KCSAgICBzZXQgdG1wIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIFtsbGVuZ3RoICRvZmZzXX1dCgkgICAgaWYgeyR0bXAgPiAwfSB7CgkJc2V0IG9mZnMgW2NvbmNhdCAkb2ZmcyBbbnRpbWVzICR0bXAgJG9dXQoJICAgIH0KCX0gZWxzZSB7CgkgICAgbHNldCBvZmZzICRjb2wge30KCX0KCWZvcmVhY2ggaSAkbmV3b2xkcyB7CgkgICAgc2V0IGlkcm93cmFuZ2VzKCRpKSAkaWQKCX0KCWluY3IgY29sICRsCglmb3JlYWNoIG9pZCAkb2xkb2xkcyB7CgkgICAgc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wgJG9pZF0KCSAgICBzZXQgb2ZmcyBbbGluc2VydCAkb2ZmcyAkY29sICRvXQoJICAgIG1ha2V1cGFycm93ICRvaWQgJGNvbCAkcm93ICRvCgkgICAgaW5jciBjb2wKCX0KCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcwogICAgfQogICAgcmV0dXJuICRyb3cKfQoKcHJvYyBhZGRleHRyYWlkIHtpZCByb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0cm93IGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb21taXRpZHggY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZHJlbiBjdXJ2aWV3CgogICAgaW5jciBjb21taXRpZHgoJGN1cnZpZXcpCiAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkIDAKICAgIGxhcHBlbmQgcGFyZW50bGlzdCB7fQogICAgc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyb3cKICAgIHJlYWRjb21taXQgJGlkCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkge30KICAgIH0KfQoKcHJvYyBsYXlvdXR0YWlsIHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZGlubGlzdCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIHJvd3JhbmdlbGlzdAoKICAgIHNldCByb3cgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICB3aGlsZSB7JGlkbGlzdCBuZSB7fX0gewoJc2V0IGNvbCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSAxfV0KCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KCWFkZGV4dHJhaWQgJGlkICRyb3cKCWNhdGNoIHt1bnNldCBpZGlubGlzdCgkaWQpfQoJbGFwcGVuZCBpZHJvd3JhbmdlcygkaWQpICRpZAoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJGlkcm93cmFuZ2VzKCRpZCkKCXVuc2V0IGlkcm93cmFuZ2VzKCRpZCkKCWluY3Igcm93CglzZXQgb2ZmcyBbbnRpbWVzICRjb2wgMF0KCXNldCBpZGxpc3QgW2xyZXBsYWNlICRpZGxpc3QgJGNvbCAkY29sXQoJbGFwcGVuZCByb3dpZGxpc3QgJGlkbGlzdAoJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCiAgICB9CgogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgaWRpbmxpc3RdIHsKCXVuc2V0IGlkaW5saXN0KCRpZCkKCWFkZGV4dHJhaWQgJGlkICRyb3cKCWxzZXQgcm93aWRsaXN0ICRyb3cgW2xpc3QgJGlkXQoJbHNldCByb3dvZmZzZXRzICRyb3cgMAoJbWFrZXVwYXJyb3cgJGlkIDAgJHJvdyAwCglsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJGlkCglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCWxhcHBlbmQgcm93aWRsaXN0IHt9CglsYXBwZW5kIHJvd29mZnNldHMge30KICAgIH0KfQoKcHJvYyBpbnNlcnRfcGFkIHtyb3cgY29sIG5wYWR9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dICRjb2wgJHBhZF0KICAgIHNldCB0bXAgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddXSAkY29sICRwYWRdCiAgICBsc2V0IHJvd29mZnNldHMgJHJvdyBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JGNvbCArICRucGFkfV0gW2V4cHIgey0kbnBhZH1dXQp9Cgpwcm9jIG9wdGltaXplX3Jvd3Mge3JvdyBjb2wgZW5kcm93fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyCgogICAgZm9yIHt9IHskcm93IDwgJGVuZHJvd30ge2luY3Igcm93fSB7CglzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQoJc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQoJc2V0IGhhc3BhZCAwCglmb3Ige30geyRjb2wgPCBbbGxlbmd0aCAkb2Zmc119IHtpbmNyIGNvbH0gewoJICAgIGlmIHtbbGluZGV4ICRpZGxpc3QgJGNvbF0gZXEge319IHsKCQlzZXQgaGFzcGFkIDEKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkgICAgaWYgeyR6IGVxIHt9fSBjb250aW51ZQoJICAgIHNldCBpc2Fycm93IDAKCSAgICBzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCgkgICAgc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkgICAgc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KCSAgICBpZiB7JHowIGVxIHt9fSB7CgkJc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJaWYgeyRyYW5nZXMgbmUge30gJiYgJHkwID4gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJICAgIHNldCBpc2Fycm93IDEKCQl9CgkgICAgfQoJICAgICMgTG9va2luZyBhdCBsaW5lcyBmcm9tIHRoaXMgcm93IHRvIHRoZSBwcmV2aW91cyByb3csCgkgICAgIyBtYWtlIHRoZW0gZ28gc3RyYWlnaHQgdXAgaWYgdGhleSBlbmQgaW4gYW4gYXJyb3cgb24KCSAgICAjIHRoZSBwcmV2aW91cyByb3c7IG90aGVyd2lzZSBtYWtlIHRoZW0gZ28gc3RyYWlnaHQgdXAKCSAgICAjIG9yIGF0IDQ1IGRlZ3JlZXMuCgkgICAgaWYgeyR6IDwgLTEgfHwgKCR6IDwgMCAmJiAkaXNhcnJvdyl9IHsKCQkjIExpbmUgY3VycmVudGx5IGdvZXMgbGVmdCB0b28gbXVjaDsKCQkjIGluc2VydCBwYWRzIGluIHRoZSBwcmV2aW91cyByb3csIHRoZW4gb3B0aW1pemUgaXQKCQlzZXQgbnBhZCBbZXhwciB7LTEgLSAkeiArICRpc2Fycm93fV0KCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJGNvbCAkbnBhZF0KCQlpbnNlcnRfcGFkICR5MCAkeDAgJG5wYWQKCQlpZiB7JHkwID4gMH0gewoJCSAgICBvcHRpbWl6ZV9yb3dzICR5MCAkeDAgJHJvdwoJCX0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IHgwIFtleHByIHskY29sICsgJHp9XQoJCXNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCgkgICAgfSBlbHNlaWYgeyR6ID4gMSB8fCAoJHogPiAwICYmICRpc2Fycm93KX0gewoJCSMgTGluZSBjdXJyZW50bHkgZ29lcyByaWdodCB0b28gbXVjaDsKCQkjIGluc2VydCBwYWRzIGluIHRoaXMgbGluZSBhbmQgYWRqdXN0IHRoZSBuZXh0J3Mgcm93b2Zmc2V0cwoJCXNldCBucGFkIFtleHByIHskeiAtIDEgKyAkaXNhcnJvd31dCgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGlmIHskeDEgKyAkeiA+ICRjb2x9IHsKCQkJaW5jciBucGFkCgkJICAgIH0KCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAkbnBhZF0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQoJCXNldCBpZGxpc3QgW2V2YWwgbGluc2VydCBcJGlkbGlzdCAkY29sICRwYWRdCgkJc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFwkb2ZmcyAkY29sICRwYWRdCgkJaW5jciBjb2wgJG5wYWQKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIFtleHByIHstJG5wYWR9XV0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IGhhc3BhZCAxCgkgICAgfQoJICAgIGlmIHskejAgZXEge30gJiYgISRpc2Fycm93fSB7CgkJIyB0aGlzIGxpbmUgbGlua3MgdG8gaXRzIGZpcnN0IGNoaWxkIG9uIHJvdyAkcm93LTIKCQlzZXQgcm0yIFtleHByIHskcm93IC0gMn1dCgkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm0yXQoJCXNldCB4YyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRybTJdICRpZF0KCQlpZiB7JHhjID49IDB9IHsKCQkgICAgc2V0IHowIFtleHByIHskeGMgLSAkeDB9XQoJCX0KCSAgICB9CgkgICAgIyBhdm9pZCBsaW5lcyBqaWdnaW5nIGxlZnQgdGhlbiBpbW1lZGlhdGVseSByaWdodAoJICAgIGlmIHskejAgbmUge30gJiYgJHogPCAwICYmICR6MCA+IDB9IHsKCQlpbnNlcnRfcGFkICR5MCAkeDAgMQoJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sIDFdCgkJb3B0aW1pemVfcm93cyAkeTAgW2V4cHIgeyR4MCArIDF9XSAkcm93CgkgICAgfQoJfQoJaWYgeyEkaGFzcGFkfSB7CgkgICAgc2V0IG8ge30KCSAgICAjIEZpbmQgdGhlIGZpcnN0IGNvbHVtbiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGxpbmUgZ29pbmcgcmlnaHQKCSAgICBmb3Ige3NldCBjb2wgW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciBjb2wgLTFdID49IDB9IHt9IHsKCQlzZXQgbyBbbGluZGV4ICRvZmZzICRjb2xdCgkJaWYgeyRvIGVxIHt9fSB7CgkJICAgICMgY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQKCQkgICAgc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCSAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQoJCSAgICBpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93ID09IFtsaW5kZXggJHJhbmdlcyAwXX0gewoJCQkjIGl0IGlzLCB3b3JrIG91dCBvZmZzZXQgdG8gY2hpbGQKCQkJc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHkwXQoJCQlzZXQgeDAgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkeTBdICRpZF0KCQkJaWYgeyR4MCA+PSAwfSB7CgkJCSAgICBzZXQgbyBbZXhwciB7JHgwIC0gJGNvbH1dCgkJCX0KCQkgICAgfQoJCX0KCQlpZiB7JG8gZXEge30gfHwgJG8gPD0gMH0gYnJlYWsKCSAgICB9CgkgICAgIyBJbnNlcnQgYSBwYWQgYXQgdGhhdCBjb2x1bW4gYXMgbG9uZyBhcyBpdCBoYXMgYSBsaW5lIGFuZAoJICAgICMgaXNuJ3QgdGhlIGxhc3QgY29sdW1uLCBhbmQgYWRqdXN0IHRoZSBuZXh0IHJvdycgb2Zmc2V0cwoJICAgIGlmIHskbyBuZSB7fSAmJiBbaW5jciBjb2xdIDwgW2xsZW5ndGggJGlkbGlzdF19IHsKCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KCQlzZXQgb2ZmczIgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTFdCgkJc2V0IHgxIC0xCgkJZm9yZWFjaCB6ICRvZmZzMiB7CgkJICAgIGluY3IgeDEKCQkgICAgaWYgeyR6IGVxIHt9IHx8ICR4MSArICR6IDwgJGNvbH0gY29udGludWUKCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAxXQoJCSAgICBicmVhawoJCX0KCQlzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCB7fV0KCQlzZXQgdG1wIFtsaW5zZXJ0ICRvZmZzICRjb2wge31dCgkJaW5jciBjb2wKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIC0xXQoJICAgIH0KCX0KCWxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKCXNldCBjb2wgMAogICAgfQp9Cgpwcm9jIHhjIHtyb3cgY29sfSB7CiAgICBnbG9iYWwgY2FudngwIGxpbmVzcGMKICAgIHJldHVybiBbZXhwciB7JGNhbnZ4MCArICRjb2wgKiAkbGluZXNwY31dCn0KCnByb2MgeWMge3Jvd30gewogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjCiAgICByZXR1cm4gW2V4cHIgeyRjYW52eTAgKyAkcm93ICogJGxpbmVzcGN9XQp9Cgpwcm9jIGxpbmV3aWR0aCB7aWR9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZSBsdGhpY2tuZXNzCgogICAgc2V0IHdpZCAkbHRoaWNrbmVzcwogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV0gJiYgJGlkIGVxICR0aGlja2VybGluZX0gewoJc2V0IHdpZCBbZXhwciB7MiAqICRsdGhpY2tuZXNzfV0KICAgIH0KICAgIHJldHVybiAkd2lkCn0KCnByb2Mgcm93cmFuZ2VzIHtpZH0gewogICAgZ2xvYmFsIHBoYXNlIGlkcm93cmFuZ2VzIGNvbW1pdHJvdyByb3dsYWlkb3V0IHJvd3JhbmdlbGlzdCBjdXJ2aWV3CgogICAgc2V0IHJhbmdlcyB7fQogICAgaWYgeyRwaGFzZSBlcSB7fSB8fAoJKFtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KCSAmJiAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgPCAkcm93bGFpZG91dCl9IHsKCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKCXNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKICAgIH0KICAgIHNldCBsaW5lbm9zIHt9CiAgICBmb3JlYWNoIHJpZCAkcmFuZ2VzIHsKCWxhcHBlbmQgbGluZW5vcyAkY29tbWl0cm93KCRjdXJ2aWV3LCRyaWQpCiAgICB9CiAgICBpZiB7JGxpbmVub3MgbmUge319IHsKCWxzZXQgbGluZW5vcyAwIFtleHByIHtbbGluZGV4ICRsaW5lbm9zIDBdICsgMX1dCiAgICB9CiAgICByZXR1cm4gJGxpbmVub3MKfQoKIyB3b3JrIGFyb3VuZCB0azguNCByZWZ1c2FsIHRvIGRyYXcgYXJyb3dzIG9uIGRpYWdvbmFsIHNlZ21lbnRzCnByb2MgYWRqYXJyb3doaWdoIHtjb29yZHN9IHsKICAgIGdsb2JhbCBsaW5lc3BjCgogICAgc2V0IHgwIFtsaW5kZXggJGNvb3JkcyAwXQogICAgc2V0IHgxIFtsaW5kZXggJGNvb3JkcyAyXQogICAgaWYgeyR4MCAhPSAkeDF9IHsKCXNldCB5MCBbbGluZGV4ICRjb29yZHMgMV0KCXNldCB5MSBbbGluZGV4ICRjb29yZHMgM10KCWlmIHskeTAgLSAkeTEgPD0gMiAqICRsaW5lc3BjICYmICR4MSA9PSBbbGluZGV4ICRjb29yZHMgNF19IHsKCSAgICAjIHdlIGhhdmUgYSBuZWFyYnkgdmVydGljYWwgc2VnbWVudCwganVzdCB0cmltIG9mZiB0aGUgZGlhZyBiaXQKCSAgICBzZXQgY29vcmRzIFtscmFuZ2UgJGNvb3JkcyAyIGVuZF0KCX0gZWxzZSB7CgkgICAgc2V0IHNsb3BlIFtleHByIHsoJHgwIC0gJHgxKSAvICgkeTAgLSAkeTEpfV0KCSAgICBzZXQgeGkgW2V4cHIgeyR4MCAtICRzbG9wZSAqICRsaW5lc3BjIC8gMn1dCgkgICAgc2V0IHlpIFtleHByIHskeTAgLSAkbGluZXNwYyAvIDJ9XQoJICAgIHNldCBjb29yZHMgW2xyZXBsYWNlICRjb29yZHMgMCAxICR4aSAkeTAgJHhpICR5aV0KCX0KICAgIH0KICAgIHJldHVybiAkY29vcmRzCn0KCnByb2MgZHJhd2xpbmVzZWcge2lkIHJvdyBlbmRyb3cgYXJyb3dsb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgZGlzcGxheW9yZGVyIGlkZHJhd24gbGluZXNlZ3MKICAgIGdsb2JhbCBjYW52IGNvbG9ybWFwIGxpbmVzcGMgY3VydmlldyBtYXhsaW5lbGVuCgogICAgc2V0IGNvbHMgW2xpc3QgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdXQogICAgc2V0IGxlIFtleHByIHskcm93ICsgMX1dCiAgICBzZXQgYXJyb3doaWdoIDEKICAgIHdoaWxlIHsxfSB7CglzZXQgYyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRsZV0gJGlkXQoJaWYgeyRjIDwgMH0gewoJICAgIGluY3IgbGUgLTEKCSAgICBicmVhawoJfQoJbGFwcGVuZCBjb2xzICRjCglzZXQgeCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxlXQoJaWYgeyR4IGVxICRpZH0gewoJICAgIHNldCBhcnJvd2hpZ2ggMAoJICAgIGJyZWFrCgl9CglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJHgpXSB8fCAkbGUgPT0gJGVuZHJvd30gewoJICAgIHNldCBjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRsZSsxfV1dICRpZF0KCSAgICBpZiB7JGMgPj0gMH0gewoJCWxhcHBlbmQgY29scyAkYwoJCXNldCBhcnJvd2hpZ2ggMAoJICAgIH0KCSAgICBicmVhawoJfQoJaW5jciBsZQogICAgfQogICAgaWYgeyRsZSA8PSAkcm93fSB7CglyZXR1cm4gJHJvdwogICAgfQoKICAgIHNldCBsaW5lcyB7fQogICAgc2V0IGkgMAogICAgc2V0IGpvaW5oaWdoIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgbGluZXNlZ3MoJGlkKV19IHsKCXNldCBsaW5lcyAkbGluZXNlZ3MoJGlkKQoJZm9yZWFjaCBsaSAkbGluZXMgewoJICAgIHNldCByMCBbbGluZGV4ICRsaSAwXQoJICAgIGlmIHskcjAgPiAkcm93fSB7CgkJaWYgeyRyMCA9PSAkbGUgJiYgW2xpbmRleCAkbGkgMV0gLSAkcm93IDw9ICRtYXhsaW5lbGVufSB7CgkJICAgIHNldCBqb2luaGlnaCAxCgkJfQoJCWJyZWFrCgkgICAgfQoJICAgIGluY3IgaQoJfQogICAgfQogICAgc2V0IGpvaW5sb3cgMAogICAgaWYgeyRpID4gMH0gewoJc2V0IGxpIFtsaW5kZXggJGxpbmVzIFtleHByIHskaS0xfV1dCglzZXQgcjEgW2xpbmRleCAkbGkgMV0KCWlmIHskcjEgPT0gJHJvdyAmJiAkbGUgLSBbbGluZGV4ICRsaSAwXSA8PSAkbWF4bGluZWxlbn0gewoJICAgIHNldCBqb2lubG93IDEKCX0KICAgIH0KCiAgICBzZXQgeCBbbGluZGV4ICRjb2xzIFtleHByIHskbGUgLSAkcm93fV1dCiAgICBzZXQgeHAgW2xpbmRleCAkY29scyBbZXhwciB7JGxlIC0gMSAtICRyb3d9XV0KICAgIHNldCBkaXIgW2V4cHIgeyR4cCAtICR4fV0KICAgIGlmIHskam9pbmhpZ2h9IHsKCXNldCBpdGggW2xpbmRleCAkbGluZXMgJGkgMl0KCXNldCBjb29yZHMgWyRjYW52IGNvb3JkcyAkaXRoXQoJc2V0IGFoIFskY2FudiBpdGVtY2dldCAkaXRoIC1hcnJvd10KCXNldCBhcnJvd2hpZ2ggW2V4cHIgeyRhaCBlcSAiZmlyc3QiIHx8ICRhaCBlcSAiYm90aCJ9XQoJc2V0IHgyIFtsaW5kZXggJGNvbHMgW2V4cHIgeyRsZSArIDEgLSAkcm93fV1dCglpZiB7JHgyIG5lIHt9ICYmICR4IC0gJHgyID09ICRkaXJ9IHsKCSAgICBzZXQgY29vcmRzIFtscmFuZ2UgJGNvb3JkcyAwIGVuZC0yXQoJfQogICAgfSBlbHNlIHsKCXNldCBjb29yZHMgW2xpc3QgW3hjICRsZSAkeF0gW3ljICRsZV1dCiAgICB9CiAgICBpZiB7JGpvaW5sb3d9IHsKCXNldCBpdGwgW2xpbmRleCAkbGluZXMgW2V4cHIgeyRpLTF9XSAyXQoJc2V0IGFsIFskY2FudiBpdGVtY2dldCAkaXRsIC1hcnJvd10KCXNldCBhcnJvd2xvdyBbZXhwciB7JGFsIGVxICJsYXN0IiB8fCAkYWwgZXEgImJvdGgifV0KICAgIH0gZWxzZWlmIHskYXJyb3dsb3cgJiYKCSAgICAgIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXSAkaWRdID49IDB9IHsKCXNldCBhcnJvd2xvdyAwCiAgICB9CiAgICBzZXQgYXJyb3cgW2xpbmRleCB7bm9uZSBmaXJzdCBsYXN0IGJvdGh9IFtleHByIHskYXJyb3doaWdoICsgMiokYXJyb3dsb3d9XV0KICAgIGZvciB7c2V0IHkgJGxlfSB7W2luY3IgeSAtMV0gPiAkcm93fSB7fSB7CglzZXQgeCAkeHAKCXNldCB4cCBbbGluZGV4ICRjb2xzIFtleHByIHskeSAtIDEgLSAkcm93fV1dCglzZXQgbmRpciBbZXhwciB7JHhwIC0gJHh9XQoJaWYgeyRkaXIgIT0gJG5kaXIgfHwgJHhwIDwgMH0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkeSAkeF0gW3ljICR5XQoJfQoJc2V0IGRpciAkbmRpcgogICAgfQogICAgaWYgeyEkam9pbmxvd30gewoJaWYgeyR4cCA8IDB9IHsKCSAgICAjIGpvaW4gcGFyZW50IGxpbmUgdG8gZmlyc3QgY2hpbGQKCSAgICBzZXQgY2ggW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCgkgICAgc2V0IHhjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoXQoJICAgIGlmIHskeGMgPCAwfSB7CgkJcHV0cyAib29wczogZHJhd2xpbmVzZWc6IGNoaWxkICRjaCBub3Qgb24gcm93ICRyb3ciCgkgICAgfSBlbHNlIHsKCQlpZiB7JHhjIDwgJHggLSAxfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskeC0xfV1dIFt5YyAkcm93XQoJCX0gZWxzZWlmIHskeGMgPiAkeCArIDF9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyR4KzF9XV0gW3ljICRyb3ddCgkJfQoJCXNldCB4ICR4YwoJICAgIH0KCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyAkeF0gW3ljICRyb3ddCgl9IGVsc2UgewoJICAgIHNldCB4biBbeGMgJHJvdyAkeHBdCgkgICAgc2V0IHluIFt5YyAkcm93XQoJICAgICMgd29yayBhcm91bmQgdGs4LjQgcmVmdXNhbCB0byBkcmF3IGFycm93cyBvbiBkaWFnb25hbCBzZWdtZW50cwoJICAgIGlmIHskYXJyb3dsb3cgJiYgJHhuICE9IFtsaW5kZXggJGNvb3JkcyBlbmQtMV19IHsKCQlpZiB7W2xsZW5ndGggJGNvb3Jkc10gPCA0IHx8CgkJICAgIFtsaW5kZXggJGNvb3JkcyBlbmQtM10gIT0gW2xpbmRleCAkY29vcmRzIGVuZC0xXSB8fAoJCSAgICBbbGluZGV4ICRjb29yZHMgZW5kXSAtICR5biA+IDIgKiAkbGluZXNwY30gewoJCSAgICBzZXQgeG4gW3hjICRyb3cgW2V4cHIgeyR4cCAtIDAuNSAqICRkaXJ9XV0KCQkgICAgc2V0IHlvIFt5YyBbZXhwciB7JHJvdyArIDAuNX1dXQoJCSAgICBsYXBwZW5kIGNvb3JkcyAkeG4gJHlvICR4biAkeW4KCQl9CgkgICAgfSBlbHNlIHsKCQlsYXBwZW5kIGNvb3JkcyAkeG4gJHluCgkgICAgfQoJfQoJaWYgeyEkam9pbmhpZ2h9IHsKCSAgICBpZiB7JGFycm93aGlnaH0gewoJCXNldCBjb29yZHMgW2FkamFycm93aGlnaCAkY29vcmRzXQoJICAgIH0KCSAgICBhc3NpZ25jb2xvciAkaWQKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkaWRdIFwKCQkgICAgICAgLWZpbGwgJGNvbG9ybWFwKCRpZCkgLXRhZ3MgbGluZXMuJGlkIC1hcnJvdyAkYXJyb3ddCgkgICAgJGNhbnYgbG93ZXIgJHQKCSAgICBiaW5kbGluZSAkdCAkaWQKCSAgICBzZXQgbGluZXMgW2xpbnNlcnQgJGxpbmVzICRpIFtsaXN0ICRyb3cgJGxlICR0XV0KCX0gZWxzZSB7CgkgICAgJGNhbnYgY29vcmRzICRpdGggJGNvb3JkcwoJICAgIGlmIHskYXJyb3cgbmUgJGFofSB7CgkJJGNhbnYgaXRlbWNvbmYgJGl0aCAtYXJyb3cgJGFycm93CgkgICAgfQoJICAgIGxzZXQgbGluZXMgJGkgMCAkcm93Cgl9CiAgICB9IGVsc2UgewoJc2V0IHhvIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3cgLSAxfV1dICRpZF0KCXNldCBuZGlyIFtleHByIHskeG8gLSAkeHB9XQoJc2V0IGNsb3cgWyRjYW52IGNvb3JkcyAkaXRsXQoJaWYgeyRkaXIgPT0gJG5kaXJ9IHsKCSAgICBzZXQgY2xvdyBbbHJhbmdlICRjbG93IDIgZW5kXQoJfQoJc2V0IGNvb3JkcyBbY29uY2F0ICRjb29yZHMgJGNsb3ddCglpZiB7ISRqb2luaGlnaH0gewoJICAgIGxzZXQgbGluZXMgW2V4cHIgeyRpLTF9XSAxICRsZQoJICAgIGlmIHskYXJyb3doaWdofSB7CgkJc2V0IGNvb3JkcyBbYWRqYXJyb3doaWdoICRjb29yZHNdCgkgICAgfQoJfSBlbHNlIHsKCSAgICAjIGNvYWxlc2NlIHR3byBwaWVjZXMKCSAgICAkY2FudiBkZWxldGUgJGl0aAoJICAgIHNldCBiIFtsaW5kZXggJGxpbmVzIFtleHByIHskaS0xfV0gMF0KCSAgICBzZXQgZSBbbGluZGV4ICRsaW5lcyAkaSAxXQoJICAgIHNldCBsaW5lcyBbbHJlcGxhY2UgJGxpbmVzIFtleHByIHskaS0xfV0gJGkgW2xpc3QgJGIgJGUgJGl0bF1dCgl9CgkkY2FudiBjb29yZHMgJGl0bCAkY29vcmRzCglpZiB7JGFycm93IG5lICRhbH0gewoJICAgICRjYW52IGl0ZW1jb25mICRpdGwgLWFycm93ICRhcnJvdwoJfQogICAgfQoKICAgIHNldCBsaW5lc2VncygkaWQpICRsaW5lcwogICAgcmV0dXJuICRsZQp9Cgpwcm9jIGRyYXdwYXJlbnRsaW5rcyB7aWQgcm93fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IGNhbnYgY29sb3JtYXAgY3VydmlldyBwYXJlbnRsaXN0CiAgICBnbG9iYWwgaWRwb3MKCiAgICBzZXQgcm93aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJHJvd2lkcyAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHJldHVybgogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQogICAgc2V0IHJvdzIgW2V4cHIgeyRyb3cgKyAxfV0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIHNldCB5MiBbeWMgJHJvdzJdCiAgICBzZXQgaWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93Ml0KICAgICMgcm14ID0gcmlnaHQtbW9zdCBYIGNvb3JkIHVzZWQKICAgIHNldCBybXggMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRzICRwXQoJaWYgeyRpIDwgMH0gewoJICAgIHB1dHMgIm9vcHMsIHBhcmVudCAkcCBvZiAkaWQgbm90IGluIGxpc3QiCgkgICAgY29udGludWUKCX0KCXNldCB4MiBbeGMgJHJvdzIgJGldCglpZiB7JHgyID4gJHJteH0gewoJICAgIHNldCBybXggJHgyCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRyb3dpZHMgJHBdIDwgMH0gewoJICAgICMgZHJhd2xpbmVzZWcgd2lsbCBkbyB0aGlzIG9uZSBmb3IgdXMKCSAgICBjb250aW51ZQoJfQoJYXNzaWduY29sb3IgJHAKCSMgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGVkIHBhcmVudHMgaGVyZS4uLgoJc2V0IGNvb3JkcyBbbGlzdCAkeCAkeV0KCWlmIHskaSA8ICRjb2wgLSAxfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpICsgMX1dXSAkeQoJfSBlbHNlaWYgeyRpID4gJGNvbCArIDF9IHsKCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgLSAxfV1dICR5Cgl9CglsYXBwZW5kIGNvb3JkcyAkeDIgJHkyCglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkcF0gXAoJCSAgIC1maWxsICRjb2xvcm1hcCgkcCkgLXRhZ3MgbGluZXMuJHBdCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJHAKICAgIH0KICAgIGlmIHskcm14ID4gW2xpbmRleCAkaWRwb3MoJGlkKSAxXX0gewoJbHNldCBpZHBvcygkaWQpIDEgJHJteAoJcmVkcmF3dGFncyAkaWQKICAgIH0KfQoKcHJvYyBkcmF3bGluZXMge2lkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGl0ZW1jb25mIGxpbmVzLiRpZCAtd2lkdGggW2xpbmV3aWR0aCAkaWRdCn0KCnByb2MgZHJhd2NtaXR0ZXh0IHtpZCByb3cgY29sfSB7CiAgICBnbG9iYWwgbGluZXNwYyBjYW52IGNhbnYyIGNhbnYzIGNhbnZ5MCBmZ2NvbG9yIGN1cnZpZXcKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgY29tbWl0aW5mbyByb3dpZGxpc3QgcGFyZW50bGlzdAogICAgZ2xvYmFsIHJvd3RleHR4IGlkcG9zIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heCBib2xkcm93cyBib2xkbmFtZXJvd3MgZmdjb2xvciBudWxsaWQgbnVsbGlkMgoKICAgICMgbGlzdGVkIGlzIDAgZm9yIGJvdW5kYXJ5LCAxIGZvciBub3JtYWwsIDIgZm9yIGxlZnQsIDMgZm9yIHJpZ2h0CiAgICBzZXQgbGlzdGVkIFtsaW5kZXggJGNvbW1pdGxpc3RlZCAkcm93XQogICAgaWYgeyRpZCBlcSAkbnVsbGlkfSB7CglzZXQgb2ZpbGwgcmVkCiAgICB9IGVsc2VpZiB7JGlkIGVxICRudWxsaWQyfSB7CglzZXQgb2ZpbGwgZ3JlZW4KICAgIH0gZWxzZSB7CglzZXQgb2ZpbGwgW2V4cHIgeyRsaXN0ZWQgIT0gMD8gImJsdWUiOiAid2hpdGUifV0KICAgIH0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIHNldCBvcmFkIFtleHByIHskbGluZXNwYyAvIDN9XQogICAgaWYgeyRsaXN0ZWQgPD0gMX0gewoJc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCgkJICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gW2V4cHIgeyR5ICsgJG9yYWQgLSAxfV0gXAoJCSAgIC1maWxsICRvZmlsbCAtb3V0bGluZSAkZmdjb2xvciAtd2lkdGggMSAtdGFncyBjaXJjbGVdCiAgICB9IGVsc2VpZiB7JGxpc3RlZCA9PSAyfSB7CgkjIHRyaWFuZ2xlIHBvaW50aW5nIGxlZnQgZm9yIGxlZnQtc2lkZSBjb21taXRzCglzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gXAoJCSAgIFtleHByIHskeCAtICRvcmFkfV0gJHkgXAoJCSAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSAtICRvcmFkfV0gXAoJCSAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKCQkgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgJGZnY29sb3IgLXdpZHRoIDEgLXRhZ3MgY2lyY2xlXQogICAgfSBlbHNlIHsKCSMgdHJpYW5nbGUgcG9pbnRpbmcgcmlnaHQgZm9yIHJpZ2h0LXNpZGUgY29tbWl0cwoJc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uIFwKCQkgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSAkeSBcCgkJICAgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkgLSAkb3JhZH1dIFwKCQkgICBbZXhwciB7JHggLSAkb3JhZH1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKCQkgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgJGZnY29sb3IgLXdpZHRoIDEgLXRhZ3MgY2lyY2xlXQogICAgfQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCBybXggW2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXQogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQogICAgaWYgeyRvbGRzIG5lIHt9fSB7CglzZXQgbmV4dGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3cgKyAxfV1dCglmb3JlYWNoIHAgJG9sZHMgewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbmV4dGlkcyAkcF0KCSAgICBpZiB7JGkgPiAkcm14fSB7CgkJc2V0IHJteCAkaQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB4dCBbeGMgJHJvdyAkcm14XQogICAgc2V0IHJvd3RleHR4KCRyb3cpICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5XQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV0gfHwgW2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV0KCXx8IFtpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5XQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGZvbnQgJG1haW5mb250CiAgICBzZXQgbmZvbnQgJG1haW5mb250CiAgICBzZXQgaXNib2xkIFtpc2hpZ2hsaWdodGVkICRyb3ddCiAgICBpZiB7JGlzYm9sZCA+IDB9IHsKCWxhcHBlbmQgYm9sZHJvd3MgJHJvdwoJbGFwcGVuZCBmb250IGJvbGQKCWlmIHskaXNib2xkID4gMX0gewoJICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKCSAgICBsYXBwZW5kIG5mb250IGJvbGQKCX0KICAgIH0KICAgIHNldCBsaW5laHRhZygkcm93KSBbJGNhbnYgY3JlYXRlIHRleHQgJHh0ICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJGZvbnQgLXRhZ3MgdGV4dF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRyb3cpIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRyb3cpIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5mb250IC10YWdzIHRleHRdCiAgICBzZXQgbGluZWR0YWcoJHJvdykgWyRjYW52MyBjcmVhdGUgdGV4dCAzICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dF0KICAgIHNldCB4ciBbZXhwciB7JHh0ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJGhlYWRsaW5lXX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9Cn0KCnByb2MgZHJhd2NtaXRyb3cge3Jvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciByb3dpZGxpc3QKICAgIGdsb2JhbCBpZGRyYXduIG1hcmtpbmdtYXRjaGVzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBwYXJlbnRsaXN0IG51bWNvbW1pdHMKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZpbmRzdHJpbmcgbmhpZ2hsaWdodHMKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGlmIHskcm93ID49ICRudW1jb21taXRzfSByZXR1cm4KCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgIVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0gJiYgIVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza2ZpbGVoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHskZmluZHN0cmluZyBuZSB7fSAmJiAhW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgJiYgIVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KCWlmIHskY29sIDwgMH0gewoJICAgIHB1dHMgIm9vcHMsIHJvdyAkcm93IGlkICRpZCBub3QgaW4gbGlzdCIKCSAgICByZXR1cm4KCX0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBnZXRjb21taXQgJGlkCgl9Cglhc3NpZ25jb2xvciAkaWQKCWRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sCglzZXQgaWRkcmF3bigkaWQpIDEKICAgIH0KICAgIGlmIHskbWFya2luZ21hdGNoZXN9IHsKCW1hcmtyb3dtYXRjaGVzICRyb3cgJGlkCiAgICB9Cn0KCnByb2MgZHJhd2NvbW1pdHMge3JvdyB7ZW5kcm93IHt9fX0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgaWRkcmF3biBkaXNwbGF5b3JkZXIgY3VydmlldwogICAgZ2xvYmFsIHBhcmVudGxpc3Qgcm93aWRsaXN0CgogICAgaWYgeyRyb3cgPCAwfSB7CglzZXQgcm93IDAKICAgIH0KICAgIGlmIHskZW5kcm93IGVxIHt9fSB7CglzZXQgZW5kcm93ICRyb3cKICAgIH0KICAgIGlmIHskZW5kcm93ID49ICRudW1jb21taXRzfSB7CglzZXQgZW5kcm93IFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQoKICAgICMgbWFrZSB0aGUgbGluZXMgam9pbiB0byBhbHJlYWR5LWRyYXduIHJvd3MgZWl0aGVyIHNpZGUKICAgIHNldCByIFtleHByIHskcm93IC0gMX1dCiAgICBpZiB7JHIgPCAwIHx8ICFbaW5mbyBleGlzdHMgaWRkcmF3bihbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdKV19IHsKCXNldCByICRyb3cKICAgIH0KICAgIHNldCBlciBbZXhwciB7JGVuZHJvdyArIDF9XQogICAgaWYgeyRlciA+PSAkbnVtY29tbWl0cyB8fAoJIVtpbmZvIGV4aXN0cyBpZGRyYXduKFtsaW5kZXggJGRpc3BsYXlvcmRlciAkZXJdKV19IHsKCXNldCBlciAkZW5kcm93CiAgICB9CiAgICBmb3Ige30geyRyIDw9ICRlcn0ge2luY3Igcn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0KCXNldCB3YXNkcmF3biBbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXQoJZHJhd2NtaXRyb3cgJHIKCWlmIHskciA9PSAkZXJ9IGJyZWFrCglzZXQgbmV4dGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciBbZXhwciB7JHIgKyAxfV1dCglpZiB7JHdhc2RyYXduICYmIFtpbmZvIGV4aXN0cyBpZGRyYXduKCRuZXh0aWQpXX0gewoJICAgIGNhdGNoIHt1bnNldCBwcmV2bGluZXN9CgkgICAgY29udGludWUKCX0KCWRyYXdwYXJlbnRsaW5rcyAkaWQgJHIKCglpZiB7W2luZm8gZXhpc3RzIGxpbmVlbmRzKCRyKV19IHsKCSAgICBmb3JlYWNoIGxpZCAkbGluZWVuZHMoJHIpIHsKCQl1bnNldCBwcmV2bGluZXMoJGxpZCkKCSAgICB9Cgl9CglzZXQgcm93aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcl0KCWZvcmVhY2ggbGlkICRyb3dpZHMgewoJICAgIGlmIHskbGlkIGVxIHt9fSBjb250aW51ZQoJICAgIGlmIHskbGlkIGVxICRpZH0gewoJCSMgc2VlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGFueSBvZiBpdHMgcGFyZW50cwoJCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyXSB7CgkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJHJvd2lkcyAkcF0gPCAwfSB7CgkJCSMgbWFrZSB0aGlzIGxpbmUgZXh0ZW5kIHVwIHRvIHRoZSBjaGlsZAoJCQlzZXQgbGUgW2RyYXdsaW5lc2VnICRwICRyICRlciAwXQoJCQlsYXBwZW5kIGxpbmVlbmRzKCRsZSkgJHAKCQkJc2V0IHByZXZsaW5lcygkcCkgMQoJCSAgICB9CgkJfQoJICAgIH0gZWxzZWlmIHshW2luZm8gZXhpc3RzIHByZXZsaW5lcygkbGlkKV19IHsKCQlzZXQgbGUgW2RyYXdsaW5lc2VnICRsaWQgJHIgJGVyIDFdCgkJbGFwcGVuZCBsaW5lZW5kcygkbGUpICRsaWQKCQlzZXQgcHJldmxpbmVzKCRsaWQpIDEKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZHJhd2ZyYWMge2YwIGYxfSB7CiAgICBnbG9iYWwgY2FudiBsaW5lc3BjCgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgogICAgc2V0IHkwIFtleHByIHtpbnQoJGYwICogJHltYXgpfV0KICAgIHNldCByb3cgW2V4cHIge2ludCgoJHkwIC0gMykgLyAkbGluZXNwYykgLSAxfV0KICAgIHNldCB5MSBbZXhwciB7aW50KCRmMSAqICR5bWF4KX1dCiAgICBzZXQgZW5kcm93IFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBkcmF3Y29tbWl0cyAkcm93ICRlbmRyb3cKfQoKcHJvYyBkcmF3dmlzaWJsZSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZXZhbCBkcmF3ZnJhYyBbJGNhbnYgeXZpZXddCn0KCnByb2MgY2xlYXJfZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgaWRkcmF3biBsaW5lc2VncwogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgY2F0Y2gge3Vuc2V0IGlkZHJhd259CiAgICBjYXRjaCB7dW5zZXQgbGluZXNlZ3N9CiAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9Cn0KCnByb2MgZmluZGNyb3NzaW5ncyB7aWR9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgcGFyZW50bGlzdCBudW1jb21taXRzIHJvd29mZnNldHMgZGlzcGxheW9yZGVyCgogICAgc2V0IGNyb3NzIHt9CiAgICBzZXQgY2Nyb3NzIHt9CiAgICBmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CglpZiB7JGUgPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgZSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KCX0KCWlmIHskZSA8PSAkc30gY29udGludWUKCXNldCB4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJGVdICRpZF0KCWlmIHskeCA8IDB9IHsKCSAgICBwdXRzICJmaW5kY3Jvc3NpbmdzOiBvb3BzLCBubyBbc2hvcnRpZHMgJGlkXSBpbiByb3cgJGUiCgkgICAgY29udGludWUKCX0KCWZvciB7c2V0IHJvdyAkZX0ge1tpbmNyIHJvdyAtMV0gPj0gJHN9IHt9IHsKCSAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCgkgICAgc2V0IGtpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCSAgICBzZXQga2lkeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRraWRdCgkgICAgaWYgeyRraWR4IDwgMH0gY29udGludWUKCSAgICBzZXQgbmV4dHJvdyBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3cgKyAxfV1dCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlzZXQgcHggW2xzZWFyY2ggLWV4YWN0ICRuZXh0cm93ICRwXQoJCWlmIHskcHggPCAwfSBjb250aW51ZQoJCWlmIHsoJGtpZHggPCAkeCAmJiAkeCA8ICRweCkgfHwgKCRweCA8ICR4ICYmICR4IDwgJGtpZHgpfSB7CgkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGNjcm9zcyAkcF0gPj0gMH0gY29udGludWUKCQkgICAgaWYgeyR4ID09ICRweCArICgka2lkeCA8ICRweD8gLTE6IDEpfSB7CgkJCWxhcHBlbmQgY2Nyb3NzICRwCgkJICAgIH0gZWxzZWlmIHtbbHNlYXJjaCAtZXhhY3QgJGNyb3NzICRwXSA8IDB9IHsKCQkJbGFwcGVuZCBjcm9zcyAkcAoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBzZXQgaW5jIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkeF0KCSAgICBpZiB7JGluYyBlcSB7fX0gYnJlYWsKCSAgICBpbmNyIHggJGluYwoJfQogICAgfQogICAgcmV0dXJuIFtjb25jYXQgJGNjcm9zcyB7e319ICRjcm9zc10KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb2xvcnMgbmV4dGNvbG9yCiAgICBnbG9iYWwgY29tbWl0cm93IHBhcmVudGxpc3QgY2hpbGRyZW4gY2hpbGRyZW4gY3VydmlldwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV19IHJldHVybgogICAgc2V0IG5jb2xvcnMgW2xsZW5ndGggJGNvbG9yc10KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCiAgICB9IGVsc2UgewoJc2V0IGtpZHMge30KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGtpZHMgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV1dID09IDF9IHsKCSAgICBzZXQgY29sb3JtYXAoJGlkKSAkY29sb3JtYXAoJGNoaWxkKQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGJhZGNvbG9ycyB7fQogICAgc2V0IG9yaWdiYWQge30KICAgIGZvcmVhY2ggeCBbZmluZGNyb3NzaW5ncyAkaWRdIHsKCWlmIHskeCBlcSB7fX0gewoJICAgICMgZGVsaW1pdGVyIGJldHdlZW4gY29ybmVyIGNyb3NzaW5ncyBhbmQgb3RoZXIgY3Jvc3NpbmdzCgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzIC0gMX0gYnJlYWsKCSAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCgl9CglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAka2lkcyB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBmb3JlYWNoIHAgW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCldIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQl9CgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJfQogICAgfQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJG5jb2xvcnN9IHtpbmNyIGl9IHsKCXNldCBjIFtsaW5kZXggJGNvbG9ycyAkbmV4dGNvbG9yXQoJaWYge1tpbmNyIG5leHRjb2xvcl0gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgbmV4dGNvbG9yIDAKCX0KCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY119IGJyZWFrCiAgICB9CiAgICBzZXQgY29sb3JtYXAoJGlkKSAkYwp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd3RhZ3Mge2lkIHggeHQgeTF9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcyBtYWluaGVhZAogICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgY29tbWl0cm93IHJvd3RleHR4IGN1cnZpZXcgZmdjb2xvciBiZ2NvbG9yCgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgc2V0IG5oZWFkcyAwCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQoJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCglzZXQgbmhlYWRzIFtsbGVuZ3RoICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkb3RoZXJyZWZzKCRpZCldCiAgICB9CiAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CglyZXR1cm4gJHh0CiAgICB9CgogICAgc2V0IGRlbHRhIFtleHByIHtpbnQoMC41ICogKCRsaW5lc3BjIC0gJGx0aGlja25lc3MpKX1dCiAgICBzZXQgeXQgW2V4cHIgeyR5MSAtIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCB5YiBbZXhwciB7JHl0ICsgJGxpbmVzcGMgLSAxfV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCWluY3IgaQoJaWYgeyRpID49ICRudGFncyAmJiAkaSA8ICRudGFncyArICRuaGVhZHMgJiYgJHRhZyBlcSAkbWFpbmhlYWR9IHsKCSAgICBzZXQgd2lkIFtmb250IG1lYXN1cmUgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0gJHRhZ10KCX0gZWxzZSB7CgkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJfQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgeyR4ICsgJGRlbHRhfV0KCXNldCB4ciBbZXhwciB7JHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3N9XQoJc2V0IGZvbnQgJG1haW5mb250CglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgeyR5dCArICRkZWx0YX1dICR4bCAkeXQgXAoJCSAgICAgICAkeHIgJHl0ICR4ciAkeWIgJHhsICR5YiAkeCBbZXhwciB7JHliIC0gJGRlbHRhfV0gXAoJCSAgICAgICAtd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCB5ZWxsb3cgLXRhZ3MgdGFnLiRpZF0KCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCSAgICBzZXQgcm93dGV4dHgoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSBbZXhwciB7JHhyICsgJGxpbmVzcGN9XQoJfSBlbHNlIHsKCSAgICAjIGRyYXcgYSBoZWFkIG9yIG90aGVyIHJlZgoJICAgIGlmIHtbaW5jciBuaGVhZHMgLTFdID49IDB9IHsKCQlzZXQgY29sIGdyZWVuCgkJaWYgeyR0YWcgZXEgJG1haW5oZWFkfSB7CgkJICAgIGxhcHBlbmQgZm9udCBib2xkCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGNvbCAiI2RkZGRmZiIKCSAgICB9CgkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsICRjb2wgLXRhZ3MgdGFnLiRpZAoJICAgIGlmIHtbcmVnZXhwIHteKHJlbW90ZXMvLiovfHJlbW90ZXMvKX0gJHRhZyBtYXRjaCByZW1vdGVwcmVmaXhdfSB7CgkgICAgICAgIHNldCByd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRyZW1vdGVwcmVmaXhdCgkJc2V0IHhpIFtleHByIHskeCArIDF9XQoJCXNldCB5dGkgW2V4cHIgeyR5dCArIDF9XQoJCXNldCB4cmkgW2V4cHIgeyR4ICsgJHJ3aWR9XQoJCSRjYW52IGNyZWF0ZSBwb2x5Z29uICR4aSAkeXRpICR4cmkgJHl0aSAkeHJpICR5YiAkeGkgJHliIFwKCQkJLXdpZHRoIDAgLWZpbGwgIiNmZmRkYWEiIC10YWdzIHRhZy4kaWQKCSAgICB9Cgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyAtZmlsbCAkZmdjb2xvciBcCgkJICAgLWZvbnQgJGZvbnQgLXRhZ3MgW2xpc3QgdGFnLiRpZCB0ZXh0XV0KCWlmIHskbnRhZ3MgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJfSBlbHNlaWYgeyRuaGVhZHMgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0zPiBbbGlzdCBoZWFkbWVudSAlWCAlWSAkaWQgJHRhZ10KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKcHJvYyBzaG93X3N0YXR1cyB7bXNnfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBmZ2NvbG9yCgogICAgY2xlYXJfZGlzcGxheQogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgJG1zZyAtZm9udCAkbWFpbmZvbnQgXAoJLXRhZ3MgdGV4dCAtZmlsbCAkZmdjb2xvcgp9CgojIEluc2VydCBhIG5ldyBjb21taXQgYXMgdGhlIGNoaWxkIG9mIHRoZSBjb21taXQgb24gcm93ICRyb3cuCiMgVGhlIG5ldyBjb21taXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gcm93ICRyb3cgYW5kIHRoZSBjb21taXRzCiMgb24gdGhhdCByb3cgYW5kIGJlbG93IHdpbGwgbW92ZSBkb3duIG9uZSByb3cuCnByb2MgaW5zZXJ0cm93IHtyb3cgbmV3Y21pdH0gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IGNvbW1pdGxpc3RlZCBjaGlsZHJlbgogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3IHJvd2lkbGlzdCByb3dvZmZzZXRzIG51bWNvbW1pdHMKICAgIGdsb2JhbCByb3dyYW5nZWxpc3Qgcm93bGFpZG91dCByb3dvcHRpbSBudW1jb21taXRzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIHJvd2NoayBjb21taXRpZHgKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gewoJcHV0cyAib29wcywgaW5zZXJ0aW5nIG5ldyByb3cgJHJvdyBidXQgb25seSBoYXZlICRudW1jb21taXRzIHJvd3MiCglyZXR1cm4KICAgIH0KICAgIHNldCBwIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgc2V0IGRpc3BsYXlvcmRlciBbbGluc2VydCAkZGlzcGxheW9yZGVyICRyb3cgJG5ld2NtaXRdCiAgICBzZXQgcGFyZW50bGlzdCBbbGluc2VydCAkcGFyZW50bGlzdCAkcm93ICRwXQogICAgc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRwKQogICAgbGFwcGVuZCBraWRzICRuZXdjbWl0CiAgICBzZXQgY2hpbGRyZW4oJGN1cnZpZXcsJHApICRraWRzCiAgICBzZXQgY2hpbGRyZW4oJGN1cnZpZXcsJG5ld2NtaXQpIHt9CiAgICBzZXQgY29tbWl0bGlzdGVkIFtsaW5zZXJ0ICRjb21taXRsaXN0ZWQgJHJvdyAxXQogICAgc2V0IGwgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KICAgIGZvciB7c2V0IHIgJHJvd30geyRyIDwgJGx9IHtpbmNyIHJ9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCglzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHIKICAgIH0KICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KQoKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCiAgICBzZXQgbmV3b2ZmcyB7fQogICAgZm9yZWFjaCB4ICRpZGxpc3QgewoJaWYgeyR4IGVxIHt9IHx8ICgkeCBlcSAkcCAmJiBbbGxlbmd0aCAka2lkc10gPT0gMSl9IHsKCSAgICBsYXBwZW5kIG5ld29mZnMge30KCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBuZXdvZmZzIDAKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0gewoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkcF0KCWxzZXQgaWRsaXN0ICRjb2wgJG5ld2NtaXQKICAgIH0gZWxzZSB7CglzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdCglsYXBwZW5kIGlkbGlzdCAkbmV3Y21pdAoJbGFwcGVuZCBvZmZzIHt9Cglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwogICAgfQogICAgc2V0IHJvd2lkbGlzdCBbbGluc2VydCAkcm93aWRsaXN0ICRyb3cgJGlkbGlzdF0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5zZXJ0ICRyb3dvZmZzZXRzIFtleHByIHskcm93KzF9XSAkbmV3b2Zmc10KCiAgICBzZXQgcm93cmFuZ2VsaXN0IFtsaW5zZXJ0ICRyb3dyYW5nZWxpc3QgJHJvdyB7fV0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPiAxfSB7CglzZXQgcnAxIFtleHByIHskcm93ICsgMX1dCglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcnAxXQoJaWYgeyRyYW5nZXMgZXEge319IHsKCSAgICBzZXQgcmFuZ2VzIFtsaXN0ICRuZXdjbWl0ICRwXQoJfSBlbHNlaWYge1tsaW5kZXggJHJhbmdlcyBlbmQtMV0gZXEgJHB9IHsKCSAgICBsc2V0IHJhbmdlcyBlbmQtMSAkbmV3Y21pdAoJfQoJbHNldCByb3dyYW5nZWxpc3QgJHJwMSAkcmFuZ2VzCiAgICB9CgogICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KCiAgICBpbmNyIHJvd2xhaWRvdXQKICAgIGluY3Igcm93b3B0aW0KICAgIGluY3IgbnVtY29tbWl0cwoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID49ICRyb3d9IHsKCWluY3Igc2VsZWN0ZWRsaW5lCiAgICB9CiAgICByZWRpc3BsYXkKfQoKIyBSZW1vdmUgYSBjb21taXQgdGhhdCB3YXMgaW5zZXJ0ZWQgd2l0aCBpbnNlcnRyb3cgb24gcm93ICRyb3cuCnByb2MgcmVtb3Zlcm93IHtyb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjb21taXRsaXN0ZWQgY2hpbGRyZW4KICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldyByb3dpZGxpc3Qgcm93b2Zmc2V0cyBudW1jb21taXRzCiAgICBnbG9iYWwgcm93cmFuZ2VsaXN0IGlkcm93cmFuZ2VzIHJvd2xhaWRvdXQgcm93b3B0aW0gbnVtY29tbWl0cwogICAgZ2xvYmFsIGxpbmVzZWdlbmRzIHNlbGVjdGVkbGluZSByb3djaGsgY29tbWl0aWR4CgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCXB1dHMgIm9vcHMsIHJlbW92aW5nIHJvdyAkcm93IGJ1dCBvbmx5IGhhdmUgJG51bWNvbW1pdHMgcm93cyIKCXJldHVybgogICAgfQogICAgc2V0IHJwMSBbZXhwciB7JHJvdyArIDF9XQogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQogICAgc2V0IGRpc3BsYXlvcmRlciBbbHJlcGxhY2UgJGRpc3BsYXlvcmRlciAkcm93ICRyb3ddCiAgICBzZXQgcGFyZW50bGlzdCBbbHJlcGxhY2UgJHBhcmVudGxpc3QgJHJvdyAkcm93XQogICAgc2V0IGNvbW1pdGxpc3RlZCBbbHJlcGxhY2UgJGNvbW1pdGxpc3RlZCAkcm93ICRyb3ddCiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJHApCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGtpZHMgJGlkXQogICAgaWYgeyRpID49IDB9IHsKCXNldCBraWRzIFtscmVwbGFjZSAka2lkcyAkaSAkaV0KCXNldCBjaGlsZHJlbigkY3VydmlldywkcCkgJGtpZHMKICAgIH0KICAgIHNldCBsIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICBmb3Ige3NldCByICRyb3d9IHskciA8ICRsfSB7aW5jciByfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyCiAgICB9CiAgICBpbmNyIGNvbW1pdGlkeCgkY3VydmlldykgLTEKCiAgICBzZXQgcm93aWRsaXN0IFtscmVwbGFjZSAkcm93aWRsaXN0ICRyb3cgJHJvd10KICAgIHNldCByb3dvZmZzZXRzIFtscmVwbGFjZSAkcm93b2Zmc2V0cyAkcnAxICRycDFdCiAgICBpZiB7JGtpZHMgbmUge319IHsKCXNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KCXNldCBvZmZzIFtscmVwbGFjZSAkb2ZmcyBlbmQgZW5kXQoJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKICAgIH0KCiAgICBzZXQgcm93cmFuZ2VsaXN0IFtscmVwbGFjZSAkcm93cmFuZ2VsaXN0ICRyb3cgJHJvd10KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPiAwfSB7CglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcm93XQoJaWYge1tsaW5kZXggJHJhbmdlcyBlbmQtMV0gZXEgJGlkfSB7CgkgICAgc2V0IHJhbmdlcyBbbHJlcGxhY2UgJHJhbmdlcyBlbmQtMSBlbmRdCgkgICAgbHNldCByb3dyYW5nZWxpc3QgJHJvdyAkcmFuZ2VzCgl9CiAgICB9CgogICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KCiAgICBpbmNyIHJvd2xhaWRvdXQgLTEKICAgIGluY3Igcm93b3B0aW0gLTEKICAgIGluY3IgbnVtY29tbWl0cyAtMQoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID4gJHJvd30gewoJaW5jciBzZWxlY3RlZGxpbmUgLTEKICAgIH0KICAgIHJlZGlzcGxheQp9CgojIERvbid0IGNoYW5nZSB0aGUgdGV4dCBwYW5lIGN1cnNvciBpZiBpdCBpcyBjdXJyZW50bHkgdGhlIGhhbmQgY3Vyc29yLAojIHNob3dpbmcgdGhhdCB3ZSBhcmUgb3ZlciBhIHNoYTEgSUQgbGluay4KcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CiAgICBnbG9iYWwgY3RleHQgY3VydGV4dGN1cnNvcgoKICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKCSRjdGV4dCBjb25maWcgLWN1cnNvciAkYwogICAgfQogICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKfQoKcHJvYyBub3didXN5IHt3aGF0fSB7CiAgICBnbG9iYWwgaXNidXN5CgogICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CgkuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCglzZXR0ZXh0Y3Vyc29yIHdhdGNoCiAgICB9CiAgICBzZXQgaXNidXN5KCR3aGF0KSAxCn0KCnByb2Mgbm90YnVzeSB7d2hhdH0gewogICAgZ2xvYmFsIGlzYnVzeSBtYWluY3Vyc29yIHRleHRjdXJzb3IKCiAgICBjYXRjaCB7dW5zZXQgaXNidXN5KCR3aGF0KX0KICAgIGlmIHtbYXJyYXkgbmFtZXMgaXNidXN5XSBlcSB7fX0gewoJLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgogICAgfQp9Cgpwcm9jIGZpbmRtYXRjaGVzIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHN0cmluZwogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZpbmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJc2V0IGZzICRmaW5kc3RyaW5nCglpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJICAgIHNldCBmIFtzdHJpbmcgdG9sb3dlciAkZl0KCSAgICBzZXQgZnMgW3N0cmluZyB0b2xvd2VyICRmc10KCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCglzZXQgbCBbc3RyaW5nIGxlbmd0aCAkZnNdCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZzICRmICRpXV0gPj0gMH0gewoJICAgIGxhcHBlbmQgbWF0Y2hlcyBbbGlzdCAkaiBbZXhwciB7JGorJGwtMX1dXQoJICAgIHNldCBpIFtleHByIHskaiArICRsfV0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7e3JldiAwfX0gewogICAgZ2xvYmFsIGZpbmRzdHJpbmcgZmluZHN0YXJ0bGluZSBmaW5kY3VybGluZSBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwoKICAgIHVubWFya21hdGNoZXMKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAogICAgZm9jdXMgLgogICAgaWYgeyRmaW5kc3RyaW5nIGVxIHt9IHx8ICRudW1jb21taXRzID09IDB9IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGZpbmRzdGFydGxpbmUgW2xpbmRleCBbdmlzaWJsZXJvd3NdICRyZXZdCiAgICB9IGVsc2UgewoJc2V0IGZpbmRzdGFydGxpbmUgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGZpbmRjdXJsaW5lICRmaW5kc3RhcnRsaW5lCiAgICBub3didXN5IGZpbmRpbmcKICAgIGlmIHshJHJldn0gewoJcnVuIGZpbmRtb3JlCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kY3VybGluZSA9PSAwfSB7CgkgICAgc2V0IGZpbmRjdXJsaW5lICRudW1jb21taXRzCgl9CglpbmNyIGZpbmRjdXJsaW5lIC0xCglydW4gZmluZG1vcmVyZXYKICAgIH0KfQoKcHJvYyBmaW5kbmV4dCB7cmVzdGFydH0gewogICAgZ2xvYmFsIGZpbmRjdXJsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaW5kY3VybGluZV19IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfSBlbHNlIHsKCSAgICBiZWxsCgl9CiAgICB9IGVsc2UgewoJcnVuIGZpbmRtb3JlCglub3didXN5IGZpbmRpbmcKICAgIH0KfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgZmluZGN1cmxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIGZpbmRjdXJsaW5lXX0gewoJZG9maW5kIDEKICAgIH0gZWxzZSB7CglydW4gZmluZG1vcmVyZXYKCW5vd2J1c3kgZmluZGluZwogICAgfQp9Cgpwcm9jIGZpbmRtb3JlIHt9IHsKICAgIGdsb2JhbCBjb21taXRkYXRhIGNvbW1pdGluZm8gbnVtY29tbWl0cyBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmRsb2MKICAgIGdsb2JhbCBmaW5kc3RhcnRsaW5lIGZpbmRjdXJsaW5lIGRpc3BsYXlvcmRlcgoKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgc2V0IGwgW2V4cHIgeyRmaW5kY3VybGluZSArIDF9XQogICAgaWYgeyRsID49ICRudW1jb21taXRzfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JGwgPD0gJGZpbmRzdGFydGxpbmV9IHsKCXNldCBsaW0gW2V4cHIgeyRmaW5kc3RhcnRsaW5lICsgMX1dCiAgICB9IGVsc2UgewoJc2V0IGxpbSAkbnVtY29tbWl0cwogICAgfQogICAgaWYgeyRsaW0gLSAkbCA+IDUwMH0gewoJc2V0IGxpbSBbZXhwciB7JGwgKyA1MDB9XQogICAgfQogICAgc2V0IGxhc3QgMAogICAgZm9yIHt9IHskbCA8ICRsaW19IHtpbmNyIGx9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCgkjIHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIGdpdCBsb2cgZG9lc24ndCBnaXZlIGFsbCB0aGUgY29tbWl0cy4uLgoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gY29udGludWUKCWlmIHshW2RvZXNtYXRjaCAkY29tbWl0ZGF0YSgkaWQpXX0gY29udGludWUKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBnZXRjb21taXQgJGlkCgl9CglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7KCRmaW5kbG9jIGVxICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyBlcSAkdHkpICYmCgkJW2RvZXNtYXRjaCAkZl19IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCW5vdGJ1c3kgZmluZGluZwoJCXJldHVybiAwCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lICsgMX0gewoJYmVsbAoJdW5zZXQgZmluZGN1cmxpbmUKCW5vdGJ1c3kgZmluZGluZwoJcmV0dXJuIDAKICAgIH0KICAgIHNldCBmaW5kY3VybGluZSBbZXhwciB7JGwgLSAxfV0KICAgIHJldHVybiAxCn0KCnByb2MgZmluZG1vcmVyZXYge30gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbyBudW1jb21taXRzIGZpbmRzdHJpbmcgZmluZHBhdHRlcm4gZmluZGxvYwogICAgZ2xvYmFsIGZpbmRzdGFydGxpbmUgZmluZGN1cmxpbmUgZGlzcGxheW9yZGVyCgogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudHN9CiAgICBzZXQgbCAkZmluZGN1cmxpbmUKICAgIGlmIHskbCA9PSAwfSB7CglzZXQgbCAkbnVtY29tbWl0cwogICAgfQogICAgaW5jciBsIC0xCiAgICBpZiB7JGwgPj0gJGZpbmRzdGFydGxpbmV9IHsKCXNldCBsaW0gW2V4cHIgeyRmaW5kc3RhcnRsaW5lIC0gMX1dCiAgICB9IGVsc2UgewoJc2V0IGxpbSAtMQogICAgfQogICAgaWYgeyRsIC0gJGxpbSA+IDUwMH0gewoJc2V0IGxpbSBbZXhwciB7JGwgLSA1MDB9XQogICAgfQogICAgc2V0IGxhc3QgMAogICAgZm9yIHt9IHskbCA+ICRsaW19IHtpbmNyIGwgLTF9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCglpZiB7IVtkb2VzbWF0Y2ggJGNvbW1pdGRhdGEoJGlkKV19IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgZ2V0Y29tbWl0ICRpZAoJfQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CgkgICAgaWYgeygkZmluZGxvYyBlcSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgZXEgJHR5KSAmJgoJCVtkb2VzbWF0Y2ggJGZdfSB7CgkJZmluZHNlbGVjdGxpbmUgJGwKCQlub3RidXN5IGZpbmRpbmcKCQlyZXR1cm4gMAoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbCA9PSAtMX0gewoJYmVsbAoJdW5zZXQgZmluZGN1cmxpbmUKCW5vdGJ1c3kgZmluZGluZwoJcmV0dXJuIDAKICAgIH0KICAgIHNldCBmaW5kY3VybGluZSBbZXhwciB7JGwgKyAxfV0KICAgIHJldHVybiAxCn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQgZmluZGN1cmxpbmUgbWFya2luZ21hdGNoZXMKCiAgICBzZXQgbWFya2luZ21hdGNoZXMgMQogICAgc2V0IGZpbmRjdXJsaW5lICRsCiAgICBzZWxlY3RsaW5lICRsIDEKICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0gewoJIyBoaWdobGlnaHQgdGhlIG1hdGNoZXMgaW4gdGhlIGNvbW1lbnRzCglzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCglzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCglmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCSAgICBzZXQgZW5kIFtleHByIHtbbGluZGV4ICRtYXRjaCAxXSArIDF9XQoJICAgICRjdGV4dCB0YWcgYWRkIGZvdW5kICIxLjAgKyAkc3RhcnQgYyIgIjEuMCArICRlbmQgYyIKCX0KICAgIH0KICAgIGRyYXd2aXNpYmxlCn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lIG9yIGF1dGhvciB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250IHJvd30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIHNldCBiYm94IFskY2FudiBiYm94ICR0YWddCiAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQogICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KICAgIHNldCB5MSBbbGluZGV4ICRiYm94IDNdCiAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJc2V0IGVuZCBbbGluZGV4ICRtYXRjaCAxXQoJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCglzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskc3RhcnQtMX1dXV0KCXNldCB4bGVuIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRlbmR9XV1dCglzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgeyR4MCskeG9mZn1dICR5MCBcCgkJICAgW2V4cHIgeyR4MCskeGxlbisyfV0gJHkxIFwKCQkgICAtb3V0bGluZSB7fSAtdGFncyBbbGlzdCBtYXRjaCRsIG1hdGNoZXNdIC1maWxsIHllbGxvd10KCSRjYW52IGxvd2VyICR0CglpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgJGNhbnYgcmFpc2UgJHQgc2Vjc2VsCgl9CiAgICB9Cn0KCnByb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZGlkcyBtYXJraW5nbWF0Y2hlcyBmaW5kY3VybGluZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIHNldCBtYXJraW5nbWF0Y2hlcyAwCiAgICBjYXRjaCB7dW5zZXQgZmluZGN1cmxpbmV9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIGNvbW1pdF9kZXNjcmlwdG9yIHtwfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CglnZXRjb21taXQgJHAKICAgIH0KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2xsZW5ndGggJGNvbW1pdGluZm8oJHApXSA+IDF9IHsKCXNldCBsIFtsaW5kZXggJGNvbW1pdGluZm8oJHApIDBdCiAgICB9CiAgICByZXR1cm4gIiRwICgkbClcbiIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0IHRhZ3N9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3CgogICAgc2V0IHN0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KICAgICRjdGV4dCBpbnNlcnQgZW5kICR0ZXh0ICR0YWdzCiAgICBzZXQgbGlua3MgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUge1swLTlhLWZdezQwfX0gJHRleHRdCiAgICBmb3JlYWNoIGwgJGxpbmtzIHsKCXNldCBzIFtsaW5kZXggJGwgMF0KCXNldCBlIFtsaW5kZXggJGwgMV0KCXNldCBsaW5raWQgW3N0cmluZyByYW5nZSAkdGV4dCAkcyAkZV0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKV19IGNvbnRpbnVlCglpbmNyIGUKCSRjdGV4dCB0YWcgYWRkIGxpbmsgIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBhZGQgbGluayRsaW5rbnVtICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYmluZCBsaW5rJGxpbmtudW0gPDE+IFwKCSAgICBbbGlzdCBzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCkgMV0KCWluY3IgbGlua251bQogICAgfQogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQp9Cgpwcm9jIHZpZXduZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgY2FudiBsaW5lc3BjCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KICAgIHNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGRpciAqICRsaW5lc3BjfV0KICAgIGlmIHskbmV3dG9wIDwgMH0gewoJc2V0IG5ld3RvcCAwCiAgICB9IGVsc2VpZiB7JG5ld3RvcCA+ICR5bWF4fSB7CglzZXQgbmV3dG9wICR5bWF4CiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gW2V4cHIgeyRuZXd0b3AgKiAxLjAgLyAkeW1heH1dCn0KCiMgYWRkIGEgbGlzdCBvZiB0YWcgb3IgYnJhbmNoIG5hbWVzIGF0IHBvc2l0aW9uIHBvcwojIHJldHVybnMgdGhlIG51bWJlciBvZiBuYW1lcyBpbnNlcnRlZApwcm9jIGFwcGVuZHJlZnMge3BvcyBpZHMgdmFyfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldyAkdmFyIG1heHJlZnMKCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggJHBvc31dfSB7CglyZXR1cm4gMAogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAkcG9zICIkcG9zIGxpbmVlbmQiCiAgICBzZXQgdGFncyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWZvcmVhY2ggdGFnIFtzZXQgJHZhclwoJGlkXCldIHsKCSAgICBsYXBwZW5kIHRhZ3MgW2xpc3QgJHRhZyAkaWRdCgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJHRhZ3NdID4gJG1heHJlZnN9IHsKCSRjdGV4dCBpbnNlcnQgJHBvcyAibWFueSAoW2xsZW5ndGggJHRhZ3NdKSIKICAgIH0gZWxzZSB7CglzZXQgdGFncyBbbHNvcnQgLWluZGV4IDAgLWRlY3JlYXNpbmcgJHRhZ3NdCglzZXQgc2VwIHt9Cglmb3JlYWNoIHRpICR0YWdzIHsKCSAgICBzZXQgaWQgW2xpbmRleCAkdGkgMV0KCSAgICBzZXQgbGsgbGluayRsaW5rbnVtCgkgICAgaW5jciBsaW5rbnVtCgkgICAgJGN0ZXh0IHRhZyBkZWxldGUgJGxrCgkgICAgJGN0ZXh0IGluc2VydCAkcG9zICRzZXAKCSAgICAkY3RleHQgaW5zZXJ0ICRwb3MgW2xpbmRleCAkdGkgMF0gJGxrCgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCQkkY3RleHQgdGFnIGNvbmYgJGxrIC1mb3JlZ3JvdW5kIGJsdWUKCQkkY3RleHQgdGFnIGJpbmQgJGxrIDwxPiBcCgkJICAgIFtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDFdCgkJJGN0ZXh0IHRhZyBjb25mICRsayAtdW5kZXJsaW5lIDEKCQkkY3RleHQgdGFnIGJpbmQgJGxrIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CgkJJGN0ZXh0IHRhZyBiaW5kICRsayA8TGVhdmU+IFwKCQkgICAgeyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CgkgICAgfQoJICAgIHNldCBzZXAgIiwgIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICByZXR1cm4gW2xsZW5ndGggJHRhZ3NdCn0KCiMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBjb21wdXRpbmcgdGhlIG5lYXJieSB0YWdzCnByb2MgZGlzcG5lYXJ0YWdzIHtkZWxheX0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgc2hvd25lYXJ0YWdzIHRhZ3BoYXNlCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSB8fCAhJHNob3duZWFydGFnc30gcmV0dXJuCiAgICBhZnRlciBjYW5jZWwgZGlzcG5leHR0YWcKICAgIGlmIHskZGVsYXl9IHsKCWFmdGVyIDIwMCBkaXNwbmV4dHRhZwoJc2V0IHRhZ3BoYXNlIC0xCiAgICB9IGVsc2UgewoJYWZ0ZXIgaWRsZSBkaXNwbmV4dHRhZwoJc2V0IHRhZ3BoYXNlIDAKICAgIH0KfQoKcHJvYyBkaXNwbmV4dHRhZyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBzaG93bmVhcnRhZ3MgdGFncGhhc2UgY3RleHQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICEkc2hvd25lYXJ0YWdzfSByZXR1cm4KICAgIHN3aXRjaCAtLSAkdGFncGhhc2UgewoJMCB7CgkgICAgc2V0IGR0YWdzIFtkZXNjdGFncyAkY3VycmVudGlkXQoJICAgIGlmIHskZHRhZ3MgbmUge319IHsKCQlhcHBlbmRyZWZzIHByZWNlZGVzICRkdGFncyBpZHRhZ3MKCSAgICB9Cgl9CgkxIHsKCSAgICBzZXQgYXRhZ3MgW2FuY3RhZ3MgJGN1cnJlbnRpZF0KCSAgICBpZiB7JGF0YWdzIG5lIHt9fSB7CgkJYXBwZW5kcmVmcyBmb2xsb3dzICRhdGFncyBpZHRhZ3MKCSAgICB9Cgl9CgkyIHsKCSAgICBzZXQgZGhlYWRzIFtkZXNjaGVhZHMgJGN1cnJlbnRpZF0KCSAgICBpZiB7JGRoZWFkcyBuZSB7fX0gewoJCWlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRoZWFkcyBpZGhlYWRzXSA+IDEKCQkgICAgJiYgWyRjdGV4dCBnZXQgImJyYW5jaCAtM2MiXSBlcSAiaCJ9IHsKCQkgICAgIyB0dXJuICJCcmFuY2giIGludG8gIkJyYW5jaGVzIgoJCSAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCgkJICAgICRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKCQkgICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5jciB0YWdwaGFzZV0gPD0gMn0gewoJYWZ0ZXIgaWRsZSBkaXNwbmV4dHRhZwogICAgfQp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50bGlzdCBjaGlsZHJlbiBjdXJ2aWV3CiAgICBnbG9iYWwgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGxpbmtudW0KICAgIGdsb2JhbCBtZXJnZW1heCBudW1jb21taXRzIHBlbmRpbmdfc2VsZWN0CiAgICBnbG9iYWwgY21pdG1vZGUgc2hvd25lYXJ0YWdzIGFsbGNvbW1pdHMKCiAgICBjYXRjaCB7dW5zZXQgcGVuZGluZ19zZWxlY3R9CiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIG5vcm1hbGxpbmUKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAogICAgdW5zZWxfcmVmbGlzdAogICAgaWYgeyRsIDwgMCB8fCAkbCA+PSAkbnVtY29tbWl0c30gcmV0dXJuCiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KICAgIHNldCB3Ym90IFtleHByIHtbbGluZGV4ICR3bm93IDFdICogJHltYXh9XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KCWRyYXd2aXNpYmxlCiAgICB9CgogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzZWxlY3RsaW5lICRsIDBdCiAgICB9CgogICAgc2V0IHNlbGVjdGVkbGluZSAkbAoKICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAogICAgcmhpZ2hsaWdodF9zZWwgJGlkCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIHNldCBsaW5rbnVtIDAKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQXV0aG9yOiBbbGluZGV4ICRpbmZvIDFdICAkZGF0ZVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyA0XV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gICRkYXRlXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlRhZ3M6IgoJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICR0YWciCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICB9CgogICAgc2V0IGhlYWRlcnMge30KICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdCiAgICBpZiB7W2xsZW5ndGggJG9sZHNdID4gMX0gewoJc2V0IG5wIDAKCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgdGFnIG1tYXgKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgbSRucAoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50OiAiICR0YWcKCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXSB7fQoJICAgIGluY3IgbnAKCX0KICAgIH0gZWxzZSB7Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGFwcGVuZCBoZWFkZXJzICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF0iCgl9CiAgICB9CgogICAgZm9yZWFjaCBjICRjaGlsZHJlbigkY3VydmlldywkaWQpIHsKCWFwcGVuZCBoZWFkZXJzICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY10iCiAgICB9CgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRoZWFkZXJzIHt9CiAgICBpZiB7JHNob3duZWFydGFnc30gewoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHsKCSAgICBnZXRhbGxjb21taXRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiQnJhbmNoOiAiCgkkY3RleHQgbWFyayBzZXQgYnJhbmNoICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBicmFuY2ggbGVmdAoJJGN0ZXh0IGluc2VydCBlbmQgIlxuRm9sbG93czogIgoJJGN0ZXh0IG1hcmsgc2V0IGZvbGxvd3MgImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGZvbGxvd3MgbGVmdAoJJGN0ZXh0IGluc2VydCBlbmQgIlxuUHJlY2VkZXM6ICIKCSRjdGV4dCBtYXJrIHNldCBwcmVjZWRlcyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgcHJlY2VkZXMgbGVmdAoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJZGlzcG5lYXJ0YWdzIDEKICAgIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBjb21tZW50IFtsaW5kZXggJGluZm8gNV0KICAgIGlmIHtbc3RyaW5nIGZpcnN0ICJcciIgJGNvbW1lbnRdID49IDB9IHsKCXNldCBjb21tZW50IFtzdHJpbmcgbWFwIHsiXHIiICJcbiAgICAifSAkY29tbWVudF0KICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkY29tbWVudCB7Y29tbWVudH0KCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICBpbml0X2ZsaXN0ICJDb21tZW50cyIKICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CglnZXR0cmVlICRpZAogICAgfSBlbHNlaWYge1tsbGVuZ3RoICRvbGRzXSA8PSAxfSB7CglzdGFydGRpZmYgJGlkCiAgICB9IGVsc2UgewoJbWVyZ2VkaWZmICRpZCAkbAogICAgfQp9Cgpwcm9jIHNlbGZpcnN0bGluZSB7fSB7CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lIDAgMQp9Cgpwcm9jIHNlbGxhc3RsaW5lIHt9IHsKICAgIGdsb2JhbCBudW1jb21taXRzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbCBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGZvY3VzIC4KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRwYWdlIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKCiAgICBzZXQgbHBwIFtleHByIHsoW3dpbmZvIGhlaWdodCAkY2Fudl0gLSAyKSAvICRsaW5lc3BjfV0KICAgIGlmIHskbHBwIDwgMX0gewoJc2V0IGxwcCAxCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgW2V4cHIgeyRkaXIgKiAkbHBwfV0gdW5pdHMKICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpciAqICRscHB9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfSBlbHNlaWYgeyRsID49ICRudW1jb21taXRzfSB7CiAgICAgICAgc2V0IGwgW2V4cHIgJG51bWNvbW1pdHMgLSAxXQogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkCgogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCBjdXJyZW50aWR9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCiAgICByaGlnaGxpZ2h0X25vbmUKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAp9Cgpwcm9jIHJlc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXggY3VydmlldwoKICAgIHNldCBlbHQgW2xpc3QgJGN1cnZpZXcgJGNtZF0KICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGVsdH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkZWx0XQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkZWx0CiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkudGYuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAudGYuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29kbyB7ZWx0fSB7CiAgICBnbG9iYWwgY3VydmlldwoKICAgIHNldCB2aWV3IFtsaW5kZXggJGVsdCAwXQogICAgc2V0IGNtZCBbbGluZGV4ICRlbHQgMV0KICAgIGlmIHskY3VydmlldyAhPSAkdmlld30gewoJc2hvd3ZpZXcgJHZpZXcKICAgIH0KICAgIGV2YWwgJGNtZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKICAgIGZvY3VzIC4KCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglnb2RvIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCgkudGYuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0gewoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ29mb3J3IHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAogICAgZm9jdXMgLgoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KCWluY3IgaGlzdG9yeWluZGV4Cglnb2RvICRjbWQKCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4ID49IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdldHRyZWUge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcyBkaWZmbWVyZ2VpZCB0cmVlcGVuZGluZwogICAgZ2xvYmFsIG51bGxpZCBudWxsaWQyCgogICAgc2V0IGRpZmZpZHMgJGlkCiAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZmlsZWxpc3QoJGlkKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGlmIHskaWQgZXEgJG51bGxpZH0gewoJCXNldCBjbWQgW2xpc3QgfCBnaXQgbHMtZmlsZXNdCgkgICAgfSBlbHNlaWYgeyRpZCBlcSAkbnVsbGlkMn0gewoJCXNldCBjbWQgW2xpc3QgfCBnaXQgbHMtZmlsZXMgLS1zdGFnZSAtdF0KCSAgICB9IGVsc2UgewoJCXNldCBjbWQgW2xpc3QgfCBnaXQgbHMtdHJlZSAtciAkaWRdCgkgICAgfQoJICAgIGlmIHtbY2F0Y2gge3NldCBndGYgW29wZW4gJGNtZCByXX1dfSB7CgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKCSAgICBzZXQgdHJlZWZpbGVsaXN0KCRpZCkge30KCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CgkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCgkgICAgZmlsZXJ1biAkZ3RmIFtsaXN0IGdldHRyZWVsaW5lICRndGYgJGlkXQoJfQogICAgfSBlbHNlIHsKCXNldGZpbGVsaXN0ICRpZAogICAgfQp9Cgpwcm9jIGdldHRyZWVsaW5lIHtndGYgaWR9IHsKICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCB0cmVlcGVuZGluZyBjbWl0bW9kZSBkaWZmaWRzIG51bGxpZCBudWxsaWQyCgogICAgc2V0IG5sIDAKICAgIHdoaWxlIHtbaW5jciBubF0gPD0gMTAwMCAmJiBbZ2V0cyAkZ3RmIGxpbmVdID49IDB9IHsKCWlmIHskZGlmZmlkcyBlcSAkbnVsbGlkfSB7CgkgICAgc2V0IGZuYW1lICRsaW5lCgl9IGVsc2UgewoJICAgIGlmIHskZGlmZmlkcyBuZSAkbnVsbGlkMiAmJiBbbGluZGV4ICRsaW5lIDFdIG5lICJibG9iIn0gY29udGludWUKCSAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcdCIgJGxpbmVdCgkgICAgaWYgeyRpIDwgMH0gY29udGludWUKCSAgICBzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDJdCgkgICAgc2V0IGZuYW1lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgW2V4cHIgeyRpKzF9XSBlbmRdCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGZuYW1lIDBdIGVxICJcIiJ9IHsKCQlzZXQgZm5hbWUgW2xpbmRleCAkZm5hbWUgMF0KCSAgICB9CgkgICAgbGFwcGVuZCB0cmVlaWRsaXN0KCRpZCkgJHNoYTEKCX0KCWxhcHBlbmQgdHJlZWZpbGVsaXN0KCRpZCkgJGZuYW1lCiAgICB9CiAgICBpZiB7IVtlb2YgJGd0Zl19IHsKCXJldHVybiBbZXhwciB7JG5sID49IDEwMDA/IDI6IDF9XQogICAgfQogICAgY2xvc2UgJGd0ZgogICAgdW5zZXQgdHJlZXBlbmRpbmcKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0KICAgIH0gZWxzZWlmIHskaWQgbmUgJGRpZmZpZHN9IHsKCWdldHRyZWUgJGRpZmZpZHMKICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2hvd2ZpbGUge2Z9IHsKICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCBkaWZmaWRzIG51bGxpZCBudWxsaWQyCiAgICBnbG9iYWwgY3RleHQgY29tbWVudGVuZAoKICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWZpbGVsaXN0KCRkaWZmaWRzKSAkZl0KICAgIGlmIHskaSA8IDB9IHsKCXB1dHMgIm9vcHMsICRmIG5vdCBpbiBsaXN0IGZvciBpZCAkZGlmZmlkcyIKCXJldHVybgogICAgfQogICAgaWYgeyRkaWZmaWRzIGVxICRudWxsaWR9IHsKCWlmIHtbY2F0Y2gge3NldCBiZiBbb3BlbiAkZiByXX0gZXJyXX0gewoJICAgIHB1dHMgIm9vcHMsIGNhbid0IHJlYWQgJGY6ICRlcnIiCgkgICAgcmV0dXJuCgl9CiAgICB9IGVsc2UgewoJc2V0IGJsb2IgW2xpbmRleCAkdHJlZWlkbGlzdCgkZGlmZmlkcykgJGldCglpZiB7W2NhdGNoIHtzZXQgYmYgW29wZW4gW2NvbmNhdCB8IGdpdCBjYXQtZmlsZSBibG9iICRibG9iXSByXX0gZXJyXX0gewoJICAgIHB1dHMgIm9vcHMsIGVycm9yIHJlYWRpbmcgYmxvYiAkYmxvYjogJGVyciIKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGZjb25maWd1cmUgJGJmIC1ibG9ja2luZyAwCiAgICBmaWxlcnVuICRiZiBbbGlzdCBnZXRibG9ibGluZSAkYmYgJGRpZmZpZHNdCiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0ICRjb21tZW50ZW5kCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGZcbiIgZmlsZXNlcAogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB5dmlldyAkY29tbWVudGVuZAp9Cgpwcm9jIGdldGJsb2JsaW5lIHtiZiBpZH0gewogICAgZ2xvYmFsIGRpZmZpZHMgY21pdG1vZGUgY3RleHQKCiAgICBpZiB7JGlkIG5lICRkaWZmaWRzIHx8ICRjbWl0bW9kZSBuZSAidHJlZSJ9IHsKCWNhdGNoIHtjbG9zZSAkYmZ9CglyZXR1cm4gMAogICAgfQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICBzZXQgbmwgMAogICAgd2hpbGUge1tpbmNyIG5sXSA8PSAxMDAwICYmIFtnZXRzICRiZiBsaW5lXSA+PSAwfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKICAgIH0KICAgIGlmIHtbZW9mICRiZl19IHsKCSMgZGVsZXRlIGxhc3QgbmV3bGluZQoJJGN0ZXh0IGRlbGV0ZSAiZW5kIC0gMmMiICJlbmQgLSAxYyIKCWNsb3NlICRiZgoJcmV0dXJuIDAKICAgIH0KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCiAgICByZXR1cm4gW2V4cHIgeyRubCA+PSAxMDAwPyAyOiAxfV0KfQoKcHJvYyBtZXJnZWRpZmYge2lkIGx9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmb3B0cyBtZGlmZmZkCiAgICBnbG9iYWwgZGlmZmlkcwogICAgZ2xvYmFsIHBhcmVudGxpc3QKCiAgICBzZXQgZGlmZm1lcmdlaWQgJGlkCiAgICBzZXQgZGlmZmlkcyAkaWQKICAgICMgdGhpcyBkb2Vzbid0IHNlZW0gdG8gYWN0dWFsbHkgYWZmZWN0IGFueXRoaW5nLi4uCiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtLWNjICRpZF0KICAgIGlmIHtbY2F0Y2gge3NldCBtZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGdldHRpbmcgbWVyZ2UgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIGZjb25maWd1cmUgJG1kZiAtYmxvY2tpbmcgMAogICAgc2V0IG1kaWZmZmQoJGlkKSAkbWRmCiAgICBzZXQgbnAgW2xsZW5ndGggW2xpbmRleCAkcGFyZW50bGlzdCAkbF1dCiAgICBmaWxlcnVuICRtZGYgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZCAkbnBdCn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7bWRmIGlkIG5wfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgY3RleHQgY2ZsaXN0IG1lcmdlbWF4CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBtZGlmZmZkCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgc2V0IG5yIDAKICAgIHdoaWxlIHtbaW5jciBucl0gPD0gMTAwMCAmJiBbZ2V0cyAkbWRmIGxpbmVdID49IDB9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSB8fCAkaWQgIT0gJGRpZmZtZXJnZWlkCgkgICAgfHwgJG1kZiAhPSAkbWRpZmZmZCgkaWQpfSB7CgkgICAgY2xvc2UgJG1kZgoJICAgIHJldHVybiAwCgl9CglpZiB7W3JlZ2V4cCB7XmRpZmYgLS1jYyAoLiopfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSAgICAjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkgICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJICAgIGxhcHBlbmQgZGlmZmZpbGVzdGFydCAkaGVyZQoJICAgIGFkZF9mbGlzdCBbbGlzdCAkZm5hbWVdCgkgICAgc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCgkgICAgc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRmbmFtZSAkcGFkXG4iIGZpbGVzZXAKCX0gZWxzZWlmIHtbcmVnZXhwIHteQEB9ICRsaW5lXX0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRsaW5lXSB8fCBbcmVnZXhwIHteaW5kZXh9ICRsaW5lXX0gewoJICAgICMgZG8gbm90aGluZwoJfSBlbHNlIHsKCSAgICAjIHBhcnNlIHRoZSBwcmVmaXggLSBvbmUgJyAnLCAnLScgb3IgJysnIGZvciBlYWNoIHBhcmVudAoJICAgIHNldCBzcGFjZXMge30KCSAgICBzZXQgbWludXNlcyB7fQoJICAgIHNldCBwbHVzZXMge30KCSAgICBzZXQgaXNiYWQgMAoJICAgIGZvciB7c2V0IGogMH0geyRqIDwgJG5wfSB7aW5jciBqfSB7CgkJc2V0IGMgW3N0cmluZyByYW5nZSAkbGluZSAkaiAkal0KCQlpZiB7JGMgPT0gIiAifSB7CgkJICAgIGxhcHBlbmQgc3BhY2VzICRqCgkJfSBlbHNlaWYgeyRjID09ICItIn0gewoJCSAgICBsYXBwZW5kIG1pbnVzZXMgJGoKCQl9IGVsc2VpZiB7JGMgPT0gIisifSB7CgkJICAgIGxhcHBlbmQgcGx1c2VzICRqCgkJfSBlbHNlIHsKCQkgICAgc2V0IGlzYmFkIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIHNldCB0YWdzIHt9CgkgICAgc2V0IG51bSB7fQoJICAgIGlmIHshJGlzYmFkICYmICRtaW51c2VzIG5lIHt9ICYmICRwbHVzZXMgZXEge319IHsKCQkjIGxpbmUgZG9lc24ndCBhcHBlYXIgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRtaW51c2VzIGhhdmUgdGhlIGxpbmUKCQlzZXQgbnVtIFtsaW5kZXggJG1pbnVzZXMgMF0KCSAgICB9IGVsc2VpZiB7ISRpc2JhZCAmJiAkcGx1c2VzIG5lIHt9ICYmICRtaW51c2VzIGVxIHt9fSB7CgkJIyBsaW5lIGFwcGVhcnMgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRwbHVzZXMgZG9uJ3QgaGF2ZSB0aGUgbGluZQoJCWxhcHBlbmQgdGFncyBtcmVzdWx0CgkJc2V0IG51bSBbbGluZGV4ICRzcGFjZXMgMF0KCSAgICB9CgkgICAgaWYgeyRudW0gbmUge319IHsKCQlpZiB7JG51bSA+PSAkbWVyZ2VtYXh9IHsKCQkgICAgc2V0IG51bSAibWF4IgoJCX0KCQlsYXBwZW5kIHRhZ3MgbSRudW0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iICR0YWdzCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbZW9mICRtZGZdfSB7CgljbG9zZSAkbWRmCglyZXR1cm4gMAogICAgfQogICAgcmV0dXJuIFtleHByIHskbnIgPj0gMTAwMD8gMjogMX1dCn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZCBudWxsaWQgbnVsbGlkMgoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV0gfHwKCVtsc2VhcmNoIC1leGFjdCAkaWRzICRudWxsaWRdID49IDAgfHwKCVtsc2VhcmNoIC1leGFjdCAkaWRzICRudWxsaWQyXSA+PSAwfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBnZXR0cmVlZGlmZnMgJGlkcwoJfQogICAgfSBlbHNlIHsKCWFkZHRvY2ZsaXN0ICRpZHMKICAgIH0KfQoKcHJvYyBhZGR0b2NmbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGNmbGlzdAogICAgYWRkX2ZsaXN0ICR0cmVlZGlmZnMoJGlkcykKICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZGlmZmNtZCB7aWRzIGZsYWdzfSB7CiAgICBnbG9iYWwgbnVsbGlkIG51bGxpZDIKCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkcyAkbnVsbGlkXQogICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRpZHMgJG51bGxpZDJdCiAgICBpZiB7JGkgPj0gMH0gewoJaWYge1tsbGVuZ3RoICRpZHNdID4gMSAmJiAkaiA8IDB9IHsKCSAgICAjIGNvbXBhcmluZyB3b3JraW5nIGRpcmVjdG9yeSB3aXRoIHNvbWUgc3BlY2lmaWMgcmV2aXNpb24KCSAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi1pbmRleCAkZmxhZ3NdCgkgICAgaWYgeyRpID09IDB9IHsKCQlsYXBwZW5kIGNtZCAtUiBbbGluZGV4ICRpZHMgMV0KCSAgICB9IGVsc2UgewoJCWxhcHBlbmQgY21kIFtsaW5kZXggJGlkcyAwXQoJICAgIH0KCX0gZWxzZSB7CgkgICAgIyBjb21wYXJpbmcgd29ya2luZyBkaXJlY3Rvcnkgd2l0aCBpbmRleAoJICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLWZpbGVzICRmbGFnc10KCSAgICBpZiB7JGogPT0gMX0gewoJCWxhcHBlbmQgY21kIC1SCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyRqID49IDB9IHsKCXNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkICRmbGFnc10KCWlmIHtbbGxlbmd0aCAkaWRzXSA+IDF9IHsKCSAgICAjIGNvbXBhcmluZyBpbmRleCB3aXRoIHNwZWNpZmljIHJldmlzaW9uCgkgICAgaWYgeyRpID09IDB9IHsKCQlsYXBwZW5kIGNtZCAtUiBbbGluZGV4ICRpZHMgMV0KCSAgICB9IGVsc2UgewoJCWxhcHBlbmQgY21kIFtsaW5kZXggJGlkcyAwXQoJICAgIH0KCX0gZWxzZSB7CgkgICAgIyBjb21wYXJpbmcgaW5kZXggd2l0aCBIRUFECgkgICAgbGFwcGVuZCBjbWQgSEVBRAoJfQogICAgfSBlbHNlIHsKCXNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLXIgJGZsYWdzICRpZHNdCiAgICB9CiAgICByZXR1cm4gJGNtZAp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZXBlbmRpbmcKCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBpZiB7W2NhdGNoIHtzZXQgZ2R0ZiBbb3BlbiBbZGlmZmNtZCAkaWRzIHstLW5vLWNvbW1pdC1pZH1dIHJdfV19IHJldHVybgogICAgZmNvbmZpZ3VyZSAkZ2R0ZiAtYmxvY2tpbmcgMAogICAgZmlsZXJ1biAkZ2R0ZiBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKICAgIGdsb2JhbCBjbWl0bW9kZQoKICAgIHNldCBuciAwCiAgICB3aGlsZSB7W2luY3IgbnJdIDw9IDEwMDAgJiYgW2dldHMgJGdkdGYgbGluZV0gPj0gMH0gewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXHQiICRsaW5lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgZmlsZSBbc3RyaW5nIHJhbmdlICRsaW5lIFtleHByIHskaSsxfV0gZW5kXQoJICAgIGlmIHtbc3RyaW5nIGluZGV4ICRmaWxlIDBdIGVxICJcIiJ9IHsKCQlzZXQgZmlsZSBbbGluZGV4ICRmaWxlIDBdCgkgICAgfQoJICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKCX0KICAgIH0KICAgIGlmIHshW2VvZiAkZ2R0Zl19IHsKCXJldHVybiBbZXhwciB7JG5yID49IDEwMDA/IDI6IDF9XQogICAgfQogICAgY2xvc2UgJGdkdGYKICAgIHNldCB0cmVlZGlmZnMoJGlkcykgJHRyZWVkaWZmCiAgICB1bnNldCB0cmVlcGVuZGluZwogICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHsKCWdldHRyZWUgJGRpZmZpZHMKICAgIH0gZWxzZWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9CiAgICByZXR1cm4gMAp9CgojIGVtcHR5IHN0cmluZyBvciBwb3NpdGl2ZSBpbnRlZ2VyCnByb2MgZGlmZmNvbnRleHR2YWxpZGF0ZSB7dn0gewogICAgcmV0dXJuIFtyZWdleHAge14ofFsxLTldWzAtOV0qKSR9ICR2XQp9Cgpwcm9jIGRpZmZjb250ZXh0Y2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIGRpZmZjb250ZXh0c3RyaW5nIGRpZmZjb250ZXh0CgogICAgaWYge1tzdHJpbmcgaXMgaW50ZWdlciAtc3RyaWN0ICRkaWZmY29udGV4dHN0cmluZ119IHsKCWlmIHskZGlmZmNvbnRleHRzdHJpbmcgPiAwfSB7CgkgICAgc2V0IGRpZmZjb250ZXh0ICRkaWZmY29udGV4dHN0cmluZwoJICAgIHJlc2VsZWN0bGluZQoJfQogICAgfQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudgogICAgZ2xvYmFsIGRpZmZpbmhkciB0cmVlZGlmZnMKICAgIGdsb2JhbCBkaWZmY29udGV4dAoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuIFtkaWZmY21kICRpZHMgIi1wIC1DIC0tbm8tY29tbWl0LWlkIC1VJGRpZmZjb250ZXh0Il0gcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBmaWxlcnVuICRiZGYgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCn0KCnByb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKCWxhcHBlbmQgJHZhciB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CglsYXBwZW5kICR2YXIgJHZhbAogICAgfSBlbHNlIHsKCWxzZXQgJHZhciAkaSAkdmFsCiAgICB9Cn0KCnByb2MgbWFrZWRpZmZoZHIge2ZuYW1lIGlkc30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cmRpZmZzdGFydCB0cmVlZGlmZnMKCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGN1cmRpZmZzdGFydAogICAgfQogICAgc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCiAgICBzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCiAgICAkY3RleHQgaW5zZXJ0ICRjdXJkaWZmc3RhcnQgIiRwYWQgJGZuYW1lICRwYWQiIGZpbGVzZXAKfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnN0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBuciAwCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB3aGlsZSB7W2luY3IgbnJdIDw9IDEwMDAgJiYgW2dldHMgJGJkZiBsaW5lXSA+PSAwfSB7CglpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIHJldHVybiAwCgl9CglpZiB7IVtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDExICJkaWZmIC0tZ2l0ICIgJGxpbmVdfSB7CgkgICAgIyB0cmltIG9mZiAiZGlmZiAtLWdpdCAiCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxMSBlbmRdCgkgICAgc2V0IGRpZmZpbmhkciAxCgkgICAgIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJICAgIHNldCBjdXJkaWZmc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIgZmlsZXNlcAoJICAgICMgSWYgdGhlIG5hbWUgaGFzbid0IGNoYW5nZWQgdGhlIGxlbmd0aCB3aWxsIGJlIG9kZCwKCSAgICAjIHRoZSBtaWRkbGUgY2hhciB3aWxsIGJlIGEgc3BhY2UsIGFuZCB0aGUgdHdvIGJpdHMgZWl0aGVyCgkgICAgIyBzaWRlIHdpbGwgYmUgYS9uYW1lIGFuZCBiL25hbWUsIG9yICJhL25hbWUiIGFuZCAiYi9uYW1lIi4KCSAgICAjIElmIHRoZSBuYW1lIGhhcyBjaGFuZ2VkIHdlJ2xsIGdldCAicmVuYW1lIGZyb20iIGFuZAoJICAgICMgInJlbmFtZSB0byIgb3IgImNvcHkgZnJvbSIgYW5kICJjb3B5IHRvIiBsaW5lcyBmb2xsb3dpbmcgdGhpcywKCSAgICAjIGFuZCB3ZSdsbCB1c2UgdGhlbSB0byBnZXQgdGhlIGZpbGVuYW1lcy4KCSAgICAjIFRoaXMgY29tcGxleGl0eSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzcGFjZXMgaW4gdGhlIGZpbGVuYW1lKHMpCgkgICAgIyBkb24ndCBnZXQgZXNjYXBlZC4KCSAgICBzZXQgbCBbc3RyaW5nIGxlbmd0aCAkbGluZV0KCSAgICBzZXQgaSBbZXhwciB7JGwgLyAyfV0KCSAgICBpZiB7ISgoJGwgJiAxKSAmJiBbc3RyaW5nIGluZGV4ICRsaW5lICRpXSBlcSAiICIgJiYKCQkgIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMiBbZXhwciB7JGkgLSAxfV1dIGVxIFwKCQkgICAgICBbc3RyaW5nIHJhbmdlICRsaW5lIFtleHByIHskaSArIDN9XSBlbmRdKX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgICMgdW5lc2NhcGUgaWYgcXVvdGVkIGFuZCBjaG9wIG9mZiB0aGUgYS8gZnJvbSB0aGUgZnJvbnQKCSAgICBpZiB7W3N0cmluZyBpbmRleCAkbGluZSAwXSBlcSAiXCIifSB7CgkJc2V0IGZuYW1lIFtzdHJpbmcgcmFuZ2UgW2xpbmRleCAkbGluZSAwXSAyIGVuZF0KCSAgICB9IGVsc2UgewoJCXNldCBmbmFtZSBbc3RyaW5nIHJhbmdlICRsaW5lIDIgW2V4cHIgeyRpIC0gMX1dXQoJICAgIH0KCSAgICBtYWtlZGlmZmhkciAkZm5hbWUgJGlkcwoKCX0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspKCxbMC05XSspPyBcKyhbMC05XSspKCxbMC05XSspPyBAQCguKil9IFwKCQkgICAgICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCSAgICBzZXQgZGlmZmluaGRyIDAKCgl9IGVsc2VpZiB7JGRpZmZpbmhkcn0gewoJICAgIGlmIHshW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMTIgInJlbmFtZSBmcm9tICIgJGxpbmVdIHx8CgkJIVtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDEwICJjb3B5IGZyb20gIiAkbGluZV19IHsKCQlzZXQgZm5hbWUgW3N0cmluZyByYW5nZSAkbGluZSBbZXhwciA2ICsgW3N0cmluZyBmaXJzdCAiIGZyb20gIiAkbGluZV0gXSBlbmRdCgkJaWYge1tzdHJpbmcgaW5kZXggJGZuYW1lIDBdIGVxICJcIiJ9IHsKCQkgICAgc2V0IGZuYW1lIFtsaW5kZXggJGZuYW1lIDBdCgkJfQoJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRpZHMpICRmbmFtZV0KCQlpZiB7JGkgPj0gMH0gewoJCSAgICBzZXRpbmxpc3QgZGlmZmZpbGVzdGFydCAkaSAkY3VyZGlmZnN0YXJ0CgkJfQoJICAgIH0gZWxzZWlmIHshW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMTAgJGxpbmUgInJlbmFtZSB0byAiXSB8fAoJCSAgICAgICFbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCA4ICRsaW5lICJjb3B5IHRvICJdfSB7CgkJc2V0IGZuYW1lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgW2V4cHIgNCArIFtzdHJpbmcgZmlyc3QgIiB0byAiICRsaW5lXSBdIGVuZF0KCQlpZiB7W3N0cmluZyBpbmRleCAkZm5hbWUgMF0gZXEgIlwiIn0gewoJCSAgICBzZXQgZm5hbWUgW2xpbmRleCAkZm5hbWUgMF0KCQl9CgkJbWFrZWRpZmZoZHIgJGZuYW1lICRpZHMKCSAgICB9IGVsc2VpZiB7W3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiLS0tIl0gPT0gMH0gewoJCSMgZG8gbm90aGluZwoJCWNvbnRpbnVlCgkgICAgfSBlbHNlaWYge1tzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIisrKyJdID09IDB9IHsKCQlzZXQgZGlmZmluaGRyIDAKCQljb250aW51ZQoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoKCX0gZWxzZSB7CgkgICAgc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCgkgICAgaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCQlzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJICAgIH0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCSAgICB9IGVsc2UgewoJCSMgIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIsCgkJIyBvciBzb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCQkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAoJICAgIH0KCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tlb2YgJGJkZl19IHsKCWNsb3NlICRiZGYKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgeyRuciA+PSAxMDAwPyAyOiAxfV0KfQoKcHJvYyBjaGFuZ2VkaWZmZGlzcCB7fSB7CiAgICBnbG9iYWwgY3RleHQgZGlmZmVsaWRlCgogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1lbGlkZSBbbGluZGV4ICRkaWZmZWxpZGUgMF0KICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZWxpZGUgW2xpbmRleCAkZGlmZmVsaWRlIDFdCn0KCnByb2MgcHJldmZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBwcmV2IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgMF0KICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvcmVhY2ggbG9jICRkaWZmZmlsZXN0YXJ0IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGxvYyA+PSAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJHByZXYKCSAgICByZXR1cm4KCX0KCXNldCBwcmV2ICRsb2MKICAgIH0KICAgICRjdGV4dCB5dmlldyAkcHJldgp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPiAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJGxvYwoJICAgIHJldHVybgoJfQogICAgfQp9Cgpwcm9jIGNsZWFyX2N0ZXh0IHt7Zmlyc3QgMS4wfX0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgJGZpcnN0IC5dIDBdCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya3RvcF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya3RvcC4wXX0gewoJc2V0IHNtYXJrdG9wICRsCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya2JvdF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya2JvdC4wXX0gewoJc2V0IHNtYXJrYm90ICRsCiAgICB9CiAgICAkY3RleHQgZGVsZXRlICRmaXJzdCBlbmQKfQoKcHJvYyBpbmNyc2VhcmNoIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggYW5jaG9yfV19IHsKCSMgbm8gYW5jaG9yIHNldCwgdXNlIHN0YXJ0IG9mIHNlbGVjdGlvbiwgb3Igb2YgdmlzaWJsZSBhcmVhCglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7JHNlYXJjaGRpcm4gZXEgIi1mb3J3YXJkcyJ9IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLDAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KICAgIH0KICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgaGVyZSBbJGN0ZXh0IHNlYXJjaCAkc2VhcmNoZGlybiAtLSAkc2VhcmNoc3RyaW5nIGFuY2hvcl0KCWlmIHskaGVyZSBuZSB7fX0gewoJICAgICRjdGV4dCBzZWUgJGhlcmUKCX0KCXNlYXJjaG1hcmt2aXNpYmxlIDEKICAgIH0KfQoKcHJvYyBkb3NlYXJjaCB7fSB7CiAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgIGZvY3VzICRzc3RyaW5nCiAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAogICAgc2V0IHNlYXJjaGRpcm4gLWZvcndhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgIltsaW5kZXggJHNlbCAwXSArIDFjIgoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CgkgICAgc2V0IHN0YXJ0ICJAMCwwIgoJfQoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQoJJGN0ZXh0IHRhZyByZW1vdmUgc2VsIDEuMCBlbmQKCWlmIHskbWF0Y2ggZXEge319IHsKCSAgICBiZWxsCgkgICAgcmV0dXJuCgl9CgkkY3RleHQgc2VlICRtYXRjaAoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBkb3NlYXJjaGJhY2sge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1iYWNrd2FyZHMKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRzZWwgMF0KCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtYmFja3dhcmRzIC1jb3VudCBtbCAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWwgYyIKCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmsge2ZpcnN0IGxhc3R9IHsKICAgIGdsb2JhbCBjdGV4dCBzZWFyY2hzdHJpbmcKCiAgICBzZXQgbWVuZCAkZmlyc3QuMAogICAgd2hpbGUgezF9IHsKCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRtZW5kICRsYXN0LmVuZF0KCWlmIHskbWF0Y2ggZXEge319IGJyZWFrCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKCSRjdGV4dCB0YWcgYWRkIGZvdW5kICRtYXRjaCAkbWVuZAogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmt2aXNpYmxlIHtkb2FsbH0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IHRvcGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCwwXSAuXSAwXQogICAgc2V0IGJvdGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF1dIC5dIDBdCiAgICBpZiB7JGRvYWxsIHx8ICRib3RsaW5lIDwgJHNtYXJrdG9wIHx8ICR0b3BsaW5lID4gJHNtYXJrYm90fSB7CgkjIG5vIG92ZXJsYXAgd2l0aCBwcmV2aW91cwoJc2VhcmNobWFyayAkdG9wbGluZSAkYm90bGluZQoJc2V0IHNtYXJrdG9wICR0b3BsaW5lCglzZXQgc21hcmtib3QgJGJvdGxpbmUKICAgIH0gZWxzZSB7CglpZiB7JHRvcGxpbmUgPCAkc21hcmt0b3B9IHsKCSAgICBzZWFyY2htYXJrICR0b3BsaW5lIFtleHByIHskc21hcmt0b3AtMX1dCgkgICAgc2V0IHNtYXJrdG9wICR0b3BsaW5lCgl9CglpZiB7JGJvdGxpbmUgPiAkc21hcmtib3R9IHsKCSAgICBzZWFyY2htYXJrIFtleHByIHskc21hcmtib3QrMX1dICRib3RsaW5lCgkgICAgc2V0IHNtYXJrYm90ICRib3RsaW5lCgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsdGV4dCB7ZjAgZjF9IHsKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcKCiAgICAuYmxlZnQuc2Igc2V0ICRmMCAkZjEKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZWFyY2htYXJrdmlzaWJsZSAwCiAgICB9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBzcGFuIFskY2FudiB5dmlld10KICAgIGNsZWFyX2Rpc3BsYXkKICAgIHNldGNhbnZzY3JvbGwKICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICBkcmF3dmlzaWJsZQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZSBjZmxpc3Qgc2hvd3JlZnN0b3AKICAgIGdsb2JhbCBjaGFyc3BjIHRhYnN0b3AKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQogICAgc2V0Y29vcmRzCiAgICAkY3RleHQgY29uZiAtZm9udCAkdGV4dGZvbnQgLXRhYnMgIltleHByIHskdGFic3RvcCAqICRjaGFyc3BjfV0iCiAgICAkY2ZsaXN0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaG93cmVmc3RvcF0gJiYgW3dpbmZvIGV4aXN0cyAkc2hvd3JlZnN0b3BdfSB7Cgkkc2hvd3JlZnN0b3AubGlzdCBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgY29tbWl0cm93IHRhZ2lkcyBoZWFkaWRzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG51bWNvbW1pdHMgY3VydmlldwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBoZWFkaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkaGVhZGlkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZSB7CglzZXQgaWQgW3N0cmluZyB0b2xvd2VyICRzaGExc3RyaW5nXQoJaWYge1tyZWdleHAge15bMC05YS1mXXs0LDM5fSR9ICRpZF19IHsKCSAgICBzZXQgbWF0Y2hlcyB7fQoJICAgIGZvcmVhY2ggaSAkZGlzcGxheW9yZGVyIHsKCQlpZiB7W3N0cmluZyBtYXRjaCAkaWQqICRpXX0gewoJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGkKCQl9CgkgICAgfQoJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0gewoJCWlmIHtbbGxlbmd0aCAkbWF0Y2hlc10gPiAxfSB7CgkJICAgIGVycm9yX3BvcHVwICJTaG9ydCBTSEExIGlkICRpZCBpcyBhbWJpZ3VvdXMiCgkJICAgIHJldHVybgoJCX0KCQlzZXQgaWQgW2xpbmRleCAkbWF0Y2hlcyAwXQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxCglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZkEtRl17NCx9JH0gJHNoYTFzdHJpbmddfSB7CglzZXQgdHlwZSAiU0hBMSBpZCIKICAgIH0gZWxzZSB7CglzZXQgdHlwZSAiVGFnL0hlYWQiCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldICYmICFbZ2V0Y29tbWl0ICRpZF19IHJldHVybgogICAgc2V0IGhvdmVyeCAkeAogICAgc2V0IGhvdmVyeSAkeQogICAgc2V0IGhvdmVyaWQgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CglhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKICAgIH0KICAgIHNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCn0KCnByb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJc2V0IGhvdmVyeCAkeAoJc2V0IGhvdmVyeSAkeQoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJfQoJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICB9Cn0KCnByb2MgbGluZWxlYXZlIHtpZH0gewogICAgZ2xvYmFsIGhvdmVyaWQgaG92ZXJ0aW1lciBjYW52CgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCSRjYW52IGRlbGV0ZSBob3ZlcgoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJICAgIHVuc2V0IGhvdmVydGltZXIKCX0KCXVuc2V0IGhvdmVyaWQKICAgIH0KfQoKcHJvYyBsaW5laG92ZXIge30gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjb21taXRpbmZvIG1haW5mb250CgogICAgc2V0IHRleHQgW2xpbmRleCAkY29tbWl0aW5mbygkaG92ZXJpZCkgMF0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeCBbZXhwciB7JGhvdmVyeCArIDIgKiAkbGluZXNwY31dCiAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KICAgIHNldCB4MCBbZXhwciB7JHggLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkwIFtleHByIHskeSAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MSBbZXhwciB7JHkgKyAkbGluZXNwYyArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3RhbmdsZSAkeDAgJHkwICR4MSAkeTEgXAoJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKICAgIHNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeCAkeSAtYW5jaG9yIG53IC10ZXh0ICR0ZXh0IC10YWdzIGhvdmVyIFwKCSAgICAgICAtZm9udCAkbWFpbmZvbnRdCiAgICAkY2FudiByYWlzZSAkdAp9Cgpwcm9jIGNsaWNraXNvbmFycm93IHtpZCB5fSB7CiAgICBnbG9iYWwgbHRoaWNrbmVzcwoKICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIHNldCBuIFtleHByIHtbbGxlbmd0aCAkcmFuZ2VzXSAtIDF9XQogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkbn0ge2luY3IgaX0gewoJc2V0IHJvdyBbbGluZGV4ICRyYW5nZXMgJGldCglpZiB7YWJzKFt5YyAkcm93XSAtICR5KSA8ICR0aHJlc2h9IHsKCSAgICByZXR1cm4gJGkKCX0KICAgIH0KICAgIHJldHVybiB7fQp9Cgpwcm9jIGFycm93anVtcCB7aWQgbiB5fSB7CiAgICBnbG9iYWwgY2FudgoKICAgICMgMSA8LT4gMiwgMyA8LT4gNCwgZXRjLi4uCiAgICBzZXQgbiBbZXhwciB7KCgkbiAtIDEpIF4gMSkgKyAxfV0KICAgIHNldCByb3cgW2xpbmRleCBbcm93cmFuZ2VzICRpZF0gJG5dCiAgICBzZXQgeXQgW3ljICRyb3ddCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCiAgICBzZXQgdmlldyBbJGNhbnYgeXZpZXddCiAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KICAgIGlmIHskeWZyYWMgPCAwfSB7CglzZXQgeWZyYWMgMAogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZnJhYwp9Cgpwcm9jIGxpbmVjbGljayB7eCB5IGlkIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjYW52IHRoaWNrZXJsaW5lIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldICYmICFbZ2V0Y29tbWl0ICRpZF19IHJldHVybgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgZHJhd2xpbmVzICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDpcdCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRpZF0KICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHQkZGF0ZVxuIgogICAgc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIGlmIHska2lkcyBuZSB7fX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuQ2hpbGRyZW46IgoJc2V0IGkgMAoJZm9yZWFjaCBjaGlsZCAka2lkcyB7CgkgICAgaW5jciBpCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkY2hpbGQpXSAmJiAhW2dldGNvbW1pdCAkY2hpbGRdfSBjb250aW51ZQoJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdCIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAkY2hpbGQgW2xpc3QgbGluayBsaW5rJGldCgkgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmskaSA8MT4gW2xpc3Qgc2VsYnlpZCAkY2hpbGRdCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXSIKCSAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0RGF0ZTpcdCRkYXRlXG4iCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGluaXRfZmxpc3Qge30KfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCXNldCBpZCAkdGhpY2tlcmxpbmUKCXVuc2V0IHRoaWNrZXJsaW5lCglkcmF3bGluZXMgJGlkCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldwogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBjb21taXRyb3cgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZCBjdXJ2aWV3CiAgICBnbG9iYWwgbnVsbGlkIG51bGxpZDIgZmFrZXJvd21lbnUgbWFpbmhlYWQKCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQoJfHwgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaWQgbmUgJG51bGxpZCAmJiAkaWQgbmUgJG51bGxpZDJ9IHsKCXNldCBtZW51ICRyb3djdHhtZW51CgkkbWVudSBlbnRyeWNvbmZpZ3VyZSA3IC1sYWJlbCAiUmVzZXQgJG1haW5oZWFkIGJyYW5jaCB0byBoZXJlIgogICAgfSBlbHNlIHsKCXNldCBtZW51ICRmYWtlcm93bWVudQogICAgfQogICAgJG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgdGhpcyoiIC1zdGF0ZSAkc3RhdGUKICAgICRtZW51IGVudHJ5Y29uZmlndXJlICJEaWZmIHNlbGVjdGVkKiIgLXN0YXRlICRzdGF0ZQogICAgJG1lbnUgZW50cnljb25maWd1cmUgIk1ha2UgcGF0Y2giIC1zdGF0ZSAkc3RhdGUKICAgIHRrX3BvcHVwICRtZW51ICR4ICR5Cn0KCnByb2MgZGlmZnZzc2VsIHtkaXJufSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBkaXNwbGF5b3JkZXIKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHskZGlybn0gewoJc2V0IG9sZGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkc2VsZWN0ZWRsaW5lXQoJc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIH0gZWxzZSB7CglzZXQgb2xkaWQgJHJvd21lbnVpZAoJc2V0IG5ld2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkc2VsZWN0ZWRsaW5lXQogICAgfQogICAgYWRkdG9oaXN0b3J5IFtsaXN0IGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkXQogICAgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWQKfQoKcHJvYyBkb3NlbGRpZmYge29sZGlkIG5ld2lkfSB7CiAgICBnbG9iYWwgY3RleHQKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIGluaXRfZmxpc3QgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkb2xkaWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkb2xkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgIgogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRuZXdpZCBbbGlzdCBsaW5rIGxpbmsxXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRvbGRpZCAkbmV3aWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wIG51bGxpZCBudWxsaWQyCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIHNldCBjbWQgW2RpZmZjbWQgW2xpc3QgJG9sZGlkICRuZXdpZF0gLXBdCiAgICBsYXBwZW5kIGNtZCA+JGZuYW1lICYKICAgIGlmIHtbY2F0Y2gge2V2YWwgZXhlYyAkY21kfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAogICAgYWRkZWR0YWcgJGlkCiAgICBkaXNwbmVhcnRhZ3MgMAogICAgcnVuIHJlZmlsbF9yZWZsaXN0Cn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGNvbW1pdHJvdyBpZHBvcyBzZWxlY3RlZGxpbmUgY3VydmlldwogICAgZ2xvYmFsIG1haW5mb250IGNhbnZ4bWF4IGlkZHJhd24KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gcmV0dXJuCiAgICBkcmF3Y29tbWl0cyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBzZXQgdGV4dCBbJGNhbnYgaXRlbWNnZXQgJGxpbmVodGFnKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgLXRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0KCSYmICRzZWxlY3RlZGxpbmUgPT0gJGNvbW1pdHJvdygkY3VydmlldywkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIG1rYnJhbmNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWticnRvcAoKICAgIHNldCB0b3AgLm1ha2VicmFuY2gKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgbmV3IGJyYW5jaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubmxhYiAtdGV4dCAiTmFtZToiCiAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDQwCiAgICBncmlkICR0b3AubmxhYiAkdG9wLm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ28gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgW2xpc3QgbWticmdvICR0b3BdCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCAiY2F0Y2gge2Rlc3Ryb3kgJHRvcH0iCiAgICBncmlkICR0b3AuYnV0cy5nbyAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5uYW1lCn0KCnByb2MgbWticmdvIHt0b3B9IHsKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgbmFtZSBbJHRvcC5uYW1lIGdldF0KICAgIHNldCBpZCBbJHRvcC5zaGExIGdldF0KICAgIGlmIHskbmFtZSBlcSB7fX0gewoJZXJyb3JfcG9wdXAgIlBsZWFzZSBzcGVjaWZ5IGEgbmFtZSBmb3IgdGhlIG5ldyBicmFuY2giCglyZXR1cm4KICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICBub3didXN5IG5ld2JyYW5jaAogICAgdXBkYXRlCiAgICBpZiB7W2NhdGNoIHsKCWV4ZWMgZ2l0IGJyYW5jaCAkbmFtZSAkaWQKICAgIH0gZXJyXX0gewoJbm90YnVzeSBuZXdicmFuY2gKCWVycm9yX3BvcHVwICRlcnIKICAgIH0gZWxzZSB7CglzZXQgaGVhZGlkcygkbmFtZSkgJGlkCglsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQoJYWRkZWRoZWFkICRpZCAkbmFtZQoJbm90YnVzeSBuZXdicmFuY2gKCXJlZHJhd3RhZ3MgJGlkCglkaXNwbmVhcnRhZ3MgMAoJcnVuIHJlZmlsbF9yZWZsaXN0CiAgICB9Cn0KCnByb2MgY2hlcnJ5cGljayB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnZpZXcgY29tbWl0cm93CiAgICBnbG9iYWwgbWFpbmhlYWQKCiAgICBzZXQgb2xkaGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICBzZXQgZGhlYWRzIFtkZXNjaGVhZHMgJHJvd21lbnVpZF0KICAgIGlmIHskZGhlYWRzIG5lIHt9ICYmIFtsc2VhcmNoIC1leGFjdCAkZGhlYWRzICRvbGRoZWFkXSA+PSAwfSB7CglzZXQgb2sgW2NvbmZpcm1fcG9wdXAgIkNvbW1pdCBbc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA3XSBpcyBhbHJlYWR5XAoJCQlpbmNsdWRlZCBpbiBicmFuY2ggJG1haW5oZWFkIC0tIHJlYWxseSByZS1hcHBseSBpdD8iXQoJaWYgeyEkb2t9IHJldHVybgogICAgfQogICAgbm93YnVzeSBjaGVycnlwaWNrCiAgICB1cGRhdGUKICAgICMgVW5mb3J0dW5hdGVseSBnaXQtY2hlcnJ5LXBpY2sgd3JpdGVzIHN0dWZmIHRvIHN0ZGVyciBldmVuIHdoZW4KICAgICMgbm8gZXJyb3Igb2NjdXJzLCBhbmQgZXhlYyB0YWtlcyB0aGF0IGFzIGFuIGluZGljYXRpb24gb2YgZXJyb3IuLi4KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgImdpdCBjaGVycnktcGljayAtciAkcm93bWVudWlkIDI+JjEifSBlcnJdfSB7Cglub3RidXN5IGNoZXJyeXBpY2sKCWVycm9yX3BvcHVwICRlcnIKCXJldHVybgogICAgfQogICAgc2V0IG5ld2hlYWQgW2V4ZWMgZ2l0IHJldi1wYXJzZSBIRUFEXQogICAgaWYgeyRuZXdoZWFkIGVxICRvbGRoZWFkfSB7Cglub3RidXN5IGNoZXJyeXBpY2sKCWVycm9yX3BvcHVwICJObyBjaGFuZ2VzIGNvbW1pdHRlZCIKCXJldHVybgogICAgfQogICAgYWRkbmV3Y2hpbGQgJG5ld2hlYWQgJG9sZGhlYWQKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKV19IHsKCWluc2VydHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKSAkbmV3aGVhZAoJaWYgeyRtYWluaGVhZCBuZSB7fX0gewoJICAgIG1vdmVoZWFkICRuZXdoZWFkICRtYWluaGVhZAoJICAgIG1vdmVkaGVhZCAkbmV3aGVhZCAkbWFpbmhlYWQKCX0KCXJlZHJhd3RhZ3MgJG9sZGhlYWQKCXJlZHJhd3RhZ3MgJG5ld2hlYWQKICAgIH0KICAgIG5vdGJ1c3kgY2hlcnJ5cGljawp9Cgpwcm9jIHJlc2V0aGVhZCB7fSB7CiAgICBnbG9iYWwgbWFpbmhlYWRpZCBtYWluaGVhZCByb3dtZW51aWQgY29uZmlybV9vayByZXNldHR5cGUKICAgIGdsb2JhbCBzaG93bG9jYWxjaGFuZ2VzCgogICAgc2V0IGNvbmZpcm1fb2sgMAogICAgc2V0IHcgIi5jb25maXJtcmVzZXQiCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIHdtIHRpdGxlICR3ICJDb25maXJtIHJlc2V0IgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IFwKCSJSZXNldCBicmFuY2ggJG1haW5oZWFkIHRvIFtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDddPyIgXAoJLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgMTAwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBmcmFtZSAkdy5mIC1yZWxpZWYgc3Vua2VuIC1ib3JkZXIgMgogICAgbWVzc2FnZSAkdy5mLnJ0IC10ZXh0ICJSZXNldCB0eXBlOiIgLWFzcGVjdCAxMDAwCiAgICBncmlkICR3LmYucnQgLXN0aWNreSB3CiAgICBzZXQgcmVzZXR0eXBlIG1peGVkCiAgICByYWRpb2J1dHRvbiAkdy5mLnNvZnQgLXZhbHVlIHNvZnQgLXZhcmlhYmxlIHJlc2V0dHlwZSAtanVzdGlmeSBsZWZ0IFwKCS10ZXh0ICJTb2Z0OiBMZWF2ZSB3b3JraW5nIHRyZWUgYW5kIGluZGV4IHVudG91Y2hlZCIKICAgIGdyaWQgJHcuZi5zb2Z0IC1zdGlja3kgdwogICAgcmFkaW9idXR0b24gJHcuZi5taXhlZCAtdmFsdWUgbWl4ZWQgLXZhcmlhYmxlIHJlc2V0dHlwZSAtanVzdGlmeSBsZWZ0IFwKCS10ZXh0ICJNaXhlZDogTGVhdmUgd29ya2luZyB0cmVlIHVudG91Y2hlZCwgcmVzZXQgaW5kZXgiCiAgICBncmlkICR3LmYubWl4ZWQgLXN0aWNreSB3CiAgICByYWRpb2J1dHRvbiAkdy5mLmhhcmQgLXZhbHVlIGhhcmQgLXZhcmlhYmxlIHJlc2V0dHlwZSAtanVzdGlmeSBsZWZ0IFwKCS10ZXh0ICJIYXJkOiBSZXNldCB3b3JraW5nIHRyZWUgYW5kIGluZGV4XG4oZGlzY2FyZCBBTEwgbG9jYWwgY2hhbmdlcykiCiAgICBncmlkICR3LmYuaGFyZCAtc3RpY2t5IHcKICAgIHBhY2sgJHcuZiAtc2lkZSB0b3AgLWZpbGwgeAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJzZXQgY29uZmlybV9vayAxOyBkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBsZWZ0IC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5jYW5jZWwgLXRleHQgQ2FuY2VsIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5jYW5jZWwgLXNpZGUgcmlnaHQgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwogICAgaWYgeyEkY29uZmlybV9va30gcmV0dXJuCiAgICBpZiB7W2NhdGNoIHtzZXQgZmQgW29wZW4gXAoJICAgIFtsaXN0IHwgc2ggLWMgImdpdCByZXNldCAtLSRyZXNldHR5cGUgJHJvd21lbnVpZCAyPiYxIl0gcl19IGVycl19IHsKCWVycm9yX3BvcHVwICRlcnIKICAgIH0gZWxzZSB7Cglkb2hpZGVsb2NhbGNoYW5nZXMKCXNldCB3ICIucmVzZXRwcm9ncmVzcyIKCWZpbGVydW4gJGZkIFtsaXN0IHJlYWRyZXNldHN0YXQgJGZkICR3XQoJdG9wbGV2ZWwgJHcKCXdtIHRyYW5zaWVudCAkdwoJd20gdGl0bGUgJHcgIlJlc2V0IHByb2dyZXNzIgoJbWVzc2FnZSAkdy5tIC10ZXh0ICJSZXNldCBpbiBwcm9ncmVzcywgcGxlYXNlIHdhaXQuLi4iIFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCAxMDAwCglwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgNQoJY2FudmFzICR3LmMgLXdpZHRoIDE1MCAtaGVpZ2h0IDIwIC1iZyB3aGl0ZQoJJHcuYyBjcmVhdGUgcmVjdCAwIDAgMCAyMCAtZmlsbCBncmVlbiAtdGFncyByZWN0CglwYWNrICR3LmMgLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgNSAtZXhwYW5kIDEKCW5vd2J1c3kgcmVzZXQKICAgIH0KfQoKcHJvYyByZWFkcmVzZXRzdGF0IHtmZCB3fSB7CiAgICBnbG9iYWwgbWFpbmhlYWQgbWFpbmhlYWRpZCBzaG93bG9jYWxjaGFuZ2VzCgogICAgaWYge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CglpZiB7W3JlZ2V4cCB7KFswLTldKyklIFwoKFswLTldKykvKFswLTldKylcKX0gJGxpbmUgbWF0Y2ggcCBtIG5dfSB7CgkgICAgc2V0IHggW2V4cHIgeygkbSAqIDE1MCkgLyAkbn1dCgkgICAgJHcuYyBjb29yZHMgcmVjdCAwIDAgJHggMjAKCX0KCXJldHVybiAxCiAgICB9CiAgICBkZXN0cm95ICR3CiAgICBub3RidXN5IHJlc2V0CiAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZmR9IGVycl19IHsKCWVycm9yX3BvcHVwICRlcnIKICAgIH0KICAgIHNldCBvbGRoZWFkICRtYWluaGVhZGlkCiAgICBzZXQgbmV3aGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICBpZiB7JG5ld2hlYWQgbmUgJG9sZGhlYWR9IHsKCW1vdmVoZWFkICRuZXdoZWFkICRtYWluaGVhZAoJbW92ZWRoZWFkICRuZXdoZWFkICRtYWluaGVhZAoJc2V0IG1haW5oZWFkaWQgJG5ld2hlYWQKCXJlZHJhd3RhZ3MgJG9sZGhlYWQKCXJlZHJhd3RhZ3MgJG5ld2hlYWQKICAgIH0KICAgIGlmIHskc2hvd2xvY2FsY2hhbmdlc30gewoJZG9zaG93bG9jYWxjaGFuZ2VzCiAgICB9CiAgICByZXR1cm4gMAp9CgojIGNvbnRleHQgbWVudSBmb3IgYSBoZWFkCnByb2MgaGVhZG1lbnUge3ggeSBpZCBoZWFkfSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgaGVhZGN0eG1lbnUgbWFpbmhlYWQKCiAgICBzZXQgaGVhZG1lbnVpZCAkaWQKICAgIHNldCBoZWFkbWVudWhlYWQgJGhlYWQKICAgIHNldCBzdGF0ZSBub3JtYWwKICAgIGlmIHskaGVhZCBlcSAkbWFpbmhlYWR9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfQogICAgJGhlYWRjdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJGhlYWRjdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgdGtfcG9wdXAgJGhlYWRjdHhtZW51ICR4ICR5Cn0KCnByb2MgY29icmFuY2gge30gewogICAgZ2xvYmFsIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIG1haW5oZWFkIGhlYWRpZHMKICAgIGdsb2JhbCBzaG93bG9jYWxjaGFuZ2VzIG1haW5oZWFkaWQKCiAgICAjIGNoZWNrIHRoZSB0cmVlIGlzIGNsZWFuIGZpcnN0Pz8KICAgIHNldCBvbGRtYWluaGVhZCAkbWFpbmhlYWQKICAgIG5vd2J1c3kgY2hlY2tvdXQKICAgIHVwZGF0ZQogICAgZG9oaWRlbG9jYWxjaGFuZ2VzCiAgICBpZiB7W2NhdGNoIHsKCWV4ZWMgZ2l0IGNoZWNrb3V0IC1xICRoZWFkbWVudWhlYWQKICAgIH0gZXJyXX0gewoJbm90YnVzeSBjaGVja291dAoJZXJyb3JfcG9wdXAgJGVycgogICAgfSBlbHNlIHsKCW5vdGJ1c3kgY2hlY2tvdXQKCXNldCBtYWluaGVhZCAkaGVhZG1lbnVoZWFkCglzZXQgbWFpbmhlYWRpZCAkaGVhZG1lbnVpZAoJaWYge1tpbmZvIGV4aXN0cyBoZWFkaWRzKCRvbGRtYWluaGVhZCldfSB7CgkgICAgcmVkcmF3dGFncyAkaGVhZGlkcygkb2xkbWFpbmhlYWQpCgl9CglyZWRyYXd0YWdzICRoZWFkbWVudWlkCiAgICB9CiAgICBpZiB7JHNob3dsb2NhbGNoYW5nZXN9IHsKCWRvZGlmZmluZGV4CiAgICB9Cn0KCnByb2Mgcm1icmFuY2gge30gewogICAgZ2xvYmFsIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIG1haW5oZWFkCiAgICBnbG9iYWwgaWRoZWFkcwoKICAgIHNldCBoZWFkICRoZWFkbWVudWhlYWQKICAgIHNldCBpZCAkaGVhZG1lbnVpZAogICAgIyB0aGlzIGNoZWNrIHNob3VsZG4ndCBiZSBuZWVkZWQgYW55IG1vcmUuLi4KICAgIGlmIHskaGVhZCBlcSAkbWFpbmhlYWR9IHsKCWVycm9yX3BvcHVwICJDYW5ub3QgZGVsZXRlIHRoZSBjdXJyZW50bHkgY2hlY2tlZC1vdXQgYnJhbmNoIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgZGhlYWRzIFtkZXNjaGVhZHMgJGlkXQogICAgaWYge1tsbGVuZ3RoICRkaGVhZHNdID09IDEgJiYgJGlkaGVhZHMoJGRoZWFkcykgZXEgJGhlYWR9IHsKCSMgdGhlIHN0dWZmIG9uIHRoaXMgYnJhbmNoIGlzbid0IG9uIGFueSBvdGhlciBicmFuY2gKCWlmIHshW2NvbmZpcm1fcG9wdXAgIlRoZSBjb21taXRzIG9uIGJyYW5jaCAkaGVhZCBhcmVuJ3Qgb24gYW55IG90aGVyXAoJCQlicmFuY2guXG5SZWFsbHkgZGVsZXRlIGJyYW5jaCAkaGVhZD8iXX0gcmV0dXJuCiAgICB9CiAgICBub3didXN5IHJtYnJhbmNoCiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGJyYW5jaCAtRCAkaGVhZH0gZXJyXX0gewoJbm90YnVzeSBybWJyYW5jaAoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICByZW1vdmVoZWFkICRpZCAkaGVhZAogICAgcmVtb3ZlZGhlYWQgJGlkICRoZWFkCiAgICByZWRyYXd0YWdzICRpZAogICAgbm90YnVzeSBybWJyYW5jaAogICAgZGlzcG5lYXJ0YWdzIDAKICAgIHJ1biByZWZpbGxfcmVmbGlzdAp9CgojIERpc3BsYXkgYSBsaXN0IG9mIHRhZ3MgYW5kIGhlYWRzCnByb2Mgc2hvd3JlZnMge30gewogICAgZ2xvYmFsIHNob3dyZWZzdG9wIGJnY29sb3IgZmdjb2xvciBzZWxlY3RiZ2NvbG9yIG1haW5mb250CiAgICBnbG9iYWwgYmdsaXN0IGZnbGlzdCB1aWZvbnQgcmVmbGlzdGZpbHRlciByZWZsaXN0IG1haW5jdXJzb3IKCiAgICBzZXQgdG9wIC5zaG93cmVmcwogICAgc2V0IHNob3dyZWZzdG9wICR0b3AKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZWZpbGxfcmVmbGlzdAoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICJUYWdzIGFuZCBoZWFkczogW2ZpbGUgdGFpbCBbcHdkXV0iCiAgICB0ZXh0ICR0b3AubGlzdCAtYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciAtZm9udCAkbWFpbmZvbnQgXAoJLXhzY3JvbGxjb21tYW5kICIkdG9wLnhzYiBzZXQiIC15c2Nyb2xsY29tbWFuZCAiJHRvcC55c2Igc2V0IiBcCgktd2lkdGggMzAgLWhlaWdodCAyMCAtY3Vyc29yICRtYWluY3Vyc29yIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxIC1zdGF0ZSBkaXNhYmxlZAogICAgJHRvcC5saXN0IHRhZyBjb25maWd1cmUgaGlnaGxpZ2h0IC1iYWNrZ3JvdW5kICRzZWxlY3RiZ2NvbG9yCiAgICBsYXBwZW5kIGJnbGlzdCAkdG9wLmxpc3QKICAgIGxhcHBlbmQgZmdsaXN0ICR0b3AubGlzdAogICAgc2Nyb2xsYmFyICR0b3AueXNiIC1jb21tYW5kICIkdG9wLmxpc3QgeXZpZXciIC1vcmllbnQgdmVydGljYWwKICAgIHNjcm9sbGJhciAkdG9wLnhzYiAtY29tbWFuZCAiJHRvcC5saXN0IHh2aWV3IiAtb3JpZW50IGhvcml6b250YWwKICAgIGdyaWQgJHRvcC5saXN0ICR0b3AueXNiIC1zdGlja3kgbnNldwogICAgZ3JpZCAkdG9wLnhzYiB4IC1zdGlja3kgZXcKICAgIGZyYW1lICR0b3AuZgogICAgbGFiZWwgJHRvcC5mLmwgLXRleHQgIkZpbHRlcjogIiAtZm9udCAkdWlmb250CiAgICBlbnRyeSAkdG9wLmYuZSAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSByZWZsaXN0ZmlsdGVyIC1mb250ICR1aWZvbnQKICAgIHNldCByZWZsaXN0ZmlsdGVyICIqIgogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHJlZmxpc3RmaWx0ZXIgd3JpdGUgcmVmbGlzdGZpbHRlcl9jaGFuZ2UKICAgIHBhY2sgJHRvcC5mLmUgLXNpZGUgcmlnaHQgLWZpbGwgeCAtZXhwYW5kIDEKICAgIHBhY2sgJHRvcC5mLmwgLXNpZGUgbGVmdAogICAgZ3JpZCAkdG9wLmYgLSAtc3RpY2t5IGV3IC1wYWR5IDIKICAgIGJ1dHRvbiAkdG9wLmNsb3NlIC1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHRvcF0gLXRleHQgIkNsb3NlIiBcCgktZm9udCAkdWlmb250CiAgICBncmlkICR0b3AuY2xvc2UgLQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcCAwIC13ZWlnaHQgMQogICAgZ3JpZCByb3djb25maWd1cmUgJHRvcCAwIC13ZWlnaHQgMQogICAgYmluZCAkdG9wLmxpc3QgPDE+IHticmVha30KICAgIGJpbmQgJHRvcC5saXN0IDxCMS1Nb3Rpb24+IHticmVha30KICAgIGJpbmQgJHRvcC5saXN0IDxCdXR0b25SZWxlYXNlLTE+IHtzZWxfcmVmbGlzdCAlVyAleCAleTsgYnJlYWt9CiAgICBzZXQgcmVmbGlzdCB7fQogICAgcmVmaWxsX3JlZmxpc3QKfQoKcHJvYyBzZWxfcmVmbGlzdCB7dyB4IHl9IHsKICAgIGdsb2JhbCBzaG93cmVmc3RvcCByZWZsaXN0IGhlYWRpZHMgdGFnaWRzIG90aGVycmVmaWRzCgogICAgaWYgeyFbd2luZm8gZXhpc3RzICRzaG93cmVmc3RvcF19IHJldHVybgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCiAgICBzZXQgcmVmIFtsaW5kZXggJHJlZmxpc3QgW2V4cHIgeyRsLTF9XV0KICAgIHNldCBuIFtsaW5kZXggJHJlZiAwXQogICAgc3dpdGNoIC0tIFtsaW5kZXggJHJlZiAxXSB7CgkiSCIge3NlbGJ5aWQgJGhlYWRpZHMoJG4pfQoJIlQiIHtzZWxieWlkICR0YWdpZHMoJG4pfQoJIm8iIHtzZWxieWlkICRvdGhlcnJlZmlkcygkbil9CiAgICB9CiAgICAkc2hvd3JlZnN0b3AubGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCn0KCnByb2MgdW5zZWxfcmVmbGlzdCB7fSB7CiAgICBnbG9iYWwgc2hvd3JlZnN0b3AKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzaG93cmVmc3RvcF0gfHwgIVt3aW5mbyBleGlzdHMgJHNob3dyZWZzdG9wXX0gcmV0dXJuCiAgICAkc2hvd3JlZnN0b3AubGlzdCB0YWcgcmVtb3ZlIGhpZ2hsaWdodCAwLjAgZW5kCn0KCnByb2MgcmVmbGlzdGZpbHRlcl9jaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgcmVmbGlzdGZpbHRlcgoKICAgIGFmdGVyIGNhbmNlbCByZWZpbGxfcmVmbGlzdAogICAgYWZ0ZXIgMjAwIHJlZmlsbF9yZWZsaXN0Cn0KCnByb2MgcmVmaWxsX3JlZmxpc3Qge30gewogICAgZ2xvYmFsIHJlZmxpc3QgcmVmbGlzdGZpbHRlciBzaG93cmVmc3RvcCBoZWFkaWRzIHRhZ2lkcyBvdGhlcnJlZmlkcwogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3IGNvbW1pdGludGVyZXN0CgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2hvd3JlZnN0b3BdIHx8ICFbd2luZm8gZXhpc3RzICRzaG93cmVmc3RvcF19IHJldHVybgogICAgc2V0IHJlZnMge30KICAgIGZvcmVhY2ggbiBbYXJyYXkgbmFtZXMgaGVhZGlkc10gewoJaWYge1tzdHJpbmcgbWF0Y2ggJHJlZmxpc3RmaWx0ZXIgJG5dfSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGhlYWRpZHMoJG4pKV19IHsKCQlsYXBwZW5kIHJlZnMgW2xpc3QgJG4gSF0KCSAgICB9IGVsc2UgewoJCXNldCBjb21taXRpbnRlcmVzdCgkaGVhZGlkcygkbikpIHtydW4gcmVmaWxsX3JlZmxpc3R9CgkgICAgfQoJfQogICAgfQogICAgZm9yZWFjaCBuIFthcnJheSBuYW1lcyB0YWdpZHNdIHsKCWlmIHtbc3RyaW5nIG1hdGNoICRyZWZsaXN0ZmlsdGVyICRuXX0gewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCR0YWdpZHMoJG4pKV19IHsKCQlsYXBwZW5kIHJlZnMgW2xpc3QgJG4gVF0KCSAgICB9IGVsc2UgewoJCXNldCBjb21taXRpbnRlcmVzdCgkdGFnaWRzKCRuKSkge3J1biByZWZpbGxfcmVmbGlzdH0KCSAgICB9Cgl9CiAgICB9CiAgICBmb3JlYWNoIG4gW2FycmF5IG5hbWVzIG90aGVycmVmaWRzXSB7CglpZiB7W3N0cmluZyBtYXRjaCAkcmVmbGlzdGZpbHRlciAkbl19IHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3Vydmlldywkb3RoZXJyZWZpZHMoJG4pKV19IHsKCQlsYXBwZW5kIHJlZnMgW2xpc3QgJG4gb10KCSAgICB9IGVsc2UgewoJCXNldCBjb21taXRpbnRlcmVzdCgkb3RoZXJyZWZpZHMoJG4pKSB7cnVuIHJlZmlsbF9yZWZsaXN0fQoJICAgIH0KCX0KICAgIH0KICAgIHNldCByZWZzIFtsc29ydCAtaW5kZXggMCAkcmVmc10KICAgIGlmIHskcmVmcyBlcSAkcmVmbGlzdH0gcmV0dXJuCgogICAgIyBVcGRhdGUgdGhlIGNvbnRlbnRzIG9mICRzaG93cmVmc3RvcC5saXN0IGFjY29yZGluZyB0byB0aGUKICAgICMgZGlmZmVyZW5jZXMgYmV0d2VlbiAkcmVmbGlzdCAob2xkKSBhbmQgJHJlZnMgKG5ldykKICAgICRzaG93cmVmc3RvcC5saXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHNob3dyZWZzdG9wLmxpc3QgaW5zZXJ0IGVuZCAiXG4iCiAgICBzZXQgaSAwCiAgICBzZXQgaiAwCiAgICB3aGlsZSB7JGkgPCBbbGxlbmd0aCAkcmVmbGlzdF0gfHwgJGogPCBbbGxlbmd0aCAkcmVmc119IHsKCWlmIHskaSA8IFtsbGVuZ3RoICRyZWZsaXN0XX0gewoJICAgIGlmIHskaiA8IFtsbGVuZ3RoICRyZWZzXX0gewoJCXNldCBjbXAgW3N0cmluZyBjb21wYXJlIFtsaW5kZXggJHJlZmxpc3QgJGkgMF0gXAoJCQkgICAgIFtsaW5kZXggJHJlZnMgJGogMF1dCgkJaWYgeyRjbXAgPT0gMH0gewoJCSAgICBzZXQgY21wIFtzdHJpbmcgY29tcGFyZSBbbGluZGV4ICRyZWZsaXN0ICRpIDFdIFwKCQkJCSBbbGluZGV4ICRyZWZzICRqIDFdXQoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBjbXAgLTEKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBjbXAgMQoJfQoJc3dpdGNoIC0tICRjbXAgewoJICAgIC0xIHsKCQkkc2hvd3JlZnN0b3AubGlzdCBkZWxldGUgIltleHByIHskaisxfV0uMCIgIltleHByIHskaisyfV0uMCIKCQlpbmNyIGkKCSAgICB9CgkgICAgMCB7CgkJaW5jciBpCgkJaW5jciBqCgkgICAgfQoJICAgIDEgewoJCXNldCBsIFtleHByIHskaiArIDF9XQoJCSRzaG93cmVmc3RvcC5saXN0IGltYWdlIGNyZWF0ZSAkbC4wIC1hbGlnbiBiYXNlbGluZSBcCgkJICAgIC1pbWFnZSByZWZpY29uLVtsaW5kZXggJHJlZnMgJGogMV0gLXBhZHggMgoJCSRzaG93cmVmc3RvcC5saXN0IGluc2VydCAkbC4xICJbbGluZGV4ICRyZWZzICRqIDBdXG4iCgkJaW5jciBqCgkgICAgfQoJfQogICAgfQogICAgc2V0IHJlZmxpc3QgJHJlZnMKICAgICMgZGVsZXRlIGxhc3QgbmV3bGluZQogICAgJHNob3dyZWZzdG9wLmxpc3QgZGVsZXRlIGVuZC0yYyBlbmQtMWMKICAgICRzaG93cmVmc3RvcC5saXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCiMgU3R1ZmYgZm9yIGZpbmRpbmcgbmVhcmJ5IHRhZ3MKcHJvYyBnZXRhbGxjb21taXRzIHt9IHsKICAgIGdsb2JhbCBhbGxjb21taXRzIGFsbGlkcyBuYm1wIG5leHRhcmMgc2VlZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gewoJc2V0IGFsbGlkcyB7fQoJc2V0IG5ibXAgMAoJc2V0IG5leHRhcmMgMAoJc2V0IGFsbGNvbW1pdHMgMAoJc2V0IHNlZWRzIHt9CiAgICB9CgogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0tYWxsIC0tcGFyZW50c10KICAgIGZvcmVhY2ggaWQgJHNlZWRzIHsKCWxhcHBlbmQgY21kICJeJGlkIgogICAgfQogICAgc2V0IGZkIFtvcGVuICRjbWQgcl0KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCiAgICBpbmNyIGFsbGNvbW1pdHMKICAgIG5vd2J1c3kgYWxsY29tbWl0cwogICAgZmlsZXJ1biAkZmQgW2xpc3QgZ2V0YWxsY2xpbmVzICRmZF0KfQoKIyBTaW5jZSBtb3N0IGNvbW1pdHMgaGF2ZSAxIHBhcmVudCBhbmQgMSBjaGlsZCwgd2UgZ3JvdXAgc3RyaW5ncyBvZgojIHN1Y2ggY29tbWl0cyBpbnRvICJhcmNzIiBqb2luaW5nIGJyYW5jaC9tZXJnZSBwb2ludHMgKEJNUHMpLCB3aGljaAojIGFyZSBjb21taXRzIHRoYXQgZWl0aGVyIGRvbid0IGhhdmUgMSBwYXJlbnQgb3IgZG9uJ3QgaGF2ZSAxIGNoaWxkLgojCiMgYXJjbm9zKGlkKSAtIGluY29taW5nIGFyY3MgZm9yIEJNUCwgYXJjIHdlJ3JlIG9uIGZvciBvdGhlciBub2RlcwojIGFyY291dChpZCkgLSBvdXRnb2luZyBhcmNzIGZvciBCTVAKIyBhcmNpZHMoYSkgLSBsaXN0IG9mIElEcyBvbiBhcmMgaW5jbHVkaW5nIGVuZCBidXQgbm90IHN0YXJ0CiMgYXJjc3RhcnQoYSkgLSBCTVAgSUQgYXQgc3RhcnQgb2YgYXJjCiMgYXJjZW5kKGEpIC0gQk1QIElEIGF0IGVuZCBvZiBhcmMKIyBncm93aW5nKGEpIC0gYXJjIGEgaXMgc3RpbGwgZ3Jvd2luZwojIGFyY3RhZ3MoYSkgLSBJRHMgb3V0IG9mIGFyY2lkcyAoZXhjbHVkaW5nIGVuZCkgdGhhdCBoYXZlIHRhZ3MKIyBhcmNoZWFkcyhhKSAtIElEcyBvdXQgb2YgYXJjaWRzIChleGNsdWRpbmcgZW5kKSB0aGF0IGhhdmUgaGVhZHMKIyBUaGUgc3RhcnQgb2YgYW4gYXJjIGlzIGF0IHRoZSBkZXNjZW5kZW50IGVuZCwgc28gImluY29taW5nIiBtZWFucwojIGNvbWluZyBmcm9tIGRlc2NlbmRlbnRzLCBhbmQgIm91dGdvaW5nIiBtZWFucyBnb2luZyB0b3dhcmRzIGFuY2VzdG9ycy4KCnByb2MgZ2V0YWxsY2xpbmVzIHtmZH0gewogICAgZ2xvYmFsIGFsbGlkcyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGlkdGFncyBpZGhlYWRzIG5leHRhcmMgbmJtcAogICAgZ2xvYmFsIGFyY25vcyBhcmNpZHMgYXJjdGFncyBhcmNvdXQgYXJjZW5kIGFyY3N0YXJ0IGFyY2hlYWRzIGdyb3dpbmcKICAgIGdsb2JhbCBzZWVkcyBhbGxjb21taXRzCgogICAgc2V0IG5pZCAwCiAgICB3aGlsZSB7W2luY3IgbmlkXSA8PSAxMDAwICYmIFtnZXRzICRmZCBsaW5lXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkbGluZSAwXQoJaWYge1tpbmZvIGV4aXN0cyBhbGxwYXJlbnRzKCRpZCldfSB7CgkgICAgIyBzZWVuIGl0IGFscmVhZHkKCSAgICBjb250aW51ZQoJfQoJbGFwcGVuZCBhbGxpZHMgJGlkCglzZXQgb2xkcyBbbHJhbmdlICRsaW5lIDEgZW5kXQoJc2V0IGFsbHBhcmVudHMoJGlkKSAkb2xkcwoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY2hpbGRyZW4oJGlkKV19IHsKCSAgICBzZXQgYWxsY2hpbGRyZW4oJGlkKSB7fQoJICAgIHNldCBhcmNub3MoJGlkKSB7fQoJICAgIGxhcHBlbmQgc2VlZHMgJGlkCgl9IGVsc2UgewoJICAgIHNldCBhICRhcmNub3MoJGlkKQoJICAgIGlmIHtbbGxlbmd0aCAkb2xkc10gPT0gMSAmJiBbbGxlbmd0aCAkYV0gPT0gMX0gewoJCWxhcHBlbmQgYXJjaWRzKCRhKSAkaWQKCQlpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJCSAgICBsYXBwZW5kIGFyY3RhZ3MoJGEpICRpZAoJCX0KCQlpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCQkgICAgbGFwcGVuZCBhcmNoZWFkcygkYSkgJGlkCgkJfQoJCWlmIHtbaW5mbyBleGlzdHMgYWxscGFyZW50cygkb2xkcyldfSB7CgkJICAgICMgc2VlbiBwYXJlbnQgYWxyZWFkeQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJG9sZHMpXX0gewoJCQlzcGxpdGFyYyAkb2xkcwoJCSAgICB9CgkJICAgIGxhcHBlbmQgYXJjaWRzKCRhKSAkb2xkcwoJCSAgICBzZXQgYXJjZW5kKCRhKSAkb2xkcwoJCSAgICB1bnNldCBncm93aW5nKCRhKQoJCX0KCQlsYXBwZW5kIGFsbGNoaWxkcmVuKCRvbGRzKSAkaWQKCQlsYXBwZW5kIGFyY25vcygkb2xkcykgJGEKCQljb250aW51ZQoJICAgIH0KCX0KCWluY3IgbmJtcAoJZm9yZWFjaCBhICRhcmNub3MoJGlkKSB7CgkgICAgbGFwcGVuZCBhcmNpZHMoJGEpICRpZAoJICAgIHNldCBhcmNlbmQoJGEpICRpZAoJICAgIHVuc2V0IGdyb3dpbmcoJGEpCgl9CgoJc2V0IGFvIHt9Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAoJICAgIHNldCBhIFtpbmNyIG5leHRhcmNdCgkgICAgc2V0IGFyY3N0YXJ0KCRhKSAkaWQKCSAgICBzZXQgYXJjaGVhZHMoJGEpIHt9CgkgICAgc2V0IGFyY3RhZ3MoJGEpIHt9CgkgICAgc2V0IGFyY2hlYWRzKCRhKSB7fQoJICAgIHNldCBhcmNpZHMoJGEpIHt9CgkgICAgbGFwcGVuZCBhbyAkYQoJICAgIHNldCBncm93aW5nKCRhKSAxCgkgICAgaWYge1tpbmZvIGV4aXN0cyBhbGxwYXJlbnRzKCRwKV19IHsKCQkjIHNlZW4gaXQgYWxyZWFkeSwgbWF5IG5lZWQgdG8gbWFrZSBhIG5ldyBicmFuY2gKCQlpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJHApXX0gewoJCSAgICBzcGxpdGFyYyAkcAoJCX0KCQlsYXBwZW5kIGFyY2lkcygkYSkgJHAKCQlzZXQgYXJjZW5kKCRhKSAkcAoJCXVuc2V0IGdyb3dpbmcoJGEpCgkgICAgfQoJICAgIGxhcHBlbmQgYXJjbm9zKCRwKSAkYQoJfQoJc2V0IGFyY291dCgkaWQpICRhbwogICAgfQogICAgaWYgeyRuaWQgPiAwfSB7CglnbG9iYWwgY2FjaGVkX2RoZWFkcyBjYWNoZWRfZHRhZ3MgY2FjaGVkX2F0YWdzCgljYXRjaCB7dW5zZXQgY2FjaGVkX2RoZWFkc30KCWNhdGNoIHt1bnNldCBjYWNoZWRfZHRhZ3N9CgljYXRjaCB7dW5zZXQgY2FjaGVkX2F0YWdzfQogICAgfQogICAgaWYgeyFbZW9mICRmZF19IHsKCXJldHVybiBbZXhwciB7JG5pZCA+PSAxMDAwPyAyOiAxfV0KICAgIH0KICAgIGNsb3NlICRmZAogICAgaWYge1tpbmNyIGFsbGNvbW1pdHMgLTFdID09IDB9IHsKCW5vdGJ1c3kgYWxsY29tbWl0cwogICAgfQogICAgZGlzcG5lYXJ0YWdzIDAKICAgIHJldHVybiAwCn0KCnByb2MgcmVjYWxjYXJjIHthfSB7CiAgICBnbG9iYWwgYXJjdGFncyBhcmNoZWFkcyBhcmNpZHMgaWR0YWdzIGlkaGVhZHMKCiAgICBzZXQgYXQge30KICAgIHNldCBhaCB7fQogICAgZm9yZWFjaCBpZCBbbHJhbmdlICRhcmNpZHMoJGEpIDAgZW5kLTFdIHsKCWlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkgICAgbGFwcGVuZCBhdCAkaWQKCX0KCWlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJICAgIGxhcHBlbmQgYWggJGlkCgl9CiAgICB9CiAgICBzZXQgYXJjdGFncygkYSkgJGF0CiAgICBzZXQgYXJjaGVhZHMoJGEpICRhaAp9Cgpwcm9jIHNwbGl0YXJjIHtwfSB7CiAgICBnbG9iYWwgYXJjbm9zIGFyY2lkcyBuZXh0YXJjIG5ibXAgYXJjdGFncyBhcmNoZWFkcyBpZHRhZ3MgaWRoZWFkcwogICAgZ2xvYmFsIGFyY3N0YXJ0IGFyY2VuZCBhcmNvdXQgYWxscGFyZW50cyBncm93aW5nCgogICAgc2V0IGEgJGFyY25vcygkcCkKICAgIGlmIHtbbGxlbmd0aCAkYV0gIT0gMX0gewoJcHV0cyAib29wcyBzcGxpdGFyYyBjYWxsZWQgYnV0IFtsbGVuZ3RoICRhXSBhcmNzIGFscmVhZHkiCglyZXR1cm4KICAgIH0KICAgIHNldCBhIFtsaW5kZXggJGEgMF0KICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkcF0KICAgIGlmIHskaSA8IDB9IHsKCXB1dHMgIm9vcHMgc3BsaXRhcmMgJHAgbm90IGluIGFyYyAkYSIKCXJldHVybgogICAgfQogICAgc2V0IG5hIFtpbmNyIG5leHRhcmNdCiAgICBpZiB7W2luZm8gZXhpc3RzIGFyY2VuZCgkYSldfSB7CglzZXQgYXJjZW5kKCRuYSkgJGFyY2VuZCgkYSkKICAgIH0gZWxzZSB7CglzZXQgbCBbbGluZGV4ICRhbGxwYXJlbnRzKFtsaW5kZXggJGFyY2lkcygkYSkgZW5kXSkgMF0KCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkYXJjbm9zKCRsKSAkYV0KCXNldCBhcmNub3MoJGwpIFtscmVwbGFjZSAkYXJjbm9zKCRsKSAkaiAkaiAkbmFdCiAgICB9CiAgICBzZXQgdGFpbCBbbHJhbmdlICRhcmNpZHMoJGEpIFtleHByIHskaSsxfV0gZW5kXQogICAgc2V0IGFyY2lkcygkYSkgW2xyYW5nZSAkYXJjaWRzKCRhKSAwICRpXQogICAgc2V0IGFyY2VuZCgkYSkgJHAKICAgIHNldCBhcmNzdGFydCgkbmEpICRwCiAgICBzZXQgYXJjb3V0KCRwKSAkbmEKICAgIHNldCBhcmNpZHMoJG5hKSAkdGFpbAogICAgaWYge1tpbmZvIGV4aXN0cyBncm93aW5nKCRhKV19IHsKCXNldCBncm93aW5nKCRuYSkgMQoJdW5zZXQgZ3Jvd2luZygkYSkKICAgIH0KICAgIGluY3IgbmJtcAoKICAgIGZvcmVhY2ggaWQgJHRhaWwgewoJaWYge1tsbGVuZ3RoICRhcmNub3MoJGlkKV0gPT0gMX0gewoJICAgIHNldCBhcmNub3MoJGlkKSAkbmEKCX0gZWxzZSB7CgkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRhcmNub3MoJGlkKSAkYV0KCSAgICBzZXQgYXJjbm9zKCRpZCkgW2xyZXBsYWNlICRhcmNub3MoJGlkKSAkaiAkaiAkbmFdCgl9CiAgICB9CgogICAgIyByZWNvbnN0cnVjdCB0YWdzIGFuZCBoZWFkcyBsaXN0cwogICAgaWYgeyRhcmN0YWdzKCRhKSBuZSB7fSB8fCAkYXJjaGVhZHMoJGEpIG5lIHt9fSB7CglyZWNhbGNhcmMgJGEKCXJlY2FsY2FyYyAkbmEKICAgIH0gZWxzZSB7CglzZXQgYXJjdGFncygkbmEpIHt9CglzZXQgYXJjaGVhZHMoJG5hKSB7fQogICAgfQp9CgojIFVwZGF0ZSB0aGluZ3MgZm9yIGEgbmV3IGNvbW1pdCBhZGRlZCB0aGF0IGlzIGEgY2hpbGQgb2Ygb25lCiMgZXhpc3RpbmcgY29tbWl0LiAgVXNlZCB3aGVuIGNoZXJyeS1waWNraW5nLgpwcm9jIGFkZG5ld2NoaWxkIHtpZCBwfSB7CiAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gaWR0YWdzIG5leHRhcmMgbmJtcAogICAgZ2xvYmFsIGFyY25vcyBhcmNpZHMgYXJjdGFncyBhcmNvdXQgYXJjZW5kIGFyY3N0YXJ0IGFyY2hlYWRzIGdyb3dpbmcKICAgIGdsb2JhbCBzZWVkcyBhbGxjb21taXRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgogICAgbGFwcGVuZCBhbGxpZHMgJGlkCiAgICBzZXQgYWxscGFyZW50cygkaWQpIFtsaXN0ICRwXQogICAgc2V0IGFsbGNoaWxkcmVuKCRpZCkge30KICAgIHNldCBhcmNub3MoJGlkKSB7fQogICAgbGFwcGVuZCBzZWVkcyAkaWQKICAgIGluY3IgbmJtcAogICAgbGFwcGVuZCBhbGxjaGlsZHJlbigkcCkgJGlkCiAgICBzZXQgYSBbaW5jciBuZXh0YXJjXQogICAgc2V0IGFyY3N0YXJ0KCRhKSAkaWQKICAgIHNldCBhcmNoZWFkcygkYSkge30KICAgIHNldCBhcmN0YWdzKCRhKSB7fQogICAgc2V0IGFyY2lkcygkYSkgW2xpc3QgJHBdCiAgICBzZXQgYXJjZW5kKCRhKSAkcAogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRwKV19IHsKCXNwbGl0YXJjICRwCiAgICB9CiAgICBsYXBwZW5kIGFyY25vcygkcCkgJGEKICAgIHNldCBhcmNvdXQoJGlkKSBbbGlzdCAkYV0KfQoKIyBSZXR1cm5zIDEgaWYgYSBpcyBhbiBhbmNlc3RvciBvZiBiLCAtMSBpZiBiIGlzIGFuIGFuY2VzdG9yIG9mIGEsCiMgb3IgMCBpZiBuZWl0aGVyIGlzIHRydWUuCnByb2MgYW5jX29yX2Rlc2Mge2EgYn0gewogICAgZ2xvYmFsIGFyY291dCBhcmNzdGFydCBhcmNlbmQgYXJjbm9zIGNhY2hlZF9pc2FuYwoKICAgIGlmIHskYXJjbm9zKCRhKSBlcSAkYXJjbm9zKCRiKX0gewoJIyBCb3RoIGFyZSBvbiB0aGUgc2FtZSBhcmMocyk7IGVpdGhlciBib3RoIGFyZSB0aGUgc2FtZSBCTVAsCgkjIG9yIGlmIG9uZSBpcyBub3QgYSBCTVAsIHRoZSBvdGhlciBpcyBhbHNvIG5vdCBhIEJNUCBvciBpcwoJIyB0aGUgQk1QIGF0IGVuZCBvZiB0aGUgYXJjIChhbmQgaXQgb25seSBoYXMgMSBpbmNvbWluZyBhcmMpLgoJIyBPciBib3RoIGNhbiBiZSBCTVBzIHdpdGggbm8gaW5jb21pbmcgYXJjcy4KCWlmIHskYSBlcSAkYiB8fCAkYXJjbm9zKCRhKSBlcSB7fX0gewoJICAgIHJldHVybiAwCgl9CgkjIGFzc2VydCB7W2xsZW5ndGggJGFyY25vcygkYSldID09IDF9CglzZXQgYXJjIFtsaW5kZXggJGFyY25vcygkYSkgMF0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhcmMpICRhXQoJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRhcmNpZHMoJGFyYykgJGJdCglpZiB7JGkgPCAwIHx8ICRpID4gJGp9IHsKCSAgICByZXR1cm4gMQoJfSBlbHNlIHsKCSAgICByZXR1cm4gLTEKCX0KICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJGEpXX0gewoJc2V0IGFyYyBbbGluZGV4ICRhcmNub3MoJGEpIDBdCglpZiB7W2luZm8gZXhpc3RzIGFyY2VuZCgkYXJjKV19IHsKCSAgICBzZXQgYWVuZCAkYXJjZW5kKCRhcmMpCgl9IGVsc2UgewoJICAgIHNldCBhZW5kIHt9Cgl9CglzZXQgYSAkYXJjc3RhcnQoJGFyYykKICAgIH0gZWxzZSB7CglzZXQgYWVuZCAkYQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRiKV19IHsKCXNldCBhcmMgW2xpbmRleCAkYXJjbm9zKCRiKSAwXQoJaWYge1tpbmZvIGV4aXN0cyBhcmNlbmQoJGFyYyldfSB7CgkgICAgc2V0IGJlbmQgJGFyY2VuZCgkYXJjKQoJfSBlbHNlIHsKCSAgICBzZXQgYmVuZCB7fQoJfQoJc2V0IGIgJGFyY3N0YXJ0KCRhcmMpCiAgICB9IGVsc2UgewoJc2V0IGJlbmQgJGIKICAgIH0KICAgIGlmIHskYSBlcSAkYmVuZH0gewoJcmV0dXJuIDEKICAgIH0KICAgIGlmIHskYiBlcSAkYWVuZH0gewoJcmV0dXJuIC0xCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNhY2hlZF9pc2FuYygkYSwkYmVuZCldfSB7CglpZiB7JGNhY2hlZF9pc2FuYygkYSwkYmVuZCl9IHsKCSAgICByZXR1cm4gMQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfaXNhbmMoJGIsJGFlbmQpXX0gewoJaWYgeyRjYWNoZWRfaXNhbmMoJGIsJGFlbmQpfSB7CgkgICAgcmV0dXJuIC0xCgl9CglpZiB7W2luZm8gZXhpc3RzIGNhY2hlZF9pc2FuYygkYSwkYmVuZCldfSB7CgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbGlzdCAkYSAkYl0KICAgIHNldCBhbmMoJGEpIGEKICAgIHNldCBhbmMoJGIpIGIKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CglzZXQgeCBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyRhbmMoJHgpIGVxIHt9fSB7CgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggYXJjICRhcmNub3MoJHgpIHsKCSAgICBzZXQgeGQgJGFyY3N0YXJ0KCRhcmMpCgkgICAgaWYgeyR4ZCBlcSAkYmVuZH0gewoJCXNldCBjYWNoZWRfaXNhbmMoJGEsJGJlbmQpIDEKCQlzZXQgY2FjaGVkX2lzYW5jKCRiLCRhZW5kKSAwCgkJcmV0dXJuIDEKCSAgICB9IGVsc2VpZiB7JHhkIGVxICRhZW5kfSB7CgkJc2V0IGNhY2hlZF9pc2FuYygkYiwkYWVuZCkgMQoJCXNldCBjYWNoZWRfaXNhbmMoJGEsJGJlbmQpIDAKCQlyZXR1cm4gLTEKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgYW5jKCR4ZCldfSB7CgkJc2V0IGFuYygkeGQpICRhbmMoJHgpCgkJbGFwcGVuZCB0b2RvICR4ZAoJICAgIH0gZWxzZWlmIHskYW5jKCR4ZCkgbmUgJGFuYygkeCl9IHsKCQlzZXQgYW5jKCR4ZCkge30KCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgY2FjaGVkX2lzYW5jKCRhLCRiZW5kKSAwCiAgICBzZXQgY2FjaGVkX2lzYW5jKCRiLCRhZW5kKSAwCiAgICByZXR1cm4gMAp9CgojIFRoaXMgaWRlbnRpZmllcyB3aGV0aGVyICRkZXNjIGhhcyBhbiBhbmNlc3RvciB0aGF0IGlzCiMgYSBncm93aW5nIHRpcCBvZiB0aGUgZ3JhcGggYW5kIHdoaWNoIGlzIG5vdCBhbiBhbmNlc3RvciBvZiAkYW5jCiMgYW5kIHJldHVybnMgMCBpZiBzbyBhbmQgMSBpZiBub3QuCiMgSWYgd2Ugc3Vic2VxdWVudGx5IGRpc2NvdmVyIGEgdGFnIG9uIHN1Y2ggYSBncm93aW5nIHRpcCwgYW5kIHRoYXQKIyB0dXJucyBvdXQgdG8gYmUgYSBkZXNjZW5kZW50IG9mICRhbmMgKHdoaWNoIGl0IGNvdWxkLCBzaW5jZSB3ZQojIGRvbid0IG5lY2Vzc2FyaWx5IHNlZSBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cyksIHRoZW4gJGRlc2MKIyBpc24ndCBhIGdvb2QgY2hvaWNlIHRvIGRpc3BsYXkgYXMgYSBkZXNjZW5kZW50IHRhZyBvZgojICRhbmMgKHNpbmNlIGl0IGlzIHRoZSBkZXNjZW5kZW50IG9mIGFub3RoZXIgdGFnIHdoaWNoIGlzCiMgYSBkZXNjZW5kZW50IG9mICRhbmMpLiAgU2ltaWxhcmx5LCAkYW5jIGlzbid0IGEgZ29vZCBjaG9pY2UgdG8KIyBkaXNwbGF5IGFzIGEgYW5jZXN0b3IgdGFnIG9mICRkZXNjLgojCnByb2MgaXNfY2VydGFpbiB7ZGVzYyBhbmN9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjb3V0IGFyY3N0YXJ0IGFyY2VuZCBncm93aW5nIHByb2JsZW1zCgogICAgc2V0IGNlcnRhaW4ge30KICAgIGlmIHtbbGxlbmd0aCAkYXJjbm9zKCRhbmMpXSA9PSAxfSB7CgkjIHRhZ3Mgb24gdGhlIHNhbWUgYXJjIGFyZSBjZXJ0YWluCglpZiB7JGFyY25vcygkZGVzYykgZXEgJGFyY25vcygkYW5jKX0gewoJICAgIHJldHVybiAxCgl9CglpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJGFuYyldfSB7CgkgICAgIyBpZiAkYW5jIGlzIHBhcnR3YXkgYWxvbmcgYW4gYXJjLCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBhcmMgaW5zdGVhZAoJICAgIHNldCBhIFtsaW5kZXggJGFyY25vcygkYW5jKSAwXQoJICAgIHNldCBhbmMgJGFyY3N0YXJ0KCRhKQoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRhcmNub3MoJGRlc2MpXSA+IDEgfHwgW2luZm8gZXhpc3RzIGFyY291dCgkZGVzYyldfSB7CglzZXQgeCAkZGVzYwogICAgfSBlbHNlIHsKCXNldCBhIFtsaW5kZXggJGFyY25vcygkZGVzYykgMF0KCXNldCB4ICRhcmNlbmQoJGEpCiAgICB9CiAgICBpZiB7JHggPT0gJGFuY30gewoJcmV0dXJuIDEKICAgIH0KICAgIHNldCBhbmNsaXN0IFtsaXN0ICR4XQogICAgc2V0IGRsKCR4KSAxCiAgICBzZXQgbm5oIDEKICAgIHNldCBuZ3Jvd2FuYyAwCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICRhbmNsaXN0XSAmJiAoJG5uaCA+IDAgfHwgJG5ncm93YW5jID4gMCl9IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJGFuY2xpc3QgJGldCglpZiB7JGRsKCR4KX0gewoJICAgIGluY3Igbm5oIC0xCgl9CglzZXQgZG9uZSgkeCkgMQoJZm9yZWFjaCBhICRhcmNvdXQoJHgpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGdyb3dpbmcoJGEpXX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGdyb3dhbmMoJHgpXSAmJiAkZGwoJHgpfSB7CgkJICAgIHNldCBncm93YW5jKCR4KSAxCgkJICAgIGluY3Igbmdyb3dhbmMKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgeSAkYXJjZW5kKCRhKQoJCWlmIHtbaW5mbyBleGlzdHMgZGwoJHkpXX0gewoJCSAgICBpZiB7JGRsKCR5KX0gewoJCQlpZiB7ISRkbCgkeCl9IHsKCQkJICAgIHNldCBkbCgkeSkgMAoJCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgZG9uZSgkeSldfSB7CgkJCQlpbmNyIG5uaCAtMQoJCQkgICAgfQoJCQkgICAgaWYge1tpbmZvIGV4aXN0cyBncm93YW5jKCR4KV19IHsKCQkJCWluY3Igbmdyb3dhbmMgLTEKCQkJICAgIH0KCQkJICAgIHNldCB4bCBbbGlzdCAkeV0KCQkJICAgIGZvciB7c2V0IGsgMH0geyRrIDwgW2xsZW5ndGggJHhsXX0ge2luY3Iga30gewoJCQkJc2V0IHogW2xpbmRleCAkeGwgJGtdCgkJCQlmb3JlYWNoIGMgJGFyY291dCgkeikgewoJCQkJICAgIGlmIHtbaW5mbyBleGlzdHMgYXJjZW5kKCRjKV19IHsKCQkJCQlzZXQgdiAkYXJjZW5kKCRjKQoJCQkJCWlmIHtbaW5mbyBleGlzdHMgZGwoJHYpXSAmJiAkZGwoJHYpfSB7CgkJCQkJICAgIHNldCBkbCgkdikgMAoJCQkJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkb25lKCR2KV19IHsKCQkJCQkJaW5jciBubmggLTEKCQkJCQkgICAgfQoJCQkJCSAgICBpZiB7W2luZm8gZXhpc3RzIGdyb3dhbmMoJHYpXX0gewoJCQkJCQlpbmNyIG5ncm93YW5jIC0xCgkJCQkJICAgIH0KCQkJCQkgICAgbGFwcGVuZCB4bCAkdgoJCQkJCX0KCQkJCSAgICB9CgkJCQl9CgkJCSAgICB9CgkJCX0KCQkgICAgfQoJCX0gZWxzZWlmIHskeSBlcSAkYW5jIHx8ICEkZGwoJHgpfSB7CgkJICAgIHNldCBkbCgkeSkgMAoJCSAgICBsYXBwZW5kIGFuY2xpc3QgJHkKCQl9IGVsc2UgewoJCSAgICBzZXQgZGwoJHkpIDEKCQkgICAgbGFwcGVuZCBhbmNsaXN0ICR5CgkJICAgIGluY3Igbm5oCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGZvcmVhY2ggeCBbYXJyYXkgbmFtZXMgZ3Jvd2FuY10gewoJaWYgeyRkbCgkeCl9IHsKCSAgICByZXR1cm4gMAoJfQoJcmV0dXJuIDAKICAgIH0KICAgIHJldHVybiAxCn0KCnByb2MgdmFsaWRhdGVfYXJjdGFncyB7YX0gewogICAgZ2xvYmFsIGFyY3RhZ3MgaWR0YWdzCgogICAgc2V0IGkgLTEKICAgIHNldCBuYSAkYXJjdGFncygkYSkKICAgIGZvcmVhY2ggaWQgJGFyY3RhZ3MoJGEpIHsKCWluY3IgaQoJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkgICAgc2V0IG5hIFtscmVwbGFjZSAkbmEgJGkgJGldCgkgICAgaW5jciBpIC0xCgl9CiAgICB9CiAgICBzZXQgYXJjdGFncygkYSkgJG5hCn0KCnByb2MgdmFsaWRhdGVfYXJjaGVhZHMge2F9IHsKICAgIGdsb2JhbCBhcmNoZWFkcyBpZGhlYWRzCgogICAgc2V0IGkgLTEKICAgIHNldCBuYSAkYXJjaGVhZHMoJGEpCiAgICBmb3JlYWNoIGlkICRhcmNoZWFkcygkYSkgewoJaW5jciBpCglpZiB7IVtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CgkgICAgc2V0IG5hIFtscmVwbGFjZSAkbmEgJGkgJGldCgkgICAgaW5jciBpIC0xCgl9CiAgICB9CiAgICBzZXQgYXJjaGVhZHMoJGEpICRuYQp9CgojIFJldHVybiB0aGUgbGlzdCBvZiBJRHMgdGhhdCBoYXZlIHRhZ3MgdGhhdCBhcmUgZGVzY2VuZGVudHMgb2YgaWQsCiMgaWdub3JpbmcgSURzIHRoYXQgYXJlIGRlc2NlbmRlbnRzIG9mIElEcyBhbHJlYWR5IHJlcG9ydGVkLgpwcm9jIGRlc2N0YWdzIHtpZH0gewogICAgZ2xvYmFsIGFyY25vcyBhcmNzdGFydCBhcmNpZHMgYXJjdGFncyBpZHRhZ3MgYWxscGFyZW50cwogICAgZ2xvYmFsIGdyb3dpbmcgY2FjaGVkX2R0YWdzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxscGFyZW50cygkaWQpXX0gewoJcmV0dXJuIHt9CiAgICB9CiAgICBzZXQgdDEgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IGFyZ2lkICRpZAogICAgaWYge1tsbGVuZ3RoICRhcmNub3MoJGlkKV0gPT0gMSAmJiBbbGxlbmd0aCAkYWxscGFyZW50cygkaWQpXSA9PSAxfSB7CgkjIHBhcnQtd2F5IGFsb25nIGFuIGFyYzsgY2hlY2sgdGhhdCBhcmMgZmlyc3QKCXNldCBhIFtsaW5kZXggJGFyY25vcygkaWQpIDBdCglpZiB7JGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkgICAgdmFsaWRhdGVfYXJjdGFncyAkYQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkaWRdCgkgICAgc2V0IHRpZCB7fQoJICAgIGZvcmVhY2ggdCAkYXJjdGFncygkYSkgewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkdF0KCQlpZiB7JGogPj0gJGl9IGJyZWFrCgkJc2V0IHRpZCAkdAoJICAgIH0KCSAgICBpZiB7JHRpZCBuZSB7fX0gewoJCXJldHVybiAkdGlkCgkgICAgfQoJfQoJc2V0IGlkICRhcmNzdGFydCgkYSkKCWlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkgICAgcmV0dXJuICRpZAoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfZHRhZ3MoJGlkKV19IHsKCXJldHVybiAkY2FjaGVkX2R0YWdzKCRpZCkKICAgIH0KCiAgICBzZXQgb3JpZ2lkICRpZAogICAgc2V0IHRvZG8gW2xpc3QgJGlkXQogICAgc2V0IHF1ZXVlZCgkaWQpIDEKICAgIHNldCBuYyAxCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXSAmJiAkbmMgPiAwfSB7aW5jciBpfSB7CglzZXQgaWQgW2xpbmRleCAkdG9kbyAkaV0KCXNldCBkb25lKCRpZCkgMQoJc2V0IHRhIFtpbmZvIGV4aXN0cyBoYXN0YWdnZWRhbmNlc3RvcigkaWQpXQoJaWYgeyEkdGF9IHsKCSAgICBpbmNyIG5jIC0xCgl9CgkjIGlnbm9yZSB0YWdzIG9uIHN0YXJ0aW5nIG5vZGUKCWlmIHshJHRhICYmICRpID4gMH0gewoJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkJc2V0IHRhZ2xvYygkaWQpICRpZAoJCXNldCB0YSAxCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfZHRhZ3MoJGlkKV19IHsKCQlzZXQgdGFnbG9jKCRpZCkgJGNhY2hlZF9kdGFncygkaWQpCgkJc2V0IHRhIDEKCSAgICB9Cgl9Cglmb3JlYWNoIGEgJGFyY25vcygkaWQpIHsKCSAgICBzZXQgZCAkYXJjc3RhcnQoJGEpCgkgICAgaWYgeyEkdGEgJiYgJGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkJdmFsaWRhdGVfYXJjdGFncyAkYQoJCWlmIHskYXJjdGFncygkYSkgbmUge319IHsKCQkgICAgbGFwcGVuZCB0YWdsb2MoJGlkKSBbbGluZGV4ICRhcmN0YWdzKCRhKSBlbmRdCgkJfQoJICAgIH0KCSAgICBpZiB7JHRhIHx8ICRhcmN0YWdzKCRhKSBuZSB7fX0gewoJCXNldCB0b21hcmsgW2xpc3QgJGRdCgkJZm9yIHtzZXQgaiAwfSB7JGogPCBbbGxlbmd0aCAkdG9tYXJrXX0ge2luY3Igan0gewoJCSAgICBzZXQgZGQgW2xpbmRleCAkdG9tYXJrICRqXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBoYXN0YWdnZWRhbmNlc3RvcigkZGQpXX0gewoJCQlpZiB7W2luZm8gZXhpc3RzIGRvbmUoJGRkKV19IHsKCQkJICAgIGZvcmVhY2ggYiAkYXJjbm9zKCRkZCkgewoJCQkJbGFwcGVuZCB0b21hcmsgJGFyY3N0YXJ0KCRiKQoJCQkgICAgfQoJCQkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdsb2MoJGRkKV19IHsKCQkJCXVuc2V0IHRhZ2xvYygkZGQpCgkJCSAgICB9CgkJCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgcXVldWVkKCRkZCldfSB7CgkJCSAgICBpbmNyIG5jIC0xCgkJCX0KCQkJc2V0IGhhc3RhZ2dlZGFuY2VzdG9yKCRkZCkgMQoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBxdWV1ZWQoJGQpXX0gewoJCWxhcHBlbmQgdG9kbyAkZAoJCXNldCBxdWV1ZWQoJGQpIDEKCQlpZiB7IVtpbmZvIGV4aXN0cyBoYXN0YWdnZWRhbmNlc3RvcigkZCldfSB7CgkJICAgIGluY3IgbmMKCQl9CgkgICAgfQoJfQogICAgfQogICAgc2V0IHRhZ3Mge30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIHRhZ2xvY10gewoJaWYgeyFbaW5mbyBleGlzdHMgaGFzdGFnZ2VkYW5jZXN0b3IoJGlkKV19IHsKCSAgICBmb3JlYWNoIHQgJHRhZ2xvYygkaWQpIHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICR0YWdzICR0XSA8IDB9IHsKCQkgICAgbGFwcGVuZCB0YWdzICR0CgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB0MiBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbG9vcGl4ICRpCgogICAgIyByZW1vdmUgdGFncyB0aGF0IGFyZSBkZXNjZW5kZW50cyBvZiBvdGhlciB0YWdzCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0YWdzXX0ge2luY3IgaX0gewoJc2V0IGEgW2xpbmRleCAkdGFncyAkaV0KCWZvciB7c2V0IGogMH0geyRqIDwgJGl9IHtpbmNyIGp9IHsKCSAgICBzZXQgYiBbbGluZGV4ICR0YWdzICRqXQoJICAgIHNldCByIFthbmNfb3JfZGVzYyAkYSAkYl0KCSAgICBpZiB7JHIgPT0gMX0gewoJCXNldCB0YWdzIFtscmVwbGFjZSAkdGFncyAkaiAkal0KCQlpbmNyIGogLTEKCQlpbmNyIGkgLTEKCSAgICB9IGVsc2VpZiB7JHIgPT0gLTF9IHsKCQlzZXQgdGFncyBbbHJlcGxhY2UgJHRhZ3MgJGkgJGldCgkJaW5jciBpIC0xCgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgaWYge1thcnJheSBuYW1lcyBncm93aW5nXSBuZSB7fX0gewoJIyBncmFwaCBpc24ndCBmaW5pc2hlZCwgbmVlZCB0byBjaGVjayBpZiBhbnkgdGFnIGNvdWxkIGdldAoJIyBlY2xpcHNlZCBieSBhbm90aGVyIHRhZyBjb21pbmcgbGF0ZXIuICBTaW1wbHkgaWdub3JlIGFueQoJIyB0YWdzIHRoYXQgY291bGQgbGF0ZXIgZ2V0IGVjbGlwc2VkLgoJc2V0IGN0YWdzIHt9Cglmb3JlYWNoIHQgJHRhZ3MgewoJICAgIGlmIHtbaXNfY2VydGFpbiAkdCAkb3JpZ2lkXX0gewoJCWxhcHBlbmQgY3RhZ3MgJHQKCSAgICB9Cgl9CglpZiB7JHRhZ3MgZXEgJGN0YWdzfSB7CgkgICAgc2V0IGNhY2hlZF9kdGFncygkb3JpZ2lkKSAkdGFncwoJfSBlbHNlIHsKCSAgICBzZXQgdGFncyAkY3RhZ3MKCX0KICAgIH0gZWxzZSB7CglzZXQgY2FjaGVkX2R0YWdzKCRvcmlnaWQpICR0YWdzCiAgICB9CiAgICBzZXQgdDMgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgaWYgezAgJiYgJHQzIC0gJHQxID49IDEwMH0gewoJcHV0cyAiaXRlcmF0aW5nIGRlc2NlbmRlbnRzICgkbG9vcGl4L1tsbGVuZ3RoICR0b2RvXSBub2RlcykgdG9va1wKICAgIAkgICAgW2V4cHIgeyR0Mi0kdDF9XStbZXhwciB7JHQzLSR0Mn1dbXMsICRuYyBjYW5kaWRhdGVzIGxlZnQiCiAgICB9CiAgICByZXR1cm4gJHRhZ3MKfQoKcHJvYyBhbmN0YWdzIHtpZH0gewogICAgZ2xvYmFsIGFyY25vcyBhcmNpZHMgYXJjb3V0IGFyY2VuZCBhcmN0YWdzIGlkdGFncyBhbGxwYXJlbnRzCiAgICBnbG9iYWwgZ3Jvd2luZyBjYWNoZWRfYXRhZ3MKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxwYXJlbnRzKCRpZCldfSB7CglyZXR1cm4ge30KICAgIH0KICAgIHNldCB0MSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgYXJnaWQgJGlkCiAgICBpZiB7W2xsZW5ndGggJGFyY25vcygkaWQpXSA9PSAxICYmIFtsbGVuZ3RoICRhbGxwYXJlbnRzKCRpZCldID09IDF9IHsKCSMgcGFydC13YXkgYWxvbmcgYW4gYXJjOyBjaGVjayB0aGF0IGFyYyBmaXJzdAoJc2V0IGEgW2xpbmRleCAkYXJjbm9zKCRpZCkgMF0KCWlmIHskYXJjdGFncygkYSkgbmUge319IHsKCSAgICB2YWxpZGF0ZV9hcmN0YWdzICRhCgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRhcmNpZHMoJGEpICRpZF0KCSAgICBmb3JlYWNoIHQgJGFyY3RhZ3MoJGEpIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGFyY2lkcygkYSkgJHRdCgkJaWYgeyRqID4gJGl9IHsKCQkgICAgcmV0dXJuICR0CgkJfQoJICAgIH0KCX0KCWlmIHshW2luZm8gZXhpc3RzIGFyY2VuZCgkYSldfSB7CgkgICAgcmV0dXJuIHt9Cgl9CglzZXQgaWQgJGFyY2VuZCgkYSkKCWlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkgICAgcmV0dXJuICRpZAoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfYXRhZ3MoJGlkKV19IHsKCXJldHVybiAkY2FjaGVkX2F0YWdzKCRpZCkKICAgIH0KCiAgICBzZXQgb3JpZ2lkICRpZAogICAgc2V0IHRvZG8gW2xpc3QgJGlkXQogICAgc2V0IHF1ZXVlZCgkaWQpIDEKICAgIHNldCB0YWdsaXN0IHt9CiAgICBzZXQgbmMgMQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb10gJiYgJG5jID4gMH0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJHRvZG8gJGldCglzZXQgZG9uZSgkaWQpIDEKCXNldCB0ZCBbaW5mbyBleGlzdHMgaGFzdGFnZ2VkZGVzY2VuZGVudCgkaWQpXQoJaWYgeyEkdGR9IHsKCSAgICBpbmNyIG5jIC0xCgl9CgkjIGlnbm9yZSB0YWdzIG9uIHN0YXJ0aW5nIG5vZGUKCWlmIHshJHRkICYmICRpID4gMH0gewoJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkJc2V0IHRhZ2xvYygkaWQpICRpZAoJCXNldCB0ZCAxCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfYXRhZ3MoJGlkKV19IHsKCQlzZXQgdGFnbG9jKCRpZCkgJGNhY2hlZF9hdGFncygkaWQpCgkJc2V0IHRkIDEKCSAgICB9Cgl9Cglmb3JlYWNoIGEgJGFyY291dCgkaWQpIHsKCSAgICBpZiB7ISR0ZCAmJiAkYXJjdGFncygkYSkgbmUge319IHsKCQl2YWxpZGF0ZV9hcmN0YWdzICRhCgkJaWYgeyRhcmN0YWdzKCRhKSBuZSB7fX0gewoJCSAgICBsYXBwZW5kIHRhZ2xvYygkaWQpIFtsaW5kZXggJGFyY3RhZ3MoJGEpIDBdCgkJfQoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNlbmQoJGEpXX0gY29udGludWUKCSAgICBzZXQgZCAkYXJjZW5kKCRhKQoJICAgIGlmIHskdGQgfHwgJGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkJc2V0IHRvbWFyayBbbGlzdCAkZF0KCQlmb3Ige3NldCBqIDB9IHskaiA8IFtsbGVuZ3RoICR0b21hcmtdfSB7aW5jciBqfSB7CgkJICAgIHNldCBkZCBbbGluZGV4ICR0b21hcmsgJGpdCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIGhhc3RhZ2dlZGRlc2NlbmRlbnQoJGRkKV19IHsKCQkJaWYge1tpbmZvIGV4aXN0cyBkb25lKCRkZCldfSB7CgkJCSAgICBmb3JlYWNoIGIgJGFyY291dCgkZGQpIHsKCQkJCWlmIHtbaW5mbyBleGlzdHMgYXJjZW5kKCRiKV19IHsKCQkJCSAgICBsYXBwZW5kIHRvbWFyayAkYXJjZW5kKCRiKQoJCQkJfQoJCQkgICAgfQoJCQkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdsb2MoJGRkKV19IHsKCQkJCXVuc2V0IHRhZ2xvYygkZGQpCgkJCSAgICB9CgkJCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgcXVldWVkKCRkZCldfSB7CgkJCSAgICBpbmNyIG5jIC0xCgkJCX0KCQkJc2V0IGhhc3RhZ2dlZGRlc2NlbmRlbnQoJGRkKSAxCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIHF1ZXVlZCgkZCldfSB7CgkJbGFwcGVuZCB0b2RvICRkCgkJc2V0IHF1ZXVlZCgkZCkgMQoJCWlmIHshW2luZm8gZXhpc3RzIGhhc3RhZ2dlZGRlc2NlbmRlbnQoJGQpXX0gewoJCSAgICBpbmNyIG5jCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB0MiBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbG9vcGl4ICRpCiAgICBzZXQgdGFncyB7fQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgdGFnbG9jXSB7CglpZiB7IVtpbmZvIGV4aXN0cyBoYXN0YWdnZWRkZXNjZW5kZW50KCRpZCldfSB7CgkgICAgZm9yZWFjaCB0ICR0YWdsb2MoJGlkKSB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkdGFncyAkdF0gPCAwfSB7CgkJICAgIGxhcHBlbmQgdGFncyAkdAoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgIyByZW1vdmUgdGFncyB0aGF0IGFyZSBhbmNlc3RvcnMgb2Ygb3RoZXIgdGFncwogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdGFnc119IHtpbmNyIGl9IHsKCXNldCBhIFtsaW5kZXggJHRhZ3MgJGldCglmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CgkgICAgc2V0IGIgW2xpbmRleCAkdGFncyAkal0KCSAgICBzZXQgciBbYW5jX29yX2Rlc2MgJGEgJGJdCgkgICAgaWYgeyRyID09IC0xfSB7CgkJc2V0IHRhZ3MgW2xyZXBsYWNlICR0YWdzICRqICRqXQoJCWluY3IgaiAtMQoJCWluY3IgaSAtMQoJICAgIH0gZWxzZWlmIHskciA9PSAxfSB7CgkJc2V0IHRhZ3MgW2xyZXBsYWNlICR0YWdzICRpICRpXQoJCWluY3IgaSAtMQoJCWJyZWFrCgkgICAgfQoJfQogICAgfQoKICAgIGlmIHtbYXJyYXkgbmFtZXMgZ3Jvd2luZ10gbmUge319IHsKCSMgZ3JhcGggaXNuJ3QgZmluaXNoZWQsIG5lZWQgdG8gY2hlY2sgaWYgYW55IHRhZyBjb3VsZCBnZXQKCSMgZWNsaXBzZWQgYnkgYW5vdGhlciB0YWcgY29taW5nIGxhdGVyLiAgU2ltcGx5IGlnbm9yZSBhbnkKCSMgdGFncyB0aGF0IGNvdWxkIGxhdGVyIGdldCBlY2xpcHNlZC4KCXNldCBjdGFncyB7fQoJZm9yZWFjaCB0ICR0YWdzIHsKCSAgICBpZiB7W2lzX2NlcnRhaW4gJG9yaWdpZCAkdF19IHsKCQlsYXBwZW5kIGN0YWdzICR0CgkgICAgfQoJfQoJaWYgeyR0YWdzIGVxICRjdGFnc30gewoJICAgIHNldCBjYWNoZWRfYXRhZ3MoJG9yaWdpZCkgJHRhZ3MKCX0gZWxzZSB7CgkgICAgc2V0IHRhZ3MgJGN0YWdzCgl9CiAgICB9IGVsc2UgewoJc2V0IGNhY2hlZF9hdGFncygkb3JpZ2lkKSAkdGFncwogICAgfQogICAgc2V0IHQzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIGlmIHswICYmICR0MyAtICR0MSA+PSAxMDB9IHsKCXB1dHMgIml0ZXJhdGluZyBhbmNlc3RvcnMgKCRsb29waXgvW2xsZW5ndGggJHRvZG9dIG5vZGVzKSB0b29rXAogICAgCSAgICBbZXhwciB7JHQyLSR0MX1dK1tleHByIHskdDMtJHQyfV1tcywgJG5jIGNhbmRpZGF0ZXMgbGVmdCIKICAgIH0KICAgIHJldHVybiAkdGFncwp9CgojIFJldHVybiB0aGUgbGlzdCBvZiBJRHMgdGhhdCBoYXZlIGhlYWRzIHRoYXQgYXJlIGRlc2NlbmRlbnRzIG9mIGlkLAojIGluY2x1ZGluZyBpZCBpdHNlbGYgaWYgaXQgaGFzIGEgaGVhZC4KcHJvYyBkZXNjaGVhZHMge2lkfSB7CiAgICBnbG9iYWwgYXJjbm9zIGFyY3N0YXJ0IGFyY2lkcyBhcmNoZWFkcyBpZGhlYWRzIGNhY2hlZF9kaGVhZHMKICAgIGdsb2JhbCBhbGxwYXJlbnRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxscGFyZW50cygkaWQpXX0gewoJcmV0dXJuIHt9CiAgICB9CiAgICBzZXQgYXJldCB7fQogICAgaWYge1tsbGVuZ3RoICRhcmNub3MoJGlkKV0gPT0gMSAmJiBbbGxlbmd0aCAkYWxscGFyZW50cygkaWQpXSA9PSAxfSB7CgkjIHBhcnQtd2F5IGFsb25nIGFuIGFyYzsgY2hlY2sgaXQgZmlyc3QKCXNldCBhIFtsaW5kZXggJGFyY25vcygkaWQpIDBdCglpZiB7JGFyY2hlYWRzKCRhKSBuZSB7fX0gewoJICAgIHZhbGlkYXRlX2FyY2hlYWRzICRhCgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRhcmNpZHMoJGEpICRpZF0KCSAgICBmb3JlYWNoIHQgJGFyY2hlYWRzKCRhKSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRhcmNpZHMoJGEpICR0XQoJCWlmIHskaiA+ICRpfSBicmVhawoJCWxhcHBlbmQgYXJldCAkdAoJICAgIH0KCX0KCXNldCBpZCAkYXJjc3RhcnQoJGEpCiAgICB9CiAgICBzZXQgb3JpZ2lkICRpZAogICAgc2V0IHRvZG8gW2xpc3QgJGlkXQogICAgc2V0IHNlZW4oJGlkKSAxCiAgICBzZXQgcmV0IHt9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJHRvZG8gJGldCglpZiB7W2luZm8gZXhpc3RzIGNhY2hlZF9kaGVhZHMoJGlkKV19IHsKCSAgICBzZXQgcmV0IFtjb25jYXQgJHJldCAkY2FjaGVkX2RoZWFkcygkaWQpXQoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCQlsYXBwZW5kIHJldCAkaWQKCSAgICB9CgkgICAgZm9yZWFjaCBhICRhcmNub3MoJGlkKSB7CgkJaWYgeyRhcmNoZWFkcygkYSkgbmUge319IHsKCQkgICAgdmFsaWRhdGVfYXJjaGVhZHMgJGEKCQkgICAgaWYgeyRhcmNoZWFkcygkYSkgbmUge319IHsKCQkJc2V0IHJldCBbY29uY2F0ICRyZXQgJGFyY2hlYWRzKCRhKV0KCQkgICAgfQoJCX0KCQlzZXQgZCAkYXJjc3RhcnQoJGEpCgkJaWYgeyFbaW5mbyBleGlzdHMgc2VlbigkZCldfSB7CgkJICAgIGxhcHBlbmQgdG9kbyAkZAoJCSAgICBzZXQgc2VlbigkZCkgMQoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgcmV0IFtsc29ydCAtdW5pcXVlICRyZXRdCiAgICBzZXQgY2FjaGVkX2RoZWFkcygkb3JpZ2lkKSAkcmV0CiAgICByZXR1cm4gW2NvbmNhdCAkcmV0ICRhcmV0XQp9Cgpwcm9jIGFkZGVkdGFnIHtpZH0gewogICAgZ2xvYmFsIGFyY25vcyBhcmNvdXQgY2FjaGVkX2R0YWdzIGNhY2hlZF9hdGFncwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY25vcygkaWQpXX0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJGlkKV19IHsKCXJlY2FsY2FyYyBbbGluZGV4ICRhcmNub3MoJGlkKSAwXQogICAgfQogICAgY2F0Y2gge3Vuc2V0IGNhY2hlZF9kdGFnc30KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfYXRhZ3N9Cn0KCnByb2MgYWRkZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGFyY25vcyBhcmNvdXQgY2FjaGVkX2RoZWFkcwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY25vcygkaGlkKV19IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRoaWQpXX0gewoJcmVjYWxjYXJjIFtsaW5kZXggJGFyY25vcygkaGlkKSAwXQogICAgfQogICAgY2F0Y2gge3Vuc2V0IGNhY2hlZF9kaGVhZHN9Cn0KCnByb2MgcmVtb3ZlZGhlYWQge2hpZCBoZWFkfSB7CiAgICBnbG9iYWwgY2FjaGVkX2RoZWFkcwoKICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfZGhlYWRzfQp9Cgpwcm9jIG1vdmVkaGVhZCB7aGlkIGhlYWR9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjb3V0IGNhY2hlZF9kaGVhZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNub3MoJGhpZCldfSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY291dCgkaGlkKV19IHsKCXJlY2FsY2FyYyBbbGluZGV4ICRhcmNub3MoJGhpZCkgMF0KICAgIH0KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfZGhlYWRzfQp9Cgpwcm9jIGNoYW5nZWRyZWZzIHt9IHsKICAgIGdsb2JhbCBjYWNoZWRfZGhlYWRzIGNhY2hlZF9kdGFncyBjYWNoZWRfYXRhZ3MKICAgIGdsb2JhbCBhcmN0YWdzIGFyY2hlYWRzIGFyY25vcyBhcmNvdXQgaWRoZWFkcyBpZHRhZ3MKCiAgICBmb3JlYWNoIGlkIFtjb25jYXQgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZHRhZ3NdXSB7CglpZiB7W2luZm8gZXhpc3RzIGFyY25vcygkaWQpXSAmJiAhW2luZm8gZXhpc3RzIGFyY291dCgkaWQpXX0gewoJICAgIHNldCBhIFtsaW5kZXggJGFyY25vcygkaWQpIDBdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZG9uZWFyYygkYSldfSB7CgkJcmVjYWxjYXJjICRhCgkJc2V0IGRvbmVhcmMoJGEpIDEKCSAgICB9Cgl9CiAgICB9CiAgICBjYXRjaCB7dW5zZXQgY2FjaGVkX2R0YWdzfQogICAgY2F0Y2gge3Vuc2V0IGNhY2hlZF9hdGFnc30KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfZGhlYWRzfQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICByZWFkcmVmcwogICAgY2hhbmdlZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2IHx8CgkgICAgKCRpZCBlcSAkb2xkbWFpbmhlYWQgJiYgJGlkIG5lICRtYWluaGVhZCkgfHwKCSAgICAoJGlkIGVxICRtYWluaGVhZCAmJiAkaWQgbmUgJG9sZG1haW5oZWFkKX0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9CiAgICBydW4gcmVmaWxsX3JlZmxpc3QKfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyBzaG93dGFnIHt0YWcgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bSB0YWdvYmppZAoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCWNhdGNoIHsKCSAgICBzZXQgdGFnY29udGVudHMoJHRhZykgW2V4ZWMgZ2l0IGNhdC1maWxlIHRhZyAkdGFnb2JqaWQoJHRhZyldCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0IHt9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGluaXRfZmxpc3Qge30KfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgc2F2ZXN0dWZmIC4KICAgIGRlc3Ryb3kgLgp9Cgpwcm9jIGRvcHJlZnMge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzIHNob3dsb2NhbGNoYW5nZXMKICAgIGdsb2JhbCBiZ2NvbG9yIGZnY29sb3IgY3RleHQgZGlmZmNvbG9ycyBzZWxlY3RiZ2NvbG9yCiAgICBnbG9iYWwgdWlmb250IHRhYnN0b3AKCiAgICBzZXQgdG9wIC5naXRrcHJlZnMKICAgIHNldCBwcmVmc3RvcCAkdG9wCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFncyBzaG93bG9jYWxjaGFuZ2VzfSB7CglzZXQgb2xkcHJlZnMoJHYpIFtzZXQgJHZdCiAgICB9CiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICJHaXRrIHByZWZlcmVuY2VzIgogICAgbGFiZWwgJHRvcC5sZGlzcCAtdGV4dCAiQ29tbWl0IGxpc3QgZGlzcGxheSBvcHRpb25zIgogICAgJHRvcC5sZGlzcCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLmxkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLnNwYWNlciAtdGV4dCAiICIKICAgIGxhYmVsICR0b3AubWF4d2lkdGhsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoIChsaW5lcykiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXh3aWR0aCAtZnJvbSAwIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXh3aWR0aAogICAgZ3JpZCAkdG9wLnNwYWNlciAkdG9wLm1heHdpZHRobCAkdG9wLm1heHdpZHRoIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5tYXhwY3RsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoICglIG9mIHBhbmUpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4cGN0IC1mcm9tIDEgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heGdyYXBocGN0CiAgICBncmlkIHggJHRvcC5tYXhwY3RsICR0b3AubWF4cGN0IC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5zaG93bG9jYWwKICAgIGxhYmVsICR0b3Auc2hvd2xvY2FsLmwgLXRleHQgIlNob3cgbG9jYWwgY2hhbmdlcyIgLWZvbnQgb3B0aW9uZm9udAogICAgY2hlY2tidXR0b24gJHRvcC5zaG93bG9jYWwuYiAtdmFyaWFibGUgc2hvd2xvY2FsY2hhbmdlcwogICAgcGFjayAkdG9wLnNob3dsb2NhbC5iICR0b3Auc2hvd2xvY2FsLmwgLXNpZGUgbGVmdAogICAgZ3JpZCB4ICR0b3Auc2hvd2xvY2FsIC1zdGlja3kgdwoKICAgIGxhYmVsICR0b3AuZGRpc3AgLXRleHQgIkRpZmYgZGlzcGxheSBvcHRpb25zIgogICAgJHRvcC5kZGlzcCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLmRkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmRpZmZvcHRsIC10ZXh0ICJPcHRpb25zIGZvciBkaWZmIHByb2dyYW0iIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIGVudHJ5ICR0b3AuZGlmZm9wdCAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBkaWZmb3B0cwogICAgZ3JpZCB4ICR0b3AuZGlmZm9wdGwgJHRvcC5kaWZmb3B0IC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5udGFnCiAgICBsYWJlbCAkdG9wLm50YWcubCAtdGV4dCAiRGlzcGxheSBuZWFyYnkgdGFncyIgLWZvbnQgb3B0aW9uZm9udAogICAgY2hlY2tidXR0b24gJHRvcC5udGFnLmIgLXZhcmlhYmxlIHNob3duZWFydGFncwogICAgcGFjayAkdG9wLm50YWcuYiAkdG9wLm50YWcubCAtc2lkZSBsZWZ0CiAgICBncmlkIHggJHRvcC5udGFnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50YWJzdG9wbCAtdGV4dCAidGFic3RvcCIgLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLnRhYnN0b3AgLWZyb20gMSAtdG8gMjAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSB0YWJzdG9wCiAgICBncmlkIHggJHRvcC50YWJzdG9wbCAkdG9wLnRhYnN0b3AgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5jZGlzcCAtdGV4dCAiQ29sb3JzOiBwcmVzcyB0byBjaG9vc2UiCiAgICAkdG9wLmNkaXNwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBncmlkICR0b3AuY2Rpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuYmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRiZ2NvbG9yCiAgICBidXR0b24gJHRvcC5iZ2J1dCAtdGV4dCAiQmFja2dyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBiZ2NvbG9yIDAgJHRvcC5iZyBiYWNrZ3JvdW5kIHNldGJnXQogICAgZ3JpZCB4ICR0b3AuYmdidXQgJHRvcC5iZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRmZ2NvbG9yCiAgICBidXR0b24gJHRvcC5mZ2J1dCAtdGV4dCAiRm9yZWdyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBmZ2NvbG9yIDAgJHRvcC5mZyBmb3JlZ3JvdW5kIHNldGZnXQogICAgZ3JpZCB4ICR0b3AuZmdidXQgJHRvcC5mZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZGlmZm9sZCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAwXQogICAgYnV0dG9uICR0b3AuZGlmZm9sZGJ1dCAtdGV4dCAiRGlmZjogb2xkIGxpbmVzIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMCAkdG9wLmRpZmZvbGQgImRpZmYgb2xkIGxpbmVzIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlZ3JvdW5kXV0KICAgIGdyaWQgeCAkdG9wLmRpZmZvbGRidXQgJHRvcC5kaWZmb2xkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmbmV3IC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICBidXR0b24gJHRvcC5kaWZmbmV3YnV0IC10ZXh0ICJEaWZmOiBuZXcgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAxICR0b3AuZGlmZm5ldyAiZGlmZiBuZXcgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm5ld2J1dCAkdG9wLmRpZmZuZXcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmh1bmtzZXAgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgIGJ1dHRvbiAkdG9wLmh1bmtzZXBidXQgLXRleHQgIkRpZmY6IGh1bmsgaGVhZGVyIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMiAkdG9wLmh1bmtzZXAgXAoJCSAgICAgICJkaWZmIGh1bmsgaGVhZGVyIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuaHVua3NlcGJ1dCAkdG9wLmh1bmtzZXAgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnNlbGJnc2VwIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvcgogICAgYnV0dG9uICR0b3Auc2VsYmdidXQgLXRleHQgIlNlbGVjdCBiZyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBzZWxlY3RiZ2NvbG9yIDAgJHRvcC5zZWxiZ3NlcCBiYWNrZ3JvdW5kIHNldHNlbGJnXQogICAgZ3JpZCB4ICR0b3Auc2VsYmdidXQgJHRvcC5zZWxiZ3NlcCAtc3RpY2t5IHcKCiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rIC1kZWZhdWx0IGFjdGl2ZQogICAgJHRvcC5idXRzLm9rIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBwcmVmc2NhbiAtZGVmYXVsdCBub3JtYWwKICAgICR0b3AuYnV0cy5jYW4gY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGJpbmQgJHRvcCA8VmlzaWJpbGl0eT4gImZvY3VzICR0b3AuYnV0cy5vayIKfQoKcHJvYyBjaG9vc2Vjb2xvciB7diB2aSB3IHggY21kfSB7CiAgICBnbG9iYWwgJHYKCiAgICBzZXQgYyBbdGtfY2hvb3NlQ29sb3IgLWluaXRpYWxjb2xvciBbbGluZGV4IFtzZXQgJHZdICR2aV0gXAoJICAgICAgIC10aXRsZSAiR2l0azogY2hvb3NlIGNvbG9yIGZvciAkeCJdCiAgICBpZiB7JGMgZXEge319IHJldHVybgogICAgJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgbHNldCAkdiAkdmkgJGMKICAgIGV2YWwgJGNtZCAkYwp9Cgpwcm9jIHNldHNlbGJnIHtjfSB7CiAgICBnbG9iYWwgYmdsaXN0IGNmbGlzdAogICAgZm9yZWFjaCB3ICRiZ2xpc3QgewoJJHcgY29uZmlndXJlIC1zZWxlY3RiYWNrZ3JvdW5kICRjCiAgICB9CiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgaGlnaGxpZ2h0IFwKCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCiAgICBhbGxjYW52cyBpdGVtY29uZiBzZWNzZWwgLWZpbGwgJGMKfQoKcHJvYyBzZXRiZyB7Y30gewogICAgZ2xvYmFsIGJnbGlzdAoKICAgIGZvcmVhY2ggdyAkYmdsaXN0IHsKCSR3IGNvbmYgLWJhY2tncm91bmQgJGMKICAgIH0KfQoKcHJvYyBzZXRmZyB7Y30gewogICAgZ2xvYmFsIGZnbGlzdCBjYW52CgogICAgZm9yZWFjaCB3ICRmZ2xpc3QgewoJJHcgY29uZiAtZm9yZWdyb3VuZCAkYwogICAgfQogICAgYWxsY2FudnMgaXRlbWNvbmYgdGV4dCAtZmlsbCAkYwogICAgJGNhbnYgaXRlbWNvbmYgY2lyY2xlIC1vdXRsaW5lICRjCn0KCnByb2MgcHJlZnNjYW4ge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzIHNob3dsb2NhbGNoYW5nZXMKCiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFncyBzaG93bG9jYWxjaGFuZ2VzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncyBzaG93bG9jYWxjaGFuZ2VzCiAgICBnbG9iYWwgY2hhcnNwYyBjdGV4dCB0YWJzdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKICAgICRjdGV4dCBjb25maWd1cmUgLXRhYnMgIltleHByIHskdGFic3RvcCAqICRjaGFyc3BjfV0iCiAgICBpZiB7JHNob3dsb2NhbGNoYW5nZXMgIT0gJG9sZHByZWZzKHNob3dsb2NhbGNoYW5nZXMpfSB7CglpZiB7JHNob3dsb2NhbGNoYW5nZXN9IHsKCSAgICBkb3Nob3dsb2NhbGNoYW5nZXMKCX0gZWxzZSB7CgkgICAgZG9oaWRlbG9jYWxjaGFuZ2VzCgl9CiAgICB9CiAgICBpZiB7JG1heHdpZHRoICE9ICRvbGRwcmVmcyhtYXh3aWR0aCkKCXx8ICRtYXhncmFwaHBjdCAhPSAkb2xkcHJlZnMobWF4Z3JhcGhwY3QpfSB7CglyZWRpc3BsYXkKICAgIH0gZWxzZWlmIHskc2hvd25lYXJ0YWdzICE9ICRvbGRwcmVmcyhzaG93bmVhcnRhZ3MpfSB7CglyZXNlbGVjdGxpbmUKICAgIH0KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICBnbG9iYWwgZGF0ZXRpbWVmb3JtYXQKICAgIGlmIHskZCBuZSB7fX0gewoJc2V0IGQgW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICRkYXRldGltZWZvcm1hdF0KICAgIH0KICAgIHJldHVybiAkZAp9CgojIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQojIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMuCiMgTm90IGFsbCBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQgYnkgVGNsLgpzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CiAgICB7IEFOU0lfWDMuNC0xOTY4IGlzby1pci02IEFOU0lfWDMuNC0xOTg2IElTT182NDYuaXJ2OjE5OTEgQVNDSUkKICAgICAgSVNPNjQ2LVVTIFVTLUFTQ0lJIHVzIElCTTM2NyBjcDM2NyBjc0FTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KICAgIHsgSVNPXzY0Ni5iYXNpYzoxOTgzIHJlZiBjc0lTTzY0NmJhc2ljMTk4MyB9CiAgICB7IElOVkFSSUFOVCBjc0lOVkFSSUFOVCB9CiAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KICAgIHsgQlNfNDczMCBpc28taXItNCBJU082NDYtR0IgZ2IgdWsgY3NJU080VW5pdGVkS2luZ2RvbSB9CiAgICB7IE5BVFMtU0VGSSBpc28taXItOC0xIGNzTkFUU1NFRkkgfQogICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CiAgICB7IE5BVFMtREFOTyBpc28taXItOS0xIGNzTkFUU0RBTk8gfQogICAgeyBOQVRTLURBTk8tQUREIGlzby1pci05LTIgY3NOQVRTREFOT0FERCB9CiAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CiAgICB7IFNFTl84NTAyMDBfQyBpc28taXItMTEgSVNPNjQ2LVNFMiBzZTIgY3NJU08xMVN3ZWRpc2hGb3JOYW1lcyB9CiAgICB7IEtTX0NfNTYwMS0xOTg3IGlzby1pci0xNDkgS1NfQ181NjAxLTE5ODkgS1NDXzU2MDEga29yZWFuIGNzS1NDNTYwMTE5ODcgfQogICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CiAgICB7IEVVQy1LUiBjc0VVQ0tSIH0KICAgIHsgSVNPLTIwMjItSlAgY3NJU08yMDIySlAgfQogICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CiAgICB7IEpJU19DNjIyMC0xOTY5LWpwIEpJU19DNjIyMC0xOTY5IGlzby1pci0xMyBrYXRha2FuYSB4MDIwMS03CiAgICAgIGNzSVNPMTNKSVNDNjIyMGpwIH0KICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CiAgICB7IElUIGlzby1pci0xNSBJU082NDYtSVQgY3NJU08xNUl0YWxpYW4gfQogICAgeyBQVCBpc28taXItMTYgSVNPNjQ2LVBUIGNzSVNPMTZQb3J0dWd1ZXNlIH0KICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CiAgICB7IGdyZWVrNy1vbGQgaXNvLWlyLTE4IGNzSVNPMThHcmVlazdPbGQgfQogICAgeyBsYXRpbi1ncmVlayBpc28taXItMTkgY3NJU08xOUxhdGluR3JlZWsgfQogICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KICAgIHsgTkZfWl82Mi0wMTBfKDE5NzMpIGlzby1pci0yNSBJU082NDYtRlIxIGNzSVNPMjVGcmVuY2ggfQogICAgeyBMYXRpbi1ncmVlay0xIGlzby1pci0yNyBjc0lTTzI3TGF0aW5HcmVlazEgfQogICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQogICAgeyBKSVNfQzYyMjYtMTk3OCBpc28taXItNDIgY3NJU080MkpJU0M2MjI2MTk3OCB9CiAgICB7IEJTX3ZpZXdkYXRhIGlzby1pci00NyBjc0lTTzQ3QlNWaWV3ZGF0YSB9CiAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KICAgIHsgSU5JUy04IGlzby1pci01MCBjc0lTTzUwSU5JUzggfQogICAgeyBJTklTLWN5cmlsbGljIGlzby1pci01MSBjc0lTTzUxSU5JU0N5cmlsbGljIH0KICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CiAgICB7IElTT181NDI4OjE5ODAgaXNvLWlyLTU1IGNzSVNPNTQyOEdyZWVrIH0KICAgIHsgR0JfMTk4OC04MCBpc28taXItNTcgY24gSVNPNjQ2LUNOIGNzSVNPNTdHQjE5ODggfQogICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CiAgICB7IE5TXzQ1NTEtMSBpc28taXItNjAgSVNPNjQ2LU5PIG5vIGNzSVNPNjBEYW5pc2hOb3J3ZWdpYW4KICAgICAgY3NJU082ME5vcndlZ2lhbjEgfQogICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KICAgIHsgTkZfWl82Mi0wMTAgaXNvLWlyLTY5IElTTzY0Ni1GUiBmciBjc0lTTzY5RnJlbmNoIH0KICAgIHsgdmlkZW90ZXgtc3VwcGwgaXNvLWlyLTcwIGNzSVNPNzBWaWRlb3RleFN1cHAxIH0KICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CiAgICB7IEVTMiBpc28taXItODUgSVNPNjQ2LUVTMiBjc0lTTzg1U3BhbmlzaDIgfQogICAgeyBNU1pfNzc5NS4zIGlzby1pci04NiBJU082NDYtSFUgaHUgY3NJU084Nkh1bmdhcmlhbiB9CiAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQogICAgeyBncmVlazcgaXNvLWlyLTg4IGNzSVNPODhHcmVlazcgfQogICAgeyBBU01PXzQ0OSBJU09fOTAzNiBhcmFiaWM3IGlzby1pci04OSBjc0lTTzg5QVNNTzQ0OSB9CiAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYSBpc28taXItOTEganAtb2NyLWEgY3NJU085MUpJU0M2MjI5MTk4NGEgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iIGlzby1pci05MiBJU082NDYtSlAtT0NSLUIganAtb2NyLWIKICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iLWFkZCBpc28taXItOTMganAtb2NyLWItYWRkIGNzSVNPOTNKSVM2MjI5MTk4NGJhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kIGlzby1pci05NCBqcC1vY3ItaGFuZCBjc0lTTzk0SklTNjIyOTE5ODRoYW5kIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAogICAgICBjc0lTTzk1SklTNjIyOTE5ODRoYW5kYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQta2FuYSBpc28taXItOTYgY3NJU085NkpJU0M2MjI5MTk4NGthbmEgfQogICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CiAgICB7IEFOU0lfWDMuMTEwLTE5ODMgaXNvLWlyLTk5IENTQV9UNTAwLTE5ODMgTkFQTFBTIGNzSVNPOTlOQVBMUFMgfQogICAgeyBJU09fODg1OS0xOjE5ODcgaXNvLWlyLTEwMCBJU09fODg1OS0xIElTTy04ODU5LTEgbGF0aW4xIGwxIElCTTgxOQogICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CiAgICB7IElTT184ODU5LTI6MTk4NyBpc28taXItMTAxIElTT184ODU5LTIgSVNPLTg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgfQogICAgeyBULjYxLTdiaXQgaXNvLWlyLTEwMiBjc0lTTzEwMlQ2MTdiaXQgfQogICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CiAgICB7IElTT184ODU5LTM6MTk4OCBpc28taXItMTA5IElTT184ODU5LTMgSVNPLTg4NTktMyBsYXRpbjMgbDMgY3NJU09MYXRpbjMgfQogICAgeyBJU09fODg1OS00OjE5ODggaXNvLWlyLTExMCBJU09fODg1OS00IElTTy04ODU5LTQgbGF0aW40IGw0IGNzSVNPTGF0aW40IH0KICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0xIGlzby1pci0xMjEgSVNPNjQ2LUNBIGNzYTctMSBjYSBjc0lTTzEyMUNhbmFkaWFuMSB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0yIGlzby1pci0xMjIgSVNPNjQ2LUNBMiBjc2E3LTIgY3NJU08xMjJDYW5hZGlhbjIgfQogICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KICAgIHsgSVNPXzg4NTktNjoxOTg3IGlzby1pci0xMjcgSVNPXzg4NTktNiBJU08tODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4CiAgICAgIGFyYWJpYyBjc0lTT0xhdGluQXJhYmljIH0KICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CiAgICB7IElTT184ODU5LTYtSSBjc0lTTzg4NTk2SSBJU08tODg1OS02LUkgfQogICAgeyBJU09fODg1OS03OjE5ODcgaXNvLWlyLTEyNiBJU09fODg1OS03IElTTy04ODU5LTcgRUxPVF85MjggRUNNQS0xMTgKICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CiAgICB7IFQuMTAxLUcyIGlzby1pci0xMjggY3NJU08xMjhUMTAxRzIgfQogICAgeyBJU09fODg1OS04OjE5ODggaXNvLWlyLTEzOCBJU09fODg1OS04IElTTy04ODU5LTggaGVicmV3CiAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQogICAgeyBJU09fODg1OS04LUUgY3NJU084ODU5OEUgSVNPLTg4NTktOC1FIH0KICAgIHsgSVNPXzg4NTktOC1JIGNzSVNPODg1OThJIElTTy04ODU5LTgtSSB9CiAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CiAgICB7IEpVU19JLkIxLjAwMiBpc28taXItMTQxIElTTzY0Ni1ZVSBqcyB5dSBjc0lTTzE0MUpVU0lCMTAwMiB9CiAgICB7IElTT182OTM3LTItYWRkIGlzby1pci0xNDIgY3NJU09UZXh0Q29tbSB9CiAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CiAgICB7IElTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgSVNPLTg4NTktNSBjeXJpbGxpYwogICAgICBjc0lTT0xhdGluQ3lyaWxsaWMgfQogICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KICAgIHsgSlVTX0kuQjEuMDAzLW1hYyBtYWNlZG9uaWFuIGlzby1pci0xNDcgY3NJU08xNDdNYWNlZG9uaWFuIH0KICAgIHsgSVNPXzg4NTktOToxOTg5IGlzby1pci0xNDggSVNPXzg4NTktOSBJU08tODg1OS05IGxhdGluNSBsNSBjc0lTT0xhdGluNSB9CiAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KICAgIHsgTkNfTkMwMC0xMDo4MSBjdWJhIGlzby1pci0xNTEgSVNPNjQ2LUNVIGNzSVNPMTUxQ3ViYSB9CiAgICB7IElTT182OTM3LTItMjUgaXNvLWlyLTE1MiBjc0lTTzY5MzdBZGQgfQogICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KICAgIHsgSVNPXzg4NTktc3VwcCBpc28taXItMTU0IGxhdGluMS0yLTUgY3NJU084ODU5U3VwcCB9CiAgICB7IElTT18xMDM2Ny1ib3ggaXNvLWlyLTE1NSBjc0lTTzEwMzY3Qm94IH0KICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CiAgICB7IGxhdGluLWxhcCBsYXAgaXNvLWlyLTE1OCBjc0lTTzE1OExhcCB9CiAgICB7IEpJU19YMDIxMi0xOTkwIHgwMjEyIGlzby1pci0xNTkgY3NJU08xNTlKSVNYMDIxMjE5OTAgfQogICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQogICAgeyB1cy1kayBjc1VTREsgfQogICAgeyBkay11cyBjc0RLVVMgfQogICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CiAgICB7IEtTQzU2MzYgSVNPNjQ2LUtSIGNzS1NDNTYzNiB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtMiBjc1VuaWNvZGUgfQogICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KICAgIHsgREVDLU1DUyBkZWMgY3NERUNNQ1MgfQogICAgeyBocC1yb21hbjggcm9tYW44IHI4IGNzSFBSb21hbjggfQogICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KICAgIHsgSUJNMDM3IGNwMDM3IGViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubAogICAgICBjc0lCTTAzNyB9CiAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KICAgIHsgSUJNMjczIENQMjczIGNzSUJNMjczIH0KICAgIHsgSUJNMjc0IEVCQ0RJQy1CRSBDUDI3NCBjc0lCTTI3NCB9CiAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQogICAgeyBJQk0yNzcgRUJDRElDLUNQLURLIEVCQ0RJQy1DUC1OTyBjc0lCTTI3NyB9CiAgICB7IElCTTI3OCBDUDI3OCBlYmNkaWMtY3AtZmkgZWJjZGljLWNwLXNlIGNzSUJNMjc4IH0KICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CiAgICB7IElCTTI4MSBFQkNESUMtSlAtRSBjcDI4MSBjc0lCTTI4MSB9CiAgICB7IElCTTI4NCBDUDI4NCBlYmNkaWMtY3AtZXMgY3NJQk0yODQgfQogICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KICAgIHsgSUJNMjkwIGNwMjkwIEVCQ0RJQy1KUC1rYW5hIGNzSUJNMjkwIH0KICAgIHsgSUJNMjk3IGNwMjk3IGViY2RpYy1jcC1mciBjc0lCTTI5NyB9CiAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KICAgIHsgSUJNNDIzIGNwNDIzIGViY2RpYy1jcC1nciBjc0lCTTQyMyB9CiAgICB7IElCTTQyNCBjcDQyNCBlYmNkaWMtY3AtaGUgY3NJQk00MjQgfQogICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQogICAgeyBJQk01MDAgQ1A1MDAgZWJjZGljLWNwLWJlIGViY2RpYy1jcC1jaCBjc0lCTTUwMCB9CiAgICB7IElCTTc3NSBjcDc3NSBjc1BDNzc1QmFsdGljIH0KICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KICAgIHsgSUJNODUxIGNwODUxIDg1MSBjc0lCTTg1MSB9CiAgICB7IElCTTg1MiBjcDg1MiA4NTIgY3NQQ3A4NTIgfQogICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KICAgIHsgSUJNODU3IGNwODU3IDg1NyBjc0lCTTg1NyB9CiAgICB7IElCTTg2MCBjcDg2MCA4NjAgY3NJQk04NjAgfQogICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KICAgIHsgSUJNODYyIGNwODYyIDg2MiBjc1BDODYyTGF0aW5IZWJyZXcgfQogICAgeyBJQk04NjMgY3A4NjMgODYzIGNzSUJNODYzIH0KICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KICAgIHsgSUJNODY1IGNwODY1IDg2NSBjc0lCTTg2NSB9CiAgICB7IElCTTg2NiBjcDg2NiA4NjYgY3NJQk04NjYgfQogICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQogICAgeyBJQk04NjkgY3A4NjkgODY5IGNwLWdyIGNzSUJNODY5IH0KICAgIHsgSUJNODcwIENQODcwIGViY2RpYy1jcC1yb2VjZSBlYmNkaWMtY3AteXUgY3NJQk04NzAgfQogICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KICAgIHsgSUJNODgwIGNwODgwIEVCQ0RJQy1DeXJpbGxpYyBjc0lCTTg4MCB9CiAgICB7IElCTTg5MSBjcDg5MSBjc0lCTTg5MSB9CiAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CiAgICB7IElCTTkwNCBjcDkwNCA5MDQgY3NJQkJNOTA0IH0KICAgIHsgSUJNOTA1IENQOTA1IGViY2RpYy1jcC10ciBjc0lCTTkwNSB9CiAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KICAgIHsgSUJNMTAyNiBDUDEwMjYgY3NJQk0xMDI2IH0KICAgIHsgRUJDRElDLUFULURFIGNzSUJNRUJDRElDQVRERSB9CiAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQogICAgeyBFQkNESUMtQ0EtRlIgY3NFQkNESUNDQUZSIH0KICAgIHsgRUJDRElDLURLLU5PIGNzRUJDRElDREtOTyB9CiAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQogICAgeyBFQkNESUMtRkktU0UgY3NFQkNESUNGSVNFIH0KICAgIHsgRUJDRElDLUZJLVNFLUEgY3NFQkNESUNGSVNFQSB9CiAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KICAgIHsgRUJDRElDLUlUIGNzRUJDRElDSVQgfQogICAgeyBFQkNESUMtUFQgY3NFQkNESUNQVCB9CiAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KICAgIHsgRUJDRElDLUVTLUEgY3NFQkNESUNFU0EgfQogICAgeyBFQkNESUMtRVMtUyBjc0VCQ0RJQ0VTUyB9CiAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KICAgIHsgRUJDRElDLVVTIGNzRUJDRElDVVMgfQogICAgeyBVTktOT1dOLThCSVQgY3NVbmtub3duOEJpVCB9CiAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQogICAgeyBNTkVNIGNzTW5lbSB9CiAgICB7IFZJU0NJSSBjc1ZJU0NJSSB9CiAgICB7IFZJUVIgY3NWSVFSIH0KICAgIHsgS09JOC1SIGNzS09JOFIgfQogICAgeyBJQk0wMDg1OCBDQ1NJRDAwODU4IENQMDA4NTggUEMtTXVsdGlsaW5ndWFsLTg1MCtldXJvIH0KICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQogICAgeyBJQk0wMTE0MCBDQ1NJRDAxMTQwIENQMDExNDAgZWJjZGljLXVzLTM3K2V1cm8gfQogICAgeyBJQk0wMTE0MSBDQ1NJRDAxMTQxIENQMDExNDEgZWJjZGljLWRlLTI3MytldXJvIH0KICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQogICAgeyBJQk0wMTE0MyBDQ1NJRDAxMTQzIENQMDExNDMgZWJjZGljLWZpLTI3OCtldXJvIGViY2RpYy1zZS0yNzgrZXVybyB9CiAgICB7IElCTTAxMTQ0IENDU0lEMDExNDQgQ1AwMTE0NCBlYmNkaWMtaXQtMjgwK2V1cm8gfQogICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KICAgIHsgSUJNMDExNDYgQ0NTSUQwMTE0NiBDUDAxMTQ2IGViY2RpYy1nYi0yODUrZXVybyB9CiAgICB7IElCTTAxMTQ3IENDU0lEMDExNDcgQ1AwMTE0NyBlYmNkaWMtZnItMjk3K2V1cm8gfQogICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQogICAgeyBJQk0wMTE0OSBDQ1NJRDAxMTQ5IENQMDExNDkgZWJjZGljLWlzLTg3MStldXJvIH0KICAgIHsgSUJNMTA0NyBJQk0tMTA0NyB9CiAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KICAgIHsgQW1pZ2EtMTI1MSBBbWkxMjUxIEFtaWdhMTI1MSBBbWktMTI1MSB9CiAgICB7IFVOSUNPREUtMS0xIGNzVW5pY29kZTExIH0KICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KICAgIHsgQk9DVS0xIGNzQk9DVS0xIH0KICAgIHsgVU5JQ09ERS0xLTEtVVRGLTcgY3NVbmljb2RlMTFVVEY3IH0KICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCiAgICAgIGw4IH0KICAgIHsgSVNPLTg4NTktMTUgSVNPXzg4NTktMTUgTGF0aW4tOSB9CiAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CiAgICB7IEdCSyBDUDkzNiBNUzkzNiB3aW5kb3dzLTkzNiB9CiAgICB7IEpJU19FbmNvZGluZyBjc0pJU0VuY29kaW5nIH0KICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UgY3NFVUNQa2RGbXRKYXBhbmVzZQogICAgICBFVUMtSlAgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQogICAgeyBJU08tMTA2NDYtVUNTLUJhc2ljIGNzVW5pY29kZUFTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xIGNzVW5pY29kZUxhdGluMSBJU08tMTA2NDYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjggY3NVbmljb2RlSUJNMTI2OCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjc2IGNzVW5pY29kZUlCTTEyNzYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjUgY3NVbmljb2RlSUJNMTI2NSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSBjc1dpbmRvd3MzMExhdGluMSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CiAgICB7IElTTy04ODU5LTItV2luZG93cy1MYXRpbi0yIGNzV2luZG93czMxTGF0aW4yIH0KICAgIHsgSVNPLTg4NTktOS1XaW5kb3dzLUxhdGluLTUgY3NXaW5kb3dzMzFMYXRpbjUgfQogICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CiAgICB7IFZlbnR1cmEtVVMgY3NWZW50dXJhVVMgfQogICAgeyBWZW50dXJhLUludGVybmF0aW9uYWwgY3NWZW50dXJhSW50ZXJuYXRpb25hbCB9CiAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KICAgIHsgUEM4LVR1cmtpc2ggY3NQQzhUdXJraXNoIH0KICAgIHsgSUJNLVN5bWJvbHMgY3NJQk1TeW1ib2xzIH0KICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KICAgIHsgSFAtTGVnYWwgY3NIUExlZ2FsIH0KICAgIHsgSFAtUGktZm9udCBjc0hQUGlGb250IH0KICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KICAgIHsgQWRvYmUtU3ltYm9sLUVuY29kaW5nIGNzSFBQU01hdGggfQogICAgeyBIUC1EZXNrVG9wIGNzSFBEZXNrdG9wIH0KICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQogICAgeyBNaWNyb3NvZnQtUHVibGlzaGluZyBjc01pY3Jvc29mdFB1Ymxpc2hpbmcgfQogICAgeyBXaW5kb3dzLTMxSiBjc1dpbmRvd3MzMUogfQogICAgeyBHQjIzMTIgY3NHQjIzMTIgfQogICAgeyBCaWc1IGNzQmlnNSB9Cn0KCnByb2MgdGNsX2VuY29kaW5nIHtlbmN9IHsKICAgIGdsb2JhbCBlbmNvZGluZ19hbGlhc2VzCiAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQogICAgc2V0IGxjbmFtZXMgW3N0cmluZyB0b2xvd2VyICRuYW1lc10KICAgIHNldCBlbmMgW3N0cmluZyB0b2xvd2VyICRlbmNdCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KICAgIGlmIHskaSA8IDB9IHsKCSMgbG9vayBmb3IgImlzb25ubiIgaW5zdGVhZCBvZiAiaXNvLW5ubiIgb3IgImlzb19ubm4iCglpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmN4XQoJfQogICAgfQogICAgaWYgeyRpIDwgMH0gewoJZm9yZWFjaCBsICRlbmNvZGluZ19hbGlhc2VzIHsKCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGxsICRlbmNdIDwgMH0gY29udGludWUKCSAgICAjIGxvb2sgdGhyb3VnaCB0aGUgYWxpYXNlcyBmb3Igb25lIHRoYXQgdGNsIGtub3dzIGFib3V0CgkgICAgZm9yZWFjaCBlICRsbCB7CgkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlXQoJCWlmIHskaSA8IDB9IHsKCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CgkJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZXhdCgkJICAgIH0KCQl9CgkJaWYgeyRpID49IDB9IGJyZWFrCgkgICAgfQoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBpZiB7JGkgPj0gMH0gewoJcmV0dXJuIFtsaW5kZXggJG5hbWVzICRpXQogICAgfQogICAgcmV0dXJuIHt9Cn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdCBkaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBnaXRlbmNvZGluZyB7fQpjYXRjaCB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgW2V4ZWMgZ2l0IGNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQp9CmlmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCn0Kc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQppZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CiAgICBwdXRzIHN0ZGVyciAiV2FybmluZzogZW5jb2RpbmcgJGdpdGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVGNsL1RrIgp9CgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IHVpZm9udCB7SGVsdmV0aWNhIDkgYm9sZH0Kc2V0IHRhYnN0b3AgOApzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMApzZXQgdXBhcnJvd2xlbiA3CnNldCBkb3duYXJyb3dsZW4gNwpzZXQgbWluZ2FwbGVuIDMwCnNldCBjbWl0bW9kZSAicGF0Y2giCnNldCB3cmFwY29tbWVudCAibm9uZSIKc2V0IHNob3duZWFydGFncyAxCnNldCBtYXhyZWZzIDIwCnNldCBtYXhsaW5lbGVuIDIwMApzZXQgc2hvd2xvY2FsY2hhbmdlcyAxCnNldCBkYXRldGltZWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0Kc2V0IGJnY29sb3Igd2hpdGUKc2V0IGZnY29sb3IgYmxhY2sKc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0Kc2V0IGRpZmZjb250ZXh0IDMKc2V0IHNlbGVjdGJnY29sb3IgZ3JheTg1CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9Cgpmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKCiMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgppZiB7W2NhdGNoIHtzZXQgZ2l0ZGlyIFtnaXRkaXJdfV19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgYSBnaXQgcmVwb3NpdG9yeSBoZXJlLiIKICAgIGV4aXQgMQp9CmlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCByZXZ0cmVlYXJncyB7fQpzZXQgY21kbGluZV9maWxlcyB7fQpzZXQgaSAwCmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtLSAkYXJnIHsKCSIiIHsgfQoJIi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCSItLSIgewoJICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJGFyZ3YgW2V4cHIgeyRpICsgMX1dIGVuZF0KCSAgICBicmVhawoJfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9CiAgICBpbmNyIGkKfQoKaWYgeyRpID49IFtsbGVuZ3RoICRhcmd2XSAmJiAkcmV2dHJlZWFyZ3MgbmUge319IHsKICAgICMgbm8gLS0gb24gY29tbWFuZCBsaW5lLCBidXQgc29tZSBhcmd1bWVudHMgKG90aGVyIHRoYW4gLWQpCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtldmFsIGV4ZWMgZ2l0IHJldi1wYXJzZSAtLW5vLXJldnMgLS1uby1mbGFncyAkcmV2dHJlZWFyZ3NdCglzZXQgY21kbGluZV9maWxlcyBbc3BsaXQgJGYgIlxuIl0KCXNldCBuIFtsbGVuZ3RoICRjbWRsaW5lX2ZpbGVzXQoJc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgZW5kLSRuXQoJIyBVbmZvcnR1bmF0ZWx5IGdpdCByZXYtcGFyc2UgZG9lc24ndCBwcm9kdWNlIGFuIGVycm9yIHdoZW4KCSMgc29tZXRoaW5nIGlzIGJvdGggYSByZXZpc2lvbiBhbmQgYSBmaWxlbmFtZS4gIFRvIGJlIGNvbnNpc3RlbnQKCSMgd2l0aCBnaXQgbG9nIGFuZCBnaXQgcmV2LWxpc3QsIGNoZWNrIHJldnRyZWVhcmdzIGZvciBmaWxlbmFtZXMuCglmb3JlYWNoIGFyZyAkcmV2dHJlZWFyZ3MgewoJICAgIGlmIHtbZmlsZSBleGlzdHMgJGFyZ119IHsKCQlzaG93X2Vycm9yIHt9IC4gIkFtYmlndW91cyBhcmd1bWVudCAnJGFyZyc6IGJvdGggcmV2aXNpb25cCgkJCQkgYW5kIGZpbGVuYW1lIgoJCWV4aXQgMQoJICAgIH0KCX0KICAgIH0gZXJyXX0gewoJIyB1bmZvcnR1bmF0ZWx5IHdlIGdldCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIGluICRlcnIsCgkjIHNvIGxvb2sgZm9yICJmYXRhbDoiLgoJc2V0IGkgW3N0cmluZyBmaXJzdCAiZmF0YWw6IiAkZXJyXQoJaWYgeyRpID4gMH0gewoJICAgIHNldCBlcnIgW3N0cmluZyByYW5nZSAkZXJyIFtleHByIHskaSArIDZ9XSBlbmRdCgl9CglzaG93X2Vycm9yIHt9IC4gIkJhZCBhcmd1bWVudHMgdG8gZ2l0azpcbiRlcnIiCglleGl0IDEKICAgIH0KfQoKc2V0IG51bGxpZCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKc2V0IG51bGxpZDIgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiCgoKc2V0IHJ1bnEge30Kc2V0IGhpc3Rvcnkge30Kc2V0IGhpc3RvcnlpbmRleCAwCnNldCBmaF9zZXJpYWwgMApzZXQgbmhsX25hbWVzIHt9CnNldCBoaWdobGlnaHRfcGF0aHMge30Kc2V0IHNlYXJjaGRpcm4gLWZvcndhcmRzCnNldCBib2xkcm93cyB7fQpzZXQgYm9sZG5hbWVyb3dzIHt9CnNldCBkaWZmZWxpZGUgezAgMH0Kc2V0IG1hcmtpbmdtYXRjaGVzIDAKCnNldCBvcHRpbV9kZWxheSAxNgoKc2V0IG5leHR2aWV3bnVtIDEKc2V0IGN1cnZpZXcgMApzZXQgc2VsZWN0ZWR2aWV3IDAKc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKc2V0IHZpZXdmaWxlcygwKSB7fQpzZXQgdmlld3Blcm0oMCkgMApzZXQgdmlld2FyZ3MoMCkge30KCnNldCBjbWRsaW5lb2sgMApzZXQgc3RvcHBlZCAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0IGxvb2tpbmdmb3JoZWFkIDAKc2V0IGxvY2FsaXJvdyAtMQpzZXQgbG9jYWxmcm93IC0xCnNldCBsc2VyaWFsIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKIyB3YWl0IGZvciB0aGUgd2luZG93IHRvIGJlY29tZSB2aXNpYmxlCnRrd2FpdCB2aXNpYmlsaXR5IC4Kd20gdGl0bGUgLiAiW2ZpbGUgdGFpbCAkYXJndjBdOiBbZmlsZSB0YWlsIFtwd2RdXSIKcmVhZHJlZnMKCmlmIHskY21kbGluZV9maWxlcyBuZSB7fSB8fCAkcmV2dHJlZWFyZ3MgbmUge319IHsKICAgICMgY3JlYXRlIGEgdmlldyBmb3IgdGhlIGZpbGVzL2RpcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKICAgIHNldCBjdXJ2aWV3IDEKICAgIHNldCBzZWxlY3RlZHZpZXcgMQogICAgc2V0IG5leHR2aWV3bnVtIDIKICAgIHNldCB2aWV3bmFtZSgxKSAiQ29tbWFuZCBsaW5lIgogICAgc2V0IHZpZXdmaWxlcygxKSAkY21kbGluZV9maWxlcwogICAgc2V0IHZpZXdhcmdzKDEpICRyZXZ0cmVlYXJncwogICAgc2V0IHZpZXdwZXJtKDEpIDAKICAgIGFkZHZpZXdtZW51IDEKICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIG5vcm1hbAogICAgLmJhci52aWV3IGVudHJ5Y29uZiBEZWxldGUqIC1zdGF0ZSBub3JtYWwKfQoKaWYge1tpbmZvIGV4aXN0cyBwZXJtdmlld3NdfSB7CiAgICBmb3JlYWNoIHYgJHBlcm12aWV3cyB7CglzZXQgbiAkbmV4dHZpZXdudW0KCWluY3IgbmV4dHZpZXdudW0KCXNldCB2aWV3bmFtZSgkbikgW2xpbmRleCAkdiAwXQoJc2V0IHZpZXdmaWxlcygkbikgW2xpbmRleCAkdiAxXQoJc2V0IHZpZXdhcmdzKCRuKSBbbGluZGV4ICR2IDJdCglzZXQgdmlld3Blcm0oJG4pIDEKCWFkZHZpZXdtZW51ICRuCiAgICB9Cn0KZ2V0Y29tbWl0cwo=