IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9CgojIEEgc2ltcGxlIHNjaGVkdWxlciBmb3IgY29tcHV0ZS1pbnRlbnNpdmUgc3R1ZmYuCiMgVGhlIGFpbSBpcyB0byBtYWtlIHN1cmUgdGhhdCBldmVudCBoYW5kbGVycyBmb3IgR1VJIGFjdGlvbnMgY2FuCiMgcnVuIGF0IGxlYXN0IGV2ZXJ5IDUwLTEwMCBtcy4gIFVuZm9ydHVuYXRlbHkgZmlsZWV2ZW50IGhhbmRsZXJzIGFyZQojIHJ1biBiZWZvcmUgWCBldmVudCBoYW5kbGVycywgc28gcmVhZGluZyBmcm9tIGEgZmFzdCBzb3VyY2UgY2FuCiMgbWFrZSB0aGUgR1VJIGNvbXBsZXRlbHkgdW5yZXNwb25zaXZlLgpwcm9jIHJ1biBhcmdzIHsKICAgIGdsb2JhbCBpc29ucnVucSBydW5xCgogICAgc2V0IHNjcmlwdCAkYXJncwogICAgaWYge1tpbmZvIGV4aXN0cyBpc29ucnVucSgkc2NyaXB0KV19IHJldHVybgogICAgaWYgeyRydW5xIGVxIHt9fSB7CglhZnRlciBpZGxlIGRvcnVucQogICAgfQogICAgbGFwcGVuZCBydW5xIFtsaXN0IHt9ICRzY3JpcHRdCiAgICBzZXQgaXNvbnJ1bnEoJHNjcmlwdCkgMQp9Cgpwcm9jIGZpbGVydW4ge2ZkIHNjcmlwdH0gewogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBmaWxlcmVhZGFibGUgJGZkICRzY3JpcHRdCn0KCnByb2MgZmlsZXJlYWRhYmxlIHtmZCBzY3JpcHR9IHsKICAgIGdsb2JhbCBydW5xCgogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSB7fQogICAgaWYgeyRydW5xIGVxIHt9fSB7CglhZnRlciBpZGxlIGRvcnVucQogICAgfQogICAgbGFwcGVuZCBydW5xIFtsaXN0ICRmZCAkc2NyaXB0XQp9Cgpwcm9jIGRvcnVucSB7fSB7CiAgICBnbG9iYWwgaXNvbnJ1bnEgcnVucQoKICAgIHNldCB0c3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IHQwICR0c3RhcnQKICAgIHdoaWxlIHskcnVucSBuZSB7fX0gewoJc2V0IGZkIFtsaW5kZXggJHJ1bnEgMCAwXQoJc2V0IHNjcmlwdCBbbGluZGV4ICRydW5xIDAgMV0KCXNldCByZXBlYXQgW2V2YWwgJHNjcmlwdF0KCXNldCB0MSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCglzZXQgdCBbZXhwciB7JHQxIC0gJHQwfV0KCXNldCBydW5xIFtscmFuZ2UgJHJ1bnEgMSBlbmRdCglpZiB7JHJlcGVhdCBuZSB7fSAmJiAkcmVwZWF0fSB7CgkgICAgaWYgeyRmZCBlcSB7fSB8fCAkcmVwZWF0ID09IDJ9IHsKCQkjIHNjcmlwdCByZXR1cm5zIDEgaWYgaXQgd2FudHMgdG8gYmUgcmVhZGRlZAoJCSMgZmlsZSByZWFkZXJzIHJldHVybiAyIGlmIHRoZXkgY291bGQgZG8gbW9yZSBzdHJhaWdodCBhd2F5CgkJbGFwcGVuZCBydW5xIFtsaXN0ICRmZCAkc2NyaXB0XQoJICAgIH0gZWxzZSB7CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBmaWxlcmVhZGFibGUgJGZkICRzY3JpcHRdCgkgICAgfQoJfSBlbHNlaWYgeyRmZCBlcSB7fX0gewoJICAgIHVuc2V0IGlzb25ydW5xKCRzY3JpcHQpCgl9CglzZXQgdDAgJHQxCglpZiB7JHQxIC0gJHRzdGFydCA+PSA4MH0gYnJlYWsKICAgIH0KICAgIGlmIHskcnVucSBuZSB7fX0gewoJYWZ0ZXIgaWRsZSBkb3J1bnEKICAgIH0KfQoKIyBTdGFydCBvZmYgYSBnaXQgcmV2LWxpc3QgcHJvY2VzcyBhbmQgYXJyYW5nZSB0byByZWFkIGl0cyBvdXRwdXQKcHJvYyBzdGFydF9yZXZfbGlzdCB7dmlld30gewogICAgZ2xvYmFsIHN0YXJ0bXNlY3MKICAgIGdsb2JhbCBjb21tZmQgbGVmdG92ZXIgdGNsZW5jb2RpbmcgZGF0ZW1vZGUKICAgIGdsb2JhbCB2aWV3YXJncyB2aWV3ZmlsZXMgY29tbWl0aWR4CiAgICBnbG9iYWwgbG9va2luZ2ZvcmhlYWQgc2hvd2xvY2FsY2hhbmdlcwoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBjb21taXRpZHgoJHZpZXcpIDAKICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IGxvZyAteiAtLXByZXR0eT1yYXcgJG9yZGVyIC0tcGFyZW50cyBcCgkJCSAtLWJvdW5kYXJ5ICR2aWV3YXJncygkdmlldykgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0gcl0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGV4ZWN1dGluZyBnaXQgcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBjb21tZmQoJHZpZXcpICRmZAogICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQogICAgc2V0IGxvb2tpbmdmb3JoZWFkICRzaG93bG9jYWxjaGFuZ2VzCiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKICAgIGlmIHskdGNsZW5jb2RpbmcgIT0ge319IHsKCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkdGNsZW5jb2RpbmcKICAgIH0KICAgIGZpbGVydW4gJGZkIFtsaXN0IGdldGNvbW1pdGxpbmVzICRmZCAkdmlld10KICAgIG5vd2J1c3kgJHZpZXcKfQoKcHJvYyBzdG9wX3Jldl9saXN0IHt9IHsKICAgIGdsb2JhbCBjb21tZmQgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1mZCgkY3VydmlldyldfSByZXR1cm4KICAgIHNldCBmZCAkY29tbWZkKCRjdXJ2aWV3KQogICAgY2F0Y2ggewoJc2V0IHBpZCBbcGlkICRmZF0KCWV4ZWMga2lsbCAkcGlkCiAgICB9CiAgICBjYXRjaCB7Y2xvc2UgJGZkfQogICAgdW5zZXQgY29tbWZkKCRjdXJ2aWV3KQp9Cgpwcm9jIGdldGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlIGNhbnYgbWFpbmZvbnQgY3VydmlldwoKICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBpbml0bGF5b3V0CiAgICBzdGFydF9yZXZfbGlzdCAkY3VydmlldwogICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKfQoKcHJvYyBnZXRjb21taXRsaW5lcyB7ZmQgdmlld30gIHsKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZHJlbiBjdXJ2aWV3IGhsdmlldwogICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSB7CgkgICAgcmV0dXJuIDEKCX0KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBydW4gY2hld2NvbW1pdHMgJHZpZXcKCX0KCXJldHVybiAwCiAgICB9CiAgICBzZXQgc3RhcnQgMAogICAgc2V0IGdvdHNvbWUgMAogICAgd2hpbGUgMSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KCWlmIHskaSA8IDB9IHsKCSAgICBhcHBlbmQgbGVmdG92ZXIoJHZpZXcpIFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBlbmRdCgkgICAgYnJlYWsKCX0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICRsZWZ0b3ZlcigkdmlldykKCSAgICBhcHBlbmQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAwIFtleHByIHskaSAtIDF9XV0KCSAgICBzZXQgbGVmdG92ZXIoJHZpZXcpIHt9Cgl9IGVsc2UgewoJICAgIHNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCgl9CglzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCglzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCglzZXQgb2sgMAoJc2V0IGxpc3RlZCAxCglpZiB7JGogPj0gMCAmJiBbc3RyaW5nIG1hdGNoICJjb21taXQgKiIgJGNtaXRdfSB7CgkgICAgc2V0IGlkcyBbc3RyaW5nIHJhbmdlICRjbWl0IDcgW2V4cHIgeyRqIC0gMX1dXQoJICAgIGlmIHtbc3RyaW5nIG1hdGNoIHtbLTw+XSp9ICRpZHNdfSB7CgkJc3dpdGNoIC0tIFtzdHJpbmcgaW5kZXggJGlkcyAwXSB7CgkJICAgICItIiB7c2V0IGxpc3RlZCAwfQoJCSAgICAiPCIge3NldCBsaXN0ZWQgMn0KCQkgICAgIj4iIHtzZXQgbGlzdGVkIDN9CgkJfQoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgbG9nIG91dHB1dDogeyRzaG9ydGNtaXR9IgoJICAgIGV4aXQgMQoJfQoJc2V0IGlkIFtsaW5kZXggJGlkcyAwXQoJaWYgeyRsaXN0ZWR9IHsKCSAgICBzZXQgb2xkcyBbbHJhbmdlICRpZHMgMSBlbmRdCgkgICAgc2V0IGkgMAoJICAgIGZvcmVhY2ggcCAkb2xkcyB7CgkJaWYgeyRpID09IDAgfHwgW2xzZWFyY2ggLWV4YWN0ICRvbGRzICRwXSA+PSAkaX0gewoJCSAgICBsYXBwZW5kIGNoaWxkcmVuKCR2aWV3LCRwKSAkaWQKCQl9CgkJaW5jciBpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgb2xkcyB7fQoJfQoJaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJHZpZXcsJGlkKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHZpZXcsJGlkKSB7fQoJfQoJc2V0IGNvbW1pdGRhdGEoJGlkKSBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCglzZXQgY29tbWl0cm93KCR2aWV3LCRpZCkgJGNvbW1pdGlkeCgkdmlldykKCWluY3IgY29tbWl0aWR4KCR2aWV3KQoJaWYgeyR2aWV3ID09ICRjdXJ2aWV3fSB7CgkgICAgbGFwcGVuZCBwYXJlbnRsaXN0ICRvbGRzCgkgICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCgkgICAgbGFwcGVuZCBjb21taXRsaXN0ZWQgJGxpc3RlZAoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHZwYXJlbnRsaXN0KCR2aWV3KSAkb2xkcwoJICAgIGxhcHBlbmQgdmRpc3BvcmRlcigkdmlldykgJGlkCgkgICAgbGFwcGVuZCB2Y21pdGxpc3RlZCgkdmlldykgJGxpc3RlZAoJfQoJc2V0IGdvdHNvbWUgMQogICAgfQogICAgaWYgeyRnb3Rzb21lfSB7CglydW4gY2hld2NvbW1pdHMgJHZpZXcKICAgIH0KICAgIHJldHVybiAyCn0KCnByb2MgY2hld2NvbW1pdHMge3ZpZXd9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IGhsdmlldyBjb21tZmQKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgcGVuZGluZ19zZWxlY3QKCiAgICBzZXQgbW9yZSAwCiAgICBpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBhbGxyZWFkIFtleHByIHshW2luZm8gZXhpc3RzIGNvbW1mZCgkdmlldyldfV0KCXNldCB0bGltaXQgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyA1MH1dCglzZXQgbW9yZSBbbGF5b3V0bW9yZSAkdGxpbWl0ICRhbGxyZWFkXQoJaWYgeyRhbGxyZWFkICYmICEkbW9yZX0gewoJICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVsbGlkIGNvbW1pdGlkeCBwaGFzZQoJICAgIGdsb2JhbCBudW1jb21taXRzIHN0YXJ0bXNlY3MKCgkgICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCQlzZXQgcm93IFtleHByIHtbbGluZGV4ICRkaXNwbGF5b3JkZXIgMF0gZXEgJG51bGxpZH1dCgkJc2VsZWN0bGluZSAkcm93IDEKCSAgICB9CgkgICAgaWYgeyRjb21taXRpZHgoJGN1cnZpZXcpID4gMH0gewoJCSNzZXQgbXMgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc31dCgkJI3B1dHMgIm92ZXJhbGwgJG1zIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgoJICAgIH0gZWxzZSB7CgkJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCgkgICAgfQoJICAgIG5vdGJ1c3kgbGF5b3V0CgkgICAgc2V0IHBoYXNlIHt9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJdmhpZ2hsaWdodG1vcmUKICAgIH0KICAgIHJldHVybiAkbW9yZQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiB7W2NhdGNoIHtzZXQgY29udGVudHMgW2V4ZWMgZ2l0IGNhdC1maWxlIGNvbW1pdCAkaWRdfV19IHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwCn0KCnByb2MgdXBkYXRlY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgdmlld2RhdGEgY3VydmlldyBwaGFzZSBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBjaGlsZHJlbiBjb21taXRyb3cgc2VsZWN0ZWRsaW5lIHRoaWNrZXJsaW5lCgogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJc3RvcF9yZXZfbGlzdAoJc2V0IHBoYXNlIHt9CiAgICB9CiAgICBzZXQgbiAkY3VydmlldwogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCWNhdGNoIHt1bnNldCBjaGlsZHJlbigkbiwkaWQpfQoJY2F0Y2gge3Vuc2V0IGNvbW1pdHJvdygkbiwkaWQpfQogICAgfQogICAgc2V0IGN1cnZpZXcgLTEKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdGhpY2tlcmxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdmlld2RhdGEoJG4pfQogICAgcmVhZHJlZnMKICAgIGNoYW5nZWRyZWZzCiAgICByZWdldGFsbGNvbW1pdHMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBub24tYmxhbmsgbGluZSBvZiB0aGUgY29tbWVudCBhcyB0aGUgaGVhZGxpbmUKICAgIHNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW1sZWZ0ICRjb21tZW50XQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRoZWFkbGluZV0KICAgIGlmIHskaSA+PSAwfSB7CglzZXQgaGVhZGxpbmUgW3N0cmluZyByYW5nZSAkaGVhZGxpbmUgMCAkaV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW1yaWdodCAkaGVhZGxpbmVdCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcciIgJGhlYWRsaW5lXQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW1yaWdodCBbc3RyaW5nIHJhbmdlICRoZWFkbGluZSAwICRpXV0KICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnb2JqaWQKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZCBtYWluaGVhZGlkCgogICAgZm9yZWFjaCB2IHt0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyBvdGhlcnJlZmlkcyBpZG90aGVycmVmc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgc2V0IHJlZmQgW29wZW4gW2xpc3QgfCBnaXQgc2hvdy1yZWYgLWRdIHJdCiAgICB3aGlsZSB7W2dldHMgJHJlZmQgbGluZV0gPj0gMH0gewoJaWYge1tzdHJpbmcgaW5kZXggJGxpbmUgNDBdIG5lICIgIn0gY29udGludWUKCXNldCBpZCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMzldCglzZXQgcmVmIFtzdHJpbmcgcmFuZ2UgJGxpbmUgNDEgZW5kXQoJaWYgeyFbc3RyaW5nIG1hdGNoICJyZWZzLyoiICRyZWZdfSBjb250aW51ZQoJc2V0IG5hbWUgW3N0cmluZyByYW5nZSAkcmVmIDUgZW5kXQoJaWYge1tzdHJpbmcgbWF0Y2ggInJlbW90ZXMvKiIgJG5hbWVdfSB7CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqL0hFQUQiICRuYW1lXX0gewoJCXNldCBoZWFkaWRzKCRuYW1lKSAkaWQKCQlsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQoJICAgIH0KCX0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoICJoZWFkcy8qIiAkbmFtZV19IHsKCSAgICBzZXQgbmFtZSBbc3RyaW5nIHJhbmdlICRuYW1lIDYgZW5kXQoJICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQoJfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggInRhZ3MvKiIgJG5hbWVdfSB7CgkgICAgIyB0aGlzIGxldHMgcmVmcy90YWdzL2Zvb157fSBvdmVyd3JpdGUgcmVmcy90YWdzL2ZvbywKCSAgICAjIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCBzaW5jZSB0aGUgZm9ybWVyIGlzIHRoZSBjb21taXQgSUQKCSAgICBzZXQgbmFtZSBbc3RyaW5nIHJhbmdlICRuYW1lIDUgZW5kXQoJICAgIGlmIHtbc3RyaW5nIG1hdGNoICIqXnt9IiAkbmFtZV19IHsKCQlzZXQgbmFtZSBbc3RyaW5nIHJhbmdlICRuYW1lIDAgZW5kLTNdCgkgICAgfSBlbHNlIHsKCQlzZXQgdGFnb2JqaWQoJG5hbWUpICRpZAoJICAgIH0KCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkdGFncygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAogICAgc2V0IG1haW5oZWFkIHt9CiAgICBzZXQgbWFpbmhlYWRpZCB7fQogICAgY2F0Y2ggewoJc2V0IHRoZWhlYWQgW2V4ZWMgZ2l0IHN5bWJvbGljLXJlZiBIRUFEXQoJaWYge1tzdHJpbmcgbWF0Y2ggInJlZnMvaGVhZHMvKiIgJHRoZWhlYWRdfSB7CgkgICAgc2V0IG1haW5oZWFkIFtzdHJpbmcgcmFuZ2UgJHRoZWhlYWQgMTEgZW5kXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkbWFpbmhlYWQpXX0gewoJCXNldCBtYWluaGVhZGlkICRoZWFkaWRzKCRtYWluaGVhZCkKCSAgICB9Cgl9CiAgICB9Cn0KCiMgdXBkYXRlIHRoaW5ncyBmb3IgYSBoZWFkIG1vdmVkIHRvIGEgY2hpbGQgb2YgaXRzIHByZXZpb3VzIGxvY2F0aW9uCnByb2MgbW92ZWhlYWQge2lkIG5hbWV9IHsKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICByZW1vdmVoZWFkICRoZWFkaWRzKCRuYW1lKSAkbmFtZQogICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAogICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKfQoKIyB1cGRhdGUgdGhpbmdzIHdoZW4gYSBoZWFkIGhhcyBiZWVuIHJlbW92ZWQKcHJvYyByZW1vdmVoZWFkIHtpZCBuYW1lfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgaWYgeyRpZGhlYWRzKCRpZCkgZXEgJG5hbWV9IHsKCXVuc2V0IGlkaGVhZHMoJGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkaWQpICRuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkaWQpICRpICRpXQoJfQogICAgfQogICAgdW5zZXQgaGVhZGlkcygkbmFtZSkKfQoKcHJvYyBzaG93X2Vycm9yIHt3IHRvcCBtc2d9IHsKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHRvcCIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHRvcCA8VmlzaWJpbGl0eT4gImdyYWIgJHRvcDsgZm9jdXMgJHRvcCIKICAgIGJpbmQgJHRvcCA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHRvcCIKICAgIHRrd2FpdCB3aW5kb3cgJHRvcAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgc2hvd19lcnJvciAkdyAkdyAkbXNnCn0KCnByb2MgY29uZmlybV9wb3B1cCBtc2cgewogICAgZ2xvYmFsIGNvbmZpcm1fb2sKICAgIHNldCBjb25maXJtX29rIDAKICAgIHNldCB3IC5jb25maXJtCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgInNldCBjb25maXJtX29rIDE7IGRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGxlZnQgLWZpbGwgeAogICAgYnV0dG9uICR3LmNhbmNlbCAtdGV4dCBDYW5jZWwgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3LmNhbmNlbCAtc2lkZSByaWdodCAtZmlsbCB4CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3CiAgICByZXR1cm4gJGNvbmZpcm1fb2sKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCB0ZXh0Zm9udCBtYWluZm9udCB1aWZvbnQgdGFic3RvcAogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmR0eXBlbWVudSBmaW5kbG9jIGZpbmRzdHJpbmcgZnN0cmluZyBnZW9tZXRyeQogICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAogICAgZ2xvYmFsIG1haW5jdXJzb3IgdGV4dGN1cnNvciBjdXJ0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcm93Y3R4bWVudSBmYWtlcm93bWVudSBtZXJnZW1heCB3cmFwY29tbWVudAogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBnZHR0eXBlCiAgICBnbG9iYWwgc2VhcmNoc3RyaW5nIHNzdHJpbmcKICAgIGdsb2JhbCBiZ2NvbG9yIGZnY29sb3IgYmdsaXN0IGZnbGlzdCBkaWZmY29sb3JzIHNlbGVjdGJnY29sb3IKICAgIGdsb2JhbCBoZWFkY3R4bWVudQoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgLmJhciBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlVwZGF0ZSIgLWNvbW1hbmQgdXBkYXRlY29tbWl0cwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgLmJhci5maWxlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBtZW51IC5iYXIuZWRpdAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAogICAgLmJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiUHJlZmVyZW5jZXMiIC1jb21tYW5kIGRvcHJlZnMKICAgIC5iYXIuZWRpdCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAoKICAgIG1lbnUgLmJhci52aWV3IC1mb250ICR1aWZvbnQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJWaWV3IiAtbWVudSAuYmFyLnZpZXcKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIk5ldyB2aWV3Li4uIiAtY29tbWFuZCB7bmV3dmlldyAwfQogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiRWRpdCB2aWV3Li4uIiAtY29tbWFuZCBlZGl0dmlldyBcCgktc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkRlbGV0ZSB2aWV3IiAtY29tbWFuZCBkZWx2aWV3IC1zdGF0ZSBkaXNhYmxlZAogICAgLmJhci52aWV3IGFkZCBzZXBhcmF0b3IKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICJBbGwgZmlsZXMiIC1jb21tYW5kIHtzaG93dmlldyAwfSBcCgktdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAwCgogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJLZXkgYmluZGluZ3MiIC1jb21tYW5kIGtleXMKICAgIC5iYXIuaGVscCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgICMgdGhlIGd1aSBoYXMgdXBwZXIgYW5kIGxvd2VyIGhhbGYsIHBhcnRzIG9mIGEgcGFuZWQgd2luZG93LgogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAoKICAgICMgcG9zc2libHkgdXNlIGFzc3VtZWQgZ2VvbWV0cnkKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KHB3c2FzaDApXX0gewogICAgICAgIHNldCBnZW9tZXRyeSh0b3BoZWlnaHQpIFtleHByIHsxNSAqICRsaW5lc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFtleHByIHs4MCAqICRjaGFyc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoYm90aGVpZ2h0KSBbZXhwciB7MTUgKiAkbGluZXNwY31dCiAgICAgICAgc2V0IGdlb21ldHJ5KGJvdHdpZHRoKSBbZXhwciB7NTAgKiAkY2hhcnNwY31dCiAgICAgICAgc2V0IGdlb21ldHJ5KHB3c2FzaDApICJbZXhwciB7NDAgKiAkY2hhcnNwY31dIDIiCiAgICAgICAgc2V0IGdlb21ldHJ5KHB3c2FzaDEpICJbZXhwciB7NjAgKiAkY2hhcnNwY31dIDIiCiAgICB9CgogICAgIyB0aGUgdXBwZXIgaGFsZiB3aWxsIGhhdmUgYSBwYW5lZCB3aW5kb3csIGEgc2Nyb2xsIGJhciB0byB0aGUgcmlnaHQsIGFuZCBzb21lIHN0dWZmIGJlbG93CiAgICBmcmFtZSAudGYgLWhlaWdodCAkZ2VvbWV0cnkodG9waGVpZ2h0KSAtd2lkdGggJGdlb21ldHJ5KHRvcHdpZHRoKQogICAgZnJhbWUgLnRmLmhpc3RmcmFtZQogICAgcGFuZWR3aW5kb3cgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKCiAgICAjIGNyZWF0ZSB0aHJlZSBjYW52YXNlcwogICAgc2V0IGNzY3JvbGwgLnRmLmhpc3RmcmFtZS5jc2IKICAgIHNldCBjYW52IC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgXAoJLXNlbGVjdGJhY2tncm91bmQgJHNlbGVjdGJnY29sb3IgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAic2Nyb2xsY2FudiAkY3Njcm9sbCIKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgXAoJLXNlbGVjdGJhY2tncm91bmQgJHNlbGVjdGJnY29sb3IgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYzCiAgICBldmFsIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIHBsYWNlIDAgJGdlb21ldHJ5KHB3c2FzaDApCiAgICBldmFsIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIHBsYWNlIDEgJGdlb21ldHJ5KHB3c2FzaDEpCgogICAgIyBhIHNjcm9sbCBiYXIgdG8gcnVsZSB0aGVtCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgYmluZCAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CiAgICBsYXBwZW5kIGJnbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzCiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtc2lkZSBsZWZ0CgogICAgIyB3ZSBoYXZlIHR3byBidXR0b24gYmFycyBhdCBib3R0b20gb2YgdG9wIGZyYW1lLiBCYXIgMQogICAgZnJhbWUgLnRmLmJhcgogICAgZnJhbWUgLnRmLmxiYXIgLWhlaWdodCAxNQoKICAgIHNldCBzaGExZW50cnkgLnRmLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAudGYuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOCAtZm9udCAkdWlmb250CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC50Zi5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC50Zi5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAudGYuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLnRmLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLnRmLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLnRmLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC50Zi5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRzdHJpbmcgd3JpdGUgZmluZF9jaGFuZ2UKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeCAtaW4gLnRmLmJhcgogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZHR5cGUgXAoJCSAgICAgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmR0eXBlIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAudGYuYmFyLmZpbmR0eXBlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAudGYuYmFyLmZpbmR0eXBlLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAudGYuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlcgogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZF9jaGFuZ2UKICAgIC50Zi5iYXIuZmluZGxvYyBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLnRmLmJhci5maW5kbG9jLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC50Zi5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKCiAgICAjIGJ1aWxkIHVwIHRoZSBib3R0b20gYmFyIG9mIHVwcGVyIHdpbmRvdwogICAgbGFiZWwgLnRmLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAogICAgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkiYWRkaW5nL3JlbW92aW5nIHN0cmluZzoiXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGdkdHR5cGUgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgJGdtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgLnRmLmxiYXIuZ2R0dHlwZSBjb25mIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIuZ2R0dHlwZSAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGVudHJ5IC50Zi5sYmFyLmZlbnQgLXdpZHRoIDI1IC1mb250ICR0ZXh0Zm9udCBcCgktdGV4dHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcyB3cml0ZSBoZmlsZXNfY2hhbmdlCiAgICBsYXBwZW5kIGVudHJpZXMgLnRmLmxiYXIuZmVudAogICAgcGFjayAudGYubGJhci5mZW50IC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDEKICAgIGxhYmVsIC50Zi5sYmFyLnZsYWJlbCAtdGV4dCAiIE9SIGluIHZpZXciIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIudmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIHZpZXdobG1lbnUgc2VsZWN0ZWRobHZpZXcKICAgIHNldCB2aWV3aGxtZW51IFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnZobCBzZWxlY3RlZGhsdmlldyBOb25lXQogICAgJHZpZXdobG1lbnUgZW50cnljb25mIE5vbmUgLWNvbW1hbmQgZGVsdmhpZ2hsaWdodAogICAgJHZpZXdobG1lbnUgY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci52aGwgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLnZobCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGxhYmVsIC50Zi5sYmFyLnJsYWJlbCAtdGV4dCAiIE9SICIgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5ybGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKICAgIHNldCBtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnJlbG0gaGlnaGxpZ2h0X3JlbGF0ZWQgTm9uZSBcCgkiRGVzY2VuZGVudCIgIk5vdCBkZXNjZW5kZW50IiAiQW5jZXN0b3IiICJOb3QgYW5jZXN0b3IiXQogICAgJG0gY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci5yZWxtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9yZWxhdGVkIHdyaXRlIHZyZWxfY2hhbmdlCiAgICBwYWNrIC50Zi5sYmFyLnJlbG0gLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgIyBGaW5pc2ggcHV0dGluZyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdmlld2VyIHRvZ2V0aGVyCiAgICBwYWNrIC50Zi5sYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLnRmLmJhciAtaW4gLnRmIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUgLWZpbGwgYm90aCAtc2lkZSB0b3AgLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLnRmCiAgICAuY3RvcCBwYW5lY29uZmlndXJlIC50ZiAtaGVpZ2h0ICRnZW9tZXRyeSh0b3BoZWlnaHQpCiAgICAuY3RvcCBwYW5lY29uZmlndXJlIC50ZiAtd2lkdGggJGdlb21ldHJ5KHRvcHdpZHRoKQoKICAgICMgbm93IGJ1aWxkIHVwIHRoZSBib3R0b20KICAgIHBhbmVkd2luZG93IC5wd2JvdHRvbSAtb3JpZW50IGhvcml6b250YWwKCiAgICAjIGxvd2VyIGxlZnQsIGEgdGV4dCBib3ggb3ZlciBzZWFyY2ggYmFyLCBzY3JvbGwgYmFyIHRvIHRoZSByaWdodAogICAgIyBpZiB3ZSBrbm93IHdpbmRvdyBoZWlnaHQsIHRoZW4gdGhhdCB3aWxsIHNldCB0aGUgbG93ZXIgdGV4dCBoZWlnaHQsIG90aGVyd2lzZQogICAgIyB3ZSBzZXQgbG93ZXIgdGV4dCBoZWlnaHQgd2hpY2ggd2lsbCBkcml2ZSB3aW5kb3cgaGVpZ2h0CiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQogICAgfSBlbHNlIHsKICAgICAgICBmcmFtZSAuYmxlZnQgLXdpZHRoICRnZW9tZXRyeShib3R3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoYm90aGVpZ2h0KQogICAgfQogICAgZnJhbWUgLmJsZWZ0LnRvcAogICAgZnJhbWUgLmJsZWZ0Lm1pZAoKICAgIGJ1dHRvbiAuYmxlZnQudG9wLnNlYXJjaCAtdGV4dCAiU2VhcmNoIiAtY29tbWFuZCBkb3NlYXJjaCBcCgktZm9udCAkdWlmb250CiAgICBwYWNrIC5ibGVmdC50b3Auc2VhcmNoIC1zaWRlIGxlZnQgLXBhZHggNQogICAgc2V0IHNzdHJpbmcgLmJsZWZ0LnRvcC5zc3RyaW5nCiAgICBlbnRyeSAkc3N0cmluZyAtd2lkdGggMjAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2VhcmNoc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJHNzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzZWFyY2hzdHJpbmcgd3JpdGUgaW5jcnNlYXJjaAogICAgcGFjayAkc3N0cmluZyAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4CiAgICByYWRpb2J1dHRvbiAuYmxlZnQubWlkLmRpZmYgLXRleHQgIkRpZmYiIFwKCS1jb21tYW5kIGNoYW5nZWRpZmZkaXNwIC12YXJpYWJsZSBkaWZmZWxpZGUgLXZhbHVlIHswIDB9CiAgICByYWRpb2J1dHRvbiAuYmxlZnQubWlkLm9sZCAtdGV4dCAiT2xkIHZlcnNpb24iIFwKCS1jb21tYW5kIGNoYW5nZWRpZmZkaXNwIC12YXJpYWJsZSBkaWZmZWxpZGUgLXZhbHVlIHswIDF9CiAgICByYWRpb2J1dHRvbiAuYmxlZnQubWlkLm5ldyAtdGV4dCAiTmV3IHZlcnNpb24iIFwKCS1jb21tYW5kIGNoYW5nZWRpZmZkaXNwIC12YXJpYWJsZSBkaWZmZWxpZGUgLXZhbHVlIHsxIDB9CiAgICBwYWNrIC5ibGVmdC5taWQuZGlmZiAuYmxlZnQubWlkLm9sZCAuYmxlZnQubWlkLm5ldyAtc2lkZSBsZWZ0CiAgICBzZXQgY3RleHQgLmJsZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktdGFicyAiW2V4cHIgeyR0YWJzdG9wICogJGNoYXJzcGN9XSIgXAoJLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmJsZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5ibGVmdC50b3AgLXNpZGUgdG9wIC1maWxsIHgKICAgIHBhY2sgLmJsZWZ0Lm1pZCAtc2lkZSB0b3AgLWZpbGwgeAogICAgcGFjayAuYmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY3RleHQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgbGFwcGVuZCBiZ2xpc3QgJGN0ZXh0CiAgICBsYXBwZW5kIGZnbGlzdCAkY3RleHQKCiAgICAkY3RleHQgdGFnIGNvbmYgY29tbWVudCAtd3JhcCAkd3JhcGNvbW1lbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgogICAgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMF0KICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICAkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCiAgICAkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQogICAgJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCiAgICAkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCiAgICAkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KICAgICRjdGV4dCB0YWcgY29uZiBtNSAtZm9yZSAiIzAwOTA5MCIKICAgICRjdGV4dCB0YWcgY29uZiBtNiAtZm9yZSBtYWdlbnRhCiAgICAkY3RleHQgdGFnIGNvbmYgbTcgLWZvcmUgIiM4MDgwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTggLWZvcmUgIiMwMDkwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTkgLWZvcmUgIiNmZjAwODAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEwIC1mb3JlIGN5YW4KICAgICRjdGV4dCB0YWcgY29uZiBtMTEgLWZvcmUgIiNiMDcwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEyIC1mb3JlICIjNzBiMGYwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMyAtZm9yZSAiIzcwZjBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTQgLWZvcmUgIiNmMGIwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE1IC1mb3JlICIjZmY3MGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKICAgIHNldCBtZXJnZW1heCAxNgogICAgJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CgogICAgLnB3Ym90dG9tIGFkZCAuYmxlZnQKICAgIC5wd2JvdHRvbSBwYW5lY29uZmlndXJlIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQoKICAgICMgbG93ZXIgcmlnaHQKICAgIGZyYW1lIC5icmlnaHQKICAgIGZyYW1lIC5icmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgLmJyaWdodC5tb2RlLnBhdGNoIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICByYWRpb2J1dHRvbiAuYnJpZ2h0Lm1vZGUudHJlZSAtdGV4dCAiVHJlZSIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInRyZWUiCiAgICAuYnJpZ2h0Lm1vZGUudHJlZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuYnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmJyaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCBcCgktc2VsZWN0YmFja2dyb3VuZCAkc2VsZWN0Ymdjb2xvciBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktZm9udCAkbWFpbmZvbnQgXAoJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAoJLXlzY3JvbGxjb21tYW5kICIuYnJpZ2h0LnNiIHNldCIgXAoJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY2ZsaXN0CiAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CiAgICBzY3JvbGxiYXIgLmJyaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmJyaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGhpZ2hsaWdodCBcCgktYmFja2dyb3VuZCBbJGNmbGlzdCBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCiAgICAucHdib3R0b20gYWRkIC5icmlnaHQKICAgIC5jdG9wIGFkZCAucHdib3R0b20KCiAgICAjIHJlc3RvcmUgd2luZG93IHBvc2l0aW9uIGlmIGtub3duCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIHdtIGdlb21ldHJ5IC4gIiRnZW9tZXRyeShtYWluKSIKICAgIH0KCiAgICBiaW5kIC5wd2JvdHRvbSA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQogICAgcGFjayAuY3RvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiY2FudnNjYW4gbWFyayAlVyAleCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImNhbnZzY2FuIGRyYWd0byAlVyAleCAleSIKICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQogICAgYmluZGtleSA8RW5kPiBzZWxsYXN0bGluZQogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxTaGlmdC1LZXktVXA+ICJuZXh0X2hpZ2hsaWdodCAtMSIKICAgIGJpbmQgLiA8U2hpZnQtS2V5LURvd24+ICJuZXh0X2hpZ2hsaWdodCAxIgogICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZGtleSA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gInNlbG5leHRwYWdlIC0xIgogICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCiAgICBiaW5kIC4gPENvbnRyb2wtSG9tZT4gImFsbGNhbnZzIHl2aWV3IG1vdmV0byAwLjAiCiAgICBiaW5kIC4gPENvbnRyb2wtRW5kPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDEuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LURvd24+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmRrZXkgPEY1PiB1cGRhdGVjb21taXRzCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZG9zZWFyY2hiYWNrCiAgICBiaW5kIC4gPENvbnRyb2wtcz4gZG9zZWFyY2gKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICB3bSBwcm90b2NvbCAuIFdNX0RFTEVURV9XSU5ET1cgZG9xdWl0CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKICAgIGJpbmQgJGNmbGlzdCA8MT4ge3NlbF9mbGlzdCAlVyAleCAleTsgYnJlYWt9CiAgICBiaW5kICRjZmxpc3QgPEIxLU1vdGlvbj4ge3NlbF9mbGlzdCAlVyAleCAleTsgYnJlYWt9CiAgICBiaW5kICRjZmxpc3QgPEJ1dHRvblJlbGVhc2UtMT4ge3RyZWVjbGljayAlVyAleCAleX0KCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSBuZXcgYnJhbmNoIiAtY29tbWFuZCBta2JyYW5jaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDaGVycnktcGljayB0aGlzIGNvbW1pdCIgXAoJLWNvbW1hbmQgY2hlcnJ5cGljawogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZXNldCBIRUFEIGJyYW5jaCB0byBoZXJlIiBcCgktY29tbWFuZCByZXNldGhlYWQKCiAgICBzZXQgZmFrZXJvd21lbnUgLmZha2Vyb3dtZW51CiAgICBtZW51ICRmYWtlcm93bWVudSAtdGVhcm9mZiAwCiAgICAkZmFrZXJvd21lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRmYWtlcm93bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJGZha2Vyb3dtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAojICAgICRmYWtlcm93bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNvbW1pdCIgLWNvbW1hbmQge21rY29tbWl0IDB9CiMgICAgJGZha2Vyb3dtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ29tbWl0IGFsbCIgLWNvbW1hbmQge21rY29tbWl0IDF9CiMgICAgJGZha2Vyb3dtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiUmV2ZXJ0IGxvY2FsIGNoYW5nZXMiIC1jb21tYW5kIHJldmVydGxvY2FsCgogICAgc2V0IGhlYWRjdHhtZW51IC5oZWFkY3R4bWVudQogICAgbWVudSAkaGVhZGN0eG1lbnUgLXRlYXJvZmYgMAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlY2sgb3V0IHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBjb2JyYW5jaAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiUmVtb3ZlIHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBybWJyYW5jaAp9CgojIG1vdXNlLTIgbWFrZXMgYWxsIHdpbmRvd3Mgc2NhbiB2ZXJ0aWNhbGx5LCBidXQgb25seSB0aGUgb25lCiMgdGhlIGN1cnNvciBpcyBpbiBzY2FucyBob3Jpem9udGFsbHkKcHJvYyBjYW52c2NhbiB7b3AgdyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBmb3JlYWNoIGMgW2xpc3QgJGNhbnYgJGNhbnYyICRjYW52M10gewoJaWYgeyRjID09ICR3fSB7CgkgICAgJGMgc2NhbiAkb3AgJHggJHkKCX0gZWxzZSB7CgkgICAgJGMgc2NhbiAkb3AgMCAkeQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbGNhbnYge2NzY3JvbGwgZjAgZjF9IHsKICAgICRjc2Nyb2xsIHNldCAkZjAgJGYxCiAgICBkcmF3ZnJhYyAkZjAgJGYxCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udCB1aWZvbnQgdGFic3RvcAogICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBtYXh3aWR0aCBzaG93bmVhcnRhZ3Mgc2hvd2xvY2FsY2hhbmdlcwogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3YXJncyB2aWV3cGVybSBuZXh0dmlld251bQogICAgZ2xvYmFsIGNtaXRtb2RlIHdyYXBjb21tZW50CiAgICBnbG9iYWwgY29sb3JzIGJnY29sb3IgZmdjb2xvciBkaWZmY29sb3JzIHNlbGVjdGJnY29sb3IKCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdGV4dGZvbnQgJHRleHRmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdWlmb250ICR1aWZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0YWJzdG9wICR0YWJzdG9wXQoJcHV0cyAkZiBbbGlzdCBzZXQgZmluZG1lcmdlZmlsZXMgJGZpbmRtZXJnZWZpbGVzXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiBbbGlzdCBzZXQgY21pdG1vZGUgJGNtaXRtb2RlXQoJcHV0cyAkZiBbbGlzdCBzZXQgd3JhcGNvbW1lbnQgJHdyYXBjb21tZW50XQoJcHV0cyAkZiBbbGlzdCBzZXQgc2hvd25lYXJ0YWdzICRzaG93bmVhcnRhZ3NdCglwdXRzICRmIFtsaXN0IHNldCBzaG93bG9jYWxjaGFuZ2VzICRzaG93bG9jYWxjaGFuZ2VzXQoJcHV0cyAkZiBbbGlzdCBzZXQgYmdjb2xvciAkYmdjb2xvcl0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZnY29sb3IgJGZnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBjb2xvcnMgJGNvbG9yc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGRpZmZjb2xvcnMgJGRpZmZjb2xvcnNdCglwdXRzICRmIFtsaXN0IHNldCBzZWxlY3RiZ2NvbG9yICRzZWxlY3RiZ2NvbG9yXQoKCXB1dHMgJGYgInNldCBnZW9tZXRyeShtYWluKSBbd20gZ2VvbWV0cnkgLl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFt3aW5mbyB3aWR0aCAudGZdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW3dpbmZvIGhlaWdodCAudGZdIgogICAgICAgIHB1dHMgJGYgInNldCBnZW9tZXRyeShwd3Nhc2gwKSBcIlsudGYuaGlzdGZyYW1lLnB3Y2xpc3Qgc2FzaCBjb29yZCAwXVwiIgogICAgICAgIHB1dHMgJGYgInNldCBnZW9tZXRyeShwd3Nhc2gxKSBcIlsudGYuaGlzdGZyYW1lLnB3Y2xpc3Qgc2FzaCBjb29yZCAxXVwiIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGJvdHdpZHRoKSBbd2luZm8gd2lkdGggLmJsZWZ0XSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShib3RoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLmJsZWZ0XSIKCglwdXRzIC1ub25ld2xpbmUgJGYgInNldCBwZXJtdmlld3MgeyIKCWZvciB7c2V0IHYgMH0geyR2IDwgJG5leHR2aWV3bnVtfSB7aW5jciB2fSB7CgkgICAgaWYgeyR2aWV3cGVybSgkdil9IHsKCQlwdXRzICRmICJ7W2xpc3QgJHZpZXduYW1lKCR2KSAkdmlld2ZpbGVzKCR2KSAkdmlld2FyZ3MoJHYpXX0iCgkgICAgfQoJfQoJcHV0cyAkZiAifSIKCWNsb3NlICRmCglmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKICAgIH0KICAgIHNldCBzdHVmZnNhdmVkIDEKfQoKcHJvYyByZXNpemVjbGlzdHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiB7W2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXX0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHNhc2gwICsgMjB9XQoJICAgIH0KCSAgICBpZiB7JHNhc2gxID4gJHcgLSAxMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHcgLSAxMH1dCgkJaWYgeyRzYXNoMCA+ICRzYXNoMSAtIDIwfSB7CgkJICAgIHNldCBzYXNoMCBbZXhwciB7JHNhc2gxIC0gMjB9XQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiB7W2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXX0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcqMy80IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDQ1fSB7CgkJc2V0IHNhc2gwIDQ1CgkgICAgfQoJICAgIGlmIHskc2FzaDAgPiAkdyAtIDE1fSB7CgkJc2V0IHNhc2gwIFtleHByIHskdyAtIDE1fV0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIGFsbGNhbnZzIGFyZ3MgewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGV2YWwgJGNhbnYgJGFyZ3MKICAgIGV2YWwgJGNhbnYyICRhcmdzCiAgICBldmFsICRjYW52MyAkYXJncwp9Cgpwcm9jIGJpbmRhbGwge2V2ZW50IGFjdGlvbn0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGJpbmQgJGNhbnYgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYyICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MyAkZXZlbnQgJGFjdGlvbgp9Cgpwcm9jIGFib3V0IHt9IHsKICAgIGdsb2JhbCB1aWZvbnQKICAgIHNldCB3IC5hYm91dAogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkFib3V0IGdpdGsiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgewpHaXRrIC0gYSBjb21taXQgdmlld2VyIGZvciBnaXQKCkNvcHlyaWdodCCpIDIwMDUtMjAwNiBQYXVsIE1hY2tlcnJhcwoKVXNlIGFuZCByZWRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0gXAoJICAgIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMCAtYm9yZGVyIDIgLWJnIHdoaXRlIC1yZWxpZWYgZ3Jvb3ZlCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMiAtcGFkeSAyCiAgICAkdy5tIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciIC1kZWZhdWx0IGFjdGl2ZQogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KICAgICR3Lm9rIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZm9jdXMgJHcub2siCiAgICBiaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKICAgIGJpbmQgJHcgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR3Igp9Cgpwcm9jIGtleXMge30gewogICAgZ2xvYmFsIHVpZm9udAogICAgc2V0IHcgLmtleXMKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJHaXRrIGtleSBiaW5kaW5ncyIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsga2V5IGJpbmRpbmdzOgoKPEN0cmwtUT4JCVF1aXQKPEhvbWU+CQlNb3ZlIHRvIGZpcnN0IGNvbW1pdAo8RW5kPgkJTW92ZSB0byBsYXN0IGNvbW1pdAo8VXA+LCBwLCBpCU1vdmUgdXAgb25lIGNvbW1pdAo8RG93bj4sIG4sIGsJTW92ZSBkb3duIG9uZSBjb21taXQKPExlZnQ+LCB6LCBqCUdvIGJhY2sgaW4gaGlzdG9yeSBsaXN0CjxSaWdodD4sIHgsIGwJR28gZm9yd2FyZCBpbiBoaXN0b3J5IGxpc3QKPFBhZ2VVcD4JTW92ZSB1cCBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8UGFnZURvd24+CU1vdmUgZG93biBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8Q3RybC1Ib21lPglTY3JvbGwgdG8gdG9wIG9mIGNvbW1pdCBsaXN0CjxDdHJsLUVuZD4JU2Nyb2xsIHRvIGJvdHRvbSBvZiBjb21taXQgbGlzdAo8Q3RybC1VcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBsaW5lCjxDdHJsLURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBsaW5lCjxDdHJsLVBhZ2VVcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBwYWdlCjxDdHJsLVBhZ2VEb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgcGFnZQo8U2hpZnQtVXA+CU1vdmUgdG8gcHJldmlvdXMgaGlnaGxpZ2h0ZWQgbGluZQo8U2hpZnQtRG93bj4JTW92ZSB0byBuZXh0IGhpZ2hsaWdodGVkIGxpbmUKPERlbGV0ZT4sIGIJU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQo8QmFja3NwYWNlPglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxTcGFjZT4JCVNjcm9sbCBkaWZmIHZpZXcgZG93biBvbmUgcGFnZQp1CQlTY3JvbGwgZGlmZiB2aWV3IHVwIDE4IGxpbmVzCmQJCVNjcm9sbCBkaWZmIHZpZXcgZG93biAxOCBsaW5lcwo8Q3RybC1GPgkJRmluZAo8Q3RybC1HPgkJTW92ZSB0byBuZXh0IGZpbmQgaGl0CjxSZXR1cm4+CU1vdmUgdG8gbmV4dCBmaW5kIGhpdAovCQlNb3ZlIHRvIG5leHQgZmluZCBoaXQsIG9yIHJlZG8gZmluZAo/CQlNb3ZlIHRvIHByZXZpb3VzIGZpbmQgaGl0CmYJCVNjcm9sbCBkaWZmIHZpZXcgdG8gbmV4dCBmaWxlCjxDdHJsLVM+CQlTZWFyY2ggZm9yIG5leHQgaGl0IGluIGRpZmYgdmlldwo8Q3RybC1SPgkJU2VhcmNoIGZvciBwcmV2aW91cyBoaXQgaW4gZGlmZiB2aWV3CjxDdHJsLUtQKz4JSW5jcmVhc2UgZm9udCBzaXplCjxDdHJsLXBsdXM+CUluY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1LUC0+CURlY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1taW51cz4JRGVjcmVhc2UgZm9udCBzaXplCjxGNT4JCVVwZGF0ZQp9IFwKCSAgICAtanVzdGlmeSBsZWZ0IC1iZyB3aGl0ZSAtYm9yZGVyIDIgLXJlbGllZiBncm9vdmUKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgYm90aCAtcGFkeCAyIC1wYWR5IDIKICAgICR3Lm0gY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIgLWRlZmF1bHQgYWN0aXZlCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQogICAgJHcub2sgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJmb2N1cyAkdy5vayIKICAgIGJpbmQgJHcgPEtleS1Fc2NhcGU+ICJkZXN0cm95ICR3IgogICAgYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KCXNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCXNldCBwcmVmZW5kc3RhY2sgW2xyZXBsYWNlICRwcmVmZW5kc3RhY2sgZW5kIGVuZF0KCXNldCBwcmVmaXggW3N0cmluZyByYW5nZSAkcHJlZml4IDAgJHByZWZpeGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCnByb2MgaW5pdF9mbGlzdCB7Zmlyc3R9IHsKICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCiAgICBpZiB7JGZpcnN0IG5lIHt9fSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGZpcnN0CglzZXQgY2ZsaXN0X3RvcCAxCgkkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0IDEuMCAiMS4wIGxpbmVlbmQiCiAgICB9IGVsc2UgewoJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQp9Cgpwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcGF0aHMKCiAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CglpZiB7W3N0cmluZyBtYXRjaCAkcCAkZl19IHsKCSAgICByZXR1cm4gImJvbGQiCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBoaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJc2V0IGVuZCBbbGluZGV4IFtzcGxpdCBbJGNmbGlzdCBpbmRleCBlbmRdIC5dIDBdCglmb3Ige3NldCBsIDJ9IHskbCA8ICRlbmR9IHtpbmNyIGx9IHsKCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KCSAgICBpZiB7W2hpZ2hsaWdodF90YWcgJGxpbmVdIG5lIHt9fSB7CgkJJGNmbGlzdCB0YWcgYWRkIGJvbGQgJGwuMCAiJGwuMCBsaW5lZW5kIgoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgloaWdobGlnaHRfdHJlZSAyIHt9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdW5oaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgYWRkX2ZsaXN0IHtmbH0gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGZsIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCgkkY2ZsaXN0IGluc2VydCBlbmQgJGYgW2hpZ2hsaWdodF90YWcgJGZdCiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsX2ZsaXN0IHt3IHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGRpZmZmaWxlc3RhcnQgY2ZsaXN0IGNmbGlzdF90b3AgY21pdG1vZGUKCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKICAgIH0gZWxzZSB7CgljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KICAgIH0KfQoKIyBGdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2hlbGwtdHlwZSBxdW90aW5nCgpwcm9jIHNoZWxscXVvdGUge3N0cn0gewogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXCBcdF0qIiAkc3RyXX0gewoJcmV0dXJuICRzdHIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFxdKiIgJHN0cl19IHsKCXJldHVybiAiXCIkc3RyXCIiCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIionKiIgJHN0cl19IHsKCXJldHVybiAiJyRzdHInIgogICAgfQogICAgcmV0dXJuICJcIltzdHJpbmcgbWFwIHtcIiBcXFwiIFxcIFxcXFx9ICRzdHJdXCIiCn0KCnByb2Mgc2hlbGxhcmdsaXN0IHtsfSB7CiAgICBzZXQgc3RyIHt9CiAgICBmb3JlYWNoIGEgJGwgewoJaWYgeyRzdHIgbmUge319IHsKCSAgICBhcHBlbmQgc3RyICIgIgoJfQoJYXBwZW5kIHN0ciBbc2hlbGxxdW90ZSAkYV0KICAgIH0KICAgIHJldHVybiAkc3RyCn0KCnByb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKICAgIHNldCByZXQge30KICAgIHNldCB1c2VkIC0xCiAgICB3aGlsZSB7MX0gewoJaW5jciB1c2VkCglpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcWydcIlxcXFwgXHRdIiAkc3RyIGZpcnN0XX0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KCSAgICBzZXQgdXNlZCBbc3RyaW5nIGxlbmd0aCAkc3RyXQoJICAgIGJyZWFrCgl9CglzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCXNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCX0KCWlmIHskY2ggZXEgIiAiIHx8ICRjaCBlcSAiXHQifSBicmVhawoJaW5jciB1c2VkCglpZiB7JGNoIGVxICInIn0gewoJICAgIHNldCBmaXJzdCBbc3RyaW5nIGZpcnN0ICInIiAkc3RyICR1c2VkXQoJICAgIGlmIHskZmlyc3QgPCAwfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0CgkgICAgY29udGludWUKCX0KCWlmIHskY2ggZXEgIlxcIn0gewoJICAgIGlmIHskdXNlZCA+PSBbc3RyaW5nIGxlbmd0aCAkc3RyXX0gewoJCWVycm9yICJ0cmFpbGluZyBiYWNrc2xhc2giCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGNvbnRpbnVlCgl9CgkjIGhlcmUgY2ggPT0gIlwiIgoJd2hpbGUgezF9IHsKCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBkb3VibGUtcXVvdGUiCgkgICAgfQoJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJICAgIHNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJICAgIGlmIHskZmlyc3QgPiAkdXNlZH0gewoJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkJc2V0IHVzZWQgJGZpcnN0CgkgICAgfQoJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKCSAgICBpbmNyIHVzZWQKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBpbmNyIHVzZWQKCX0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQp9Cgpwcm9jIHNoZWxsc3BsaXQge3N0cn0gewogICAgc2V0IGwge30KICAgIHdoaWxlIHsxfSB7CglzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KCWlmIHskc3RyIGVxIHt9fSBicmVhawoJc2V0IGRxIFtzaGVsbGRlcXVvdGUgJHN0cl0KCXNldCBuIFtsaW5kZXggJGRxIDBdCglzZXQgd29yZCBbbGluZGV4ICRkcSAxXQoJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRzdHIgJG4gZW5kXQoJbGFwcGVuZCBsICR3b3JkCiAgICB9CiAgICByZXR1cm4gJGwKfQoKIyBDb2RlIHRvIGltcGxlbWVudCBtdWx0aXBsZSB2aWV3cwoKcHJvYyBuZXd2aWV3IHtpc2hpZ2hsaWdodH0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHVpZm9udCBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCgogICAgc2V0IG5ld2lzaGlnaGxpZ2h0ICRpc2hpZ2hsaWdodAogICAgc2V0IHRvcCAuZ2l0a3ZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkbmV4dHZpZXdudW0pICJWaWV3ICRuZXh0dmlld251bSIKICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKICAgIHNldCBuZXd2aWV3YXJncygkbmV4dHZpZXdudW0pIFtzaGVsbGFyZ2xpc3QgJHJldnRyZWVhcmdzXQogICAgdmlld2VkaXRvciAkdG9wICRuZXh0dmlld251bSAiR2l0ayB2aWV3IGRlZmluaXRpb24iCn0KCnByb2MgZWRpdHZpZXcge30gewogICAgZ2xvYmFsIGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybQogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzCgogICAgc2V0IHRvcCAuZ2l0a3ZlZGl0LSRjdXJ2aWV3CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3dmlld25hbWUoJGN1cnZpZXcpICR2aWV3bmFtZSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3cGVybSgkY3VydmlldykgJHZpZXdwZXJtKCRjdXJ2aWV3KQogICAgc2V0IG5ld3ZpZXdhcmdzKCRjdXJ2aWV3KSBbc2hlbGxhcmdsaXN0ICR2aWV3YXJncygkY3VydmlldyldCiAgICB2aWV3ZWRpdG9yICR0b3AgJGN1cnZpZXcgIkdpdGs6IGVkaXQgdmlldyAkdmlld25hbWUoJGN1cnZpZXcpIgp9Cgpwcm9jIHZpZXdlZGl0b3Ige3RvcCBuIHRpdGxlfSB7CiAgICBnbG9iYWwgbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdmlld2ZpbGVzCiAgICBnbG9iYWwgdWlmb250CgogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAkdGl0bGUKICAgIGxhYmVsICR0b3AubmwgLXRleHQgIk5hbWUiIC1mb250ICR1aWZvbnQKICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBuZXd2aWV3bmFtZSgkbikgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLm5sICR0b3AubmFtZSAtc3RpY2t5IHcgLXBhZHkgNQogICAgY2hlY2tidXR0b24gJHRvcC5wZXJtIC10ZXh0ICJSZW1lbWJlciB0aGlzIHZpZXciIC12YXJpYWJsZSBuZXd2aWV3cGVybSgkbikgXAoJLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLnBlcm0gLSAtcGFkeSA1IC1zdGlja3kgdwogICAgbWVzc2FnZSAkdG9wLmFsIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKCS10ZXh0ICJDb21taXRzIHRvIGluY2x1ZGUgKGFyZ3VtZW50cyB0byBnaXQgcmV2LWxpc3QpOiIKICAgIGdyaWQgJHRvcC5hbCAtIC1zdGlja3kgdyAtcGFkeSA1CiAgICBlbnRyeSAkdG9wLmFyZ3MgLXdpZHRoIDUwIC10ZXh0dmFyaWFibGUgbmV3dmlld2FyZ3MoJG4pIFwKCS1iYWNrZ3JvdW5kIHdoaXRlIC1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5hcmdzIC0gLXN0aWNreSBldyAtcGFkeCA1CiAgICBtZXNzYWdlICR0b3AubCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiRW50ZXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGluY2x1ZGUsIG9uZSBwZXIgbGluZToiCiAgICBncmlkICR0b3AubCAtIC1zdGlja3kgdwogICAgdGV4dCAkdG9wLnQgLXdpZHRoIDQwIC1oZWlnaHQgMTAgLWJhY2tncm91bmQgd2hpdGUgLWZvbnQgJHVpZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJZm9yZWFjaCBmICR2aWV3ZmlsZXMoJG4pIHsKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAkZgoJICAgICR0b3AudCBpbnNlcnQgZW5kICJcbiIKCX0KCSR0b3AudCBkZWxldGUge2VuZCAtIDFjfSBlbmQKCSR0b3AudCBtYXJrIHNldCBpbnNlcnQgMC4wCiAgICB9CiAgICBncmlkICR0b3AudCAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgW2xpc3QgbmV3dmlld29rICR0b3AgJG5dIFwKCS1mb250ICR1aWZvbnQKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHRvcF0gXAoJLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudAp9Cgpwcm9jIGRvdmlld21lbnUge20gZmlyc3QgY21kIG9wIGFyZ3Z9IHsKICAgIHNldCBubWVudSBbJG0gaW5kZXggZW5kXQogICAgZm9yIHtzZXQgaSAkZmlyc3R9IHskaSA8PSAkbm1lbnV9IHtpbmNyIGl9IHsKCWlmIHtbJG0gZW50cnljZ2V0ICRpIC1jb21tYW5kXSBlcSAkY21kfSB7CgkgICAgZXZhbCAkbSAkb3AgJGkgJGFyZ3YKCSAgICBicmVhawoJfQogICAgfQp9Cgpwcm9jIGFsbHZpZXdtZW51cyB7biBvcCBhcmdzfSB7CiAgICBnbG9iYWwgdmlld2hsbWVudQoKICAgIGRvdmlld21lbnUgLmJhci52aWV3IDUgW2xpc3Qgc2hvd3ZpZXcgJG5dICRvcCAkYXJncwogICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dICRvcCAkYXJncwp9Cgpwcm9jIG5ld3ZpZXdvayB7dG9wIG59IHsKICAgIGdsb2JhbCBuZXh0dmlld251bSBuZXd2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3cGVybSBzZWxlY3RlZHZpZXcgY3VydmlldwogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzIHZpZXdobG1lbnUKCiAgICBpZiB7W2NhdGNoIHsKCXNldCBuZXdhcmdzIFtzaGVsbHNwbGl0ICRuZXd2aWV3YXJncygkbildCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBpbiBjb21taXQgc2VsZWN0aW9uIGFyZ3VtZW50czogJGVyciIKCXdtIHJhaXNlICR0b3AKCWZvY3VzICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IGZpbGVzIHt9CiAgICBmb3JlYWNoIGYgW3NwbGl0IFskdG9wLnQgZ2V0IDAuMCBlbmRdICJcbiJdIHsKCXNldCBmdCBbc3RyaW5nIHRyaW0gJGZdCglpZiB7JGZ0IG5lIHt9fSB7CgkgICAgbGFwcGVuZCBmaWxlcyAkZnQKCX0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7CgkjIGNyZWF0aW5nIGEgbmV3IHZpZXcKCWluY3IgbmV4dHZpZXdudW0KCXNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKCXNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCWFkZHZpZXdtZW51ICRuCglpZiB7ISRuZXdpc2hpZ2hsaWdodH0gewoJICAgIHJ1biBzaG93dmlldyAkbgoJfSBlbHNlIHsKCSAgICBydW4gYWRkdmhpZ2hsaWdodCAkbgoJfQogICAgfSBlbHNlIHsKCSMgZWRpdGluZyBhbiBleGlzdGluZyB2aWV3CglzZXQgdmlld3Blcm0oJG4pICRuZXd2aWV3cGVybSgkbikKCWlmIHskbmV3dmlld25hbWUoJG4pIG5lICR2aWV3bmFtZSgkbil9IHsKCSAgICBzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCSAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA1IFtsaXN0IHNob3d2aWV3ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pXQoJICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pIC12YWx1ZSAkdmlld25hbWUoJG4pXQoJfQoJaWYgeyRmaWxlcyBuZSAkdmlld2ZpbGVzKCRuKSB8fCAkbmV3YXJncyBuZSAkdmlld2FyZ3MoJG4pfSB7CgkgICAgc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCgkgICAgc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncwoJICAgIGlmIHskY3VydmlldyA9PSAkbn0gewoJCXJ1biB1cGRhdGVjb21taXRzCgkgICAgfQoJfQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KfQoKcHJvYyBkZWx2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdwZXJtIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskY3VydmlldyA9PSAwfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQoJdW5zZXQgaGx2aWV3CiAgICB9CiAgICBhbGx2aWV3bWVudXMgJGN1cnZpZXcgZGVsZXRlCiAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIHt9CiAgICBzZXQgdmlld3Blcm0oJGN1cnZpZXcpIDAKICAgIHNob3d2aWV3IDAKfQoKcHJvYyBhZGR2aWV3bWVudSB7bn0gewogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdobG1lbnUKCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IHNob3d2aWV3ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAkbgogICAgJHZpZXdobG1lbnUgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIC12YXJpYWJsZSBzZWxlY3RlZGhsdmlldwp9Cgpwcm9jIGZsYXR0ZW4ge3Zhcn0gewogICAgZ2xvYmFsICR2YXIKCiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGkgW2FycmF5IG5hbWVzICR2YXJdIHsKCWxhcHBlbmQgcmV0ICRpIFtzZXQgJHZhclwoJGlcKV0KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgdW5mbGF0dGVuIHt2YXIgbH0gewogICAgZ2xvYmFsICR2YXIKCiAgICBjYXRjaCB7dW5zZXQgJHZhcn0KICAgIGZvcmVhY2gge2kgdn0gJGwgewoJc2V0ICR2YXJcKCRpXCkgJHYKICAgIH0KfQoKcHJvYyBzaG93dmlldyB7bn0gewogICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld2ZpbGVzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3Qgcm93aWRsaXN0IHJvd29mZnNldHMKICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eCBjb21taXRyb3cgbmV4dGNvbG9yIGNhbnZ4bWF4CiAgICBnbG9iYWwgbnVtY29tbWl0cyByb3dyYW5nZWxpc3QgY29tbWl0bGlzdGVkIGlkcm93cmFuZ2VzIHJvd2NoawogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY2FudiBjYW52eTAKICAgIGdsb2JhbCB0cmVlZGlmZnMKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdCBwaGFzZQogICAgZ2xvYmFsIGNvbW1pdGlkeCByb3dsYWlkb3V0IHJvd29wdGltCiAgICBnbG9iYWwgY29tbWZkCiAgICBnbG9iYWwgc2VsZWN0ZWR2aWV3IHNlbGVjdGZpcnN0CiAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmRpc3BvcmRlciB2Y21pdGxpc3RlZAogICAgZ2xvYmFsIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskbiA9PSAkY3Vydmlld30gcmV0dXJuCiAgICBzZXQgc2VsaWQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IHNlbGlkICRjdXJyZW50aWQKCXNldCB5IFt5YyAkc2VsZWN0ZWRsaW5lXQoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJc2V0IHNwYW4gWyRjYW52IHl2aWV3XQoJc2V0IHl0b3AgW2V4cHIge1tsaW5kZXggJHNwYW4gMF0gKiAkeW1heH1dCglzZXQgeWJvdCBbZXhwciB7W2xpbmRleCAkc3BhbiAxXSAqICR5bWF4fV0KCWlmIHskeXRvcCA8ICR5ICYmICR5IDwgJHlib3R9IHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7JHkgLSAkeXRvcH1dCgl9IGVsc2UgewoJICAgIHNldCB5c2NyZWVuIFtleHByIHsoJHlib3QgLSAkeXRvcCkgLyAyfV0KCX0KICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdfSB7CglzZXQgc2VsaWQgJHBlbmRpbmdfc2VsZWN0Cgl1bnNldCBwZW5kaW5nX3NlbGVjdAogICAgfQogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICBpZiB7JGN1cnZpZXcgPj0gMH0gewoJc2V0IHZwYXJlbnRsaXN0KCRjdXJ2aWV3KSAkcGFyZW50bGlzdAoJc2V0IHZkaXNwb3JkZXIoJGN1cnZpZXcpICRkaXNwbGF5b3JkZXIKCXNldCB2Y21pdGxpc3RlZCgkY3VydmlldykgJGNvbW1pdGxpc3RlZAoJaWYgeyRwaGFzZSBuZSB7fX0gewoJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAoJCVtsaXN0ICRwaGFzZSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3QgXAoJCSAgICAgW2ZsYXR0ZW4gaWRyb3dyYW5nZXNdIFtmbGF0dGVuIGlkaW5saXN0XSBcCgkJICAgICAkcm93bGFpZG91dCAkcm93b3B0aW0gJG51bWNvbW1pdHNdCgl9IGVsc2VpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkY3VydmlldyldCgkJICB8fCBbbGluZGV4ICR2aWV3ZGF0YSgkY3VydmlldykgMF0gbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCB7fSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3RdCgl9CiAgICB9CiAgICBjYXRjaCB7dW5zZXQgdHJlZWRpZmZzfQogICAgY2xlYXJfZGlzcGxheQogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJG59IHsKCXVuc2V0IGhsdmlldwoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKICAgIH0KCiAgICBzZXQgY3VydmlldyAkbgogICAgc2V0IHNlbGVjdGVkdmlldyAkbgogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRGVsZXRlKiAtc3RhdGUgW2V4cHIgeyRuID09IDA/ICJkaXNhYmxlZCI6ICJub3JtYWwifV0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CglpZiB7JHNlbGlkIG5lIHt9fSB7CgkgICAgc2V0IHBlbmRpbmdfc2VsZWN0ICRzZWxpZAoJfQoJZ2V0Y29tbWl0cwoJcmV0dXJuCiAgICB9CgogICAgc2V0IHYgJHZpZXdkYXRhKCRuKQogICAgc2V0IHBoYXNlIFtsaW5kZXggJHYgMF0KICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCiAgICBzZXQgcGFyZW50bGlzdCAkdnBhcmVudGxpc3QoJG4pCiAgICBzZXQgY29tbWl0bGlzdGVkICR2Y21pdGxpc3RlZCgkbikKICAgIHNldCByb3dpZGxpc3QgW2xpbmRleCAkdiAxXQogICAgc2V0IHJvd29mZnNldHMgW2xpbmRleCAkdiAyXQogICAgc2V0IHJvd3JhbmdlbGlzdCBbbGluZGV4ICR2IDNdCiAgICBpZiB7JHBoYXNlIGVxIHt9fSB7CglzZXQgbnVtY29tbWl0cyBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQoJY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQogICAgfSBlbHNlIHsKCXVuZmxhdHRlbiBpZHJvd3JhbmdlcyBbbGluZGV4ICR2IDRdCgl1bmZsYXR0ZW4gaWRpbmxpc3QgW2xpbmRleCAkdiA1XQoJc2V0IHJvd2xhaWRvdXQgW2xpbmRleCAkdiA2XQoJc2V0IHJvd29wdGltIFtsaW5kZXggJHYgN10KCXNldCBudW1jb21taXRzIFtsaW5kZXggJHYgOF0KCWNhdGNoIHt1bnNldCByb3djaGt9CiAgICB9CgogICAgY2F0Y2gge3Vuc2V0IGNvbG9ybWFwfQogICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQogICAgc2V0IGN1cnZpZXcgJG4KICAgIHNldCByb3cgMAogICAgc2V0Y2FudnNjcm9sbAogICAgc2V0IHlmIDAKICAgIHNldCByb3cge30KICAgIHNldCBzZWxlY3RmaXJzdCAwCiAgICBpZiB7JHNlbGlkIG5lIHt9ICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJG4sJHNlbGlkKV19IHsKCXNldCByb3cgJGNvbW1pdHJvdygkbiwkc2VsaWQpCgkjIHRyeSB0byBnZXQgdGhlIHNlbGVjdGVkIHJvdyBpbiB0aGUgc2FtZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuCglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglzZXQgeXRvcCBbZXhwciB7W3ljICRyb3ddIC0gJHlzY3JlZW59XQoJaWYgeyR5dG9wIDwgMH0gewoJICAgIHNldCB5dG9wIDAKCX0KCXNldCB5ZiBbZXhwciB7JHl0b3AgKiAxLjAgLyAkeW1heH1dCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmCiAgICBkcmF3dmlzaWJsZQogICAgaWYgeyRyb3cgbmUge319IHsKCXNlbGVjdGxpbmUgJHJvdyAwCiAgICB9IGVsc2VpZiB7JHNlbGlkIG5lIHt9fSB7CglzZXQgcGVuZGluZ19zZWxlY3QgJHNlbGlkCiAgICB9IGVsc2UgewoJc2V0IHJvdyBbZXhwciB7W2xpbmRleCAkZGlzcGxheW9yZGVyIDBdIGVxICRudWxsaWR9XQoJaWYgeyRyb3cgPCAkbnVtY29tbWl0c30gewoJICAgIHNlbGVjdGxpbmUgJHJvdyAwCgl9IGVsc2UgewoJICAgIHNldCBzZWxlY3RmaXJzdCAxCgl9CiAgICB9CiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0gewoJICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCgl9CglydW4gY2hld2NvbW1pdHMgJG4KICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKICAgIH0KfQoKIyBTdHVmZiByZWxhdGluZyB0byB0aGUgaGlnaGxpZ2h0aW5nIGZhY2lsaXR5Cgpwcm9jIGlzaGlnaGxpZ2h0ZWQge3Jvd30gewogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV0gJiYgJG5oaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRuaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV0gJiYgJHZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICR2aGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV0gJiYgJGZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRmaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV0gJiYgJHJoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRyaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyBib2xkZW4ge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBzZWxlY3RlZGxpbmUgYm9sZHJvd3MKCiAgICBsYXBwZW5kIGJvbGRyb3dzICRyb3cKICAgICRjYW52IGl0ZW1jb25mICRsaW5laHRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYgZGVsZXRlIHNlY3NlbAoJc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgYm9sZGVuX25hbWUge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudjIgbGluZW50YWcgc2VsZWN0ZWRsaW5lIGJvbGRuYW1lcm93cwoKICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKICAgICRjYW52MiBpdGVtY29uZiAkbGluZW50YWcoJHJvdykgLWZvbnQgJGZvbnQKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKCSRjYW52MiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkcm93KV0gXAoJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKCQkgICAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYyIGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5ib2xkZW4ge30gewogICAgZ2xvYmFsIG1haW5mb250IGJvbGRyb3dzCgogICAgc2V0IHN0aWxsYm9sZCB7fQogICAgZm9yZWFjaCByb3cgJGJvbGRyb3dzIHsKCWlmIHshW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyAkbWFpbmZvbnQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBzdGlsbGJvbGQgJHJvdwoJfQogICAgfQogICAgc2V0IGJvbGRyb3dzICRzdGlsbGJvbGQKfQoKcHJvYyBhZGR2aGlnaGxpZ2h0IHtufSB7CiAgICBnbG9iYWwgaGx2aWV3IGN1cnZpZXcgdmlld2RhdGEgdmhsX2RvbmUgdmhpZ2hsaWdodHMgY29tbWl0aWR4CgogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CglkZWx2aGlnaGxpZ2h0CiAgICB9CiAgICBzZXQgaGx2aWV3ICRuCiAgICBpZiB7JG4gIT0gJGN1cnZpZXcgJiYgIVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CglzZXQgdmlld2RhdGEoJG4pIFtsaXN0IGdldGNvbW1pdHMge3t9fSB7e319IHt9IHt9IHt9IDAgMCAwIHt9XQoJc2V0IHZwYXJlbnRsaXN0KCRuKSB7fQoJc2V0IHZkaXNwb3JkZXIoJG4pIHt9CglzZXQgdmNtaXRsaXN0ZWQoJG4pIHt9CglzdGFydF9yZXZfbGlzdCAkbgogICAgfQogICAgc2V0IHZobF9kb25lICRjb21taXRpZHgoJGhsdmlldykKICAgIGlmIHskdmhsX2RvbmUgPiAwfSB7CglkcmF3dmlzaWJsZQogICAgfQp9Cgpwcm9jIGRlbHZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGhsdmlld119IHJldHVybgogICAgdW5zZXQgaGx2aWV3CiAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgp9Cgpwcm9jIHZoaWdobGlnaHRtb3JlIHt9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhsX2RvbmUgY29tbWl0aWR4IHZoaWdobGlnaHRzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHZkaXNwb3JkZXIgY3VydmlldyBtYWluZm9udAoKICAgIHNldCBmb250IFtjb25jYXQgJG1haW5mb250IGJvbGRdCiAgICBzZXQgbWF4ICRjb21taXRpZHgoJGhsdmlldykKICAgIGlmIHskaGx2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgZGlzcCAkZGlzcGxheW9yZGVyCiAgICB9IGVsc2UgewoJc2V0IGRpc3AgJHZkaXNwb3JkZXIoJGhsdmlldykKICAgIH0KICAgIHNldCB2ciBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjAgW2xpbmRleCAkdnIgMF0KICAgIHNldCByMSBbbGluZGV4ICR2ciAxXQogICAgZm9yIHtzZXQgaSAkdmhsX2RvbmV9IHskaSA8ICRtYXh9IHtpbmNyIGl9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwICRpXQoJaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJICAgIGlmIHskcjAgPD0gJHJvdyAmJiAkcm93IDw9ICRyMX0gewoJCWlmIHshW2hpZ2hsaWdodGVkICRyb3ddfSB7CgkJICAgIGJvbGRlbiAkcm93ICRmb250CgkJfQoJCXNldCB2aGlnaGxpZ2h0cygkcm93KSAxCgkgICAgfQoJfQogICAgfQogICAgc2V0IHZobF9kb25lICRtYXgKfQoKcHJvYyBhc2t2aGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMgY29tbWl0cm93IGlkZHJhd24gbWFpbmZvbnQKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkaGx2aWV3LCRpZCldfSB7CglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV0gJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KCXNldCB2aGlnaGxpZ2h0cygkcm93KSAxCiAgICB9IGVsc2UgewoJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDAKICAgIH0KfQoKcHJvYyBoZmlsZXNfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmhfc2VyaWFsCiAgICBnbG9iYWwgbWFpbmZvbnQgaGlnaGxpZ2h0X3BhdGhzCgogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cwoJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQoJdW5zZXQgZmlsZWhpZ2hsaWdodAoJY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQoJdW5ib2xkZW4KCXVuaGlnaGxpZ2h0X2ZpbGVsaXN0CiAgICB9CiAgICBzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CiAgICBhZnRlciBjYW5jZWwgZG9fZmlsZV9obCAkZmhfc2VyaWFsCiAgICBpbmNyIGZoX3NlcmlhbAogICAgaWYgeyRoaWdobGlnaHRfZmlsZXMgbmUge319IHsKCWFmdGVyIDMwMCBkb19maWxlX2hsICRmaF9zZXJpYWwKICAgIH0KfQoKcHJvYyBtYWtlcGF0dGVybnMge2x9IHsKICAgIHNldCByZXQge30KICAgIGZvcmVhY2ggZSAkbCB7CglzZXQgZWUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9ICRlXQoJaWYge1tzdHJpbmcgaW5kZXggJGVlIGVuZF0gZXEgIi8ifSB7CgkgICAgbGFwcGVuZCByZXQgIiRlZSoiCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmV0ICRlZQoJICAgIGxhcHBlbmQgcmV0ICIkZWUvKiIKCX0KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgZG9fZmlsZV9obCB7c2VyaWFsfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGZpbGVoaWdobGlnaHQgaGlnaGxpZ2h0X3BhdGhzIGdkdHR5cGUgZmhsX2xpc3QKCiAgICBpZiB7JGdkdHR5cGUgZXEgInRvdWNoaW5nIHBhdGhzOiJ9IHsKCWlmIHtbY2F0Y2gge3NldCBwYXRocyBbc2hlbGxzcGxpdCAkaGlnaGxpZ2h0X2ZpbGVzXX1dfSByZXR1cm4KCXNldCBoaWdobGlnaHRfcGF0aHMgW21ha2VwYXR0ZXJucyAkcGF0aHNdCgloaWdobGlnaHRfZmlsZWxpc3QKCXNldCBnZHRhcmdzIFtjb25jYXQgLS0gJHBhdGhzXQogICAgfSBlbHNlIHsKCXNldCBnZHRhcmdzIFtsaXN0ICItUyRoaWdobGlnaHRfZmlsZXMiXQogICAgfQogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtciAtcyAtLXN0ZGluICRnZHRhcmdzXQogICAgc2V0IGZpbGVoaWdobGlnaHQgW29wZW4gJGNtZCByK10KICAgIGZjb25maWd1cmUgJGZpbGVoaWdobGlnaHQgLWJsb2NraW5nIDAKICAgIGZpbGVydW4gJGZpbGVoaWdobGlnaHQgcmVhZGZoaWdobGlnaHQKICAgIHNldCBmaGxfbGlzdCB7fQogICAgZHJhd3Zpc2libGUKICAgIGZsdXNoaGlnaGxpZ2h0cwp9Cgpwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGxfbGlzdAoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCWxhcHBlbmQgZmhsX2xpc3Qge30KCXB1dHMgJGZpbGVoaWdobGlnaHQgIiIKCWZsdXNoICRmaWxlaGlnaGxpZ2h0CiAgICB9Cn0KCnByb2MgYXNrZmlsZWhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaGxfbGlzdAoKICAgIGxhcHBlbmQgZmhsX2xpc3QgJGlkCiAgICBzZXQgZmhpZ2hsaWdodHMoJHJvdykgLTEKICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCn0KCnByb2MgcmVhZGZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgY29tbWl0cm93IGN1cnZpZXcgbWFpbmZvbnQgaWRkcmF3bgogICAgZ2xvYmFsIGZobF9saXN0CgogICAgaWYgeyFbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCXJldHVybiAwCiAgICB9CiAgICBzZXQgbnIgMAogICAgd2hpbGUge1tpbmNyIG5yXSA8PSAxMDAgJiYgW2dldHMgJGZpbGVoaWdobGlnaHQgbGluZV0gPj0gMH0gewoJc2V0IGxpbmUgW3N0cmluZyB0cmltICRsaW5lXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRmaGxfbGlzdCAkbGluZV0KCWlmIHskaSA8IDB9IGNvbnRpbnVlCglmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CgkgICAgc2V0IGlkIFtsaW5kZXggJGZobF9saXN0ICRqXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkJc2V0IGZoaWdobGlnaHRzKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgMAoJICAgIH0KCX0KCXNldCBmaGxfbGlzdCBbbHJhbmdlICRmaGxfbGlzdCBbZXhwciB7JGkrMX1dIGVuZF0KCWlmIHskbGluZSBlcSB7fX0gY29udGludWUKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkbGluZSldfSBjb250aW51ZQoJc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKQoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRsaW5lKV0gJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KCXNldCBmaGlnaGxpZ2h0cygkcm93KSAxCiAgICB9CiAgICBpZiB7W2VvZiAkZmlsZWhpZ2hsaWdodF19IHsKCSMgc3RyYW5nZS4uLgoJcHV0cyAib29wcywgZ2l0IGRpZmYtdHJlZSBkaWVkIgoJY2F0Y2gge2Nsb3NlICRmaWxlaGlnaGxpZ2h0fQoJdW5zZXQgZmlsZWhpZ2hsaWdodAoJcmV0dXJuIDAKICAgIH0KICAgIG5leHRfaGxjb250CiAgICByZXR1cm4gMQp9Cgpwcm9jIGZpbmRfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgbWFpbmZvbnQgYm9sZG5hbWVyb3dzCiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kdHlwZSBtYXJraW5nbWF0Y2hlcwoKICAgICMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMsIGlmIGFueQogICAgZm9yZWFjaCByb3cgJGJvbGRuYW1lcm93cyB7Cglib2xkZW5fbmFtZSAkcm93ICRtYWluZm9udAogICAgfQogICAgc2V0IGJvbGRuYW1lcm93cyB7fQogICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQogICAgdW5ib2xkZW4KICAgIHVubWFya21hdGNoZXMKICAgIGlmIHskZmluZHR5cGUgbmUgIlJlZ2V4cCJ9IHsKCXNldCBlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSBcCgkJICAgJGZpbmRzdHJpbmddCglzZXQgZmluZHBhdHRlcm4gIiokZSoiCiAgICB9CiAgICBzZXQgbWFya2luZ21hdGNoZXMgW2V4cHIgeyRmaW5kc3RyaW5nIG5lIHt9fV0KICAgIGRyYXd2aXNpYmxlCn0KCnByb2MgZG9lc21hdGNoIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHN0cmluZyBmaW5kcGF0dGVybgoKICAgIGlmIHskZmluZHR5cGUgZXEgIlJlZ2V4cCJ9IHsKCXJldHVybiBbcmVnZXhwICRmaW5kc3RyaW5nICRmXQogICAgfSBlbHNlaWYgeyRmaW5kdHlwZSBlcSAiSWduQ2FzZSJ9IHsKCXJldHVybiBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJGZpbmRwYXR0ZXJuICRmXQogICAgfSBlbHNlIHsKCXJldHVybiBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KICAgIH0KfQoKcHJvYyBhc2tmaW5kaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBjb21taXRpbmZvIGlkZHJhd24gbWFpbmZvbnQKICAgIGdsb2JhbCBmaW5kbG9jCiAgICBnbG9iYWwgbWFya2luZ21hdGNoZXMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglnZXRjb21taXQgJGlkCiAgICB9CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgaXNib2xkIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CglpZiB7KCRmaW5kbG9jIGVxICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyBlcSAkdHkpICYmCgkgICAgW2RvZXNtYXRjaCAkZl19IHsKCSAgICBpZiB7JHR5IGVxICJBdXRob3IifSB7CgkJc2V0IGlzYm9sZCAyCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9CiAgICBpZiB7JGlzYm9sZCAmJiBbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJc2V0IGYgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCWlmIHshW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyAkZgoJICAgIGlmIHskaXNib2xkID4gMX0gewoJCWJvbGRlbl9uYW1lICRyb3cgJGYKCSAgICB9Cgl9CglpZiB7JG1hcmtpbmdtYXRjaGVzfSB7CgkgICAgbWFya3Jvd21hdGNoZXMgJHJvdyBbbGluZGV4ICRpbmZvIDBdIFtsaW5kZXggJGluZm8gMV0KCX0KICAgIH0KICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgbWFya3Jvd21hdGNoZXMge3JvdyBoZWFkbGluZSBhdXRob3J9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGxpbmVodGFnIGxpbmVudGFnCgogICAgJGNhbnYgZGVsZXRlIG1hdGNoJHJvdwogICAgJGNhbnYyIGRlbGV0ZSBtYXRjaCRyb3cKICAgIHNldCBtIFtmaW5kbWF0Y2hlcyAkaGVhZGxpbmVdCiAgICBpZiB7JG0gbmUge319IHsKCW1hcmttYXRjaGVzICRjYW52ICRyb3cgJGhlYWRsaW5lICRsaW5laHRhZygkcm93KSAkbSBcCgkgICAgWyRjYW52IGl0ZW1jZ2V0ICRsaW5laHRhZygkcm93KSAtZm9udF0KICAgIH0KICAgIHNldCBtIFtmaW5kbWF0Y2hlcyAkYXV0aG9yXQogICAgaWYgeyRtIG5lIHt9fSB7CgltYXJrbWF0Y2hlcyAkY2FudjIgJHJvdyAkYXV0aG9yICRsaW5lbnRhZygkcm93KSAkbSBcCgkgICAgWyRjYW52MiBpdGVtY2dldCAkbGluZW50YWcoJHJvdykgLWZvbnRdCiAgICB9Cn0KCnByb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAoKICAgIHJoaWdobGlnaHRfbm9uZQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCXJ1biBkcmF3dmlzaWJsZQogICAgfQp9CgojIHByZXBhcmUgZm9yIHRlc3Rpbmcgd2hldGhlciBjb21taXRzIGFyZSBkZXNjZW5kZW50cyBvciBhbmNlc3RvcnMgb2YgYQpwcm9jIHJoaWdobGlnaHRfc2VsIHthfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQogICAgc2V0IGRlc2NfdG9kbyBbbGlzdCAkYV0KICAgIGNhdGNoIHt1bnNldCBhbmNlc3Rvcn0KICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CglyaGlnaGxpZ2h0X25vbmUKCXJ1biBkcmF3dmlzaWJsZQogICAgfQp9Cgpwcm9jIHJoaWdobGlnaHRfbm9uZSB7fSB7CiAgICBnbG9iYWwgcmhpZ2hsaWdodHMKCiAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgp9Cgpwcm9jIGlzX2Rlc2NlbmRlbnQge2F9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IGNoaWxkcmVuIGNvbW1pdHJvdyBkZXNjZW5kZW50IGRlc2NfdG9kbwoKICAgIHNldCB2ICRjdXJ2aWV3CiAgICBzZXQgbGEgJGNvbW1pdHJvdygkdiwkYSkKICAgIHNldCB0b2RvICRkZXNjX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyRjb21taXRyb3coJHYsJGRvKSA8ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbmsgJGNoaWxkcmVuKCR2LCRkbykgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJG5rKV19IHsKCQlzZXQgZGVzY2VuZGVudCgkbmspIDEKCQlsYXBwZW5kIHRvZG8gJG5rCgkJaWYgeyRuayBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBkZXNjX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgZGVzY2VuZGVudCgkYSkgMAogICAgc2V0IGRlc2NfdG9kbyAkbGVmdG92ZXIKfQoKcHJvYyBpc19hbmNlc3RvciB7YX0gewogICAgZ2xvYmFsIGN1cnZpZXcgcGFyZW50bGlzdCBjb21taXRyb3cgYW5jZXN0b3IgYW5jX3RvZG8KCiAgICBzZXQgdiAkY3VydmlldwogICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCiAgICBzZXQgdG9kbyAkYW5jX3RvZG8KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgc2V0IGRvbmUgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvICRpXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCR2LCRkbyldIHx8ICRjb21taXRyb3coJHYsJGRvKSA+ICRsYX0gewoJICAgIGxhcHBlbmQgbGVmdG92ZXIgJGRvCgkgICAgY29udGludWUKCX0KCWZvcmVhY2ggbnAgW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCR2LCRkbyldIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkbnApXX0gewoJCXNldCBhbmNlc3RvcigkbnApIDEKCQlsYXBwZW5kIHRvZG8gJG5wCgkJaWYgeyRucCBlcSAkYX0gewoJCSAgICBzZXQgZG9uZSAxCgkJfQoJICAgIH0KCX0KCWlmIHskZG9uZX0gewoJICAgIHNldCBhbmNfdG9kbyBbY29uY2F0ICRsZWZ0b3ZlciBbbHJhbmdlICR0b2RvIFtleHByIHskaSsxfV0gZW5kXV0KCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBhbmNlc3RvcigkYSkgMAogICAgc2V0IGFuY190b2RvICRsZWZ0b3Zlcgp9Cgpwcm9jIGFza3JlbGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBoaWdobGlnaHRfcmVsYXRlZCBpZGRyYXduIG1haW5mb250IHJoaWdobGlnaHRzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGFuY2VzdG9yCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgaXNib2xkIDAKICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkRlc2NlbmRlbnQiIHx8CgkkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIk5vdCBkZXNjZW5kZW50In0gewoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkaWQpXX0gewoJICAgIGlzX2Rlc2NlbmRlbnQgJGlkCgl9CglpZiB7JGRlc2NlbmRlbnQoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50Iil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0gZWxzZWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIiB8fAoJICAgICAgJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJOb3QgYW5jZXN0b3IifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbmNlc3RvcigkaWQpXX0gewoJICAgIGlzX2FuY2VzdG9yICRpZAoJfQoJaWYgeyRhbmNlc3RvcigkaWQpID09ICgkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkFuY2VzdG9yIil9IHsKCSAgICBzZXQgaXNib2xkIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gewoJaWYgeyRpc2JvbGQgJiYgIVtpc2hpZ2hsaWdodGVkICRyb3ddfSB7CgkgICAgYm9sZGVuICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KICAgIH0KICAgIHNldCByaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgbmV4dF9obGNvbnQge30gewogICAgZ2xvYmFsIGZobF9yb3cgZmhsX2Rpcm4gZGlzcGxheW9yZGVyIG51bWNvbW1pdHMKICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGxfZGlybl0gfHwgJGZobF9kaXJuID09IDB9IHJldHVybgogICAgc2V0IHJvdyAkZmhsX3JvdwogICAgd2hpbGUgezF9IHsKCWlmIHskcm93IDwgMCB8fCAkcm93ID49ICRudW1jb21taXRzfSB7CgkgICAgYmVsbAoJICAgIHNldCBmaGxfZGlybiAwCgkgICAgcmV0dXJuCgl9CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskdmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYgeyRmaW5kc3RyaW5nIG5lIHt9fSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JG5oaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskcmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0gewoJCSMgYXNrIGZvciBhIGZldyBtb3JlIHdoaWxlIHdlJ3JlIGF0IGl0Li4uCgkJc2V0IHIgJHJvdwoJCWZvciB7c2V0IG4gMH0geyRuIDwgMTAwfSB7aW5jciBufSB7CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyKV19IHsKCQkJYXNrZmlsZWhpZ2hsaWdodCAkciBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCgkJICAgIH0KCQkgICAgaW5jciByICRmaGxfZGlybgoJCSAgICBpZiB7JHIgPCAwIHx8ICRyID49ICRudW1jb21taXRzfSBicmVhawoJCX0KCQlmbHVzaGhpZ2hsaWdodHMKCSAgICB9CgkgICAgaWYgeyRmaGlnaGxpZ2h0cygkcm93KSA8IDB9IHsKCQlzZXQgZmhsX3JvdyAkcm93CgkJcmV0dXJuCgkgICAgfQoJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaW5jciByb3cgJGZobF9kaXJuCiAgICB9CiAgICBzZXQgZmhsX2Rpcm4gMAogICAgc2VsZWN0bGluZSAkcm93IDEKfQoKcHJvYyBuZXh0X2hpZ2hsaWdodCB7ZGlybn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBmaGxfcm93IGZobF9kaXJuCiAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyEoW2luZm8gZXhpc3RzIGhsdmlld10gfHwgJGZpbmRzdHJpbmcgbmUge30gfHwKCSAgJGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiB8fCBbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0pfSByZXR1cm4KICAgIHNldCBmaGxfcm93IFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcm59XQogICAgc2V0IGZobF9kaXJuICRkaXJuCiAgICBuZXh0X2hsY29udAp9Cgpwcm9jIGNhbmNlbF9uZXh0X2hpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgZmhsX2Rpcm4KCiAgICBzZXQgZmhsX2Rpcm4gMAp9CgojIEdyYXBoIGxheW91dCBmdW5jdGlvbnMKCnByb2Mgc2hvcnRpZHMge2lkc30gewogICAgc2V0IHJlcyB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHtbbGxlbmd0aCAkaWRdID4gMX0gewoJICAgIGxhcHBlbmQgcmVzIFtzaG9ydGlkcyAkaWRdCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCSAgICBsYXBwZW5kIHJlcyBbc3RyaW5nIHJhbmdlICRpZCAwIDddCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgcmVzICRpZAoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBpbmNyYW5nZSB7bCB4IG99IHsKICAgIHNldCBuIFtsbGVuZ3RoICRsXQogICAgd2hpbGUgeyR4IDwgJG59IHsKCXNldCBlIFtsaW5kZXggJGwgJHhdCglpZiB7JGUgbmUge319IHsKCSAgICBsc2V0IGwgJHggW2V4cHIgeyRlICsgJG99XQoJfQoJaW5jciB4CiAgICB9CiAgICByZXR1cm4gJGwKfQoKcHJvYyBudGltZXMge24gb30gewogICAgc2V0IHJldCB7fQogICAgZm9yIHt9IHskbiA+IDB9IHtpbmNyIG4gLTF9IHsKCWxhcHBlbmQgcmV0ICRvCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVzZWRpbnJhbmdlIHtpZCBsMSBsMn0gewogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CiAgICB9CiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgZm9yZWFjaCBjICRraWRzIHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGMpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2FuaXR5IHtyb3cge2Z1bGwgMH19IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBjb2wgLTEKICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBmb3JlYWNoIGlkICRpZHMgewoJaW5jciBjb2wKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgoJICAgIFtsc2VhcmNoIC1leGFjdCAtc3RhcnQgW2V4cHIgeyRjb2wrMX1dICRpZHMgJGlkXSA+PSAwfSB7CgkgICAgcHV0cyAib29wczogW3Nob3J0aWRzICRpZF0gcmVwZWF0ZWQgaW4gcm93ICRyb3cgY29sICRjb2w6IHtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXX0iCgl9CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCXNldCB5ICRyb3cKCXNldCB4ICRjb2wKCXdoaWxlIHskbyBuZSB7fX0gewoJICAgIGluY3IgeSAtMQoJICAgIGluY3IgeCAkbwoJICAgIGlmIHtbbGluZGV4ICRyb3dpZGxpc3QgJHkgJHhdICE9ICRpZH0gewoJCXB1dHMgIm9vcHM6IHJvd29mZnNldHMgd3JvbmcgYXQgcm93IFtleHByIHskeSsxfV0gY29sIFtleHByIHskeC0kb31dIgoJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKCQlmb3Ige3NldCBpICRyb3d9IHskaSA+PSAkeX0ge2luY3IgaSAtMX0gewoJCSAgICBwdXRzICIgIHJvdyAkaSBpZHM9e1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJGldXX0gb2Zmcz17W2xpbmRleCAkcm93b2Zmc2V0cyAkaV19IgoJCX0KCQlicmVhawoJICAgIH0KCSAgICBpZiB7ISRmdWxsfSBicmVhawoJICAgIHNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHkgJHhdCgl9CiAgICB9Cn0KCnByb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIHVwYXJyb3dsZW4gaWRyb3dyYW5nZXMgZGlzcGxheW9yZGVyCgogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkdXBhcnJvd2xlbiAmJiAkeSA+IDF9IHtpbmNyIGl9IHsKCWluY3IgeSAtMQoJaW5jciB4ICR6CglzZXQgb2ZmMCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XQoJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0gewoJICAgIGlmIHskeDAgPj0gW2xsZW5ndGggJG9mZjBdfSB7CgkJc2V0IHgwIFtsbGVuZ3RoIFtsaW5kZXggJHJvd29mZnNldHMgW2V4cHIgeyR5LTF9XV1dCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IHogW2xpbmRleCAkb2ZmMCAkeDBdCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJaW5jciB4MCAkegoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHogW2V4cHIgeyR4MCAtICR4fV0KCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KCWxzZXQgcm93b2Zmc2V0cyAkeSBbbGluc2VydCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XSAkeCAkel0KICAgIH0KICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQogICAgbHNldCByb3dvZmZzZXRzICR5IFtpbmNyYW5nZSAkdG1wIFtleHByIHskeCsxfV0gLTFdCiAgICBsYXBwZW5kIGlkcm93cmFuZ2VzKCRvaWQpIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeV0KfQoKcHJvYyBpbml0bGF5b3V0IHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbQogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnZ4bWF4IGNhbnYKICAgIGdsb2JhbCBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRsaXN0CiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHgKICAgIGdsb2JhbCBzZWxlY3RmaXJzdAoKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBkaXNwbGF5b3JkZXIge30KICAgIHNldCBjb21taXRsaXN0ZWQge30KICAgIHNldCBwYXJlbnRsaXN0IHt9CiAgICBzZXQgcm93cmFuZ2VsaXN0IHt9CiAgICBzZXQgbmV4dGNvbG9yIDAKICAgIHNldCByb3dpZGxpc3Qge3t9fQogICAgc2V0IHJvd29mZnNldHMge3t9fQogICAgY2F0Y2gge3Vuc2V0IGlkaW5saXN0fQogICAgY2F0Y2gge3Vuc2V0IHJvd2Noa30KICAgIHNldCByb3dsYWlkb3V0IDAKICAgIHNldCByb3dvcHRpbSAwCiAgICBzZXQgY2FudnhtYXggWyRjYW52IGNnZXQgLXdpZHRoXQogICAgY2F0Y2gge3Vuc2V0IGNvbG9ybWFwfQogICAgY2F0Y2gge3Vuc2V0IHJvd3RleHR4fQogICAgY2F0Y2gge3Vuc2V0IGlkcm93cmFuZ2VzfQogICAgc2V0IHNlbGVjdGZpcnN0IDEKfQoKcHJvYyBzZXRjYW52c2Nyb2xsIHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKCiAgICBzZXQgeW1heCBbZXhwciB7JGNhbnZ5MCArICgkbnVtY29tbWl0cyAtIDAuNSkgKiAkbGluZXNwYyArIDJ9XQogICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCiAgICAkY2FudjIgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQogICAgJGNhbnYzIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KfQoKcHJvYyB2aXNpYmxlcm93cyB7fSB7CiAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgZiBbJGNhbnYgeXZpZXddCiAgICBzZXQgeTAgW2V4cHIge2ludChbbGluZGV4ICRmIDBdICogJHltYXgpfV0KICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyMCA8IDB9IHsKCXNldCByMCAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludChbbGluZGV4ICRmIDFdICogJHltYXgpfV0KICAgIHNldCByMSBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30gewoJc2V0IHIxIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCn0KCnByb2MgbGF5b3V0bW9yZSB7dG1heCBhbGxyZWFkfSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldyByb3dpZGxpc3QgaWRpbmxpc3QKCiAgICBzZXQgc2hvd2xhc3QgMAogICAgc2V0IHNob3dkZWxheSAkb3B0aW1fZGVsYXkKICAgIHNldCBvcHRkZWxheSBbZXhwciB7JHVwYXJyb3dsZW4gKyAxfV0KICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvd29wdGltIC0gJHNob3dkZWxheSA+ICRudW1jb21taXRzfSB7CgkgICAgc2hvd3N0dWZmIFtleHByIHskcm93b3B0aW0gLSAkc2hvd2RlbGF5fV0gJHNob3dsYXN0Cgl9IGVsc2VpZiB7JHJvd2xhaWRvdXQgLSAkb3B0ZGVsYXkgPiAkcm93b3B0aW19IHsKCSAgICBzZXQgbnIgW2V4cHIgeyRyb3dsYWlkb3V0IC0gJG9wdGRlbGF5IC0gJHJvd29wdGltfV0KCSAgICBpZiB7JG5yID4gMTAwfSB7CgkJc2V0IG5yIDEwMAoJICAgIH0KCSAgICBvcHRpbWl6ZV9yb3dzICRyb3dvcHRpbSAwIFtleHByIHskcm93b3B0aW0gKyAkbnJ9XQoJICAgIGluY3Igcm93b3B0aW0gJG5yCgl9IGVsc2VpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAkcm93bGFpZG91dH0gewoJICAgIHNldCBuciBbZXhwciB7JGNvbW1pdGlkeCgkY3VydmlldykgLSAkcm93bGFpZG91dH1dCgkgICAgIyBtYXkgbmVlZCB0byBpbmNyZWFzZSB0aGlzIHRocmVzaG9sZCBpZiB1cGFycm93bGVuIG9yCgkgICAgIyBtaW5nYXBsZW4gYXJlIGluY3JlYXNlZC4uLgoJICAgIGlmIHskbnIgPiAxNTB9IHsKCQlzZXQgbnIgMTUwCgkgICAgfQoJICAgIHNldCByb3cgJHJvd2xhaWRvdXQKCSAgICBzZXQgcm93bGFpZG91dCBbbGF5b3V0cm93cyAkcm93IFtleHByIHskcm93ICsgJG5yfV0gJGFsbHJlYWRdCgkgICAgaWYgeyRyb3dsYWlkb3V0ID09ICRyb3d9IHsKCQlyZXR1cm4gMAoJICAgIH0KCX0gZWxzZWlmIHskYWxscmVhZH0gewoJICAgIHNldCBvcHRkZWxheSAwCgkgICAgc2V0IG5yb3dzICRjb21taXRpZHgoJGN1cnZpZXcpCgkgICAgaWYge1tsaW5kZXggJHJvd2lkbGlzdCAkbnJvd3NdIG5lIHt9IHx8CgkJW2FycmF5IG5hbWVzIGlkaW5saXN0XSBuZSB7fX0gewoJCWxheW91dHRhaWwKCQlzZXQgcm93bGFpZG91dCAkY29tbWl0aWR4KCRjdXJ2aWV3KQoJICAgIH0gZWxzZWlmIHskcm93b3B0aW0gPT0gJG5yb3dzfSB7CgkJc2V0IHNob3dkZWxheSAwCgkJc2V0IHNob3dsYXN0IDEKCQlpZiB7JG51bWNvbW1pdHMgPT0gJG5yb3dzfSB7CgkJICAgIHJldHVybiAwCgkJfQoJICAgIH0KCX0gZWxzZSB7CgkgICAgcmV0dXJuIDAKCX0KCWlmIHskdG1heCBuZSB7fSAmJiBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICR0bWF4fSB7CgkgICAgcmV0dXJuIDEKCX0KICAgIH0KfQoKcHJvYyBzaG93c3R1ZmYge2NhbnNob3cgbGFzdH0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY29tbWl0cm93IHBlbmRpbmdfc2VsZWN0IHNlbGVjdGVkbGluZSBjdXJ2aWV3CiAgICBnbG9iYWwgbG9va2luZ2ZvcmhlYWQgbWFpbmhlYWRpZCBkaXNwbGF5b3JkZXIgbnVsbGlkIHNlbGVjdGZpcnN0CiAgICBnbG9iYWwgbGFzdHNjcm9sbHNldAoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglnbG9iYWwgcGhhc2UKCXNldCBwaGFzZSAiaW5jcmRyYXciCglhbGxjYW52cyBkZWxldGUgYWxsCiAgICB9CiAgICBzZXQgcjAgJG51bWNvbW1pdHMKICAgIHNldCBwcmV2ICRudW1jb21taXRzCiAgICBzZXQgbnVtY29tbWl0cyAkY2Fuc2hvdwogICAgc2V0IHQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgaWYgeyRwcmV2IDwgMTAwIHx8ICRsYXN0IHx8ICR0IC0gJGxhc3RzY3JvbGxzZXQgPiA1MDB9IHsKCXNldCBsYXN0c2Nyb2xsc2V0ICR0CglzZXRjYW52c2Nyb2xsCiAgICB9CiAgICBzZXQgcm93cyBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQogICAgaWYgeyRyMSA+PSAkY2Fuc2hvd30gewoJc2V0IHIxIFtleHByIHskY2Fuc2hvdyAtIDF9XQogICAgfQogICAgaWYgeyRyMCA8PSAkcjF9IHsKCWRyYXdjb21taXRzICRyMCAkcjEKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdICYmCglbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCldICYmCgkkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgPCAkbnVtY29tbWl0c30gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgMQogICAgfQogICAgaWYgeyRzZWxlY3RmaXJzdH0gewoJaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8IFtpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCSAgICBzZXQgc2VsZWN0Zmlyc3QgMAoJfSBlbHNlIHsKCSAgICBzZXQgbCBbZXhwciB7W2xpbmRleCAkZGlzcGxheW9yZGVyIDBdIGVxICRudWxsaWR9XQoJICAgIHNlbGVjdGxpbmUgJGwgMQoJICAgIHNldCBzZWxlY3RmaXJzdCAwCgl9CiAgICB9CiAgICBpZiB7JGxvb2tpbmdmb3JoZWFkICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJG1haW5oZWFkaWQpXQoJJiYgKCRsYXN0IHx8ICRjb21taXRyb3coJGN1cnZpZXcsJG1haW5oZWFkaWQpIDwgJG51bWNvbW1pdHMgLSAxKX0gewoJc2V0IGxvb2tpbmdmb3JoZWFkIDAKCWRvZGlmZmluZGV4CiAgICB9Cn0KCnByb2MgZG9zaG93bG9jYWxjaGFuZ2VzIHt9IHsKICAgIGdsb2JhbCBsb29raW5nZm9yaGVhZCBjdXJ2aWV3IG1haW5oZWFkaWQgcGhhc2UgY29tbWl0cm93CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJG1haW5oZWFkaWQpXSAmJgoJKCRwaGFzZSBlcSB7fSB8fCAkY29tbWl0cm93KCRjdXJ2aWV3LCRtYWluaGVhZGlkKSA8ICRudW1jb21taXRzIC0gMSl9IHsKCWRvZGlmZmluZGV4CiAgICB9IGVsc2VpZiB7JHBoYXNlIG5lIHt9fSB7CglzZXQgbG9va2luZ2ZvcmhlYWQgMQogICAgfQp9Cgpwcm9jIGRvaGlkZWxvY2FsY2hhbmdlcyB7fSB7CiAgICBnbG9iYWwgbG9va2luZ2ZvcmhlYWQgbG9jYWxyb3cgbHNlcmlhbAoKICAgIHNldCBsb29raW5nZm9yaGVhZCAwCiAgICBpZiB7JGxvY2Fscm93ID49IDB9IHsKCXJlbW92ZXJvdyAkbG9jYWxyb3cKCXNldCBsb2NhbHJvdyAtMQogICAgfQogICAgaW5jciBsc2VyaWFsCn0KCiMgc3Bhd24gb2ZmIGEgcHJvY2VzcyB0byBkbyBnaXQgZGlmZi1pbmRleCBIRUFECnByb2MgZG9kaWZmaW5kZXgge30gewogICAgZ2xvYmFsIGxvY2Fscm93IGxzZXJpYWwKCiAgICBpbmNyIGxzZXJpYWwKICAgIHNldCBsb2NhbHJvdyAtMQogICAgc2V0IGZkIFtvcGVuICJ8Z2l0IGRpZmYtaW5kZXggSEVBRCIgcl0KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCiAgICBmaWxlcnVuICRmZCBbbGlzdCByZWFkZGlmZmluZGV4ICRmZCAkbHNlcmlhbF0KfQoKcHJvYyByZWFkZGlmZmluZGV4IHtmZCBzZXJpYWx9IHsKICAgIGdsb2JhbCBsb2NhbHJvdyBjb21taXRyb3cgbWFpbmhlYWRpZCBudWxsaWQgY3VydmlldwogICAgZ2xvYmFsIGNvbW1pdGluZm8gY29tbWl0ZGF0YSBsc2VyaWFsCgogICAgaWYge1tnZXRzICRmZCBsaW5lXSA8IDB9IHsKCWlmIHtbZW9mICRmZF19IHsKCSAgICBjbG9zZSAkZmQKCSAgICByZXR1cm4gMAoJfQoJcmV0dXJuIDEKICAgIH0KICAgICMgd2Ugb25seSBuZWVkIHRvIHNlZSBvbmUgbGluZSBhbmQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgd2hhdCBpdCBzYXlzLi4uCiAgICBjbG9zZSAkZmQKCiAgICBpZiB7JHNlcmlhbCA9PSAkbHNlcmlhbCAmJiAkbG9jYWxyb3cgPT0gLTF9IHsKCSMgYWRkIHRoZSBsaW5lIGZvciB0aGUgbG9jYWwgZGlmZiB0byB0aGUgZ3JhcGgKCXNldCBsb2NhbHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRtYWluaGVhZGlkKQoJc2V0IGhsICJMb2NhbCB1bmNvbW1pdHRlZCBjaGFuZ2VzIgoJc2V0IGNvbW1pdGluZm8oJG51bGxpZCkgW2xpc3QgICRobCB7fSB7fSB7fSB7fSAiICAgICRobFxuIl0KCXNldCBjb21taXRkYXRhKCRudWxsaWQpICJcbiAgICAkaGxcbiIKCWluc2VydHJvdyAkbG9jYWxyb3cgJG51bGxpZAogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyBsYXlvdXRyb3dzIHtyb3cgZW5kcm93IGxhc3R9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCB1cGFycm93bGVuIGRvd25hcnJvd2xlbiBtYXh3aWR0aCBtaW5nYXBsZW4KICAgIGdsb2JhbCBjaGlsZHJlbiBwYXJlbnRsaXN0CiAgICBnbG9iYWwgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QKCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQogICAgd2hpbGUgeyRyb3cgPCAkZW5kcm93fSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgb2xkb2xkcyB7fQoJc2V0IG5ld29sZHMge30KCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGlubGlzdCgkcCldfSB7CgkJbGFwcGVuZCBuZXdvbGRzICRwCgkgICAgfSBlbHNlaWYgeyEkaWRpbmxpc3QoJHApfSB7CgkJbGFwcGVuZCBvbGRvbGRzICRwCgkgICAgfQoJfQoJc2V0IG5ldiBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gKyBbbGxlbmd0aCAkbmV3b2xkc10KCQkgICAgICAgKyBbbGxlbmd0aCAkb2xkb2xkc10gLSAkbWF4d2lkdGggKyAxfV0KCWlmIHskbmV2ID4gMH0gewoJICAgIGlmIHshJGxhc3QgJiYKCQkkcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVuID49ICRjb21taXRpZHgoJGN1cnZpZXcpfSBicmVhawoJICAgIGZvciB7c2V0IHggW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciB4IC0xXSA+PSAwfSB7fSB7CgkJc2V0IGkgW2xpbmRleCAkaWRsaXN0ICR4XQoJCWlmIHshW2luZm8gZXhpc3RzIHJvd2NoaygkaSldIHx8ICRyb3cgPj0gJHJvd2NoaygkaSl9IHsKCQkgICAgc2V0IHIgW3VzZWRpbnJhbmdlICRpIFtleHByIHskcm93IC0gJGRvd25hcnJvd2xlbn1dIFwKCQkJICAgICAgIFtleHByIHskcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVufV1dCgkJICAgIGlmIHskciA9PSAwfSB7CgkJCXNldCBpZGxpc3QgW2xyZXBsYWNlICRpZGxpc3QgJHggJHhdCgkJCXNldCBvZmZzIFtscmVwbGFjZSAkb2ZmcyAkeCAkeF0KCQkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICR4IDFdCgkJCXNldCBpZGlubGlzdCgkaSkgMAoJCQlzZXQgcm0xIFtleHByIHskcm93IC0gMX1dCgkJCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGkpIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm0xXQoJCQlpZiB7W2luY3IgbmV2IC0xXSA8PSAwfSBicmVhawoJCQljb250aW51ZQoJCSAgICB9CgkJICAgIHNldCByb3djaGsoJGlkKSBbZXhwciB7JHJvdyArICRyfV0KCQl9CgkgICAgfQoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgl9CglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRpZF0KCWlmIHskY29sIDwgMH0gewoJICAgIHNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCSAgICBsYXBwZW5kIGlkbGlzdCAkaWQKCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBzZXQgeiB7fQoJICAgIGlmIHskY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSBuZSB7fX0gewoJCXNldCB6IFtleHByIHtbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXV0gLSAkY29sfV0KCQl1bnNldCBpZGlubGlzdCgkaWQpCgkgICAgfQoJICAgIGxhcHBlbmQgb2ZmcyAkegoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJbWFrZXVwYXJyb3cgJGlkICRjb2wgJHJvdyAkegoJICAgIH0KCX0gZWxzZSB7CgkgICAgdW5zZXQgaWRpbmxpc3QoJGlkKQoJfQoJc2V0IHJhbmdlcyB7fQoJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJICAgIHNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKCSAgICBsYXBwZW5kIHJhbmdlcyAkaWQKCSAgICB1bnNldCBpZHJvd3JhbmdlcygkaWQpCgl9CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkcmFuZ2VzCglpbmNyIHJvdwoJc2V0IG9mZnMgW250aW1lcyBbbGxlbmd0aCAkaWRsaXN0XSAwXQoJc2V0IGwgW2xsZW5ndGggJG5ld29sZHNdCglzZXQgaWRsaXN0IFtldmFsIGxyZXBsYWNlIFwkaWRsaXN0ICRjb2wgJGNvbCAkbmV3b2xkc10KCXNldCBvIDAKCWlmIHskbCAhPSAxfSB7CgkgICAgc2V0IG9mZnMgW2xyYW5nZSAkb2ZmcyAwIFtleHByIHskY29sIC0gMX1dXQoJICAgIGZvcmVhY2ggeCAkbmV3b2xkcyB7CgkJbGFwcGVuZCBvZmZzIHt9CgkJaW5jciBvIC0xCgkgICAgfQoJICAgIGluY3IgbwoJICAgIHNldCB0bXAgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gW2xsZW5ndGggJG9mZnNdfV0KCSAgICBpZiB7JHRtcCA+IDB9IHsKCQlzZXQgb2ZmcyBbY29uY2F0ICRvZmZzIFtudGltZXMgJHRtcCAkb11dCgkgICAgfQoJfSBlbHNlIHsKCSAgICBsc2V0IG9mZnMgJGNvbCB7fQoJfQoJZm9yZWFjaCBpICRuZXdvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJGkpIDEKCSAgICBzZXQgaWRyb3dyYW5nZXMoJGkpICRpZAoJfQoJaW5jciBjb2wgJGwKCWZvcmVhY2ggb2lkICRvbGRvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJG9pZCkgMQoJICAgIHNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sICRvaWRdCgkgICAgc2V0IG9mZnMgW2xpbnNlcnQgJG9mZnMgJGNvbCAkb10KCSAgICBtYWtldXBhcnJvdyAkb2lkICRjb2wgJHJvdyAkbwoJICAgIGluY3IgY29sCgl9CglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KICAgIHJldHVybiAkcm93Cn0KCnByb2MgYWRkZXh0cmFpZCB7aWQgcm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdHJvdyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29tbWl0aWR4IGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRyZW4gY3VydmlldwoKICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCiAgICBsYXBwZW5kIGNvbW1pdGxpc3RlZCAwCiAgICBsYXBwZW5kIHBhcmVudGxpc3Qge30KICAgIHNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcm93CiAgICByZWFkY29tbWl0ICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKCXNldCBjaGlsZHJlbigkY3VydmlldywkaWQpIHt9CiAgICB9Cn0KCnByb2MgbGF5b3V0dGFpbCB7fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgaWRpbmxpc3QgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBpZHJvd3JhbmdlcyByb3dyYW5nZWxpc3QKCiAgICBzZXQgcm93ICRjb21taXRpZHgoJGN1cnZpZXcpCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgd2hpbGUgeyRpZGxpc3QgbmUge319IHsKCXNldCBjb2wgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gMX1dCglzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCglhZGRleHRyYWlkICRpZCAkcm93Cgl1bnNldCBpZGlubGlzdCgkaWQpCglsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJGlkCglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgJGNvbCAwXQoJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkY29sICRjb2xdCglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KCiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyBpZGlubGlzdF0gewoJdW5zZXQgaWRpbmxpc3QoJGlkKQoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJbHNldCByb3dpZGxpc3QgJHJvdyBbbGlzdCAkaWRdCglsc2V0IHJvd29mZnNldHMgJHJvdyAwCgltYWtldXBhcnJvdyAkaWQgMCAkcm93IDAKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkaWQKCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCgl1bnNldCBpZHJvd3JhbmdlcygkaWQpCglpbmNyIHJvdwoJbGFwcGVuZCByb3dpZGxpc3Qge30KCWxhcHBlbmQgcm93b2Zmc2V0cyB7fQogICAgfQp9Cgpwcm9jIGluc2VydF9wYWQge3JvdyBjb2wgbnBhZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCgogICAgc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQogICAgbHNldCByb3dpZGxpc3QgJHJvdyBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0gJGNvbCAkcGFkXQogICAgc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd29mZnNldHMgJHJvd11dICRjb2wgJHBhZF0KICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93IFtpbmNyYW5nZSAkdG1wIFtleHByIHskY29sICsgJG5wYWR9XSBbZXhwciB7LSRucGFkfV1dCn0KCnByb2Mgb3B0aW1pemVfcm93cyB7cm93IGNvbCBlbmRyb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKCiAgICBmb3Ige30geyRyb3cgPCAkZW5kcm93fSB7aW5jciByb3d9IHsKCXNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCglzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCglzZXQgaGFzcGFkIDAKCWZvciB7fSB7JGNvbCA8IFtsbGVuZ3RoICRvZmZzXX0ge2luY3IgY29sfSB7CgkgICAgaWYge1tsaW5kZXggJGlkbGlzdCAkY29sXSBlcSB7fX0gewoJCXNldCBoYXNwYWQgMQoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCSAgICBpZiB7JHogZXEge319IGNvbnRpbnVlCgkgICAgc2V0IGlzYXJyb3cgMAoJICAgIHNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCSAgICBzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCSAgICBzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIGlmIHskejAgZXEge319IHsKCQlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KCQlpZiB7JHJhbmdlcyBuZSB7fSAmJiAkeTAgPiBbbGluZGV4ICRyYW5nZXMgMF19IHsKCQkgICAgc2V0IGlzYXJyb3cgMQoJCX0KCSAgICB9CgkgICAgIyBMb29raW5nIGF0IGxpbmVzIGZyb20gdGhpcyByb3cgdG8gdGhlIHByZXZpb3VzIHJvdywKCSAgICAjIG1ha2UgdGhlbSBnbyBzdHJhaWdodCB1cCBpZiB0aGV5IGVuZCBpbiBhbiBhcnJvdyBvbgoJICAgICMgdGhlIHByZXZpb3VzIHJvdzsgb3RoZXJ3aXNlIG1ha2UgdGhlbSBnbyBzdHJhaWdodCB1cAoJICAgICMgb3IgYXQgNDUgZGVncmVlcy4KCSAgICBpZiB7JHogPCAtMSB8fCAoJHogPCAwICYmICRpc2Fycm93KX0gewoJCSMgTGluZSBjdXJyZW50bHkgZ29lcyBsZWZ0IHRvbyBtdWNoOwoJCSMgaW5zZXJ0IHBhZHMgaW4gdGhlIHByZXZpb3VzIHJvdywgdGhlbiBvcHRpbWl6ZSBpdAoJCXNldCBucGFkIFtleHByIHstMSAtICR6ICsgJGlzYXJyb3d9XQoJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sICRucGFkXQoJCWluc2VydF9wYWQgJHkwICR4MCAkbnBhZAoJCWlmIHskeTAgPiAwfSB7CgkJICAgIG9wdGltaXplX3Jvd3MgJHkwICR4MCAkcm93CgkJfQoJCXNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCQlzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCgkJc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KCSAgICB9IGVsc2VpZiB7JHogPiAxIHx8ICgkeiA+IDAgJiYgJGlzYXJyb3cpfSB7CgkJIyBMaW5lIGN1cnJlbnRseSBnb2VzIHJpZ2h0IHRvbyBtdWNoOwoJCSMgaW5zZXJ0IHBhZHMgaW4gdGhpcyBsaW5lIGFuZCBhZGp1c3QgdGhlIG5leHQncyByb3dvZmZzZXRzCgkJc2V0IG5wYWQgW2V4cHIgeyR6IC0gMSArICRpc2Fycm93fV0KCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KCQlzZXQgb2ZmczIgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTFdCgkJc2V0IHgxIC0xCgkJZm9yZWFjaCB6ICRvZmZzMiB7CgkJICAgIGluY3IgeDEKCQkgICAgaWYgeyR6IGVxIHt9IHx8ICR4MSArICR6IDwgJGNvbH0gY29udGludWUKCQkgICAgaWYgeyR4MSArICR6ID4gJGNvbH0gewoJCQlpbmNyIG5wYWQKCQkgICAgfQoJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxICRucGFkXQoJCSAgICBicmVhawoJCX0KCQlzZXQgcGFkIFtudGltZXMgJG5wYWQge31dCgkJc2V0IGlkbGlzdCBbZXZhbCBsaW5zZXJ0IFwkaWRsaXN0ICRjb2wgJHBhZF0KCQlzZXQgdG1wIFtldmFsIGxpbnNlcnQgXCRvZmZzICRjb2wgJHBhZF0KCQlpbmNyIGNvbCAkbnBhZAoJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgW2V4cHIgey0kbnBhZH1dXQoJCXNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCQlzZXQgaGFzcGFkIDEKCSAgICB9CgkgICAgaWYgeyR6MCBlcSB7fSAmJiAhJGlzYXJyb3d9IHsKCQkjIHRoaXMgbGluZSBsaW5rcyB0byBpdHMgZmlyc3QgY2hpbGQgb24gcm93ICRyb3ctMgoJCXNldCBybTIgW2V4cHIgeyRyb3cgLSAyfV0KCQlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRybTJdCgkJc2V0IHhjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJtMl0gJGlkXQoJCWlmIHskeGMgPj0gMH0gewoJCSAgICBzZXQgejAgW2V4cHIgeyR4YyAtICR4MH1dCgkJfQoJICAgIH0KCSAgICAjIGF2b2lkIGxpbmVzIGppZ2dpbmcgbGVmdCB0aGVuIGltbWVkaWF0ZWx5IHJpZ2h0CgkgICAgaWYgeyR6MCBuZSB7fSAmJiAkeiA8IDAgJiYgJHowID4gMH0gewoJCWluc2VydF9wYWQgJHkwICR4MCAxCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgMV0KCQlvcHRpbWl6ZV9yb3dzICR5MCBbZXhwciB7JHgwICsgMX1dICRyb3cKCSAgICB9Cgl9CglpZiB7ISRoYXNwYWR9IHsKCSAgICBzZXQgbyB7fQoJICAgICMgRmluZCB0aGUgZmlyc3QgY29sdW1uIHRoYXQgZG9lc24ndCBoYXZlIGEgbGluZSBnb2luZyByaWdodAoJICAgIGZvciB7c2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIGNvbCAtMV0gPj0gMH0ge30gewoJCXNldCBvIFtsaW5kZXggJG9mZnMgJGNvbF0KCQlpZiB7JG8gZXEge319IHsKCQkgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZAoJCSAgICBzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJICAgIGlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cgPT0gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJCSMgaXQgaXMsIHdvcmsgb3V0IG9mZnNldCB0byBjaGlsZAoJCQlzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCQkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeTBdCgkJCXNldCB4MCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICR5MF0gJGlkXQoJCQlpZiB7JHgwID49IDB9IHsKCQkJICAgIHNldCBvIFtleHByIHskeDAgLSAkY29sfV0KCQkJfQoJCSAgICB9CgkJfQoJCWlmIHskbyBlcSB7fSB8fCAkbyA8PSAwfSBicmVhawoJICAgIH0KCSAgICAjIEluc2VydCBhIHBhZCBhdCB0aGF0IGNvbHVtbiBhcyBsb25nIGFzIGl0IGhhcyBhIGxpbmUgYW5kCgkgICAgIyBpc24ndCB0aGUgbGFzdCBjb2x1bW4sIGFuZCBhZGp1c3QgdGhlIG5leHQgcm93JyBvZmZzZXRzCgkgICAgaWYgeyRvIG5lIHt9ICYmIFtpbmNyIGNvbF0gPCBbbGxlbmd0aCAkaWRsaXN0XX0gewoJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQoJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KCQlzZXQgeDEgLTEKCQlmb3JlYWNoIHogJG9mZnMyIHsKCQkgICAgaW5jciB4MQoJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQoJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxIDFdCgkJICAgIGJyZWFrCgkJfQoJCXNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sIHt9XQoJCXNldCB0bXAgW2xpbnNlcnQgJG9mZnMgJGNvbCB7fV0KCQlpbmNyIGNvbAoJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgLTFdCgkgICAgfQoJfQoJbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0Cglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJc2V0IGNvbCAwCiAgICB9Cn0KCnByb2MgeGMge3JvdyBjb2x9IHsKICAgIGdsb2JhbCBjYW52eDAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudngwICsgJGNvbCAqICRsaW5lc3BjfV0KfQoKcHJvYyB5YyB7cm93fSB7CiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMKICAgIHJldHVybiBbZXhwciB7JGNhbnZ5MCArICRyb3cgKiAkbGluZXNwY31dCn0KCnByb2MgbGluZXdpZHRoIHtpZH0gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lIGx0aGlja25lc3MKCiAgICBzZXQgd2lkICRsdGhpY2tuZXNzCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXSAmJiAkaWQgZXEgJHRoaWNrZXJsaW5lfSB7CglzZXQgd2lkIFtleHByIHsyICogJGx0aGlja25lc3N9XQogICAgfQogICAgcmV0dXJuICR3aWQKfQoKcHJvYyByb3dyYW5nZXMge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgaWRyb3dyYW5nZXMgY29tbWl0cm93IHJvd2xhaWRvdXQgcm93cmFuZ2VsaXN0IGN1cnZpZXcKCiAgICBzZXQgcmFuZ2VzIHt9CiAgICBpZiB7JHBoYXNlIGVxIHt9IHx8CgkoW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXQoJICYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRyb3dsYWlkb3V0KX0gewoJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkaWQpXQogICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQogICAgfQogICAgc2V0IGxpbmVub3Mge30KICAgIGZvcmVhY2ggcmlkICRyYW5nZXMgewoJbGFwcGVuZCBsaW5lbm9zICRjb21taXRyb3coJGN1cnZpZXcsJHJpZCkKICAgIH0KICAgIGlmIHskbGluZW5vcyBuZSB7fX0gewoJbHNldCBsaW5lbm9zIDAgW2V4cHIge1tsaW5kZXggJGxpbmVub3MgMF0gKyAxfV0KICAgIH0KICAgIHJldHVybiAkbGluZW5vcwp9CgojIHdvcmsgYXJvdW5kIHRrOC40IHJlZnVzYWwgdG8gZHJhdyBhcnJvd3Mgb24gZGlhZ29uYWwgc2VnbWVudHMKcHJvYyBhZGphcnJvd2hpZ2gge2Nvb3Jkc30gewogICAgZ2xvYmFsIGxpbmVzcGMKCiAgICBzZXQgeDAgW2xpbmRleCAkY29vcmRzIDBdCiAgICBzZXQgeDEgW2xpbmRleCAkY29vcmRzIDJdCiAgICBpZiB7JHgwICE9ICR4MX0gewoJc2V0IHkwIFtsaW5kZXggJGNvb3JkcyAxXQoJc2V0IHkxIFtsaW5kZXggJGNvb3JkcyAzXQoJaWYgeyR5MCAtICR5MSA8PSAyICogJGxpbmVzcGMgJiYgJHgxID09IFtsaW5kZXggJGNvb3JkcyA0XX0gewoJICAgICMgd2UgaGF2ZSBhIG5lYXJieSB2ZXJ0aWNhbCBzZWdtZW50LCBqdXN0IHRyaW0gb2ZmIHRoZSBkaWFnIGJpdAoJICAgIHNldCBjb29yZHMgW2xyYW5nZSAkY29vcmRzIDIgZW5kXQoJfSBlbHNlIHsKCSAgICBzZXQgc2xvcGUgW2V4cHIgeygkeDAgLSAkeDEpIC8gKCR5MCAtICR5MSl9XQoJICAgIHNldCB4aSBbZXhwciB7JHgwIC0gJHNsb3BlICogJGxpbmVzcGMgLyAyfV0KCSAgICBzZXQgeWkgW2V4cHIgeyR5MCAtICRsaW5lc3BjIC8gMn1dCgkgICAgc2V0IGNvb3JkcyBbbHJlcGxhY2UgJGNvb3JkcyAwIDEgJHhpICR5MCAkeGkgJHlpXQoJfQogICAgfQogICAgcmV0dXJuICRjb29yZHMKfQoKcHJvYyBkcmF3bGluZXNlZyB7aWQgcm93IGVuZHJvdyBhcnJvd2xvd30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBkaXNwbGF5b3JkZXIgaWRkcmF3biBsaW5lc2VncwogICAgZ2xvYmFsIGNhbnYgY29sb3JtYXAgbGluZXNwYyBjdXJ2aWV3IG1heGxpbmVsZW4KCiAgICBzZXQgY29scyBbbGlzdCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF1dCiAgICBzZXQgbGUgW2V4cHIgeyRyb3cgKyAxfV0KICAgIHNldCBhcnJvd2hpZ2ggMQogICAgd2hpbGUgezF9IHsKCXNldCBjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJGxlXSAkaWRdCglpZiB7JGMgPCAwfSB7CgkgICAgaW5jciBsZSAtMQoJICAgIGJyZWFrCgl9CglsYXBwZW5kIGNvbHMgJGMKCXNldCB4IFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbGVdCglpZiB7JHggZXEgJGlkfSB7CgkgICAgc2V0IGFycm93aGlnaCAwCgkgICAgYnJlYWsKCX0KCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkeCldIHx8ICRsZSA9PSAkZW5kcm93fSB7CgkgICAgc2V0IGMgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JGxlKzF9XV0gJGlkXQoJICAgIGlmIHskYyA+PSAwfSB7CgkJbGFwcGVuZCBjb2xzICRjCgkJc2V0IGFycm93aGlnaCAwCgkgICAgfQoJICAgIGJyZWFrCgl9CglpbmNyIGxlCiAgICB9CiAgICBpZiB7JGxlIDw9ICRyb3d9IHsKCXJldHVybiAkcm93CiAgICB9CgogICAgc2V0IGxpbmVzIHt9CiAgICBzZXQgaSAwCiAgICBzZXQgam9pbmhpZ2ggMAogICAgaWYge1tpbmZvIGV4aXN0cyBsaW5lc2VncygkaWQpXX0gewoJc2V0IGxpbmVzICRsaW5lc2VncygkaWQpCglmb3JlYWNoIGxpICRsaW5lcyB7CgkgICAgc2V0IHIwIFtsaW5kZXggJGxpIDBdCgkgICAgaWYgeyRyMCA+ICRyb3d9IHsKCQlpZiB7JHIwID09ICRsZSAmJiBbbGluZGV4ICRsaSAxXSAtICRyb3cgPD0gJG1heGxpbmVsZW59IHsKCQkgICAgc2V0IGpvaW5oaWdoIDEKCQl9CgkJYnJlYWsKCSAgICB9CgkgICAgaW5jciBpCgl9CiAgICB9CiAgICBzZXQgam9pbmxvdyAwCiAgICBpZiB7JGkgPiAwfSB7CglzZXQgbGkgW2xpbmRleCAkbGluZXMgW2V4cHIgeyRpLTF9XV0KCXNldCByMSBbbGluZGV4ICRsaSAxXQoJaWYgeyRyMSA9PSAkcm93ICYmICRsZSAtIFtsaW5kZXggJGxpIDBdIDw9ICRtYXhsaW5lbGVufSB7CgkgICAgc2V0IGpvaW5sb3cgMQoJfQogICAgfQoKICAgIHNldCB4IFtsaW5kZXggJGNvbHMgW2V4cHIgeyRsZSAtICRyb3d9XV0KICAgIHNldCB4cCBbbGluZGV4ICRjb2xzIFtleHByIHskbGUgLSAxIC0gJHJvd31dXQogICAgc2V0IGRpciBbZXhwciB7JHhwIC0gJHh9XQogICAgaWYgeyRqb2luaGlnaH0gewoJc2V0IGl0aCBbbGluZGV4ICRsaW5lcyAkaSAyXQoJc2V0IGNvb3JkcyBbJGNhbnYgY29vcmRzICRpdGhdCglzZXQgYWggWyRjYW52IGl0ZW1jZ2V0ICRpdGggLWFycm93XQoJc2V0IGFycm93aGlnaCBbZXhwciB7JGFoIGVxICJmaXJzdCIgfHwgJGFoIGVxICJib3RoIn1dCglzZXQgeDIgW2xpbmRleCAkY29scyBbZXhwciB7JGxlICsgMSAtICRyb3d9XV0KCWlmIHskeDIgbmUge30gJiYgJHggLSAkeDIgPT0gJGRpcn0gewoJICAgIHNldCBjb29yZHMgW2xyYW5nZSAkY29vcmRzIDAgZW5kLTJdCgl9CiAgICB9IGVsc2UgewoJc2V0IGNvb3JkcyBbbGlzdCBbeGMgJGxlICR4XSBbeWMgJGxlXV0KICAgIH0KICAgIGlmIHskam9pbmxvd30gewoJc2V0IGl0bCBbbGluZGV4ICRsaW5lcyBbZXhwciB7JGktMX1dIDJdCglzZXQgYWwgWyRjYW52IGl0ZW1jZ2V0ICRpdGwgLWFycm93XQoJc2V0IGFycm93bG93IFtleHByIHskYWwgZXEgImxhc3QiIHx8ICRhbCBlcSAiYm90aCJ9XQogICAgfSBlbHNlaWYgeyRhcnJvd2xvdyAmJgoJICAgICAgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdy0xfV1dICRpZF0gPj0gMH0gewoJc2V0IGFycm93bG93IDAKICAgIH0KICAgIHNldCBhcnJvdyBbbGluZGV4IHtub25lIGZpcnN0IGxhc3QgYm90aH0gW2V4cHIgeyRhcnJvd2hpZ2ggKyAyKiRhcnJvd2xvd31dXQogICAgZm9yIHtzZXQgeSAkbGV9IHtbaW5jciB5IC0xXSA+ICRyb3d9IHt9IHsKCXNldCB4ICR4cAoJc2V0IHhwIFtsaW5kZXggJGNvbHMgW2V4cHIgeyR5IC0gMSAtICRyb3d9XV0KCXNldCBuZGlyIFtleHByIHskeHAgLSAkeH1dCglpZiB7JGRpciAhPSAkbmRpciB8fCAkeHAgPCAwfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICR5ICR4XSBbeWMgJHldCgl9CglzZXQgZGlyICRuZGlyCiAgICB9CiAgICBpZiB7ISRqb2lubG93fSB7CglpZiB7JHhwIDwgMH0gewoJICAgICMgam9pbiBwYXJlbnQgbGluZSB0byBmaXJzdCBjaGlsZAoJICAgIHNldCBjaCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCSAgICBzZXQgeGMgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hdCgkgICAgaWYgeyR4YyA8IDB9IHsKCQlwdXRzICJvb3BzOiBkcmF3bGluZXNlZzogY2hpbGQgJGNoIG5vdCBvbiByb3cgJHJvdyIKCSAgICB9IGVsc2UgewoJCWlmIHskeGMgPCAkeCAtIDF9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyR4LTF9XV0gW3ljICRyb3ddCgkJfSBlbHNlaWYgeyR4YyA+ICR4ICsgMX0gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JHgrMX1dXSBbeWMgJHJvd10KCQl9CgkJc2V0IHggJHhjCgkgICAgfQoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93ICR4XSBbeWMgJHJvd10KCX0gZWxzZSB7CgkgICAgc2V0IHhuIFt4YyAkcm93ICR4cF0KCSAgICBzZXQgeW4gW3ljICRyb3ddCgkgICAgIyB3b3JrIGFyb3VuZCB0azguNCByZWZ1c2FsIHRvIGRyYXcgYXJyb3dzIG9uIGRpYWdvbmFsIHNlZ21lbnRzCgkgICAgaWYgeyRhcnJvd2xvdyAmJiAkeG4gIT0gW2xpbmRleCAkY29vcmRzIGVuZC0xXX0gewoJCWlmIHtbbGxlbmd0aCAkY29vcmRzXSA8IDQgfHwKCQkgICAgW2xpbmRleCAkY29vcmRzIGVuZC0zXSAhPSBbbGluZGV4ICRjb29yZHMgZW5kLTFdIHx8CgkJICAgIFtsaW5kZXggJGNvb3JkcyBlbmRdIC0gJHluID4gMiAqICRsaW5lc3BjfSB7CgkJICAgIHNldCB4biBbeGMgJHJvdyBbZXhwciB7JHhwIC0gMC41ICogJGRpcn1dXQoJCSAgICBzZXQgeW8gW3ljIFtleHByIHskcm93ICsgMC41fV1dCgkJICAgIGxhcHBlbmQgY29vcmRzICR4biAkeW8gJHhuICR5bgoJCX0KCSAgICB9IGVsc2UgewoJCWxhcHBlbmQgY29vcmRzICR4biAkeW4KCSAgICB9Cgl9CglpZiB7ISRqb2luaGlnaH0gewoJICAgIGlmIHskYXJyb3doaWdofSB7CgkJc2V0IGNvb3JkcyBbYWRqYXJyb3doaWdoICRjb29yZHNdCgkgICAgfQoJICAgIGFzc2lnbmNvbG9yICRpZAoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRpZF0gXAoJCSAgICAgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgLWFycm93ICRhcnJvd10KCSAgICAkY2FudiBsb3dlciAkdAoJICAgIGJpbmRsaW5lICR0ICRpZAoJICAgIHNldCBsaW5lcyBbbGluc2VydCAkbGluZXMgJGkgW2xpc3QgJHJvdyAkbGUgJHRdXQoJfSBlbHNlIHsKCSAgICAkY2FudiBjb29yZHMgJGl0aCAkY29vcmRzCgkgICAgaWYgeyRhcnJvdyBuZSAkYWh9IHsKCQkkY2FudiBpdGVtY29uZiAkaXRoIC1hcnJvdyAkYXJyb3cKCSAgICB9CgkgICAgbHNldCBsaW5lcyAkaSAwICRyb3cKCX0KICAgIH0gZWxzZSB7CglzZXQgeG8gW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdyAtIDF9XV0gJGlkXQoJc2V0IG5kaXIgW2V4cHIgeyR4byAtICR4cH1dCglzZXQgY2xvdyBbJGNhbnYgY29vcmRzICRpdGxdCglpZiB7JGRpciA9PSAkbmRpcn0gewoJICAgIHNldCBjbG93IFtscmFuZ2UgJGNsb3cgMiBlbmRdCgl9CglzZXQgY29vcmRzIFtjb25jYXQgJGNvb3JkcyAkY2xvd10KCWlmIHshJGpvaW5oaWdofSB7CgkgICAgbHNldCBsaW5lcyBbZXhwciB7JGktMX1dIDEgJGxlCgkgICAgaWYgeyRhcnJvd2hpZ2h9IHsKCQlzZXQgY29vcmRzIFthZGphcnJvd2hpZ2ggJGNvb3Jkc10KCSAgICB9Cgl9IGVsc2UgewoJICAgICMgY29hbGVzY2UgdHdvIHBpZWNlcwoJICAgICRjYW52IGRlbGV0ZSAkaXRoCgkgICAgc2V0IGIgW2xpbmRleCAkbGluZXMgW2V4cHIgeyRpLTF9XSAwXQoJICAgIHNldCBlIFtsaW5kZXggJGxpbmVzICRpIDFdCgkgICAgc2V0IGxpbmVzIFtscmVwbGFjZSAkbGluZXMgW2V4cHIgeyRpLTF9XSAkaSBbbGlzdCAkYiAkZSAkaXRsXV0KCX0KCSRjYW52IGNvb3JkcyAkaXRsICRjb29yZHMKCWlmIHskYXJyb3cgbmUgJGFsfSB7CgkgICAgJGNhbnYgaXRlbWNvbmYgJGl0bCAtYXJyb3cgJGFycm93Cgl9CiAgICB9CgogICAgc2V0IGxpbmVzZWdzKCRpZCkgJGxpbmVzCiAgICByZXR1cm4gJGxlCn0KCnByb2MgZHJhd3BhcmVudGxpbmtzIHtpZCByb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgY2FudiBjb2xvcm1hcCBjdXJ2aWV3IHBhcmVudGxpc3QKICAgIGdsb2JhbCBpZHBvcwoKICAgIHNldCByb3dpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkcm93aWRzICRpZF0KICAgIGlmIHskY29sIDwgMH0gcmV0dXJuCiAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCiAgICBzZXQgcm93MiBbZXhwciB7JHJvdyArIDF9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IHkyIFt5YyAkcm93Ml0KICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3cyXQogICAgIyBybXggPSByaWdodC1tb3N0IFggY29vcmQgdXNlZAogICAgc2V0IHJteCAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZHMgJHBdCglpZiB7JGkgPCAwfSB7CgkgICAgcHV0cyAib29wcywgcGFyZW50ICRwIG9mICRpZCBub3QgaW4gbGlzdCIKCSAgICBjb250aW51ZQoJfQoJc2V0IHgyIFt4YyAkcm93MiAkaV0KCWlmIHskeDIgPiAkcm14fSB7CgkgICAgc2V0IHJteCAkeDIKCX0KCWlmIHtbbHNlYXJjaCAtZXhhY3QgJHJvd2lkcyAkcF0gPCAwfSB7CgkgICAgIyBkcmF3bGluZXNlZyB3aWxsIGRvIHRoaXMgb25lIGZvciB1cwoJICAgIGNvbnRpbnVlCgl9Cglhc3NpZ25jb2xvciAkcAoJIyBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZWQgcGFyZW50cyBoZXJlLi4uCglzZXQgY29vcmRzIFtsaXN0ICR4ICR5XQoJaWYgeyRpIDwgJGNvbCAtIDF9IHsKCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgKyAxfV1dICR5Cgl9IGVsc2VpZiB7JGkgPiAkY29sICsgMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSAtIDF9XV0gJHkKCX0KCWxhcHBlbmQgY29vcmRzICR4MiAkeTIKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRwXSBcCgkJICAgLWZpbGwgJGNvbG9ybWFwKCRwKSAtdGFncyBsaW5lcy4kcF0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkcAogICAgfQogICAgaWYgeyRybXggPiBbbGluZGV4ICRpZHBvcygkaWQpIDFdfSB7Cglsc2V0IGlkcG9zKCRpZCkgMSAkcm14CglyZWRyYXd0YWdzICRpZAogICAgfQp9Cgpwcm9jIGRyYXdsaW5lcyB7aWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgaXRlbWNvbmYgbGluZXMuJGlkIC13aWR0aCBbbGluZXdpZHRoICRpZF0KfQoKcHJvYyBkcmF3Y21pdHRleHQge2lkIHJvdyBjb2x9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNhbnYgY2FudjIgY2FudjMgY2FudnkwIGZnY29sb3IgY3VydmlldwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBjb21taXRpbmZvIHJvd2lkbGlzdCBwYXJlbnRsaXN0CiAgICBnbG9iYWwgcm93dGV4dHggaWRwb3MgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBtYXJraW5nbWF0Y2hlcwogICAgZ2xvYmFsIG1haW5mb250IGNhbnZ4bWF4IGJvbGRyb3dzIGJvbGRuYW1lcm93cyBmZ2NvbG9yIG51bGxpZAoKICAgICMgbGlzdGVkIGlzIDAgZm9yIGJvdW5kYXJ5LCAxIGZvciBub3JtYWwsIDIgZm9yIGxlZnQsIDMgZm9yIHJpZ2h0CiAgICBzZXQgbGlzdGVkIFtsaW5kZXggJGNvbW1pdGxpc3RlZCAkcm93XQogICAgaWYgeyRpZCBlcSAkbnVsbGlkfSB7CglzZXQgb2ZpbGwgcmVkCiAgICB9IGVsc2UgewoJc2V0IG9maWxsIFtleHByIHskbGlzdGVkICE9IDA/ICJibHVlIjogIndoaXRlIn1dCiAgICB9CiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBzZXQgb3JhZCBbZXhwciB7JGxpbmVzcGMgLyAzfV0KICAgIGlmIHskbGlzdGVkIDw9IDF9IHsKCXNldCB0IFskY2FudiBjcmVhdGUgb3ZhbCBbZXhwciB7JHggLSAkb3JhZH1dIFtleHByIHskeSAtICRvcmFkfV0gXAoJCSAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKCQkgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgJGZnY29sb3IgLXdpZHRoIDEgLXRhZ3MgY2lyY2xlXQogICAgfSBlbHNlaWYgeyRsaXN0ZWQgPT0gMn0gewoJIyB0cmlhbmdsZSBwb2ludGluZyBsZWZ0IGZvciBsZWZ0LXNpZGUgY29tbWl0cwoJc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uIFwKCQkgICBbZXhwciB7JHggLSAkb3JhZH1dICR5IFwKCQkgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSBbZXhwciB7JHkgLSAkb3JhZH1dIFwKCQkgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSBbZXhwciB7JHkgKyAkb3JhZCAtIDF9XSBcCgkJICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lICRmZ2NvbG9yIC13aWR0aCAxIC10YWdzIGNpcmNsZV0KICAgIH0gZWxzZSB7CgkjIHRyaWFuZ2xlIHBvaW50aW5nIHJpZ2h0IGZvciByaWdodC1zaWRlIGNvbW1pdHMKCXNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiBcCgkJICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gJHkgXAoJCSAgIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCgkJICAgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkgKyAkb3JhZCAtIDF9XSBcCgkJICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lICRmZ2NvbG9yIC13aWR0aCAxIC10YWdzIGNpcmNsZV0KICAgIH0KICAgICRjYW52IHJhaXNlICR0CiAgICAkY2FudiBiaW5kICR0IDwxPiB7c2VsY2FudmxpbmUge30gJXggJXl9CiAgICBzZXQgcm14IFtsbGVuZ3RoIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0KICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10KICAgIGlmIHskb2xkcyBuZSB7fX0gewoJc2V0IG5leHRpZHMgW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93ICsgMX1dXQoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJG5leHRpZHMgJHBdCgkgICAgaWYgeyRpID4gJHJteH0gewoJCXNldCBybXggJGkKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeHQgW3hjICRyb3cgJHJteF0KICAgIHNldCByb3d0ZXh0eCgkcm93KSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSAkZGF0ZV0KICAgIHNldCBmb250ICRtYWluZm9udAogICAgc2V0IG5mb250ICRtYWluZm9udAogICAgc2V0IGlzYm9sZCBbaXNoaWdobGlnaHRlZCAkcm93XQogICAgaWYgeyRpc2JvbGQgPiAwfSB7CglsYXBwZW5kIGJvbGRyb3dzICRyb3cKCWxhcHBlbmQgZm9udCBib2xkCglpZiB7JGlzYm9sZCA+IDF9IHsKCSAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CgkgICAgbGFwcGVuZCBuZm9udCBib2xkCgl9CiAgICB9CiAgICBzZXQgbGluZWh0YWcoJHJvdykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRmb250IC10YWdzIHRleHRdCiAgICAkY2FudiBiaW5kICRsaW5laHRhZygkcm93KSA8QnV0dG9uLTM+ICJyb3dtZW51ICVYICVZICRpZCIKICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKCQkJICAgIC10ZXh0ICRuYW1lIC1mb250ICRuZm9udCAtdGFncyB0ZXh0XQogICAgc2V0IGxpbmVkdGFnKCRyb3cpIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGRhdGUgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRoZWFkbGluZV19XQogICAgaWYgeyRtYXJraW5nbWF0Y2hlc30gewoJbWFya3Jvd21hdGNoZXMgJHJvdyAkaGVhZGxpbmUgJG5hbWUKICAgIH0KICAgIGlmIHskeHIgPiAkY2FudnhtYXh9IHsKCXNldCBjYW52eG1heCAkeHIKCXNldGNhbnZzY3JvbGwKICAgIH0KfQoKcHJvYyBkcmF3Y21pdHJvdyB7cm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHJvd2lkbGlzdAogICAgZ2xvYmFsIGlkZHJhd24KICAgIGdsb2JhbCBjb21taXRpbmZvIHBhcmVudGxpc3QgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmluZHN0cmluZyBuaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkIHJoaWdobGlnaHRzCgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHJldHVybgoKICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAhW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrdmhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSAmJiAhW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrZmlsZWhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyRmaW5kc3RyaW5nIG5lIHt9ICYmICFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tmaW5kaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiAmJiAhW2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHJldHVybgogICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KICAgIGlmIHskY29sIDwgMH0gewoJcHV0cyAib29wcywgcm93ICRyb3cgaWQgJGlkIG5vdCBpbiBsaXN0IgoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglnZXRjb21taXQgJGlkCiAgICB9CiAgICBhc3NpZ25jb2xvciAkaWQKICAgIGRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sCiAgICBzZXQgaWRkcmF3bigkaWQpIDEKfQoKcHJvYyBkcmF3Y29tbWl0cyB7cm93IHtlbmRyb3cge319fSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cyBpZGRyYXduIGRpc3BsYXlvcmRlciBjdXJ2aWV3CiAgICBnbG9iYWwgcGFyZW50bGlzdCByb3dpZGxpc3QKCiAgICBpZiB7JHJvdyA8IDB9IHsKCXNldCByb3cgMAogICAgfQogICAgaWYgeyRlbmRyb3cgZXEge319IHsKCXNldCBlbmRyb3cgJHJvdwogICAgfQogICAgaWYgeyRlbmRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCXNldCBlbmRyb3cgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCiAgICB9CgogICAgIyBtYWtlIHRoZSBsaW5lcyBqb2luIHRvIGFscmVhZHktZHJhd24gcm93cyBlaXRoZXIgc2lkZQogICAgc2V0IHIgW2V4cHIgeyRyb3cgLSAxfV0KICAgIGlmIHskciA8IDAgfHwgIVtpbmZvIGV4aXN0cyBpZGRyYXduKFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0pXX0gewoJc2V0IHIgJHJvdwogICAgfQogICAgc2V0IGVyIFtleHByIHskZW5kcm93ICsgMX1dCiAgICBpZiB7JGVyID49ICRudW1jb21taXRzIHx8CgkhW2luZm8gZXhpc3RzIGlkZHJhd24oW2xpbmRleCAkZGlzcGxheW9yZGVyICRlcl0pXX0gewoJc2V0IGVyICRlbmRyb3cKICAgIH0KICAgIGZvciB7fSB7JHIgPD0gJGVyfSB7aW5jciByfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJc2V0IHdhc2RyYXduIFtpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldCglkcmF3Y21pdHJvdyAkcgoJaWYgeyRyID09ICRlcn0gYnJlYWsKCXNldCBuZXh0aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyIFtleHByIHskciArIDF9XV0KCWlmIHskd2FzZHJhd24gJiYgW2luZm8gZXhpc3RzIGlkZHJhd24oJG5leHRpZCldfSB7CgkgICAgY2F0Y2gge3Vuc2V0IHByZXZsaW5lc30KCSAgICBjb250aW51ZQoJfQoJZHJhd3BhcmVudGxpbmtzICRpZCAkcgoKCWlmIHtbaW5mbyBleGlzdHMgbGluZWVuZHMoJHIpXX0gewoJICAgIGZvcmVhY2ggbGlkICRsaW5lZW5kcygkcikgewoJCXVuc2V0IHByZXZsaW5lcygkbGlkKQoJICAgIH0KCX0KCXNldCByb3dpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyXQoJZm9yZWFjaCBsaWQgJHJvd2lkcyB7CgkgICAgaWYgeyRsaWQgZXEge319IGNvbnRpbnVlCgkgICAgaWYgeyRsaWQgZXEgJGlkfSB7CgkJIyBzZWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgYW55IG9mIGl0cyBwYXJlbnRzCgkJZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJHJdIHsKCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkcm93aWRzICRwXSA8IDB9IHsKCQkJIyBtYWtlIHRoaXMgbGluZSBleHRlbmQgdXAgdG8gdGhlIGNoaWxkCgkJCXNldCBsZSBbZHJhd2xpbmVzZWcgJHAgJHIgJGVyIDBdCgkJCWxhcHBlbmQgbGluZWVuZHMoJGxlKSAkcAoJCQlzZXQgcHJldmxpbmVzKCRwKSAxCgkJICAgIH0KCQl9CgkgICAgfSBlbHNlaWYgeyFbaW5mbyBleGlzdHMgcHJldmxpbmVzKCRsaWQpXX0gewoJCXNldCBsZSBbZHJhd2xpbmVzZWcgJGxpZCAkciAkZXIgMV0KCQlsYXBwZW5kIGxpbmVlbmRzKCRsZSkgJGxpZAoJCXNldCBwcmV2bGluZXMoJGxpZCkgMQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkcmF3ZnJhYyB7ZjAgZjF9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgeTAgW2V4cHIge2ludCgkZjAgKiAkeW1heCl9XQogICAgc2V0IHJvdyBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgc2V0IHkxIFtleHByIHtpbnQoJGYxICogJHltYXgpfV0KICAgIHNldCBlbmRyb3cgW2V4cHIge2ludCgoJHkxIC0gMykgLyAkbGluZXNwYykgKyAxfV0KICAgIGRyYXdjb21taXRzICRyb3cgJGVuZHJvdwp9Cgpwcm9jIGRyYXd2aXNpYmxlIHt9IHsKICAgIGdsb2JhbCBjYW52CiAgICBldmFsIGRyYXdmcmFjIFskY2FudiB5dmlld10KfQoKcHJvYyBjbGVhcl9kaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBpZGRyYXduIGxpbmVzZWdzCiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBhbGxjYW52cyBkZWxldGUgYWxsCiAgICBjYXRjaCB7dW5zZXQgaWRkcmF3bn0KICAgIGNhdGNoIHt1bnNldCBsaW5lc2Vnc30KICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KfQoKcHJvYyBmaW5kY3Jvc3NpbmdzIHtpZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBwYXJlbnRsaXN0IG51bWNvbW1pdHMgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKCiAgICBzZXQgY3Jvc3Mge30KICAgIHNldCBjY3Jvc3Mge30KICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCWlmIHskZSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBlIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQoJfQoJaWYgeyRlIDw9ICRzfSBjb250aW51ZQoJc2V0IHggW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkZV0gJGlkXQoJaWYgeyR4IDwgMH0gewoJICAgIHB1dHMgImZpbmRjcm9zc2luZ3M6IG9vcHMsIG5vIFtzaG9ydGlkcyAkaWRdIGluIHJvdyAkZSIKCSAgICBjb250aW51ZQoJfQoJZm9yIHtzZXQgcm93ICRlfSB7W2luY3Igcm93IC0xXSA+PSAkc30ge30gewoJICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10KCSAgICBzZXQga2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJICAgIHNldCBraWR4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGtpZF0KCSAgICBpZiB7JGtpZHggPCAwfSBjb250aW51ZQoJICAgIHNldCBuZXh0cm93IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdyArIDF9XV0KCSAgICBmb3JlYWNoIHAgJG9sZHMgewoJCXNldCBweCBbbHNlYXJjaCAtZXhhY3QgJG5leHRyb3cgJHBdCgkJaWYgeyRweCA8IDB9IGNvbnRpbnVlCgkJaWYgeygka2lkeCA8ICR4ICYmICR4IDwgJHB4KSB8fCAoJHB4IDwgJHggJiYgJHggPCAka2lkeCl9IHsKCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkY2Nyb3NzICRwXSA+PSAwfSBjb250aW51ZQoJCSAgICBpZiB7JHggPT0gJHB4ICsgKCRraWR4IDwgJHB4PyAtMTogMSl9IHsKCQkJbGFwcGVuZCBjY3Jvc3MgJHAKCQkgICAgfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY3Jvc3MgJHBdIDwgMH0gewoJCQlsYXBwZW5kIGNyb3NzICRwCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIHNldCBpbmMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICR4XQoJICAgIGlmIHskaW5jIGVxIHt9fSBicmVhawoJICAgIGluY3IgeCAkaW5jCgl9CiAgICB9CiAgICByZXR1cm4gW2NvbmNhdCAkY2Nyb3NzIHt7fX0gJGNyb3NzXQp9Cgpwcm9jIGFzc2lnbmNvbG9yIHtpZH0gewogICAgZ2xvYmFsIGNvbG9ybWFwIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBjb21taXRyb3cgcGFyZW50bGlzdCBjaGlsZHJlbiBjaGlsZHJlbiBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXX0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0gewoJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIH0gZWxzZSB7CglzZXQga2lkcyB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY2hpbGQgW2xpbmRleCAka2lkcyAwXQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJICAgICYmIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXV0gPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBzZXQgb3JpZ2JhZCB7fQogICAgZm9yZWFjaCB4IFtmaW5kY3Jvc3NpbmdzICRpZF0gewoJaWYgeyR4IGVxIHt9fSB7CgkgICAgIyBkZWxpbWl0ZXIgYmV0d2VlbiBjb3JuZXIgY3Jvc3NpbmdzIGFuZCBvdGhlciBjcm9zc2luZ3MKCSAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnMgLSAxfSBicmVhawoJICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0gewoJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7Cglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCldIDwgMH0gewoJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgfQoJICAgIGZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV0gewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCiAgICBnbG9iYWwgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjb21taXRyb3cgcm93dGV4dHggY3VydmlldyBmZ2NvbG9yIGJnY29sb3IKCiAgICBzZXQgbWFya3Mge30KICAgIHNldCBudGFncyAwCiAgICBzZXQgbmhlYWRzIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgbWFya3MgJGlkdGFncygkaWQpCglzZXQgbnRhZ3MgW2xsZW5ndGggJG1hcmtzXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkaGVhZHMoJGlkKV0KCXNldCBuaGVhZHMgW2xsZW5ndGggJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRvdGhlcnJlZnMoJGlkKV0KICAgIH0KICAgIGlmIHskbWFya3MgZXEge319IHsKCXJldHVybiAkeHQKICAgIH0KCiAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KICAgIHNldCB5dCBbZXhwciB7JHkxIC0gMC41ICogJGxpbmVzcGN9XQogICAgc2V0IHliIFtleHByIHskeXQgKyAkbGluZXNwYyAtIDF9XQogICAgc2V0IHh2YWxzIHt9CiAgICBzZXQgd3ZhbHMge30KICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJaW5jciBpCglpZiB7JGkgPj0gJG50YWdzICYmICRpIDwgJG50YWdzICsgJG5oZWFkcyAmJiAkdGFnIGVxICRtYWluaGVhZH0gewoJICAgIHNldCB3aWQgW2ZvbnQgbWVhc3VyZSBbY29uY2F0ICRtYWluZm9udCBib2xkXSAkdGFnXQoJfSBlbHNlIHsKCSAgICBzZXQgd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0YWddCgl9CglsYXBwZW5kIHh2YWxzICR4dAoJbGFwcGVuZCB3dmFscyAkd2lkCglzZXQgeHQgW2V4cHIgeyR4dCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzcyArICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkeCAkeTEgW2xpbmRleCAkeHZhbHMgZW5kXSAkeTEgXAoJICAgICAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCBibGFjayAtdGFncyB0YWcuJGlkXQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB4ICR4dmFscyB3aWQgJHd2YWxzIHsKCXNldCB4bCBbZXhwciB7JHggKyAkZGVsdGF9XQoJc2V0IHhyIFtleHByIHskeCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzc31dCglzZXQgZm9udCAkbWFpbmZvbnQKCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciB7JHl0ICsgJGRlbHRhfV0gJHhsICR5dCBcCgkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCQlpZiB7JHRhZyBlcSAkbWFpbmhlYWR9IHsKCQkgICAgbGFwcGVuZCBmb250IGJvbGQKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgY29sICIjZGRkZGZmIgoJICAgIH0KCSAgICBzZXQgeGwgW2V4cHIgeyR4bCAtICRkZWx0YS8yfV0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgkgICAgaWYge1tyZWdleHAge14ocmVtb3Rlcy8uKi98cmVtb3Rlcy8pfSAkdGFnIG1hdGNoIHJlbW90ZXByZWZpeF19IHsKCSAgICAgICAgc2V0IHJ3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHJlbW90ZXByZWZpeF0KCQlzZXQgeGkgW2V4cHIgeyR4ICsgMX1dCgkJc2V0IHl0aSBbZXhwciB7JHl0ICsgMX1dCgkJc2V0IHhyaSBbZXhwciB7JHggKyAkcndpZH1dCgkJJGNhbnYgY3JlYXRlIHBvbHlnb24gJHhpICR5dGkgJHhyaSAkeXRpICR4cmkgJHliICR4aSAkeWIgXAoJCQktd2lkdGggMCAtZmlsbCAiI2ZmZGRhYSIgLXRhZ3MgdGFnLiRpZAoJICAgIH0KCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIC1maWxsICRmZ2NvbG9yIFwKCQkgICAtZm9udCAkZm9udCAtdGFncyBbbGlzdCB0YWcuJGlkIHRleHRdXQoJaWYgeyRudGFncyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgl9IGVsc2VpZiB7JG5oZWFkcyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTM+IFtsaXN0IGhlYWRtZW51ICVYICVZICRpZCAkdGFnXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0gewogICAgZ2xvYmFsIGNhbnZ4MCB4c3BjMSB4c3BjMgoKICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCiAgICBpZiB7JGkgPiAwICYmICRpID09ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCiAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArICR4c3BjMiAtICR4c3BjMSgkbG4pfV0KICAgIH0KICAgIHJldHVybiAkeAp9Cgpwcm9jIHNob3dfc3RhdHVzIHttc2d9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGZnY29sb3IKCiAgICBjbGVhcl9kaXNwbGF5CiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAkbXNnIC1mb250ICRtYWluZm9udCBcCgktdGFncyB0ZXh0IC1maWxsICRmZ2NvbG9yCn0KCiMgSW5zZXJ0IGEgbmV3IGNvbW1pdCBhcyB0aGUgY2hpbGQgb2YgdGhlIGNvbW1pdCBvbiByb3cgJHJvdy4KIyBUaGUgbmV3IGNvbW1pdCB3aWxsIGJlIGRpc3BsYXllZCBvbiByb3cgJHJvdyBhbmQgdGhlIGNvbW1pdHMKIyBvbiB0aGF0IHJvdyBhbmQgYmVsb3cgd2lsbCBtb3ZlIGRvd24gb25lIHJvdy4KcHJvYyBpbnNlcnRyb3cge3JvdyBuZXdjbWl0fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY29tbWl0bGlzdGVkIGNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcgcm93aWRsaXN0IHJvd29mZnNldHMgbnVtY29tbWl0cwogICAgZ2xvYmFsIHJvd3JhbmdlbGlzdCByb3dsYWlkb3V0IHJvd29wdGltIG51bWNvbW1pdHMKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgcm93Y2hrIGNvbW1pdGlkeAoKICAgIGlmIHskcm93ID49ICRudW1jb21taXRzfSB7CglwdXRzICJvb3BzLCBpbnNlcnRpbmcgbmV3IHJvdyAkcm93IGJ1dCBvbmx5IGhhdmUgJG51bWNvbW1pdHMgcm93cyIKCXJldHVybgogICAgfQogICAgc2V0IHAgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBzZXQgZGlzcGxheW9yZGVyIFtsaW5zZXJ0ICRkaXNwbGF5b3JkZXIgJHJvdyAkbmV3Y21pdF0KICAgIHNldCBwYXJlbnRsaXN0IFtsaW5zZXJ0ICRwYXJlbnRsaXN0ICRyb3cgJHBdCiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJHApCiAgICBsYXBwZW5kIGtpZHMgJG5ld2NtaXQKICAgIHNldCBjaGlsZHJlbigkY3VydmlldywkcCkgJGtpZHMKICAgIHNldCBjaGlsZHJlbigkY3VydmlldywkbmV3Y21pdCkge30KICAgIHNldCBjb21taXRsaXN0ZWQgW2xpbnNlcnQgJGNvbW1pdGxpc3RlZCAkcm93IDFdCiAgICBzZXQgbCBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQogICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkbH0ge2luY3Igcn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0KCXNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcgogICAgfQogICAgaW5jciBjb21taXRpZHgoJGN1cnZpZXcpCgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHNldCBuZXdvZmZzIHt9CiAgICBmb3JlYWNoIHggJGlkbGlzdCB7CglpZiB7JHggZXEge30gfHwgKCR4IGVxICRwICYmIFtsbGVuZ3RoICRraWRzXSA9PSAxKX0gewoJICAgIGxhcHBlbmQgbmV3b2ZmcyB7fQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG5ld29mZnMgMAoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRwXQoJbHNldCBpZGxpc3QgJGNvbCAkbmV3Y21pdAogICAgfSBlbHNlIHsKCXNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCWxhcHBlbmQgaWRsaXN0ICRuZXdjbWl0CglsYXBwZW5kIG9mZnMge30KCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCiAgICB9CiAgICBzZXQgcm93aWRsaXN0IFtsaW5zZXJ0ICRyb3dpZGxpc3QgJHJvdyAkaWRsaXN0XQogICAgc2V0IHJvd29mZnNldHMgW2xpbnNlcnQgJHJvd29mZnNldHMgW2V4cHIgeyRyb3crMX1dICRuZXdvZmZzXQoKICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbnNlcnQgJHJvd3JhbmdlbGlzdCAkcm93IHt9XQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA+IDF9IHsKCXNldCBycDEgW2V4cHIgeyRyb3cgKyAxfV0KCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRycDFdCglpZiB7JHJhbmdlcyBlcSB7fX0gewoJICAgIHNldCByYW5nZXMgW2xpc3QgJG5ld2NtaXQgJHBdCgl9IGVsc2VpZiB7W2xpbmRleCAkcmFuZ2VzIGVuZC0xXSBlcSAkcH0gewoJICAgIGxzZXQgcmFuZ2VzIGVuZC0xICRuZXdjbWl0Cgl9Cglsc2V0IHJvd3JhbmdlbGlzdCAkcnAxICRyYW5nZXMKICAgIH0KCiAgICBjYXRjaCB7dW5zZXQgcm93Y2hrfQoKICAgIGluY3Igcm93bGFpZG91dAogICAgaW5jciByb3dvcHRpbQogICAgaW5jciBudW1jb21taXRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPj0gJHJvd30gewoJaW5jciBzZWxlY3RlZGxpbmUKICAgIH0KICAgIHJlZGlzcGxheQp9CgojIFJlbW92ZSBhIGNvbW1pdCB0aGF0IHdhcyBpbnNlcnRlZCB3aXRoIGluc2VydHJvdyBvbiByb3cgJHJvdy4KcHJvYyByZW1vdmVyb3cge3Jvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IGNvbW1pdGxpc3RlZCBjaGlsZHJlbgogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3IHJvd2lkbGlzdCByb3dvZmZzZXRzIG51bWNvbW1pdHMKICAgIGdsb2JhbCByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMgcm93bGFpZG91dCByb3dvcHRpbSBudW1jb21taXRzCiAgICBnbG9iYWwgbGluZXNlZ2VuZHMgc2VsZWN0ZWRsaW5lIHJvd2NoayBjb21taXRpZHgKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gewoJcHV0cyAib29wcywgcmVtb3Zpbmcgcm93ICRyb3cgYnV0IG9ubHkgaGF2ZSAkbnVtY29tbWl0cyByb3dzIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgcnAxIFtleHByIHskcm93ICsgMX1dCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCiAgICBzZXQgZGlzcGxheW9yZGVyIFtscmVwbGFjZSAkZGlzcGxheW9yZGVyICRyb3cgJHJvd10KICAgIHNldCBwYXJlbnRsaXN0IFtscmVwbGFjZSAkcGFyZW50bGlzdCAkcm93ICRyb3ddCiAgICBzZXQgY29tbWl0bGlzdGVkIFtscmVwbGFjZSAkY29tbWl0bGlzdGVkICRyb3cgJHJvd10KICAgIHNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkcCkKICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAka2lkcyAkaWRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGtpZHMgW2xyZXBsYWNlICRraWRzICRpICRpXQoJc2V0IGNoaWxkcmVuKCRjdXJ2aWV3LCRwKSAka2lkcwogICAgfQogICAgc2V0IGwgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KICAgIGZvciB7c2V0IHIgJHJvd30geyRyIDwgJGx9IHtpbmNyIHJ9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJdCglzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHIKICAgIH0KICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KSAtMQoKICAgIHNldCByb3dpZGxpc3QgW2xyZXBsYWNlICRyb3dpZGxpc3QgJHJvdyAkcm93XQogICAgc2V0IHJvd29mZnNldHMgW2xyZXBsYWNlICRyb3dvZmZzZXRzICRycDEgJHJwMV0KICAgIGlmIHska2lkcyBuZSB7fX0gewoJc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQoJc2V0IG9mZnMgW2xyZXBsYWNlICRvZmZzIGVuZCBlbmRdCglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwogICAgfQoKICAgIHNldCByb3dyYW5nZWxpc3QgW2xyZXBsYWNlICRyb3dyYW5nZWxpc3QgJHJvdyAkcm93XQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA+IDB9IHsKCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRyb3ddCglpZiB7W2xpbmRleCAkcmFuZ2VzIGVuZC0xXSBlcSAkaWR9IHsKCSAgICBzZXQgcmFuZ2VzIFtscmVwbGFjZSAkcmFuZ2VzIGVuZC0xIGVuZF0KCSAgICBsc2V0IHJvd3JhbmdlbGlzdCAkcm93ICRyYW5nZXMKCX0KICAgIH0KCiAgICBjYXRjaCB7dW5zZXQgcm93Y2hrfQoKICAgIGluY3Igcm93bGFpZG91dCAtMQogICAgaW5jciByb3dvcHRpbSAtMQogICAgaW5jciBudW1jb21taXRzIC0xCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRzZWxlY3RlZGxpbmUgPiAkcm93fSB7CglpbmNyIHNlbGVjdGVkbGluZSAtMQogICAgfQogICAgcmVkaXNwbGF5Cn0KCiMgRG9uJ3QgY2hhbmdlIHRoZSB0ZXh0IHBhbmUgY3Vyc29yIGlmIGl0IGlzIGN1cnJlbnRseSB0aGUgaGFuZCBjdXJzb3IsCiMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgpwcm9jIHNldHRleHRjdXJzb3Ige2N9IHsKICAgIGdsb2JhbCBjdGV4dCBjdXJ0ZXh0Y3Vyc29yCgogICAgaWYge1skY3RleHQgY2dldCAtY3Vyc29yXSA9PSAkY3VydGV4dGN1cnNvcn0gewoJJGN0ZXh0IGNvbmZpZyAtY3Vyc29yICRjCiAgICB9CiAgICBzZXQgY3VydGV4dGN1cnNvciAkYwp9Cgpwcm9jIG5vd2J1c3kge3doYXR9IHsKICAgIGdsb2JhbCBpc2J1c3kKCiAgICBpZiB7W2FycmF5IG5hbWVzIGlzYnVzeV0gZXEge319IHsKCS4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKCXNldHRleHRjdXJzb3Igd2F0Y2gKICAgIH0KICAgIHNldCBpc2J1c3koJHdoYXQpIDEKfQoKcHJvYyBub3RidXN5IHt3aGF0fSB7CiAgICBnbG9iYWwgaXNidXN5IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGNhdGNoIHt1bnNldCBpc2J1c3koJHdoYXQpfQogICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CgkuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCglzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kc3RyaW5nCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZmluZHN0cmluZyAkZl0KICAgIH0gZWxzZSB7CglzZXQgZnMgJGZpbmRzdHJpbmcKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IGYgW3N0cmluZyB0b2xvd2VyICRmXQoJICAgIHNldCBmcyBbc3RyaW5nIHRvbG93ZXIgJGZzXQoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXNldCBsIFtzdHJpbmcgbGVuZ3RoICRmc10KCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZnMgJGYgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskbC0xfV1dCgkgICAgc2V0IGkgW2V4cHIgeyRqICsgJGx9XQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt7cmV2IDB9fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kc3RhcnRsaW5lIGZpbmRjdXJsaW5lIHNlbGVjdGVkbGluZSBudW1jb21taXRzCgogICAgdW5tYXJrbWF0Y2hlcwogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBmb2N1cyAuCiAgICBpZiB7JGZpbmRzdHJpbmcgZXEge30gfHwgJG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgZmluZHN0YXJ0bGluZSBbbGluZGV4IFt2aXNpYmxlcm93c10gJHJldl0KICAgIH0gZWxzZSB7CglzZXQgZmluZHN0YXJ0bGluZSAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZmluZGN1cmxpbmUgJGZpbmRzdGFydGxpbmUKICAgIG5vd2J1c3kgZmluZGluZwogICAgaWYgeyEkcmV2fSB7CglydW4gZmluZG1vcmUKICAgIH0gZWxzZSB7CglzZXQgZmluZGN1cmxpbmUgJGZpbmRzdGFydGxpbmUKCWlmIHskZmluZGN1cmxpbmUgPT0gMH0gewoJICAgIHNldCBmaW5kY3VybGluZSAkbnVtY29tbWl0cwoJfQoJaW5jciBmaW5kY3VybGluZSAtMQoJcnVuIGZpbmRtb3JlcmV2CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBmaW5kY3VybGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgZmluZGN1cmxpbmVdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0gZWxzZSB7CgkgICAgYmVsbAoJfQogICAgfSBlbHNlIHsKCXJ1biBmaW5kbW9yZQoJbm93YnVzeSBmaW5kaW5nCiAgICB9Cn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIGZpbmRjdXJsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaW5kY3VybGluZV19IHsKCWRvZmluZCAxCiAgICB9IGVsc2UgewoJcnVuIGZpbmRtb3JlcmV2Cglub3didXN5IGZpbmRpbmcKICAgIH0KfQoKcHJvYyBmaW5kbW9yZSB7fSB7CiAgICBnbG9iYWwgY29tbWl0ZGF0YSBjb21taXRpbmZvIG51bWNvbW1pdHMgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kbG9jCiAgICBnbG9iYWwgZmluZHN0YXJ0bGluZSBmaW5kY3VybGluZSBtYXJraW5nbWF0Y2hlcyBkaXNwbGF5b3JkZXIKCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KICAgIHNldCBsIFtleHByIHskZmluZGN1cmxpbmUgKyAxfV0KICAgIGlmIHskbCA+PSAkbnVtY29tbWl0c30gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyRsIDw9ICRmaW5kc3RhcnRsaW5lfSB7CglzZXQgbGltIFtleHByIHskZmluZHN0YXJ0bGluZSArIDF9XQogICAgfSBlbHNlIHsKCXNldCBsaW0gJG51bWNvbW1pdHMKICAgIH0KICAgIGlmIHskbGltIC0gJGwgPiA1MDB9IHsKCXNldCBsaW0gW2V4cHIgeyRsICsgNTAwfV0KICAgIH0KICAgIHNldCBsYXN0IDAKICAgIGZvciB7fSB7JGwgPCAkbGltfSB7aW5jciBsfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQoJaWYgeyFbZG9lc21hdGNoICRjb21taXRkYXRhKCRpZCldfSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIGdldGNvbW1pdCAkaWQKCX0KCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHsoJGZpbmRsb2MgZXEgIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jIGVxICR0eSkgJiYKCQlbZG9lc21hdGNoICRmXX0gewoJCXNldCBtYXJraW5nbWF0Y2hlcyAxCgkJZmluZHNlbGVjdGxpbmUgJGwKCQlub3RidXN5IGZpbmRpbmcKCQlyZXR1cm4gMAoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbCA9PSAkZmluZHN0YXJ0bGluZSArIDF9IHsKCWJlbGwKCXVuc2V0IGZpbmRjdXJsaW5lCglub3RidXN5IGZpbmRpbmcKCXJldHVybiAwCiAgICB9CiAgICBzZXQgZmluZGN1cmxpbmUgW2V4cHIgeyRsIC0gMX1dCiAgICByZXR1cm4gMQp9Cgpwcm9jIGZpbmRtb3JlcmV2IHt9IHsKICAgIGdsb2JhbCBjb21taXRkYXRhIGNvbW1pdGluZm8gbnVtY29tbWl0cyBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmRsb2MKICAgIGdsb2JhbCBmaW5kc3RhcnRsaW5lIGZpbmRjdXJsaW5lIG1hcmtpbmdtYXRjaGVzIGRpc3BsYXlvcmRlcgoKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgc2V0IGwgJGZpbmRjdXJsaW5lCiAgICBpZiB7JGwgPT0gMH0gewoJc2V0IGwgJG51bWNvbW1pdHMKICAgIH0KICAgIGluY3IgbCAtMQogICAgaWYgeyRsID49ICRmaW5kc3RhcnRsaW5lfSB7CglzZXQgbGltIFtleHByIHskZmluZHN0YXJ0bGluZSAtIDF9XQogICAgfSBlbHNlIHsKCXNldCBsaW0gLTEKICAgIH0KICAgIGlmIHskbCAtICRsaW0gPiA1MDB9IHsKCXNldCBsaW0gW2V4cHIgeyRsIC0gNTAwfV0KICAgIH0KICAgIHNldCBsYXN0IDAKICAgIGZvciB7fSB7JGwgPiAkbGltfSB7aW5jciBsIC0xfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRsXQoJaWYgeyFbZG9lc21hdGNoICRjb21taXRkYXRhKCRpZCldfSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIGdldGNvbW1pdCAkaWQKCX0KCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHsoJGZpbmRsb2MgZXEgIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jIGVxICR0eSkgJiYKCQlbZG9lc21hdGNoICRmXX0gewoJCXNldCBtYXJraW5nbWF0Y2hlcyAxCgkJZmluZHNlbGVjdGxpbmUgJGwKCQlub3RidXN5IGZpbmRpbmcKCQlyZXR1cm4gMAoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbCA9PSAtMX0gewoJYmVsbAoJdW5zZXQgZmluZGN1cmxpbmUKCW5vdGJ1c3kgZmluZGluZwoJcmV0dXJuIDAKICAgIH0KICAgIHNldCBmaW5kY3VybGluZSBbZXhwciB7JGwgKyAxfV0KICAgIHJldHVybiAxCn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSBvciBhdXRob3IgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIFtsaXN0IG1hdGNoJGwgbWF0Y2hlc10gLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBmaW5kaWRzIG1hcmtpbmdtYXRjaGVzIGZpbmRjdXJsaW5lCgogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgc2V0IG1hcmtpbmdtYXRjaGVzIDAKICAgIGNhdGNoIHt1bnNldCBmaW5kY3VybGluZX0KfQoKcHJvYyBzZWxjYW52bGluZSB7dyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnZ5MCBjdGV4dCBsaW5lc3BjCiAgICBnbG9iYWwgcm93dGV4dHgKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0KICAgIGlmIHskdyBlcSAkY2Fudn0gewoJaWYgeyFbaW5mbyBleGlzdHMgcm93dGV4dHgoJGwpXSB8fCAkeCA8ICRyb3d0ZXh0eCgkbCl9IHJldHVybgogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgY29tbWl0X2Rlc2NyaXB0b3Ige3B9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCWdldGNvbW1pdCAkcAogICAgfQogICAgc2V0IGwgIi4uLiIKICAgIGlmIHtbbGxlbmd0aCAkY29tbWl0aW5mbygkcCldID4gMX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKVxuIgp9CgojIGFwcGVuZCBzb21lIHRleHQgdG8gdGhlIGN0ZXh0IHdpZGdldCwgYW5kIG1ha2UgYW55IFNIQTEgSUQKIyB0aGF0IHdlIGtub3cgYWJvdXQgYmUgYSBjbGlja2FibGUgbGluay4KcHJvYyBhcHBlbmR3aXRobGlua3Mge3RleHQgdGFnc30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdHJvdyBsaW5rbnVtIGN1cnZpZXcKCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQgJHRhZ3MKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gXAoJICAgIFtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKSAxXQoJaW5jciBsaW5rbnVtCiAgICB9CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cn0KCnByb2Mgdmlld25leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMKCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkZGlyICogJGxpbmVzcGN9XQogICAgaWYgeyRuZXd0b3AgPCAwfSB7CglzZXQgbmV3dG9wIDAKICAgIH0gZWxzZWlmIHskbmV3dG9wID4gJHltYXh9IHsKCXNldCBuZXd0b3AgJHltYXgKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KfQoKIyBhZGQgYSBsaXN0IG9mIHRhZyBvciBicmFuY2ggbmFtZXMgYXQgcG9zaXRpb24gcG9zCiMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5hbWVzIGluc2VydGVkCnByb2MgYXBwZW5kcmVmcyB7cG9zIGlkcyB2YXJ9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3ICR2YXIgbWF4cmVmcwoKICAgIGlmIHtbY2F0Y2ggeyRjdGV4dCBpbmRleCAkcG9zfV19IHsKCXJldHVybiAwCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlICRwb3MgIiRwb3MgbGluZWVuZCIKICAgIHNldCB0YWdzIHt9CiAgICBmb3JlYWNoIGlkICRpZHMgewoJZm9yZWFjaCB0YWcgW3NldCAkdmFyXCgkaWRcKV0gewoJICAgIGxhcHBlbmQgdGFncyBbbGlzdCAkdGFnICRpZF0KCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkdGFnc10gPiAkbWF4cmVmc30gewoJJGN0ZXh0IGluc2VydCAkcG9zICJtYW55IChbbGxlbmd0aCAkdGFnc10pIgogICAgfSBlbHNlIHsKCXNldCB0YWdzIFtsc29ydCAtaW5kZXggMCAtZGVjcmVhc2luZyAkdGFnc10KCXNldCBzZXAge30KCWZvcmVhY2ggdGkgJHRhZ3MgewoJICAgIHNldCBpZCBbbGluZGV4ICR0aSAxXQoJICAgIHNldCBsayBsaW5rJGxpbmtudW0KCSAgICBpbmNyIGxpbmtudW0KCSAgICAkY3RleHQgdGFnIGRlbGV0ZSAkbGsKCSAgICAkY3RleHQgaW5zZXJ0ICRwb3MgJHNlcAoJICAgICRjdGV4dCBpbnNlcnQgJHBvcyBbbGluZGV4ICR0aSAwXSAkbGsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJCSRjdGV4dCB0YWcgY29uZiAkbGsgLWZvcmVncm91bmQgYmx1ZQoJCSRjdGV4dCB0YWcgYmluZCAkbGsgPDE+IFwKCQkgICAgW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMV0KCQkkY3RleHQgdGFnIGNvbmYgJGxrIC11bmRlcmxpbmUgMQoJCSRjdGV4dCB0YWcgYmluZCAkbGsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KCQkkY3RleHQgdGFnIGJpbmQgJGxrIDxMZWF2ZT4gXAoJCSAgICB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KCSAgICB9CgkgICAgc2V0IHNlcCAiLCAiCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHJldHVybiBbbGxlbmd0aCAkdGFnc10KfQoKIyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIGNvbXB1dGluZyB0aGUgbmVhcmJ5IHRhZ3MKcHJvYyBkaXNwbmVhcnRhZ3Mge2RlbGF5fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBzaG93bmVhcnRhZ3MgdGFncGhhc2UKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICEkc2hvd25lYXJ0YWdzfSByZXR1cm4KICAgIGFmdGVyIGNhbmNlbCBkaXNwbmV4dHRhZwogICAgaWYgeyRkZWxheX0gewoJYWZ0ZXIgMjAwIGRpc3BuZXh0dGFnCglzZXQgdGFncGhhc2UgLTEKICAgIH0gZWxzZSB7CglhZnRlciBpZGxlIGRpc3BuZXh0dGFnCglzZXQgdGFncGhhc2UgMAogICAgfQp9Cgpwcm9jIGRpc3BuZXh0dGFnIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkIHNob3duZWFydGFncyB0YWdwaGFzZSBjdGV4dAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgISRzaG93bmVhcnRhZ3N9IHJldHVybgogICAgc3dpdGNoIC0tICR0YWdwaGFzZSB7CgkwIHsKCSAgICBzZXQgZHRhZ3MgW2Rlc2N0YWdzICRjdXJyZW50aWRdCgkgICAgaWYgeyRkdGFncyBuZSB7fX0gewoJCWFwcGVuZHJlZnMgcHJlY2VkZXMgJGR0YWdzIGlkdGFncwoJICAgIH0KCX0KCTEgewoJICAgIHNldCBhdGFncyBbYW5jdGFncyAkY3VycmVudGlkXQoJICAgIGlmIHskYXRhZ3MgbmUge319IHsKCQlhcHBlbmRyZWZzIGZvbGxvd3MgJGF0YWdzIGlkdGFncwoJICAgIH0KCX0KCTIgewoJICAgIHNldCBkaGVhZHMgW2Rlc2NoZWFkcyAkY3VycmVudGlkXQoJICAgIGlmIHskZGhlYWRzIG5lIHt9fSB7CgkJaWYge1thcHBlbmRyZWZzIGJyYW5jaCAkZGhlYWRzIGlkaGVhZHNdID4gMQoJCSAgICAmJiBbJGN0ZXh0IGdldCAiYnJhbmNoIC0zYyJdIGVxICJoIn0gewoJCSAgICAjIHR1cm4gIkJyYW5jaCIgaW50byAiQnJhbmNoZXMiCgkJICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKCQkgICAgJGN0ZXh0IGluc2VydCAiYnJhbmNoIC0yYyIgImVzIgoJCSAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmNyIHRhZ3BoYXNlXSA8PSAyfSB7CglhZnRlciBpZGxlIGRpc3BuZXh0dGFnCiAgICB9Cn0KCnByb2Mgc2VsZWN0bGluZSB7bCBpc25ld30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY29tbWl0aW5mbyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYyBwYXJlbnRsaXN0IGNoaWxkcmVuIGN1cnZpZXcKICAgIGdsb2JhbCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgbGlua251bQogICAgZ2xvYmFsIG1lcmdlbWF4IG51bWNvbW1pdHMgcGVuZGluZ19zZWxlY3QKICAgIGdsb2JhbCBjbWl0bW9kZSBzaG93bmVhcnRhZ3MgYWxsY29tbWl0cwoKICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBpZiB7JGwgPCAwIHx8ICRsID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQoJZHJhd3Zpc2libGUKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbF0KICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCiAgICByaGlnaGxpZ2h0X3NlbCAkaWQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KCiAgICBzZXQgaGVhZGVycyB7fQogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkbF0KICAgIGlmIHtbbGxlbmd0aCAkb2xkc10gPiAxfSB7CglzZXQgbnAgMAoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBpZiB7JG5wID49ICRtZXJnZW1heH0gewoJCXNldCB0YWcgbW1heAoJICAgIH0gZWxzZSB7CgkJc2V0IHRhZyBtJG5wCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6ICIgJHRhZwoJICAgIGFwcGVuZHdpdGhsaW5rcyBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdIHt9CgkgICAgaW5jciBucAoJfQogICAgfSBlbHNlIHsKCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgYXBwZW5kIGhlYWRlcnMgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXSIKCX0KICAgIH0KCiAgICBmb3JlYWNoIGMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkgewoJYXBwZW5kIGhlYWRlcnMgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXSIKICAgIH0KCiAgICAjIG1ha2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgU0hBMSBJRCBiZSBhIGNsaWNrYWJsZSBsaW5rCiAgICBhcHBlbmR3aXRobGlua3MgJGhlYWRlcnMge30KICAgIGlmIHskc2hvd25lYXJ0YWdzfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gewoJICAgIGdldGFsbGNvbW1pdHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJCcmFuY2g6ICIKCSRjdGV4dCBtYXJrIHNldCBicmFuY2ggImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGJyYW5jaCBsZWZ0CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5Gb2xsb3dzOiAiCgkkY3RleHQgbWFyayBzZXQgZm9sbG93cyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm9sbG93cyBsZWZ0CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5QcmVjZWRlczogIgoJJGN0ZXh0IG1hcmsgc2V0IHByZWNlZGVzICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBwcmVjZWRlcyBsZWZ0CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCglkaXNwbmVhcnRhZ3MgMQogICAgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgc2V0IGNvbW1lbnQgW2xpbmRleCAkaW5mbyA1XQogICAgaWYge1tzdHJpbmcgZmlyc3QgIlxyIiAkY29tbWVudF0gPj0gMH0gewoJc2V0IGNvbW1lbnQgW3N0cmluZyBtYXAgeyJcciIgIlxuICAgICJ9ICRjb21tZW50XQogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICRjb21tZW50IHtjb21tZW50fQoKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgIGluaXRfZmxpc3QgIkNvbW1lbnRzIgogICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHsKCWdldHRyZWUgJGlkCiAgICB9IGVsc2VpZiB7W2xsZW5ndGggJG9sZHNdIDw9IDF9IHsKCXN0YXJ0ZGlmZiAkaWQKICAgIH0gZWxzZSB7CgltZXJnZWRpZmYgJGlkICRsCiAgICB9Cn0KCnByb2Mgc2VsZmlyc3RsaW5lIHt9IHsKICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgMCAxCn0KCnByb2Mgc2VsbGFzdGxpbmUge30gewogICAgZ2xvYmFsIG51bWNvbW1pdHMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBsIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2Mgc2VsbmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJ9XQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2Mgc2VsbmV4dHBhZ2Uge2Rpcn0gewogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwoKICAgIHNldCBscHAgW2V4cHIgeyhbd2luZm8gaGVpZ2h0ICRjYW52XSAtIDIpIC8gJGxpbmVzcGN9XQogICAgaWYgeyRscHAgPCAxfSB7CglzZXQgbHBwIDEKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IHNjcm9sbCBbZXhwciB7JGRpciAqICRscHB9XSB1bml0cwogICAgZHJhd3Zpc2libGUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyICogJGxwcH1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9IGVsc2VpZiB7JGwgPj0gJG51bWNvbW1pdHN9IHsKICAgICAgICBzZXQgbCBbZXhwciAkbnVtY29tbWl0cyAtIDFdCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyB1bnNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQKCiAgICBjYXRjaCB7dW5zZXQgc2VsZWN0ZWRsaW5lfQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRpZH0KICAgIGFsbGNhbnZzIGRlbGV0ZSBzZWNzZWwKICAgIHJoaWdobGlnaHRfbm9uZQogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0Cn0KCnByb2MgcmVzZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgYWRkdG9oaXN0b3J5IHtjbWR9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleCBjdXJ2aWV3CgogICAgc2V0IGVsdCBbbGlzdCAkY3VydmlldyAkY21kXQogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAwCgkmJiBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXSA9PSAkZWx0fSB7CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGhpc3RvcnkgW2xyZXBsYWNlICRoaXN0b3J5ICRoaXN0b3J5aW5kZXggZW5kICRlbHRdCiAgICB9IGVsc2UgewoJbGFwcGVuZCBoaXN0b3J5ICRlbHQKICAgIH0KICAgIGluY3IgaGlzdG9yeWluZGV4CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0gZWxzZSB7CgkudGYuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KICAgIC50Zi5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBnb2RvIHtlbHR9IHsKICAgIGdsb2JhbCBjdXJ2aWV3CgogICAgc2V0IHZpZXcgW2xpbmRleCAkZWx0IDBdCiAgICBzZXQgY21kIFtsaW5kZXggJGVsdCAxXQogICAgaWYgeyRjdXJ2aWV3ICE9ICR2aWV3fSB7CglzaG93dmlldyAkdmlldwogICAgfQogICAgZXZhbCAkY21kCn0KCnByb2MgZ29iYWNrIHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJaW5jciBoaXN0b3J5aW5kZXggLTEKCWdvZG8gW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0KCS50Zi5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA8PSAxfSB7CgkudGYuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnb2Zvcncge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSAkaGlzdG9yeWluZGV4XQoJaW5jciBoaXN0b3J5aW5kZXgKCWdvZG8gJGNtZAoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPj0gW2xsZW5ndGggJGhpc3RvcnldfSB7CgkudGYuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ2V0dHJlZSB7aWR9IHsKICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCBkaWZmaWRzIGRpZmZtZXJnZWlkIHRyZWVwZW5kaW5nIG51bGxpZAoKICAgIHNldCBkaWZmaWRzICRpZAogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWZpbGVsaXN0KCRpZCldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBpZiB7JGlkIG5lICRudWxsaWR9IHsKCQlzZXQgY21kIFtjb25jYXQgfCBnaXQgbHMtdHJlZSAtciAkaWRdCgkgICAgfSBlbHNlIHsKCQlzZXQgY21kIFtjb25jYXQgfCBnaXQgbHMtZmlsZXNdCgkgICAgfQoJICAgIGlmIHtbY2F0Y2gge3NldCBndGYgW29wZW4gJGNtZCByXX1dfSB7CgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKCSAgICBzZXQgdHJlZWZpbGVsaXN0KCRpZCkge30KCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CgkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCgkgICAgZmlsZXJ1biAkZ3RmIFtsaXN0IGdldHRyZWVsaW5lICRndGYgJGlkXQoJfQogICAgfSBlbHNlIHsKCXNldGZpbGVsaXN0ICRpZAogICAgfQp9Cgpwcm9jIGdldHRyZWVsaW5lIHtndGYgaWR9IHsKICAgIGdsb2JhbCB0cmVlZmlsZWxpc3QgdHJlZWlkbGlzdCB0cmVlcGVuZGluZyBjbWl0bW9kZSBkaWZmaWRzIG51bGxpZAoKICAgIHNldCBubCAwCiAgICB3aGlsZSB7W2luY3IgbmxdIDw9IDEwMDAgJiYgW2dldHMgJGd0ZiBsaW5lXSA+PSAwfSB7CglpZiB7JGRpZmZpZHMgbmUgJG51bGxpZH0gewoJICAgIGlmIHtbbGluZGV4ICRsaW5lIDFdIG5lICJibG9iIn0gY29udGludWUKCSAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcdCIgJGxpbmVdCgkgICAgaWYgeyRpIDwgMH0gY29udGludWUKCSAgICBzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDJdCgkgICAgc2V0IGZuYW1lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgW2V4cHIgeyRpKzF9XSBlbmRdCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGZuYW1lIDBdIGVxICJcIiJ9IHsKCQlzZXQgZm5hbWUgW2xpbmRleCAkZm5hbWUgMF0KCSAgICB9CgkgICAgbGFwcGVuZCB0cmVlaWRsaXN0KCRpZCkgJHNoYTEKCX0gZWxzZSB7CgkgICAgc2V0IGZuYW1lICRsaW5lCgl9CglsYXBwZW5kIHRyZWVmaWxlbGlzdCgkaWQpICRmbmFtZQogICAgfQogICAgaWYgeyFbZW9mICRndGZdfSB7CglyZXR1cm4gW2V4cHIgeyRubCA+PSAxMDAwPyAyOiAxfV0KICAgIH0KICAgIGNsb3NlICRndGYKICAgIHVuc2V0IHRyZWVwZW5kaW5nCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgl9CiAgICB9IGVsc2VpZiB7JGlkIG5lICRkaWZmaWRzfSB7CglnZXR0cmVlICRkaWZmaWRzCiAgICB9IGVsc2UgewoJc2V0ZmlsZWxpc3QgJGlkCiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIHNob3dmaWxlIHtmfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcyBudWxsaWQKICAgIGdsb2JhbCBjdGV4dCBjb21tZW50ZW5kCgogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZmlsZWxpc3QoJGRpZmZpZHMpICRmXQogICAgaWYgeyRpIDwgMH0gewoJcHV0cyAib29wcywgJGYgbm90IGluIGxpc3QgZm9yIGlkICRkaWZmaWRzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGRpZmZpZHMgbmUgJG51bGxpZH0gewoJc2V0IGJsb2IgW2xpbmRleCAkdHJlZWlkbGlzdCgkZGlmZmlkcykgJGldCglpZiB7W2NhdGNoIHtzZXQgYmYgW29wZW4gW2NvbmNhdCB8IGdpdCBjYXQtZmlsZSBibG9iICRibG9iXSByXX0gZXJyXX0gewoJICAgIHB1dHMgIm9vcHMsIGVycm9yIHJlYWRpbmcgYmxvYiAkYmxvYjogJGVyciIKCSAgICByZXR1cm4KCX0KICAgIH0gZWxzZSB7CglpZiB7W2NhdGNoIHtzZXQgYmYgW29wZW4gJGYgcl19IGVycl19IHsKCSAgICBwdXRzICJvb3BzLCBjYW4ndCByZWFkICRmOiAkZXJyIgoJICAgIHJldHVybgoJfQogICAgfQogICAgZmNvbmZpZ3VyZSAkYmYgLWJsb2NraW5nIDAKICAgIGZpbGVydW4gJGJmIFtsaXN0IGdldGJsb2JsaW5lICRiZiAkZGlmZmlkc10KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQgJGNvbW1lbnRlbmQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICIkZlxuIiBmaWxlc2VwCiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHl2aWV3ICRjb21tZW50ZW5kCn0KCnByb2MgZ2V0YmxvYmxpbmUge2JmIGlkfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBjbWl0bW9kZSBjdGV4dAoKICAgIGlmIHskaWQgbmUgJGRpZmZpZHMgfHwgJGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJY2F0Y2gge2Nsb3NlICRiZn0KCXJldHVybiAwCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBub3JtYWwKICAgIHNldCBubCAwCiAgICB3aGlsZSB7W2luY3IgbmxdIDw9IDEwMDAgJiYgW2dldHMgJGJmIGxpbmVdID49IDB9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgogICAgfQogICAgaWYge1tlb2YgJGJmXX0gewoJIyBkZWxldGUgbGFzdCBuZXdsaW5lCgkkY3RleHQgZGVsZXRlICJlbmQgLSAyYyIgImVuZCAtIDFjIgoJY2xvc2UgJGJmCglyZXR1cm4gMAogICAgfQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgZGlzYWJsZWQKICAgIHJldHVybiBbZXhwciB7JG5sID49IDEwMDA/IDI6IDF9XQp9Cgpwcm9jIG1lcmdlZGlmZiB7aWQgbH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZvcHRzIG1kaWZmZmQKICAgIGdsb2JhbCBkaWZmaWRzCiAgICBnbG9iYWwgcGFyZW50bGlzdAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmaWRzICRpZAogICAgIyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBhY3R1YWxseSBhZmZlY3QgYW55dGhpbmcuLi4KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC0tY2MgJGlkXQogICAgaWYge1tjYXRjaCB7c2V0IG1kZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBtZXJnZSBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkbWRmIC1ibG9ja2luZyAwCiAgICBzZXQgbWRpZmZmZCgkaWQpICRtZGYKICAgIHNldCBucCBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXV0KICAgIGZpbGVydW4gJG1kZiBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZGYgJGlkICRucF0KfQoKcHJvYyBnZXRtZXJnZWRpZmZsaW5lIHttZGYgaWQgbnB9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBjdGV4dCBjZmxpc3QgbWVyZ2VtYXgKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG1kaWZmZmQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBzZXQgbnIgMAogICAgd2hpbGUge1tpbmNyIG5yXSA8PSAxMDAwICYmIFtnZXRzICRtZGYgbGluZV0gPj0gMH0gewoJaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdIHx8ICRpZCAhPSAkZGlmZm1lcmdlaWQKCSAgICB8fCAkbWRmICE9ICRtZGlmZmZkKCRpZCl9IHsKCSAgICBjbG9zZSAkbWRmCgkgICAgcmV0dXJuIDAKCX0KCWlmIHtbcmVnZXhwIHteZGlmZiAtLWNjICguKil9ICRsaW5lIG1hdGNoIGZuYW1lXX0gewoJICAgICMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCSAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgkgICAgbGFwcGVuZCBkaWZmZmlsZXN0YXJ0ICRoZXJlCgkgICAgYWRkX2ZsaXN0IFtsaXN0ICRmbmFtZV0KCSAgICBzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGZuYW1lXSkgLyAyfV0KCSAgICBzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAoJfSBlbHNlaWYge1tyZWdleHAge15AQH0gJGxpbmVdfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCX0gZWxzZWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGxpbmVdIHx8IFtyZWdleHAge15pbmRleH0gJGxpbmVdfSB7CgkgICAgIyBkbyBub3RoaW5nCgl9IGVsc2UgewoJICAgICMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CgkgICAgc2V0IHNwYWNlcyB7fQoJICAgIHNldCBtaW51c2VzIHt9CgkgICAgc2V0IHBsdXNlcyB7fQoJICAgIHNldCBpc2JhZCAwCgkgICAgZm9yIHtzZXQgaiAwfSB7JGogPCAkbnB9IHtpbmNyIGp9IHsKCQlzZXQgYyBbc3RyaW5nIHJhbmdlICRsaW5lICRqICRqXQoJCWlmIHskYyA9PSAiICJ9IHsKCQkgICAgbGFwcGVuZCBzcGFjZXMgJGoKCQl9IGVsc2VpZiB7JGMgPT0gIi0ifSB7CgkJICAgIGxhcHBlbmQgbWludXNlcyAkagoJCX0gZWxzZWlmIHskYyA9PSAiKyJ9IHsKCQkgICAgbGFwcGVuZCBwbHVzZXMgJGoKCQl9IGVsc2UgewoJCSAgICBzZXQgaXNiYWQgMQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgc2V0IHRhZ3Mge30KCSAgICBzZXQgbnVtIHt9CgkgICAgaWYgeyEkaXNiYWQgJiYgJG1pbnVzZXMgbmUge30gJiYgJHBsdXNlcyBlcSB7fX0gewoJCSMgbGluZSBkb2Vzbid0IGFwcGVhciBpbiByZXN1bHQsIHBhcmVudHMgaW4gJG1pbnVzZXMgaGF2ZSB0aGUgbGluZQoJCXNldCBudW0gW2xpbmRleCAkbWludXNlcyAwXQoJICAgIH0gZWxzZWlmIHshJGlzYmFkICYmICRwbHVzZXMgbmUge30gJiYgJG1pbnVzZXMgZXEge319IHsKCQkjIGxpbmUgYXBwZWFycyBpbiByZXN1bHQsIHBhcmVudHMgaW4gJHBsdXNlcyBkb24ndCBoYXZlIHRoZSBsaW5lCgkJbGFwcGVuZCB0YWdzIG1yZXN1bHQKCQlzZXQgbnVtIFtsaW5kZXggJHNwYWNlcyAwXQoJICAgIH0KCSAgICBpZiB7JG51bSBuZSB7fX0gewoJCWlmIHskbnVtID49ICRtZXJnZW1heH0gewoJCSAgICBzZXQgbnVtICJtYXgiCgkJfQoJCWxhcHBlbmQgdGFncyBtJG51bQoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgJHRhZ3MKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tlb2YgJG1kZl19IHsKCWNsb3NlICRtZGYKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgeyRuciA+PSAxMDAwPyAyOiAxfV0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkIG51bGxpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV0gfHwgW2xzZWFyY2ggLWV4YWN0ICRpZHMgJG51bGxpZF0gPj0gMH0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGFkZF9mbGlzdCAkdHJlZWRpZmZzKCRpZHMpCiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGRpZmZjbWQge2lkcyBmbGFnc30gewogICAgZ2xvYmFsIG51bGxpZAoKICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRzICRudWxsaWRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGNtZCBbY29uY2F0IHwgZ2l0IGRpZmYtaW5kZXggJGZsYWdzXQoJaWYge1tsbGVuZ3RoICRpZHNdID4gMX0gewoJICAgIGlmIHskaSA9PSAwfSB7CgkJbGFwcGVuZCBjbWQgLVIgW2xpbmRleCAkaWRzIDFdCgkgICAgfSBlbHNlIHsKCQlsYXBwZW5kIGNtZCBbbGluZGV4ICRpZHMgMF0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGxhcHBlbmQgY21kIEhFQUQKCX0KICAgIH0gZWxzZSB7CglzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yICRmbGFncyAkaWRzXQogICAgfQogICAgcmV0dXJuICRjbWQKfQoKcHJvYyBnZXR0cmVlZGlmZnMge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVwZW5kaW5nCgogICAgc2V0IHRyZWVwZW5kaW5nICRpZHMKICAgIHNldCB0cmVlZGlmZiB7fQogICAgaWYge1tjYXRjaCB7c2V0IGdkdGYgW29wZW4gW2RpZmZjbWQgJGlkcyB7fV0gcl19XX0gcmV0dXJuCiAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCiAgICBmaWxlcnVuICRnZHRmIFtsaXN0IGdldHRyZWVkaWZmbGluZSAkZ2R0ZiAkaWRzXQp9Cgpwcm9jIGdldHRyZWVkaWZmbGluZSB7Z2R0ZiBpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlZGlmZnMgdHJlZXBlbmRpbmcgZGlmZmlkcyBkaWZmbWVyZ2VpZAogICAgZ2xvYmFsIGNtaXRtb2RlCgogICAgc2V0IG5yIDAKICAgIHdoaWxlIHtbaW5jciBucl0gPD0gMTAwMCAmJiBbZ2V0cyAkZ2R0ZiBsaW5lXSA+PSAwfSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcdCIgJGxpbmVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldCBmaWxlIFtzdHJpbmcgcmFuZ2UgJGxpbmUgW2V4cHIgeyRpKzF9XSBlbmRdCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGZpbGUgMF0gZXEgIlwiIn0gewoJCXNldCBmaWxlIFtsaW5kZXggJGZpbGUgMF0KCSAgICB9CgkgICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQoJfQogICAgfQogICAgaWYgeyFbZW9mICRnZHRmXX0gewoJcmV0dXJuIFtleHByIHskbnIgPj0gMTAwMD8gMjogMX1dCiAgICB9CiAgICBjbG9zZSAkZ2R0ZgogICAgc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKICAgIHVuc2V0IHRyZWVwZW5kaW5nCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJZ2V0dHJlZSAkZGlmZmlkcwogICAgfSBlbHNlaWYgeyRpZHMgIT0gJGRpZmZpZHN9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfQogICAgfSBlbHNlIHsKCWFkZHRvY2ZsaXN0ICRpZHMKICAgIH0KICAgIHJldHVybiAwCn0KCnByb2MgZ2V0YmxvYmRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmb3B0cyBibG9iZGlmZmZkIGRpZmZpZHMgZW52CiAgICBnbG9iYWwgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuIFtkaWZmY21kICRpZHMgey1wIC1DfV0gcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBmaWxlcnVuICRiZGYgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCn0KCnByb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKCWxhcHBlbmQgJHZhciB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CglsYXBwZW5kICR2YXIgJHZhbAogICAgfSBlbHNlIHsKCWxzZXQgJHZhciAkaSAkdmFsCiAgICB9Cn0KCnByb2MgbWFrZWRpZmZoZHIge2ZuYW1lIGlkc30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cmRpZmZzdGFydCB0cmVlZGlmZnMKCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGN1cmRpZmZzdGFydAogICAgfQogICAgc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCiAgICBzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCiAgICAkY3RleHQgaW5zZXJ0ICRjdXJkaWZmc3RhcnQgIiRwYWQgJGZuYW1lICRwYWQiIGZpbGVzZXAKfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnN0YXJ0CiAgICBnbG9iYWwgZGlmZm5leHRoZWFkIGRpZmZuZXh0bm90ZSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBuciAwCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB3aGlsZSB7W2luY3IgbnJdIDw9IDEwMDAgJiYgW2dldHMgJGJkZiBsaW5lXSA+PSAwfSB7CglpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIHJldHVybiAwCgl9CglpZiB7IVtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDExICJkaWZmIC0tZ2l0ICIgJGxpbmVdfSB7CgkgICAgIyB0cmltIG9mZiAiZGlmZiAtLWdpdCAiCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxMSBlbmRdCgkgICAgc2V0IGRpZmZpbmhkciAxCgkgICAgIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJICAgIHNldCBjdXJkaWZmc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIgZmlsZXNlcAoJICAgICMgSWYgdGhlIG5hbWUgaGFzbid0IGNoYW5nZWQgdGhlIGxlbmd0aCB3aWxsIGJlIG9kZCwKCSAgICAjIHRoZSBtaWRkbGUgY2hhciB3aWxsIGJlIGEgc3BhY2UsIGFuZCB0aGUgdHdvIGJpdHMgZWl0aGVyCgkgICAgIyBzaWRlIHdpbGwgYmUgYS9uYW1lIGFuZCBiL25hbWUsIG9yICJhL25hbWUiIGFuZCAiYi9uYW1lIi4KCSAgICAjIElmIHRoZSBuYW1lIGhhcyBjaGFuZ2VkIHdlJ2xsIGdldCAicmVuYW1lIGZyb20iIGFuZAoJICAgICMgInJlbmFtZSB0byIgbGluZXMgZm9sbG93aW5nIHRoaXMsIGFuZCB3ZSdsbCB1c2UgdGhlbQoJICAgICMgdG8gZ2V0IHRoZSBmaWxlbmFtZXMuCgkgICAgIyBUaGlzIGNvbXBsZXhpdHkgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc3BhY2VzIGluIHRoZSBmaWxlbmFtZShzKQoJICAgICMgZG9uJ3QgZ2V0IGVzY2FwZWQuCgkgICAgc2V0IGwgW3N0cmluZyBsZW5ndGggJGxpbmVdCgkgICAgc2V0IGkgW2V4cHIgeyRsIC8gMn1dCgkgICAgaWYgeyEoKCRsICYgMSkgJiYgW3N0cmluZyBpbmRleCAkbGluZSAkaV0gZXEgIiAiICYmCgkJICBbc3RyaW5nIHJhbmdlICRsaW5lIDIgW2V4cHIgeyRpIC0gMX1dXSBlcSBcCgkJICAgICAgW3N0cmluZyByYW5nZSAkbGluZSBbZXhwciB7JGkgKyAzfV0gZW5kXSl9IHsKCQljb250aW51ZQoJICAgIH0KCSAgICAjIHVuZXNjYXBlIGlmIHF1b3RlZCBhbmQgY2hvcCBvZmYgdGhlIGEvIGZyb20gdGhlIGZyb250CgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGxpbmUgMF0gZXEgIlwiIn0gewoJCXNldCBmbmFtZSBbc3RyaW5nIHJhbmdlIFtsaW5kZXggJGxpbmUgMF0gMiBlbmRdCgkgICAgfSBlbHNlIHsKCQlzZXQgZm5hbWUgW3N0cmluZyByYW5nZSAkbGluZSAyIFtleHByIHskaSAtIDF9XV0KCSAgICB9CgkgICAgbWFrZWRpZmZoZHIgJGZuYW1lICRpZHMKCgl9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSgsWzAtOV0rKT8gXCsoWzAtOV0rKSgsWzAtOV0rKT8gQEAoLiopfSBcCgkJICAgICAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgkgICAgc2V0IGRpZmZpbmhkciAwCgoJfSBlbHNlaWYgeyRkaWZmaW5oZHJ9IHsKCSAgICBpZiB7IVtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDEyICJyZW5hbWUgZnJvbSAiICRsaW5lXX0gewoJCXNldCBmbmFtZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEyIGVuZF0KCQlpZiB7W3N0cmluZyBpbmRleCAkZm5hbWUgMF0gZXEgIlwiIn0gewoJCSAgICBzZXQgZm5hbWUgW2xpbmRleCAkZm5hbWUgMF0KCQl9CgkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJGZuYW1lXQoJCWlmIHskaSA+PSAwfSB7CgkJICAgIHNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRjdXJkaWZmc3RhcnQKCQl9CgkgICAgfSBlbHNlaWYgeyFbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAxMCAkbGluZSAicmVuYW1lIHRvICJdfSB7CgkJc2V0IGZuYW1lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMTAgZW5kXQoJCWlmIHtbc3RyaW5nIGluZGV4ICRmbmFtZSAwXSBlcSAiXCIifSB7CgkJICAgIHNldCBmbmFtZSBbbGluZGV4ICRmbmFtZSAwXQoJCX0KCQltYWtlZGlmZmhkciAkZm5hbWUgJGlkcwoJICAgIH0gZWxzZWlmIHtbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICItLS0iXSA9PSAwfSB7CgkJIyBkbyBub3RoaW5nCgkJY29udGludWUKCSAgICB9IGVsc2VpZiB7W3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiKysrIl0gPT0gMH0gewoJCXNldCBkaWZmaW5oZHIgMAoJCWNvbnRpbnVlCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgoJfSBlbHNlIHsKCSAgICBzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCSAgICBpZiB7JHggPT0gIi0iIHx8ICR4ID09ICIrIn0gewoJCXNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCgkJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCgkgICAgfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJICAgIH0gZWxzZSB7CgkJIyAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIiwKCQkjIG9yIHNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgkgICAgfQoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2VvZiAkYmRmXX0gewoJY2xvc2UgJGJkZgoJcmV0dXJuIDAKICAgIH0KICAgIHJldHVybiBbZXhwciB7JG5yID49IDEwMDA/IDI6IDF9XQp9Cgpwcm9jIGNoYW5nZWRpZmZkaXNwIHt9IHsKICAgIGdsb2JhbCBjdGV4dCBkaWZmZWxpZGUKCiAgICAkY3RleHQgdGFnIGNvbmYgZDAgLWVsaWRlIFtsaW5kZXggJGRpZmZlbGlkZSAwXQogICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1lbGlkZSBbbGluZGV4ICRkaWZmZWxpZGUgMV0KfQoKcHJvYyBwcmV2ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IHByZXYgW2xpbmRleCAkZGlmZmZpbGVzdGFydCAwXQogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yZWFjaCBsb2MgJGRpZmZmaWxlc3RhcnQgewoJaWYge1skY3RleHQgY29tcGFyZSAkbG9jID49ICRoZXJlXX0gewoJICAgICRjdGV4dCB5dmlldyAkcHJldgoJICAgIHJldHVybgoJfQoJc2V0IHByZXYgJGxvYwogICAgfQogICAgJGN0ZXh0IHl2aWV3ICRwcmV2Cn0KCnByb2MgbmV4dGZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvcmVhY2ggbG9jICRkaWZmZmlsZXN0YXJ0IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGxvYyA+ICRoZXJlXX0gewoJICAgICRjdGV4dCB5dmlldyAkbG9jCgkgICAgcmV0dXJuCgl9CiAgICB9Cn0KCnByb2MgY2xlYXJfY3RleHQge3tmaXJzdCAxLjB9fSB7CiAgICBnbG9iYWwgY3RleHQgc21hcmt0b3Agc21hcmtib3QKCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCAkZmlyc3QgLl0gMF0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNtYXJrdG9wXSB8fCBbJGN0ZXh0IGNvbXBhcmUgJGZpcnN0IDwgJHNtYXJrdG9wLjBdfSB7CglzZXQgc21hcmt0b3AgJGwKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNtYXJrYm90XSB8fCBbJGN0ZXh0IGNvbXBhcmUgJGZpcnN0IDwgJHNtYXJrYm90LjBdfSB7CglzZXQgc21hcmtib3QgJGwKICAgIH0KICAgICRjdGV4dCBkZWxldGUgJGZpcnN0IGVuZAp9Cgpwcm9jIGluY3JzZWFyY2gge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgIGlmIHtbY2F0Y2ggeyRjdGV4dCBpbmRleCBhbmNob3J9XX0gewoJIyBubyBhbmNob3Igc2V0LCB1c2Ugc3RhcnQgb2Ygc2VsZWN0aW9uLCBvciBvZiB2aXNpYmxlIGFyZWEKCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KCWlmIHskc2VsIG5lIHt9fSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBbbGluZGV4ICRzZWwgMF0KCX0gZWxzZWlmIHskc2VhcmNoZGlybiBlcSAiLWZvcndhcmRzIn0gewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgQDAsMAoJfSBlbHNlIHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLFt3aW5mbyBoZWlnaHQgJGN0ZXh0XQoJfQogICAgfQogICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKCXNldCBoZXJlIFskY3RleHQgc2VhcmNoICRzZWFyY2hkaXJuIC0tICRzZWFyY2hzdHJpbmcgYW5jaG9yXQoJaWYgeyRoZXJlIG5lIHt9fSB7CgkgICAgJGN0ZXh0IHNlZSAkaGVyZQoJfQoJc2VhcmNobWFya3Zpc2libGUgMQogICAgfQp9Cgpwcm9jIGRvc2VhcmNoIHt9IHsKICAgIGdsb2JhbCBzc3RyaW5nIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCgogICAgZm9jdXMgJHNzdHJpbmcKICAgICRzc3RyaW5nIGljdXJzb3IgZW5kCiAgICBzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgIHNldCBzdGFydCAiW2xpbmRleCAkc2VsIDBdICsgMWMiCgl9IGVsc2VpZiB7W2NhdGNoIHtzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCBhbmNob3JdfV19IHsKCSAgICBzZXQgc3RhcnQgIkAwLDAiCgl9CglzZXQgbWF0Y2ggWyRjdGV4dCBzZWFyY2ggLWNvdW50IG1sZW4gLS0gJHNlYXJjaHN0cmluZyAkc3RhcnRdCgkkY3RleHQgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAoJaWYgeyRtYXRjaCBlcSB7fX0gewoJICAgIGJlbGwKCSAgICByZXR1cm4KCX0KCSRjdGV4dCBzZWUgJG1hdGNoCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgogICAgfQp9Cgpwcm9jIGRvc2VhcmNoYmFjayB7fSB7CiAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgIGZvY3VzICRzc3RyaW5nCiAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAogICAgc2V0IHNlYXJjaGRpcm4gLWJhY2t3YXJkcwogICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KCWlmIHskc2VsIG5lIHt9fSB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJHNlbCAwXQoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CgkgICAgc2V0IHN0YXJ0IEAwLFt3aW5mbyBoZWlnaHQgJGN0ZXh0XQoJfQoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1iYWNrd2FyZHMgLWNvdW50IG1sIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQoJJGN0ZXh0IHRhZyByZW1vdmUgc2VsIDEuMCBlbmQKCWlmIHskbWF0Y2ggZXEge319IHsKCSAgICBiZWxsCgkgICAgcmV0dXJuCgl9CgkkY3RleHQgc2VlICRtYXRjaAoJc2V0IG1lbmQgIiRtYXRjaCArICRtbCBjIgoJJGN0ZXh0IHRhZyBhZGQgc2VsICRtYXRjaCAkbWVuZAoJJGN0ZXh0IG1hcmsgdW5zZXQgYW5jaG9yCiAgICB9Cn0KCnByb2Mgc2VhcmNobWFyayB7Zmlyc3QgbGFzdH0gewogICAgZ2xvYmFsIGN0ZXh0IHNlYXJjaHN0cmluZwoKICAgIHNldCBtZW5kICRmaXJzdC4wCiAgICB3aGlsZSB7MX0gewoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJG1lbmQgJGxhc3QuZW5kXQoJaWYgeyRtYXRjaCBlcSB7fX0gYnJlYWsKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWxlbiBjIgoJJGN0ZXh0IHRhZyBhZGQgZm91bmQgJG1hdGNoICRtZW5kCiAgICB9Cn0KCnByb2Mgc2VhcmNobWFya3Zpc2libGUge2RvYWxsfSB7CiAgICBnbG9iYWwgY3RleHQgc21hcmt0b3Agc21hcmtib3QKCiAgICBzZXQgdG9wbGluZSBbbGluZGV4IFtzcGxpdCBbJGN0ZXh0IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgYm90bGluZSBbbGluZGV4IFtzcGxpdCBbJGN0ZXh0IGluZGV4IEAwLFt3aW5mbyBoZWlnaHQgJGN0ZXh0XV0gLl0gMF0KICAgIGlmIHskZG9hbGwgfHwgJGJvdGxpbmUgPCAkc21hcmt0b3AgfHwgJHRvcGxpbmUgPiAkc21hcmtib3R9IHsKCSMgbm8gb3ZlcmxhcCB3aXRoIHByZXZpb3VzCglzZWFyY2htYXJrICR0b3BsaW5lICRib3RsaW5lCglzZXQgc21hcmt0b3AgJHRvcGxpbmUKCXNldCBzbWFya2JvdCAkYm90bGluZQogICAgfSBlbHNlIHsKCWlmIHskdG9wbGluZSA8ICRzbWFya3RvcH0gewoJICAgIHNlYXJjaG1hcmsgJHRvcGxpbmUgW2V4cHIgeyRzbWFya3RvcC0xfV0KCSAgICBzZXQgc21hcmt0b3AgJHRvcGxpbmUKCX0KCWlmIHskYm90bGluZSA+ICRzbWFya2JvdH0gewoJICAgIHNlYXJjaG1hcmsgW2V4cHIgeyRzbWFya2JvdCsxfV0gJGJvdGxpbmUKCSAgICBzZXQgc21hcmtib3QgJGJvdGxpbmUKCX0KICAgIH0KfQoKcHJvYyBzY3JvbGx0ZXh0IHtmMCBmMX0gewogICAgZ2xvYmFsIHNlYXJjaHN0cmluZwoKICAgIC5ibGVmdC5zYiBzZXQgJGYwICRmMQogICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKCXNlYXJjaG1hcmt2aXNpYmxlIDAKICAgIH0KfQoKcHJvYyBzZXRjb29yZHMge30gewogICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CiAgICBnbG9iYWwgeHNwYzEgeHNwYzIgbHRoaWNrbmVzcwoKICAgIHNldCBsaW5lc3BjIFtmb250IG1ldHJpY3MgJG1haW5mb250IC1saW5lc3BhY2VdCiAgICBzZXQgY2hhcnNwYyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAibSJdCiAgICBzZXQgY2FudnkwIFtleHByIHtpbnQoMyArIDAuNSAqICRsaW5lc3BjKX1dCiAgICBzZXQgY2FudngwIFtleHByIHtpbnQoMyArIDAuNSAqICRsaW5lc3BjKX1dCiAgICBzZXQgbHRoaWNrbmVzcyBbZXhwciB7aW50KCRsaW5lc3BjIC8gOSkgKyAxfV0KICAgIHNldCB4c3BjMSgwKSAkbGluZXNwYwogICAgc2V0IHhzcGMyICRsaW5lc3BjCn0KCnByb2MgcmVkaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBjYW52CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgogICAgc2V0IHNwYW4gWyRjYW52IHl2aWV3XQogICAgY2xlYXJfZGlzcGxheQogICAgc2V0Y2FudnNjcm9sbAogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCglhbGxjYW52cyB5dmlldyBtb3ZldG8gW2xpbmRleCAkc3BhbiAwXQogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlIGNmbGlzdAogICAgZ2xvYmFsIGNoYXJzcGMgdGFic3RvcAogICAgZ2xvYmFsIHN0b3BwZWQgZW50cmllcwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udCAtdGFicyAiW2V4cHIgeyR0YWJzdG9wICogJGNoYXJzcGN9XSIKICAgICRjZmxpc3QgY29uZiAtZm9udCAkdGV4dGZvbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJJGUgY29uZiAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIGlmIHskcGhhc2UgZXEgImdldGNvbW1pdHMifSB7CgkkY2FudiBpdGVtY29uZiB0ZXh0aXRlbXMgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICByZWRpc3BsYXkKfQoKcHJvYyBjbGVhcnNoYTEge30gewogICAgZ2xvYmFsIHNoYTFlbnRyeSBzaGExc3RyaW5nCiAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7Cgkkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgfQp9Cgpwcm9jIHNoYTFjaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHtbJHNoYTFidXQgY2dldCAtc3RhdGVdID09ICRzdGF0ZX0gcmV0dXJuCiAgICBpZiB7JHN0YXRlID09ICJub3JtYWwifSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKICAgIH0gZWxzZSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgLXRleHQgIlNIQTEgSUQ6ICIKICAgIH0KfQoKcHJvYyBnb3RvY29tbWl0IHt9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBjb21taXRyb3cgdGFnaWRzIGhlYWRpZHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cyBjdXJ2aWV3CgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICRoZWFkaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yZWFjaCBpICRkaXNwbGF5b3JkZXIgewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkaQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWcvSGVhZCIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgXAoJICAgICAgIC1mb250ICRtYWluZm9udF0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBsdGhpY2tuZXNzCgogICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KICAgIHNldCB0aHJlc2ggW2V4cHIgezIgKiAkbHRoaWNrbmVzcyArIDZ9XQogICAgc2V0IG4gW2V4cHIge1tsbGVuZ3RoICRyYW5nZXNdIC0gMX1dCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICRufSB7aW5jciBpfSB7CglzZXQgcm93IFtsaW5kZXggJHJhbmdlcyAkaV0KCWlmIHthYnMoW3ljICRyb3ddIC0gJHkpIDwgJHRocmVzaH0gewoJICAgIHJldHVybiAkaQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBuIHl9IHsKICAgIGdsb2JhbCBjYW52CgogICAgIyAxIDwtPiAyLCAzIDwtPiA0LCBldGMuLi4KICAgIHNldCBuIFtleHByIHsoKCRuIC0gMSkgXiAxKSArIDF9XQogICAgc2V0IHJvdyBbbGluZGV4IFtyb3dyYW5nZXMgJGlkXSAkbl0KICAgIHNldCB5dCBbeWMgJHJvd10KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA8PSAwfSByZXR1cm4KICAgIHNldCB2aWV3IFskY2FudiB5dmlld10KICAgIHNldCB5c3BhbiBbZXhwciB7W2xpbmRleCAkdmlldyAxXSAtIFtsaW5kZXggJHZpZXcgMF19XQogICAgc2V0IHlmcmFjIFtleHByIHskeXQgLyAkeW1heCAtICR5c3BhbiAvIDJ9XQogICAgaWYgeyR5ZnJhYyA8IDB9IHsKCXNldCB5ZnJhYyAwCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmcmFjCn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNhbnYgdGhpY2tlcmxpbmUgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBzZXQgdGhpY2tlcmxpbmUgJGlkCiAgICBkcmF3bGluZXMgJGlkCiAgICBpZiB7JGlzbmV3fSB7CglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglpZiB7JHltYXggZXEge319IHJldHVybgoJc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQoJc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgfQogICAgc2V0IGRpcm4gW2NsaWNraXNvbmFycm93ICRpZCAkeV0KICAgIGlmIHskZGlybiBuZSB7fX0gewoJYXJyb3dqdW1wICRpZCAkZGlybiAkeQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IGxpbmVjbGljayAkeCAkeSAkaWQgMF0KICAgIH0KICAgICMgZmlsbCB0aGUgZGV0YWlscyBwYW5lIHdpdGggaW5mbyBhYm91dCB0aGlzIGxpbmUKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgaWYgeyRraWRzIG5lIHt9fSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpbmNyIGkKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRjaGlsZCldICYmICFbZ2V0Y29tbWl0ICRjaGlsZF19IGNvbnRpbnVlCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KCSAgICAkY3RleHQgdGFnIGJpbmQgbGluayRpIDwxPiBbbGlzdCBzZWxieWlkICRjaGlsZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgoJICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0JGRhdGVcbiIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaW5pdF9mbGlzdCB7fQp9Cgpwcm9jIG5vcm1hbGxpbmUge30gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0gewoJc2V0IGlkICR0aGlja2VybGluZQoJdW5zZXQgdGhpY2tlcmxpbmUKCWRyYXdsaW5lcyAkaWQKICAgIH0KfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgcm93bWVudWlkIGN1cnZpZXcKICAgIGdsb2JhbCBudWxsaWQgZmFrZXJvd21lbnUgbWFpbmhlYWQKCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQoJfHwgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaWQgbmUgJG51bGxpZH0gewoJc2V0IG1lbnUgJHJvd2N0eG1lbnUKCSRtZW51IGVudHJ5Y29uZmlndXJlIDcgLWxhYmVsICJSZXNldCAkbWFpbmhlYWQgYnJhbmNoIHRvIGhlcmUiCiAgICB9IGVsc2UgewoJc2V0IG1lbnUgJGZha2Vyb3dtZW51CiAgICB9CiAgICAkbWVudSBlbnRyeWNvbmZpZ3VyZSAiRGlmZiB0aGlzKiIgLXN0YXRlICRzdGF0ZQogICAgJG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgc2VsZWN0ZWQqIiAtc3RhdGUgJHN0YXRlCiAgICAkbWVudSBlbnRyeWNvbmZpZ3VyZSAiTWFrZSBwYXRjaCIgLXN0YXRlICRzdGF0ZQogICAgdGtfcG9wdXAgJG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGRpc3BsYXlvcmRlcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCiAgICB9CiAgICBhZGR0b2hpc3RvcnkgW2xpc3QgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWRdCiAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAp9Cgpwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKICAgIGdsb2JhbCBjdGV4dAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgaW5pdF9mbGlzdCAiVG9wIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkZyb20gIgogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRvbGRpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazEgPDE+IFtsaXN0IHNlbGJ5aWQgJG5ld2lkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG5ld2lkIFtsaXN0IGxpbmsgbGluazFdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AgbnVsbGlkCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHskbmV3aWQgZXEgJG51bGxpZH0gewoJc2V0IGNtZCBbbGlzdCBnaXQgZGlmZi1pbmRleCAtcCAkb2xkaWRdCiAgICB9IGVsc2VpZiB7JG9sZGlkIGVxICRudWxsaWR9IHsKCXNldCBjbWQgW2xpc3QgZ2l0IGRpZmYtaW5kZXggLXAgLVIgJG5ld2lkXQogICAgfSBlbHNlIHsKCXNldCBjbWQgW2xpc3QgZ2l0IGRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkXQogICAgfQogICAgbGFwcGVuZCBjbWQgPiRmbmFtZSAmCiAgICBpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgcmVkcmF3dGFncyAkaWQKICAgIGFkZGVkdGFnICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heCBpZGRyYXduCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHJldHVybgogICAgZHJhd2NvbW1pdHMgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCiAgICAkY2FudiBkZWxldGUgdGFnLiRpZAogICAgc2V0IHh0IFtldmFsIGRyYXd0YWdzICRpZCAkaWRwb3MoJGlkKV0KICAgICRjYW52IGNvb3JkcyAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAkeHQgW2xpbmRleCAkaWRwb3MoJGlkKSAyXQogICAgc2V0IHRleHQgWyRjYW52IGl0ZW1jZ2V0ICRsaW5laHRhZygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIC10ZXh0XQogICAgc2V0IHhyIFtleHByIHskeHQgKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF19XQogICAgaWYgeyR4ciA+ICRjYW52eG1heH0gewoJc2V0IGNhbnZ4bWF4ICR4cgoJc2V0Y2FudnNjcm9sbAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdCgkmJiAkc2VsZWN0ZWRsaW5lID09ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBta2JyYW5jaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rYnJ0b3AKCiAgICBzZXQgdG9wIC5tYWtlYnJhbmNoCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIG5ldyBicmFuY2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm5sYWIgLXRleHQgIk5hbWU6IgogICAgZW50cnkgJHRvcC5uYW1lIC13aWR0aCA0MAogICAgZ3JpZCAkdG9wLm5sYWIgJHRvcC5uYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdvIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIFtsaXN0IG1rYnJnbyAkdG9wXQogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgImNhdGNoIHtkZXN0cm95ICR0b3B9IgogICAgZ3JpZCAkdG9wLmJ1dHMuZ28gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AubmFtZQp9Cgpwcm9jIG1rYnJnbyB7dG9wfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IG5hbWUgWyR0b3AubmFtZSBnZXRdCiAgICBzZXQgaWQgWyR0b3Auc2hhMSBnZXRdCiAgICBpZiB7JG5hbWUgZXEge319IHsKCWVycm9yX3BvcHVwICJQbGVhc2Ugc3BlY2lmeSBhIG5hbWUgZm9yIHRoZSBuZXcgYnJhbmNoIgoJcmV0dXJuCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgbm93YnVzeSBuZXdicmFuY2gKICAgIHVwZGF0ZQogICAgaWYge1tjYXRjaCB7CglleGVjIGdpdCBicmFuY2ggJG5hbWUgJGlkCiAgICB9IGVycl19IHsKCW5vdGJ1c3kgbmV3YnJhbmNoCgllcnJvcl9wb3B1cCAkZXJyCiAgICB9IGVsc2UgewoJc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKCWFkZGVkaGVhZCAkaWQgJG5hbWUKCW5vdGJ1c3kgbmV3YnJhbmNoCglyZWRyYXd0YWdzICRpZAoJZGlzcG5lYXJ0YWdzIDAKICAgIH0KfQoKcHJvYyBjaGVycnlwaWNrIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VydmlldyBjb21taXRyb3cKICAgIGdsb2JhbCBtYWluaGVhZAoKICAgIHNldCBvbGRoZWFkIFtleGVjIGdpdCByZXYtcGFyc2UgSEVBRF0KICAgIHNldCBkaGVhZHMgW2Rlc2NoZWFkcyAkcm93bWVudWlkXQogICAgaWYgeyRkaGVhZHMgbmUge30gJiYgW2xzZWFyY2ggLWV4YWN0ICRkaGVhZHMgJG9sZGhlYWRdID49IDB9IHsKCXNldCBvayBbY29uZmlybV9wb3B1cCAiQ29tbWl0IFtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDddIGlzIGFscmVhZHlcCgkJCWluY2x1ZGVkIGluIGJyYW5jaCAkbWFpbmhlYWQgLS0gcmVhbGx5IHJlLWFwcGx5IGl0PyJdCglpZiB7ISRva30gcmV0dXJuCiAgICB9CiAgICBub3didXN5IGNoZXJyeXBpY2sKICAgIHVwZGF0ZQogICAgIyBVbmZvcnR1bmF0ZWx5IGdpdC1jaGVycnktcGljayB3cml0ZXMgc3R1ZmYgdG8gc3RkZXJyIGV2ZW4gd2hlbgogICAgIyBubyBlcnJvciBvY2N1cnMsIGFuZCBleGVjIHRha2VzIHRoYXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBlcnJvci4uLgogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAiZ2l0IGNoZXJyeS1waWNrIC1yICRyb3dtZW51aWQgMj4mMSJ9IGVycl19IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3aGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICBpZiB7JG5ld2hlYWQgZXEgJG9sZGhlYWR9IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgIk5vIGNoYW5nZXMgY29tbWl0dGVkIgoJcmV0dXJuCiAgICB9CiAgICBhZGRuZXdjaGlsZCAkbmV3aGVhZCAkb2xkaGVhZAogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJG9sZGhlYWQpXX0gewoJaW5zZXJ0cm93ICRjb21taXRyb3coJGN1cnZpZXcsJG9sZGhlYWQpICRuZXdoZWFkCglpZiB7JG1haW5oZWFkIG5lIHt9fSB7CgkgICAgbW92ZWhlYWQgJG5ld2hlYWQgJG1haW5oZWFkCgkgICAgbW92ZWRoZWFkICRuZXdoZWFkICRtYWluaGVhZAoJfQoJcmVkcmF3dGFncyAkb2xkaGVhZAoJcmVkcmF3dGFncyAkbmV3aGVhZAogICAgfQogICAgbm90YnVzeSBjaGVycnlwaWNrCn0KCnByb2MgcmVzZXRoZWFkIHt9IHsKICAgIGdsb2JhbCBtYWluaGVhZGlkIG1haW5oZWFkIHJvd21lbnVpZCBjb25maXJtX29rIHJlc2V0dHlwZQogICAgZ2xvYmFsIHNob3dsb2NhbGNoYW5nZXMKCiAgICBzZXQgY29uZmlybV9vayAwCiAgICBzZXQgdyAiLmNvbmZpcm1yZXNldCIKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgd20gdGl0bGUgJHcgIkNvbmZpcm0gcmVzZXQiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgXAoJIlJlc2V0IGJyYW5jaCAkbWFpbmhlYWQgdG8gW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgN10/IiBcCgktanVzdGlmeSBjZW50ZXIgLWFzcGVjdCAxMDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGZyYW1lICR3LmYgLXJlbGllZiBzdW5rZW4gLWJvcmRlciAyCiAgICBtZXNzYWdlICR3LmYucnQgLXRleHQgIlJlc2V0IHR5cGU6IiAtYXNwZWN0IDEwMDAKICAgIGdyaWQgJHcuZi5ydCAtc3RpY2t5IHcKICAgIHNldCByZXNldHR5cGUgbWl4ZWQKICAgIHJhZGlvYnV0dG9uICR3LmYuc29mdCAtdmFsdWUgc29mdCAtdmFyaWFibGUgcmVzZXR0eXBlIC1qdXN0aWZ5IGxlZnQgXAoJLXRleHQgIlNvZnQ6IExlYXZlIHdvcmtpbmcgdHJlZSBhbmQgaW5kZXggdW50b3VjaGVkIgogICAgZ3JpZCAkdy5mLnNvZnQgLXN0aWNreSB3CiAgICByYWRpb2J1dHRvbiAkdy5mLm1peGVkIC12YWx1ZSBtaXhlZCAtdmFyaWFibGUgcmVzZXR0eXBlIC1qdXN0aWZ5IGxlZnQgXAoJLXRleHQgIk1peGVkOiBMZWF2ZSB3b3JraW5nIHRyZWUgdW50b3VjaGVkLCByZXNldCBpbmRleCIKICAgIGdyaWQgJHcuZi5taXhlZCAtc3RpY2t5IHcKICAgIHJhZGlvYnV0dG9uICR3LmYuaGFyZCAtdmFsdWUgaGFyZCAtdmFyaWFibGUgcmVzZXR0eXBlIC1qdXN0aWZ5IGxlZnQgXAoJLXRleHQgIkhhcmQ6IFJlc2V0IHdvcmtpbmcgdHJlZSBhbmQgaW5kZXhcbihkaXNjYXJkIEFMTCBsb2NhbCBjaGFuZ2VzKSIKICAgIGdyaWQgJHcuZi5oYXJkIC1zdGlja3kgdwogICAgcGFjayAkdy5mIC1zaWRlIHRvcCAtZmlsbCB4CiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgInNldCBjb25maXJtX29rIDE7IGRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGxlZnQgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3LmNhbmNlbCAtdGV4dCBDYW5jZWwgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3LmNhbmNlbCAtc2lkZSByaWdodCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBiaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCiAgICB0a3dhaXQgd2luZG93ICR3CiAgICBpZiB7ISRjb25maXJtX29rfSByZXR1cm4KICAgIGlmIHtbY2F0Y2gge3NldCBmZCBbb3BlbiBcCgkgICAgW2xpc3QgfCBzaCAtYyAiZ2l0IHJlc2V0IC0tJHJlc2V0dHlwZSAkcm93bWVudWlkIDI+JjEiXSByXX0gZXJyXX0gewoJZXJyb3JfcG9wdXAgJGVycgogICAgfSBlbHNlIHsKCWRvaGlkZWxvY2FsY2hhbmdlcwoJc2V0IHcgIi5yZXNldHByb2dyZXNzIgoJZmlsZXJ1biAkZmQgW2xpc3QgcmVhZHJlc2V0c3RhdCAkZmQgJHddCgl0b3BsZXZlbCAkdwoJd20gdHJhbnNpZW50ICR3Cgl3bSB0aXRsZSAkdyAiUmVzZXQgcHJvZ3Jlc3MiCgltZXNzYWdlICR3Lm0gLXRleHQgIlJlc2V0IGluIHByb2dyZXNzLCBwbGVhc2Ugd2FpdC4uLiIgXAoJICAgIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDEwMDAKCXBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSA1CgljYW52YXMgJHcuYyAtd2lkdGggMTUwIC1oZWlnaHQgMjAgLWJnIHdoaXRlCgkkdy5jIGNyZWF0ZSByZWN0IDAgMCAwIDIwIC1maWxsIGdyZWVuIC10YWdzIHJlY3QKCXBhY2sgJHcuYyAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSA1IC1leHBhbmQgMQoJbm93YnVzeSByZXNldAogICAgfQp9Cgpwcm9jIHJlYWRyZXNldHN0YXQge2ZkIHd9IHsKICAgIGdsb2JhbCBtYWluaGVhZCBtYWluaGVhZGlkIHNob3dsb2NhbGNoYW5nZXMKCiAgICBpZiB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKCWlmIHtbcmVnZXhwIHsoWzAtOV0rKSUgXCgoWzAtOV0rKS8oWzAtOV0rKVwpfSAkbGluZSBtYXRjaCBwIG0gbl19IHsKCSAgICBzZXQgeCBbZXhwciB7KCRtICogMTUwKSAvICRufV0KCSAgICAkdy5jIGNvb3JkcyByZWN0IDAgMCAkeCAyMAoJfQoJcmV0dXJuIDEKICAgIH0KICAgIGRlc3Ryb3kgJHcKICAgIG5vdGJ1c3kgcmVzZXQKICAgIGlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgJGVycgogICAgfQogICAgc2V0IG9sZGhlYWQgJG1haW5oZWFkaWQKICAgIHNldCBuZXdoZWFkIFtleGVjIGdpdCByZXYtcGFyc2UgSEVBRF0KICAgIGlmIHskbmV3aGVhZCBuZSAkb2xkaGVhZH0gewoJbW92ZWhlYWQgJG5ld2hlYWQgJG1haW5oZWFkCgltb3ZlZGhlYWQgJG5ld2hlYWQgJG1haW5oZWFkCglzZXQgbWFpbmhlYWRpZCAkbmV3aGVhZAoJcmVkcmF3dGFncyAkb2xkaGVhZAoJcmVkcmF3dGFncyAkbmV3aGVhZAogICAgfQogICAgaWYgeyRzaG93bG9jYWxjaGFuZ2VzfSB7Cglkb3Nob3dsb2NhbGNoYW5nZXMKICAgIH0KICAgIHJldHVybiAwCn0KCiMgY29udGV4dCBtZW51IGZvciBhIGhlYWQKcHJvYyBoZWFkbWVudSB7eCB5IGlkIGhlYWR9IHsKICAgIGdsb2JhbCBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBoZWFkY3R4bWVudSBtYWluaGVhZAoKICAgIHNldCBoZWFkbWVudWlkICRpZAogICAgc2V0IGhlYWRtZW51aGVhZCAkaGVhZAogICAgc2V0IHN0YXRlIG5vcm1hbAogICAgaWYgeyRoZWFkIGVxICRtYWluaGVhZH0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAkaGVhZGN0eG1lbnUgZW50cnljb25maWd1cmUgMCAtc3RhdGUgJHN0YXRlCiAgICAkaGVhZGN0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICB0a19wb3B1cCAkaGVhZGN0eG1lbnUgJHggJHkKfQoKcHJvYyBjb2JyYW5jaCB7fSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQgaGVhZGlkcwogICAgZ2xvYmFsIHNob3dsb2NhbGNoYW5nZXMgbWFpbmhlYWRpZAoKICAgICMgY2hlY2sgdGhlIHRyZWUgaXMgY2xlYW4gZmlyc3Q/PwogICAgc2V0IG9sZG1haW5oZWFkICRtYWluaGVhZAogICAgbm93YnVzeSBjaGVja291dAogICAgdXBkYXRlCiAgICBkb2hpZGVsb2NhbGNoYW5nZXMKICAgIGlmIHtbY2F0Y2ggewoJZXhlYyBnaXQgY2hlY2tvdXQgLXEgJGhlYWRtZW51aGVhZAogICAgfSBlcnJdfSB7Cglub3RidXN5IGNoZWNrb3V0CgllcnJvcl9wb3B1cCAkZXJyCiAgICB9IGVsc2UgewoJbm90YnVzeSBjaGVja291dAoJc2V0IG1haW5oZWFkICRoZWFkbWVudWhlYWQKCXNldCBtYWluaGVhZGlkICRoZWFkbWVudWlkCglpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJG9sZG1haW5oZWFkKV19IHsKCSAgICByZWRyYXd0YWdzICRoZWFkaWRzKCRvbGRtYWluaGVhZCkKCX0KCXJlZHJhd3RhZ3MgJGhlYWRtZW51aWQKICAgIH0KICAgIGlmIHskc2hvd2xvY2FsY2hhbmdlc30gewoJZG9kaWZmaW5kZXgKICAgIH0KfQoKcHJvYyBybWJyYW5jaCB7fSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgaGVhZCAkaGVhZG1lbnVoZWFkCiAgICBzZXQgaWQgJGhlYWRtZW51aWQKICAgICMgdGhpcyBjaGVjayBzaG91bGRuJ3QgYmUgbmVlZGVkIGFueSBtb3JlLi4uCiAgICBpZiB7JGhlYWQgZXEgJG1haW5oZWFkfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGRlbGV0ZSB0aGUgY3VycmVudGx5IGNoZWNrZWQtb3V0IGJyYW5jaCIKCXJldHVybgogICAgfQogICAgc2V0IGRoZWFkcyBbZGVzY2hlYWRzICRpZF0KICAgIGlmIHskZGhlYWRzIGVxICRoZWFkaWRzKCRoZWFkKX0gewoJIyB0aGUgc3R1ZmYgb24gdGhpcyBicmFuY2ggaXNuJ3Qgb24gYW55IG90aGVyIGJyYW5jaAoJaWYgeyFbY29uZmlybV9wb3B1cCAiVGhlIGNvbW1pdHMgb24gYnJhbmNoICRoZWFkIGFyZW4ndCBvbiBhbnkgb3RoZXJcCgkJCWJyYW5jaC5cblJlYWxseSBkZWxldGUgYnJhbmNoICRoZWFkPyJdfSByZXR1cm4KICAgIH0KICAgIG5vd2J1c3kgcm1icmFuY2gKICAgIHVwZGF0ZQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgYnJhbmNoIC1EICRoZWFkfSBlcnJdfSB7Cglub3RidXN5IHJtYnJhbmNoCgllcnJvcl9wb3B1cCAkZXJyCglyZXR1cm4KICAgIH0KICAgIHJlbW92ZWhlYWQgJGlkICRoZWFkCiAgICByZW1vdmVkaGVhZCAkaWQgJGhlYWQKICAgIHJlZHJhd3RhZ3MgJGlkCiAgICBub3RidXN5IHJtYnJhbmNoCiAgICBkaXNwbmVhcnRhZ3MgMAp9CgojIFN0dWZmIGZvciBmaW5kaW5nIG5lYXJieSB0YWdzCnByb2MgZ2V0YWxsY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgYWxsY29tbWl0cyBhbGxpZHMgbmJtcCBuZXh0YXJjIHNlZWRzCgogICAgc2V0IGFsbGlkcyB7fQogICAgc2V0IG5ibXAgMAogICAgc2V0IG5leHRhcmMgMAogICAgc2V0IGFsbGNvbW1pdHMgMAogICAgc2V0IHNlZWRzIHt9CiAgICByZWdldGFsbGNvbW1pdHMKfQoKIyBDYWxsZWQgd2hlbiB0aGUgZ3JhcGggbWlnaHQgaGF2ZSBjaGFuZ2VkCnByb2MgcmVnZXRhbGxjb21taXRzIHt9IHsKICAgIGdsb2JhbCBhbGxjb21taXRzIHNlZWRzCgogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0tYWxsIC0tcGFyZW50c10KICAgIGZvcmVhY2ggaWQgJHNlZWRzIHsKCWxhcHBlbmQgY21kICJeJGlkIgogICAgfQogICAgc2V0IGZkIFtvcGVuICRjbWQgcl0KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwCiAgICBpbmNyIGFsbGNvbW1pdHMKICAgIG5vd2J1c3kgYWxsY29tbWl0cwogICAgZmlsZXJ1biAkZmQgW2xpc3QgZ2V0YWxsY2xpbmVzICRmZF0KfQoKIyBTaW5jZSBtb3N0IGNvbW1pdHMgaGF2ZSAxIHBhcmVudCBhbmQgMSBjaGlsZCwgd2UgZ3JvdXAgc3RyaW5ncyBvZgojIHN1Y2ggY29tbWl0cyBpbnRvICJhcmNzIiBqb2luaW5nIGJyYW5jaC9tZXJnZSBwb2ludHMgKEJNUHMpLCB3aGljaAojIGFyZSBjb21taXRzIHRoYXQgZWl0aGVyIGRvbid0IGhhdmUgMSBwYXJlbnQgb3IgZG9uJ3QgaGF2ZSAxIGNoaWxkLgojCiMgYXJjbm9zKGlkKSAtIGluY29taW5nIGFyY3MgZm9yIEJNUCwgYXJjIHdlJ3JlIG9uIGZvciBvdGhlciBub2RlcwojIGFyY291dChpZCkgLSBvdXRnb2luZyBhcmNzIGZvciBCTVAKIyBhcmNpZHMoYSkgLSBsaXN0IG9mIElEcyBvbiBhcmMgaW5jbHVkaW5nIGVuZCBidXQgbm90IHN0YXJ0CiMgYXJjc3RhcnQoYSkgLSBCTVAgSUQgYXQgc3RhcnQgb2YgYXJjCiMgYXJjZW5kKGEpIC0gQk1QIElEIGF0IGVuZCBvZiBhcmMKIyBncm93aW5nKGEpIC0gYXJjIGEgaXMgc3RpbGwgZ3Jvd2luZwojIGFyY3RhZ3MoYSkgLSBJRHMgb3V0IG9mIGFyY2lkcyAoZXhjbHVkaW5nIGVuZCkgdGhhdCBoYXZlIHRhZ3MKIyBhcmNoZWFkcyhhKSAtIElEcyBvdXQgb2YgYXJjaWRzIChleGNsdWRpbmcgZW5kKSB0aGF0IGhhdmUgaGVhZHMKIyBUaGUgc3RhcnQgb2YgYW4gYXJjIGlzIGF0IHRoZSBkZXNjZW5kZW50IGVuZCwgc28gImluY29taW5nIiBtZWFucwojIGNvbWluZyBmcm9tIGRlc2NlbmRlbnRzLCBhbmQgIm91dGdvaW5nIiBtZWFucyBnb2luZyB0b3dhcmRzIGFuY2VzdG9ycy4KCnByb2MgZ2V0YWxsY2xpbmVzIHtmZH0gewogICAgZ2xvYmFsIGFsbGlkcyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGlkdGFncyBpZGhlYWRzIG5leHRhcmMgbmJtcAogICAgZ2xvYmFsIGFyY25vcyBhcmNpZHMgYXJjdGFncyBhcmNvdXQgYXJjZW5kIGFyY3N0YXJ0IGFyY2hlYWRzIGdyb3dpbmcKICAgIGdsb2JhbCBzZWVkcyBhbGxjb21taXRzCgogICAgc2V0IG5pZCAwCiAgICB3aGlsZSB7W2luY3IgbmlkXSA8PSAxMDAwICYmIFtnZXRzICRmZCBsaW5lXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkbGluZSAwXQoJaWYge1tpbmZvIGV4aXN0cyBhbGxwYXJlbnRzKCRpZCldfSB7CgkgICAgIyBzZWVuIGl0IGFscmVhZHkKCSAgICBjb250aW51ZQoJfQoJbGFwcGVuZCBhbGxpZHMgJGlkCglzZXQgb2xkcyBbbHJhbmdlICRsaW5lIDEgZW5kXQoJc2V0IGFsbHBhcmVudHMoJGlkKSAkb2xkcwoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY2hpbGRyZW4oJGlkKV19IHsKCSAgICBzZXQgYWxsY2hpbGRyZW4oJGlkKSB7fQoJICAgIHNldCBhcmNub3MoJGlkKSB7fQoJICAgIGxhcHBlbmQgc2VlZHMgJGlkCgl9IGVsc2UgewoJICAgIHNldCBhICRhcmNub3MoJGlkKQoJICAgIGlmIHtbbGxlbmd0aCAkb2xkc10gPT0gMSAmJiBbbGxlbmd0aCAkYV0gPT0gMX0gewoJCWxhcHBlbmQgYXJjaWRzKCRhKSAkaWQKCQlpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJCSAgICBsYXBwZW5kIGFyY3RhZ3MoJGEpICRpZAoJCX0KCQlpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCQkgICAgbGFwcGVuZCBhcmNoZWFkcygkYSkgJGlkCgkJfQoJCWlmIHtbaW5mbyBleGlzdHMgYWxscGFyZW50cygkb2xkcyldfSB7CgkJICAgICMgc2VlbiBwYXJlbnQgYWxyZWFkeQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJG9sZHMpXX0gewoJCQlzcGxpdGFyYyAkb2xkcwoJCSAgICB9CgkJICAgIGxhcHBlbmQgYXJjaWRzKCRhKSAkb2xkcwoJCSAgICBzZXQgYXJjZW5kKCRhKSAkb2xkcwoJCSAgICB1bnNldCBncm93aW5nKCRhKQoJCX0KCQlsYXBwZW5kIGFsbGNoaWxkcmVuKCRvbGRzKSAkaWQKCQlsYXBwZW5kIGFyY25vcygkb2xkcykgJGEKCQljb250aW51ZQoJICAgIH0KCX0KCWluY3IgbmJtcAoJZm9yZWFjaCBhICRhcmNub3MoJGlkKSB7CgkgICAgbGFwcGVuZCBhcmNpZHMoJGEpICRpZAoJICAgIHNldCBhcmNlbmQoJGEpICRpZAoJICAgIHVuc2V0IGdyb3dpbmcoJGEpCgl9CgoJc2V0IGFvIHt9Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAoJICAgIHNldCBhIFtpbmNyIG5leHRhcmNdCgkgICAgc2V0IGFyY3N0YXJ0KCRhKSAkaWQKCSAgICBzZXQgYXJjaGVhZHMoJGEpIHt9CgkgICAgc2V0IGFyY3RhZ3MoJGEpIHt9CgkgICAgc2V0IGFyY2hlYWRzKCRhKSB7fQoJICAgIHNldCBhcmNpZHMoJGEpIHt9CgkgICAgbGFwcGVuZCBhbyAkYQoJICAgIHNldCBncm93aW5nKCRhKSAxCgkgICAgaWYge1tpbmZvIGV4aXN0cyBhbGxwYXJlbnRzKCRwKV19IHsKCQkjIHNlZW4gaXQgYWxyZWFkeSwgbWF5IG5lZWQgdG8gbWFrZSBhIG5ldyBicmFuY2gKCQlpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJHApXX0gewoJCSAgICBzcGxpdGFyYyAkcAoJCX0KCQlsYXBwZW5kIGFyY2lkcygkYSkgJHAKCQlzZXQgYXJjZW5kKCRhKSAkcAoJCXVuc2V0IGdyb3dpbmcoJGEpCgkgICAgfQoJICAgIGxhcHBlbmQgYXJjbm9zKCRwKSAkYQoJfQoJc2V0IGFyY291dCgkaWQpICRhbwogICAgfQogICAgaWYgeyRuaWQgPiAwfSB7CglnbG9iYWwgY2FjaGVkX2RoZWFkcyBjYWNoZWRfZHRhZ3MgY2FjaGVkX2F0YWdzCgljYXRjaCB7dW5zZXQgY2FjaGVkX2RoZWFkc30KCWNhdGNoIHt1bnNldCBjYWNoZWRfZHRhZ3N9CgljYXRjaCB7dW5zZXQgY2FjaGVkX2F0YWdzfQogICAgfQogICAgaWYgeyFbZW9mICRmZF19IHsKCXJldHVybiBbZXhwciB7JG5pZCA+PSAxMDAwPyAyOiAxfV0KICAgIH0KICAgIGNsb3NlICRmZAogICAgaWYge1tpbmNyIGFsbGNvbW1pdHMgLTFdID09IDB9IHsKCW5vdGJ1c3kgYWxsY29tbWl0cwogICAgfQogICAgZGlzcG5lYXJ0YWdzIDAKICAgIHJldHVybiAwCn0KCnByb2MgcmVjYWxjYXJjIHthfSB7CiAgICBnbG9iYWwgYXJjdGFncyBhcmNoZWFkcyBhcmNpZHMgaWR0YWdzIGlkaGVhZHMKCiAgICBzZXQgYXQge30KICAgIHNldCBhaCB7fQogICAgZm9yZWFjaCBpZCBbbHJhbmdlICRhcmNpZHMoJGEpIDAgZW5kLTFdIHsKCWlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkgICAgbGFwcGVuZCBhdCAkaWQKCX0KCWlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJICAgIGxhcHBlbmQgYWggJGlkCgl9CiAgICB9CiAgICBzZXQgYXJjdGFncygkYSkgJGF0CiAgICBzZXQgYXJjaGVhZHMoJGEpICRhaAp9Cgpwcm9jIHNwbGl0YXJjIHtwfSB7CiAgICBnbG9iYWwgYXJjbm9zIGFyY2lkcyBuZXh0YXJjIG5ibXAgYXJjdGFncyBhcmNoZWFkcyBpZHRhZ3MgaWRoZWFkcwogICAgZ2xvYmFsIGFyY3N0YXJ0IGFyY2VuZCBhcmNvdXQgYWxscGFyZW50cyBncm93aW5nCgogICAgc2V0IGEgJGFyY25vcygkcCkKICAgIGlmIHtbbGxlbmd0aCAkYV0gIT0gMX0gewoJcHV0cyAib29wcyBzcGxpdGFyYyBjYWxsZWQgYnV0IFtsbGVuZ3RoICRhXSBhcmNzIGFscmVhZHkiCglyZXR1cm4KICAgIH0KICAgIHNldCBhIFtsaW5kZXggJGEgMF0KICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkcF0KICAgIGlmIHskaSA8IDB9IHsKCXB1dHMgIm9vcHMgc3BsaXRhcmMgJHAgbm90IGluIGFyYyAkYSIKCXJldHVybgogICAgfQogICAgc2V0IG5hIFtpbmNyIG5leHRhcmNdCiAgICBpZiB7W2luZm8gZXhpc3RzIGFyY2VuZCgkYSldfSB7CglzZXQgYXJjZW5kKCRuYSkgJGFyY2VuZCgkYSkKICAgIH0gZWxzZSB7CglzZXQgbCBbbGluZGV4ICRhbGxwYXJlbnRzKFtsaW5kZXggJGFyY2lkcygkYSkgZW5kXSkgMF0KCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkYXJjbm9zKCRsKSAkYV0KCXNldCBhcmNub3MoJGwpIFtscmVwbGFjZSAkYXJjbm9zKCRsKSAkaiAkaiAkbmFdCiAgICB9CiAgICBzZXQgdGFpbCBbbHJhbmdlICRhcmNpZHMoJGEpIFtleHByIHskaSsxfV0gZW5kXQogICAgc2V0IGFyY2lkcygkYSkgW2xyYW5nZSAkYXJjaWRzKCRhKSAwICRpXQogICAgc2V0IGFyY2VuZCgkYSkgJHAKICAgIHNldCBhcmNzdGFydCgkbmEpICRwCiAgICBzZXQgYXJjb3V0KCRwKSAkbmEKICAgIHNldCBhcmNpZHMoJG5hKSAkdGFpbAogICAgaWYge1tpbmZvIGV4aXN0cyBncm93aW5nKCRhKV19IHsKCXNldCBncm93aW5nKCRuYSkgMQoJdW5zZXQgZ3Jvd2luZygkYSkKICAgIH0KICAgIGluY3IgbmJtcAoKICAgIGZvcmVhY2ggaWQgJHRhaWwgewoJaWYge1tsbGVuZ3RoICRhcmNub3MoJGlkKV0gPT0gMX0gewoJICAgIHNldCBhcmNub3MoJGlkKSAkbmEKCX0gZWxzZSB7CgkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRhcmNub3MoJGlkKSAkYV0KCSAgICBzZXQgYXJjbm9zKCRpZCkgW2xyZXBsYWNlICRhcmNub3MoJGlkKSAkaiAkaiAkbmFdCgl9CiAgICB9CgogICAgIyByZWNvbnN0cnVjdCB0YWdzIGFuZCBoZWFkcyBsaXN0cwogICAgaWYgeyRhcmN0YWdzKCRhKSBuZSB7fSB8fCAkYXJjaGVhZHMoJGEpIG5lIHt9fSB7CglyZWNhbGNhcmMgJGEKCXJlY2FsY2FyYyAkbmEKICAgIH0gZWxzZSB7CglzZXQgYXJjdGFncygkbmEpIHt9CglzZXQgYXJjaGVhZHMoJG5hKSB7fQogICAgfQp9CgojIFVwZGF0ZSB0aGluZ3MgZm9yIGEgbmV3IGNvbW1pdCBhZGRlZCB0aGF0IGlzIGEgY2hpbGQgb2Ygb25lCiMgZXhpc3RpbmcgY29tbWl0LiAgVXNlZCB3aGVuIGNoZXJyeS1waWNraW5nLgpwcm9jIGFkZG5ld2NoaWxkIHtpZCBwfSB7CiAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gaWR0YWdzIG5leHRhcmMgbmJtcAogICAgZ2xvYmFsIGFyY25vcyBhcmNpZHMgYXJjdGFncyBhcmNvdXQgYXJjZW5kIGFyY3N0YXJ0IGFyY2hlYWRzIGdyb3dpbmcKICAgIGdsb2JhbCBzZWVkcwoKICAgIGxhcHBlbmQgYWxsaWRzICRpZAogICAgc2V0IGFsbHBhcmVudHMoJGlkKSBbbGlzdCAkcF0KICAgIHNldCBhbGxjaGlsZHJlbigkaWQpIHt9CiAgICBzZXQgYXJjbm9zKCRpZCkge30KICAgIGxhcHBlbmQgc2VlZHMgJGlkCiAgICBpbmNyIG5ibXAKICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAogICAgc2V0IGEgW2luY3IgbmV4dGFyY10KICAgIHNldCBhcmNzdGFydCgkYSkgJGlkCiAgICBzZXQgYXJjaGVhZHMoJGEpIHt9CiAgICBzZXQgYXJjdGFncygkYSkge30KICAgIHNldCBhcmNpZHMoJGEpIFtsaXN0ICRwXQogICAgc2V0IGFyY2VuZCgkYSkgJHAKICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY291dCgkcCldfSB7CglzcGxpdGFyYyAkcAogICAgfQogICAgbGFwcGVuZCBhcmNub3MoJHApICRhCiAgICBzZXQgYXJjb3V0KCRpZCkgW2xpc3QgJGFdCn0KCiMgUmV0dXJucyAxIGlmIGEgaXMgYW4gYW5jZXN0b3Igb2YgYiwgLTEgaWYgYiBpcyBhbiBhbmNlc3RvciBvZiBhLAojIG9yIDAgaWYgbmVpdGhlciBpcyB0cnVlLgpwcm9jIGFuY19vcl9kZXNjIHthIGJ9IHsKICAgIGdsb2JhbCBhcmNvdXQgYXJjc3RhcnQgYXJjZW5kIGFyY25vcyBjYWNoZWRfaXNhbmMKCiAgICBpZiB7JGFyY25vcygkYSkgZXEgJGFyY25vcygkYil9IHsKCSMgQm90aCBhcmUgb24gdGhlIHNhbWUgYXJjKHMpOyBlaXRoZXIgYm90aCBhcmUgdGhlIHNhbWUgQk1QLAoJIyBvciBpZiBvbmUgaXMgbm90IGEgQk1QLCB0aGUgb3RoZXIgaXMgYWxzbyBub3QgYSBCTVAgb3IgaXMKCSMgdGhlIEJNUCBhdCBlbmQgb2YgdGhlIGFyYyAoYW5kIGl0IG9ubHkgaGFzIDEgaW5jb21pbmcgYXJjKS4KCSMgT3IgYm90aCBjYW4gYmUgQk1QcyB3aXRoIG5vIGluY29taW5nIGFyY3MuCglpZiB7JGEgZXEgJGIgfHwgJGFyY25vcygkYSkgZXEge319IHsKCSAgICByZXR1cm4gMAoJfQoJIyBhc3NlcnQge1tsbGVuZ3RoICRhcmNub3MoJGEpXSA9PSAxfQoJc2V0IGFyYyBbbGluZGV4ICRhcmNub3MoJGEpIDBdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGFyY2lkcygkYXJjKSAkYV0KCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhcmMpICRiXQoJaWYgeyRpIDwgMCB8fCAkaSA+ICRqfSB7CgkgICAgcmV0dXJuIDEKCX0gZWxzZSB7CgkgICAgcmV0dXJuIC0xCgl9CiAgICB9CgogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRhKV19IHsKCXNldCBhcmMgW2xpbmRleCAkYXJjbm9zKCRhKSAwXQoJaWYge1tpbmZvIGV4aXN0cyBhcmNlbmQoJGFyYyldfSB7CgkgICAgc2V0IGFlbmQgJGFyY2VuZCgkYXJjKQoJfSBlbHNlIHsKCSAgICBzZXQgYWVuZCB7fQoJfQoJc2V0IGEgJGFyY3N0YXJ0KCRhcmMpCiAgICB9IGVsc2UgewoJc2V0IGFlbmQgJGEKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY291dCgkYildfSB7CglzZXQgYXJjIFtsaW5kZXggJGFyY25vcygkYikgMF0KCWlmIHtbaW5mbyBleGlzdHMgYXJjZW5kKCRhcmMpXX0gewoJICAgIHNldCBiZW5kICRhcmNlbmQoJGFyYykKCX0gZWxzZSB7CgkgICAgc2V0IGJlbmQge30KCX0KCXNldCBiICRhcmNzdGFydCgkYXJjKQogICAgfSBlbHNlIHsKCXNldCBiZW5kICRiCiAgICB9CiAgICBpZiB7JGEgZXEgJGJlbmR9IHsKCXJldHVybiAxCiAgICB9CiAgICBpZiB7JGIgZXEgJGFlbmR9IHsKCXJldHVybiAtMQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfaXNhbmMoJGEsJGJlbmQpXX0gewoJaWYgeyRjYWNoZWRfaXNhbmMoJGEsJGJlbmQpfSB7CgkgICAgcmV0dXJuIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2FjaGVkX2lzYW5jKCRiLCRhZW5kKV19IHsKCWlmIHskY2FjaGVkX2lzYW5jKCRiLCRhZW5kKX0gewoJICAgIHJldHVybiAtMQoJfQoJaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfaXNhbmMoJGEsJGJlbmQpXX0gewoJICAgIHJldHVybiAwCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xpc3QgJGEgJGJdCiAgICBzZXQgYW5jKCRhKSBhCiAgICBzZXQgYW5jKCRiKSBiCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IHggW2xpbmRleCAkdG9kbyAkaV0KCWlmIHskYW5jKCR4KSBlcSB7fX0gewoJICAgIGNvbnRpbnVlCgl9Cglmb3JlYWNoIGFyYyAkYXJjbm9zKCR4KSB7CgkgICAgc2V0IHhkICRhcmNzdGFydCgkYXJjKQoJICAgIGlmIHskeGQgZXEgJGJlbmR9IHsKCQlzZXQgY2FjaGVkX2lzYW5jKCRhLCRiZW5kKSAxCgkJc2V0IGNhY2hlZF9pc2FuYygkYiwkYWVuZCkgMAoJCXJldHVybiAxCgkgICAgfSBlbHNlaWYgeyR4ZCBlcSAkYWVuZH0gewoJCXNldCBjYWNoZWRfaXNhbmMoJGIsJGFlbmQpIDEKCQlzZXQgY2FjaGVkX2lzYW5jKCRhLCRiZW5kKSAwCgkJcmV0dXJuIC0xCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGFuYygkeGQpXX0gewoJCXNldCBhbmMoJHhkKSAkYW5jKCR4KQoJCWxhcHBlbmQgdG9kbyAkeGQKCSAgICB9IGVsc2VpZiB7JGFuYygkeGQpIG5lICRhbmMoJHgpfSB7CgkJc2V0IGFuYygkeGQpIHt9CgkgICAgfQoJfQogICAgfQogICAgc2V0IGNhY2hlZF9pc2FuYygkYSwkYmVuZCkgMAogICAgc2V0IGNhY2hlZF9pc2FuYygkYiwkYWVuZCkgMAogICAgcmV0dXJuIDAKfQoKIyBUaGlzIGlkZW50aWZpZXMgd2hldGhlciAkZGVzYyBoYXMgYW4gYW5jZXN0b3IgdGhhdCBpcwojIGEgZ3Jvd2luZyB0aXAgb2YgdGhlIGdyYXBoIGFuZCB3aGljaCBpcyBub3QgYW4gYW5jZXN0b3Igb2YgJGFuYwojIGFuZCByZXR1cm5zIDAgaWYgc28gYW5kIDEgaWYgbm90LgojIElmIHdlIHN1YnNlcXVlbnRseSBkaXNjb3ZlciBhIHRhZyBvbiBzdWNoIGEgZ3Jvd2luZyB0aXAsIGFuZCB0aGF0CiMgdHVybnMgb3V0IHRvIGJlIGEgZGVzY2VuZGVudCBvZiAkYW5jICh3aGljaCBpdCBjb3VsZCwgc2luY2Ugd2UKIyBkb24ndCBuZWNlc3NhcmlseSBzZWUgY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMpLCB0aGVuICRkZXNjCiMgaXNuJ3QgYSBnb29kIGNob2ljZSB0byBkaXNwbGF5IGFzIGEgZGVzY2VuZGVudCB0YWcgb2YKIyAkYW5jIChzaW5jZSBpdCBpcyB0aGUgZGVzY2VuZGVudCBvZiBhbm90aGVyIHRhZyB3aGljaCBpcwojIGEgZGVzY2VuZGVudCBvZiAkYW5jKS4gIFNpbWlsYXJseSwgJGFuYyBpc24ndCBhIGdvb2QgY2hvaWNlIHRvCiMgZGlzcGxheSBhcyBhIGFuY2VzdG9yIHRhZyBvZiAkZGVzYy4KIwpwcm9jIGlzX2NlcnRhaW4ge2Rlc2MgYW5jfSB7CiAgICBnbG9iYWwgYXJjbm9zIGFyY291dCBhcmNzdGFydCBhcmNlbmQgZ3Jvd2luZyBwcm9ibGVtcwoKICAgIHNldCBjZXJ0YWluIHt9CiAgICBpZiB7W2xsZW5ndGggJGFyY25vcygkYW5jKV0gPT0gMX0gewoJIyB0YWdzIG9uIHRoZSBzYW1lIGFyYyBhcmUgY2VydGFpbgoJaWYgeyRhcmNub3MoJGRlc2MpIGVxICRhcmNub3MoJGFuYyl9IHsKCSAgICByZXR1cm4gMQoJfQoJaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRhbmMpXX0gewoJICAgICMgaWYgJGFuYyBpcyBwYXJ0d2F5IGFsb25nIGFuIGFyYywgdXNlIHRoZSBzdGFydCBvZiB0aGUgYXJjIGluc3RlYWQKCSAgICBzZXQgYSBbbGluZGV4ICRhcmNub3MoJGFuYykgMF0KCSAgICBzZXQgYW5jICRhcmNzdGFydCgkYSkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYXJjbm9zKCRkZXNjKV0gPiAxIHx8IFtpbmZvIGV4aXN0cyBhcmNvdXQoJGRlc2MpXX0gewoJc2V0IHggJGRlc2MKICAgIH0gZWxzZSB7CglzZXQgYSBbbGluZGV4ICRhcmNub3MoJGRlc2MpIDBdCglzZXQgeCAkYXJjZW5kKCRhKQogICAgfQogICAgaWYgeyR4ID09ICRhbmN9IHsKCXJldHVybiAxCiAgICB9CiAgICBzZXQgYW5jbGlzdCBbbGlzdCAkeF0KICAgIHNldCBkbCgkeCkgMQogICAgc2V0IG5uaCAxCiAgICBzZXQgbmdyb3dhbmMgMAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkYW5jbGlzdF0gJiYgKCRubmggPiAwIHx8ICRuZ3Jvd2FuYyA+IDApfSB7aW5jciBpfSB7CglzZXQgeCBbbGluZGV4ICRhbmNsaXN0ICRpXQoJaWYgeyRkbCgkeCl9IHsKCSAgICBpbmNyIG5uaCAtMQoJfQoJc2V0IGRvbmUoJHgpIDEKCWZvcmVhY2ggYSAkYXJjb3V0KCR4KSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBncm93aW5nKCRhKV19IHsKCQlpZiB7IVtpbmZvIGV4aXN0cyBncm93YW5jKCR4KV0gJiYgJGRsKCR4KX0gewoJCSAgICBzZXQgZ3Jvd2FuYygkeCkgMQoJCSAgICBpbmNyIG5ncm93YW5jCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IHkgJGFyY2VuZCgkYSkKCQlpZiB7W2luZm8gZXhpc3RzIGRsKCR5KV19IHsKCQkgICAgaWYgeyRkbCgkeSl9IHsKCQkJaWYgeyEkZGwoJHgpfSB7CgkJCSAgICBzZXQgZGwoJHkpIDAKCQkJICAgIGlmIHshW2luZm8gZXhpc3RzIGRvbmUoJHkpXX0gewoJCQkJaW5jciBubmggLTEKCQkJICAgIH0KCQkJICAgIGlmIHtbaW5mbyBleGlzdHMgZ3Jvd2FuYygkeCldfSB7CgkJCQlpbmNyIG5ncm93YW5jIC0xCgkJCSAgICB9CgkJCSAgICBzZXQgeGwgW2xpc3QgJHldCgkJCSAgICBmb3Ige3NldCBrIDB9IHskayA8IFtsbGVuZ3RoICR4bF19IHtpbmNyIGt9IHsKCQkJCXNldCB6IFtsaW5kZXggJHhsICRrXQoJCQkJZm9yZWFjaCBjICRhcmNvdXQoJHopIHsKCQkJCSAgICBpZiB7W2luZm8gZXhpc3RzIGFyY2VuZCgkYyldfSB7CgkJCQkJc2V0IHYgJGFyY2VuZCgkYykKCQkJCQlpZiB7W2luZm8gZXhpc3RzIGRsKCR2KV0gJiYgJGRsKCR2KX0gewoJCQkJCSAgICBzZXQgZGwoJHYpIDAKCQkJCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgZG9uZSgkdildfSB7CgkJCQkJCWluY3Igbm5oIC0xCgkJCQkJICAgIH0KCQkJCQkgICAgaWYge1tpbmZvIGV4aXN0cyBncm93YW5jKCR2KV19IHsKCQkJCQkJaW5jciBuZ3Jvd2FuYyAtMQoJCQkJCSAgICB9CgkJCQkJICAgIGxhcHBlbmQgeGwgJHYKCQkJCQl9CgkJCQkgICAgfQoJCQkJfQoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQl9IGVsc2VpZiB7JHkgZXEgJGFuYyB8fCAhJGRsKCR4KX0gewoJCSAgICBzZXQgZGwoJHkpIDAKCQkgICAgbGFwcGVuZCBhbmNsaXN0ICR5CgkJfSBlbHNlIHsKCQkgICAgc2V0IGRsKCR5KSAxCgkJICAgIGxhcHBlbmQgYW5jbGlzdCAkeQoJCSAgICBpbmNyIG5uaAoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBmb3JlYWNoIHggW2FycmF5IG5hbWVzIGdyb3dhbmNdIHsKCWlmIHskZGwoJHgpfSB7CgkgICAgcmV0dXJuIDAKCX0KCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gMQp9Cgpwcm9jIHZhbGlkYXRlX2FyY3RhZ3Mge2F9IHsKICAgIGdsb2JhbCBhcmN0YWdzIGlkdGFncwoKICAgIHNldCBpIC0xCiAgICBzZXQgbmEgJGFyY3RhZ3MoJGEpCiAgICBmb3JlYWNoIGlkICRhcmN0YWdzKCRhKSB7CglpbmNyIGkKCWlmIHshW2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJICAgIHNldCBuYSBbbHJlcGxhY2UgJG5hICRpICRpXQoJICAgIGluY3IgaSAtMQoJfQogICAgfQogICAgc2V0IGFyY3RhZ3MoJGEpICRuYQp9Cgpwcm9jIHZhbGlkYXRlX2FyY2hlYWRzIHthfSB7CiAgICBnbG9iYWwgYXJjaGVhZHMgaWRoZWFkcwoKICAgIHNldCBpIC0xCiAgICBzZXQgbmEgJGFyY2hlYWRzKCRhKQogICAgZm9yZWFjaCBpZCAkYXJjaGVhZHMoJGEpIHsKCWluY3IgaQoJaWYgeyFbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJICAgIHNldCBuYSBbbHJlcGxhY2UgJG5hICRpICRpXQoJICAgIGluY3IgaSAtMQoJfQogICAgfQogICAgc2V0IGFyY2hlYWRzKCRhKSAkbmEKfQoKIyBSZXR1cm4gdGhlIGxpc3Qgb2YgSURzIHRoYXQgaGF2ZSB0YWdzIHRoYXQgYXJlIGRlc2NlbmRlbnRzIG9mIGlkLAojIGlnbm9yaW5nIElEcyB0aGF0IGFyZSBkZXNjZW5kZW50cyBvZiBJRHMgYWxyZWFkeSByZXBvcnRlZC4KcHJvYyBkZXNjdGFncyB7aWR9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjc3RhcnQgYXJjaWRzIGFyY3RhZ3MgaWR0YWdzIGFsbHBhcmVudHMKICAgIGdsb2JhbCBncm93aW5nIGNhY2hlZF9kdGFncwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbHBhcmVudHMoJGlkKV19IHsKCXJldHVybiB7fQogICAgfQogICAgc2V0IHQxIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBhcmdpZCAkaWQKICAgIGlmIHtbbGxlbmd0aCAkYXJjbm9zKCRpZCldID09IDEgJiYgW2xsZW5ndGggJGFsbHBhcmVudHMoJGlkKV0gPT0gMX0gewoJIyBwYXJ0LXdheSBhbG9uZyBhbiBhcmM7IGNoZWNrIHRoYXQgYXJjIGZpcnN0CglzZXQgYSBbbGluZGV4ICRhcmNub3MoJGlkKSAwXQoJaWYgeyRhcmN0YWdzKCRhKSBuZSB7fX0gewoJICAgIHZhbGlkYXRlX2FyY3RhZ3MgJGEKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGFyY2lkcygkYSkgJGlkXQoJICAgIHNldCB0aWQge30KCSAgICBmb3JlYWNoIHQgJGFyY3RhZ3MoJGEpIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGFyY2lkcygkYSkgJHRdCgkJaWYgeyRqID49ICRpfSBicmVhawoJCXNldCB0aWQgJHQKCSAgICB9CgkgICAgaWYgeyR0aWQgbmUge319IHsKCQlyZXR1cm4gJHRpZAoJICAgIH0KCX0KCXNldCBpZCAkYXJjc3RhcnQoJGEpCglpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJICAgIHJldHVybiAkaWQKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2FjaGVkX2R0YWdzKCRpZCldfSB7CglyZXR1cm4gJGNhY2hlZF9kdGFncygkaWQpCiAgICB9CgogICAgc2V0IG9yaWdpZCAkaWQKICAgIHNldCB0b2RvIFtsaXN0ICRpZF0KICAgIHNldCBxdWV1ZWQoJGlkKSAxCiAgICBzZXQgbmMgMQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb10gJiYgJG5jID4gMH0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJHRvZG8gJGldCglzZXQgZG9uZSgkaWQpIDEKCXNldCB0YSBbaW5mbyBleGlzdHMgaGFzdGFnZ2VkYW5jZXN0b3IoJGlkKV0KCWlmIHshJHRhfSB7CgkgICAgaW5jciBuYyAtMQoJfQoJIyBpZ25vcmUgdGFncyBvbiBzdGFydGluZyBub2RlCglpZiB7ISR0YSAmJiAkaSA+IDB9IHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJCXNldCB0YWdsb2MoJGlkKSAkaWQKCQlzZXQgdGEgMQoJICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgY2FjaGVkX2R0YWdzKCRpZCldfSB7CgkJc2V0IHRhZ2xvYygkaWQpICRjYWNoZWRfZHRhZ3MoJGlkKQoJCXNldCB0YSAxCgkgICAgfQoJfQoJZm9yZWFjaCBhICRhcmNub3MoJGlkKSB7CgkgICAgc2V0IGQgJGFyY3N0YXJ0KCRhKQoJICAgIGlmIHshJHRhICYmICRhcmN0YWdzKCRhKSBuZSB7fX0gewoJCXZhbGlkYXRlX2FyY3RhZ3MgJGEKCQlpZiB7JGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkJICAgIGxhcHBlbmQgdGFnbG9jKCRpZCkgW2xpbmRleCAkYXJjdGFncygkYSkgZW5kXQoJCX0KCSAgICB9CgkgICAgaWYgeyR0YSB8fCAkYXJjdGFncygkYSkgbmUge319IHsKCQlzZXQgdG9tYXJrIFtsaXN0ICRkXQoJCWZvciB7c2V0IGogMH0geyRqIDwgW2xsZW5ndGggJHRvbWFya119IHtpbmNyIGp9IHsKCQkgICAgc2V0IGRkIFtsaW5kZXggJHRvbWFyayAkal0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgaGFzdGFnZ2VkYW5jZXN0b3IoJGRkKV19IHsKCQkJaWYge1tpbmZvIGV4aXN0cyBkb25lKCRkZCldfSB7CgkJCSAgICBmb3JlYWNoIGIgJGFyY25vcygkZGQpIHsKCQkJCWxhcHBlbmQgdG9tYXJrICRhcmNzdGFydCgkYikKCQkJICAgIH0KCQkJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnbG9jKCRkZCldfSB7CgkJCQl1bnNldCB0YWdsb2MoJGRkKQoJCQkgICAgfQoJCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHF1ZXVlZCgkZGQpXX0gewoJCQkgICAgaW5jciBuYyAtMQoJCQl9CgkJCXNldCBoYXN0YWdnZWRhbmNlc3RvcigkZGQpIDEKCQkgICAgfQoJCX0KCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgcXVldWVkKCRkKV19IHsKCQlsYXBwZW5kIHRvZG8gJGQKCQlzZXQgcXVldWVkKCRkKSAxCgkJaWYgeyFbaW5mbyBleGlzdHMgaGFzdGFnZ2VkYW5jZXN0b3IoJGQpXX0gewoJCSAgICBpbmNyIG5jCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB0YWdzIHt9CiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyB0YWdsb2NdIHsKCWlmIHshW2luZm8gZXhpc3RzIGhhc3RhZ2dlZGFuY2VzdG9yKCRpZCldfSB7CgkgICAgZm9yZWFjaCB0ICR0YWdsb2MoJGlkKSB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkdGFncyAkdF0gPCAwfSB7CgkJICAgIGxhcHBlbmQgdGFncyAkdAoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgdDIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IGxvb3BpeCAkaQoKICAgICMgcmVtb3ZlIHRhZ3MgdGhhdCBhcmUgZGVzY2VuZGVudHMgb2Ygb3RoZXIgdGFncwogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdGFnc119IHtpbmNyIGl9IHsKCXNldCBhIFtsaW5kZXggJHRhZ3MgJGldCglmb3Ige3NldCBqIDB9IHskaiA8ICRpfSB7aW5jciBqfSB7CgkgICAgc2V0IGIgW2xpbmRleCAkdGFncyAkal0KCSAgICBzZXQgciBbYW5jX29yX2Rlc2MgJGEgJGJdCgkgICAgaWYgeyRyID09IDF9IHsKCQlzZXQgdGFncyBbbHJlcGxhY2UgJHRhZ3MgJGogJGpdCgkJaW5jciBqIC0xCgkJaW5jciBpIC0xCgkgICAgfSBlbHNlaWYgeyRyID09IC0xfSB7CgkJc2V0IHRhZ3MgW2xyZXBsYWNlICR0YWdzICRpICRpXQoJCWluY3IgaSAtMQoJCWJyZWFrCgkgICAgfQoJfQogICAgfQoKICAgIGlmIHtbYXJyYXkgbmFtZXMgZ3Jvd2luZ10gbmUge319IHsKCSMgZ3JhcGggaXNuJ3QgZmluaXNoZWQsIG5lZWQgdG8gY2hlY2sgaWYgYW55IHRhZyBjb3VsZCBnZXQKCSMgZWNsaXBzZWQgYnkgYW5vdGhlciB0YWcgY29taW5nIGxhdGVyLiAgU2ltcGx5IGlnbm9yZSBhbnkKCSMgdGFncyB0aGF0IGNvdWxkIGxhdGVyIGdldCBlY2xpcHNlZC4KCXNldCBjdGFncyB7fQoJZm9yZWFjaCB0ICR0YWdzIHsKCSAgICBpZiB7W2lzX2NlcnRhaW4gJHQgJG9yaWdpZF19IHsKCQlsYXBwZW5kIGN0YWdzICR0CgkgICAgfQoJfQoJaWYgeyR0YWdzIGVxICRjdGFnc30gewoJICAgIHNldCBjYWNoZWRfZHRhZ3MoJG9yaWdpZCkgJHRhZ3MKCX0gZWxzZSB7CgkgICAgc2V0IHRhZ3MgJGN0YWdzCgl9CiAgICB9IGVsc2UgewoJc2V0IGNhY2hlZF9kdGFncygkb3JpZ2lkKSAkdGFncwogICAgfQogICAgc2V0IHQzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIGlmIHswICYmICR0MyAtICR0MSA+PSAxMDB9IHsKCXB1dHMgIml0ZXJhdGluZyBkZXNjZW5kZW50cyAoJGxvb3BpeC9bbGxlbmd0aCAkdG9kb10gbm9kZXMpIHRvb2tcCiAgICAJICAgIFtleHByIHskdDItJHQxfV0rW2V4cHIgeyR0My0kdDJ9XW1zLCAkbmMgY2FuZGlkYXRlcyBsZWZ0IgogICAgfQogICAgcmV0dXJuICR0YWdzCn0KCnByb2MgYW5jdGFncyB7aWR9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjaWRzIGFyY291dCBhcmNlbmQgYXJjdGFncyBpZHRhZ3MgYWxscGFyZW50cwogICAgZ2xvYmFsIGdyb3dpbmcgY2FjaGVkX2F0YWdzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxscGFyZW50cygkaWQpXX0gewoJcmV0dXJuIHt9CiAgICB9CiAgICBzZXQgdDEgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IGFyZ2lkICRpZAogICAgaWYge1tsbGVuZ3RoICRhcmNub3MoJGlkKV0gPT0gMSAmJiBbbGxlbmd0aCAkYWxscGFyZW50cygkaWQpXSA9PSAxfSB7CgkjIHBhcnQtd2F5IGFsb25nIGFuIGFyYzsgY2hlY2sgdGhhdCBhcmMgZmlyc3QKCXNldCBhIFtsaW5kZXggJGFyY25vcygkaWQpIDBdCglpZiB7JGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkgICAgdmFsaWRhdGVfYXJjdGFncyAkYQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkaWRdCgkgICAgZm9yZWFjaCB0ICRhcmN0YWdzKCRhKSB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRhcmNpZHMoJGEpICR0XQoJCWlmIHskaiA+ICRpfSB7CgkJICAgIHJldHVybiAkdAoJCX0KCSAgICB9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBhcmNlbmQoJGEpXX0gewoJICAgIHJldHVybiB7fQoJfQoJc2V0IGlkICRhcmNlbmQoJGEpCglpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJICAgIHJldHVybiAkaWQKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY2FjaGVkX2F0YWdzKCRpZCldfSB7CglyZXR1cm4gJGNhY2hlZF9hdGFncygkaWQpCiAgICB9CgogICAgc2V0IG9yaWdpZCAkaWQKICAgIHNldCB0b2RvIFtsaXN0ICRpZF0KICAgIHNldCBxdWV1ZWQoJGlkKSAxCiAgICBzZXQgdGFnbGlzdCB7fQogICAgc2V0IG5jIDEKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dICYmICRuYyA+IDB9IHtpbmNyIGl9IHsKCXNldCBpZCBbbGluZGV4ICR0b2RvICRpXQoJc2V0IGRvbmUoJGlkKSAxCglzZXQgdGQgW2luZm8gZXhpc3RzIGhhc3RhZ2dlZGRlc2NlbmRlbnQoJGlkKV0KCWlmIHshJHRkfSB7CgkgICAgaW5jciBuYyAtMQoJfQoJIyBpZ25vcmUgdGFncyBvbiBzdGFydGluZyBub2RlCglpZiB7ISR0ZCAmJiAkaSA+IDB9IHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJCXNldCB0YWdsb2MoJGlkKSAkaWQKCQlzZXQgdGQgMQoJICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgY2FjaGVkX2F0YWdzKCRpZCldfSB7CgkJc2V0IHRhZ2xvYygkaWQpICRjYWNoZWRfYXRhZ3MoJGlkKQoJCXNldCB0ZCAxCgkgICAgfQoJfQoJZm9yZWFjaCBhICRhcmNvdXQoJGlkKSB7CgkgICAgaWYgeyEkdGQgJiYgJGFyY3RhZ3MoJGEpIG5lIHt9fSB7CgkJdmFsaWRhdGVfYXJjdGFncyAkYQoJCWlmIHskYXJjdGFncygkYSkgbmUge319IHsKCQkgICAgbGFwcGVuZCB0YWdsb2MoJGlkKSBbbGluZGV4ICRhcmN0YWdzKCRhKSAwXQoJCX0KCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjZW5kKCRhKV19IGNvbnRpbnVlCgkgICAgc2V0IGQgJGFyY2VuZCgkYSkKCSAgICBpZiB7JHRkIHx8ICRhcmN0YWdzKCRhKSBuZSB7fX0gewoJCXNldCB0b21hcmsgW2xpc3QgJGRdCgkJZm9yIHtzZXQgaiAwfSB7JGogPCBbbGxlbmd0aCAkdG9tYXJrXX0ge2luY3Igan0gewoJCSAgICBzZXQgZGQgW2xpbmRleCAkdG9tYXJrICRqXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBoYXN0YWdnZWRkZXNjZW5kZW50KCRkZCldfSB7CgkJCWlmIHtbaW5mbyBleGlzdHMgZG9uZSgkZGQpXX0gewoJCQkgICAgZm9yZWFjaCBiICRhcmNvdXQoJGRkKSB7CgkJCQlpZiB7W2luZm8gZXhpc3RzIGFyY2VuZCgkYildfSB7CgkJCQkgICAgbGFwcGVuZCB0b21hcmsgJGFyY2VuZCgkYikKCQkJCX0KCQkJICAgIH0KCQkJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnbG9jKCRkZCldfSB7CgkJCQl1bnNldCB0YWdsb2MoJGRkKQoJCQkgICAgfQoJCQl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIHF1ZXVlZCgkZGQpXX0gewoJCQkgICAgaW5jciBuYyAtMQoJCQl9CgkJCXNldCBoYXN0YWdnZWRkZXNjZW5kZW50KCRkZCkgMQoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBxdWV1ZWQoJGQpXX0gewoJCWxhcHBlbmQgdG9kbyAkZAoJCXNldCBxdWV1ZWQoJGQpIDEKCQlpZiB7IVtpbmZvIGV4aXN0cyBoYXN0YWdnZWRkZXNjZW5kZW50KCRkKV19IHsKCQkgICAgaW5jciBuYwoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgdDIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IGxvb3BpeCAkaQogICAgc2V0IHRhZ3Mge30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIHRhZ2xvY10gewoJaWYgeyFbaW5mbyBleGlzdHMgaGFzdGFnZ2VkZGVzY2VuZGVudCgkaWQpXX0gewoJICAgIGZvcmVhY2ggdCAkdGFnbG9jKCRpZCkgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJHRhZ3MgJHRdIDwgMH0gewoJCSAgICBsYXBwZW5kIHRhZ3MgJHQKCQl9CgkgICAgfQoJfQogICAgfQoKICAgICMgcmVtb3ZlIHRhZ3MgdGhhdCBhcmUgYW5jZXN0b3JzIG9mIG90aGVyIHRhZ3MKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRhZ3NdfSB7aW5jciBpfSB7CglzZXQgYSBbbGluZGV4ICR0YWdzICRpXQoJZm9yIHtzZXQgaiAwfSB7JGogPCAkaX0ge2luY3Igan0gewoJICAgIHNldCBiIFtsaW5kZXggJHRhZ3MgJGpdCgkgICAgc2V0IHIgW2FuY19vcl9kZXNjICRhICRiXQoJICAgIGlmIHskciA9PSAtMX0gewoJCXNldCB0YWdzIFtscmVwbGFjZSAkdGFncyAkaiAkal0KCQlpbmNyIGogLTEKCQlpbmNyIGkgLTEKCSAgICB9IGVsc2VpZiB7JHIgPT0gMX0gewoJCXNldCB0YWdzIFtscmVwbGFjZSAkdGFncyAkaSAkaV0KCQlpbmNyIGkgLTEKCQlicmVhawoJICAgIH0KCX0KICAgIH0KCiAgICBpZiB7W2FycmF5IG5hbWVzIGdyb3dpbmddIG5lIHt9fSB7CgkjIGdyYXBoIGlzbid0IGZpbmlzaGVkLCBuZWVkIHRvIGNoZWNrIGlmIGFueSB0YWcgY291bGQgZ2V0CgkjIGVjbGlwc2VkIGJ5IGFub3RoZXIgdGFnIGNvbWluZyBsYXRlci4gIFNpbXBseSBpZ25vcmUgYW55CgkjIHRhZ3MgdGhhdCBjb3VsZCBsYXRlciBnZXQgZWNsaXBzZWQuCglzZXQgY3RhZ3Mge30KCWZvcmVhY2ggdCAkdGFncyB7CgkgICAgaWYge1tpc19jZXJ0YWluICRvcmlnaWQgJHRdfSB7CgkJbGFwcGVuZCBjdGFncyAkdAoJICAgIH0KCX0KCWlmIHskdGFncyBlcSAkY3RhZ3N9IHsKCSAgICBzZXQgY2FjaGVkX2F0YWdzKCRvcmlnaWQpICR0YWdzCgl9IGVsc2UgewoJICAgIHNldCB0YWdzICRjdGFncwoJfQogICAgfSBlbHNlIHsKCXNldCBjYWNoZWRfYXRhZ3MoJG9yaWdpZCkgJHRhZ3MKICAgIH0KICAgIHNldCB0MyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBpZiB7MCAmJiAkdDMgLSAkdDEgPj0gMTAwfSB7CglwdXRzICJpdGVyYXRpbmcgYW5jZXN0b3JzICgkbG9vcGl4L1tsbGVuZ3RoICR0b2RvXSBub2RlcykgdG9va1wKICAgIAkgICAgW2V4cHIgeyR0Mi0kdDF9XStbZXhwciB7JHQzLSR0Mn1dbXMsICRuYyBjYW5kaWRhdGVzIGxlZnQiCiAgICB9CiAgICByZXR1cm4gJHRhZ3MKfQoKIyBSZXR1cm4gdGhlIGxpc3Qgb2YgSURzIHRoYXQgaGF2ZSBoZWFkcyB0aGF0IGFyZSBkZXNjZW5kZW50cyBvZiBpZCwKIyBpbmNsdWRpbmcgaWQgaXRzZWxmIGlmIGl0IGhhcyBhIGhlYWQuCnByb2MgZGVzY2hlYWRzIHtpZH0gewogICAgZ2xvYmFsIGFyY25vcyBhcmNzdGFydCBhcmNpZHMgYXJjaGVhZHMgaWRoZWFkcyBjYWNoZWRfZGhlYWRzCiAgICBnbG9iYWwgYWxscGFyZW50cwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbHBhcmVudHMoJGlkKV19IHsKCXJldHVybiB7fQogICAgfQogICAgc2V0IGFyZXQge30KICAgIGlmIHtbbGxlbmd0aCAkYXJjbm9zKCRpZCldID09IDEgJiYgW2xsZW5ndGggJGFsbHBhcmVudHMoJGlkKV0gPT0gMX0gewoJIyBwYXJ0LXdheSBhbG9uZyBhbiBhcmM7IGNoZWNrIGl0IGZpcnN0CglzZXQgYSBbbGluZGV4ICRhcmNub3MoJGlkKSAwXQoJaWYgeyRhcmNoZWFkcygkYSkgbmUge319IHsKCSAgICB2YWxpZGF0ZV9hcmNoZWFkcyAkYQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkaWRdCgkgICAgZm9yZWFjaCB0ICRhcmNoZWFkcygkYSkgewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkYXJjaWRzKCRhKSAkdF0KCQlpZiB7JGogPiAkaX0gYnJlYWsKCQlsYXBwZW5kIGFyZXQgJHQKCSAgICB9Cgl9CglzZXQgaWQgJGFyY3N0YXJ0KCRhKQogICAgfQogICAgc2V0IG9yaWdpZCAkaWQKICAgIHNldCB0b2RvIFtsaXN0ICRpZF0KICAgIHNldCBzZWVuKCRpZCkgMQogICAgc2V0IHJldCB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCBbbGxlbmd0aCAkdG9kb119IHtpbmNyIGl9IHsKCXNldCBpZCBbbGluZGV4ICR0b2RvICRpXQoJaWYge1tpbmZvIGV4aXN0cyBjYWNoZWRfZGhlYWRzKCRpZCldfSB7CgkgICAgc2V0IHJldCBbY29uY2F0ICRyZXQgJGNhY2hlZF9kaGVhZHMoJGlkKV0KCX0gZWxzZSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CgkJbGFwcGVuZCByZXQgJGlkCgkgICAgfQoJICAgIGZvcmVhY2ggYSAkYXJjbm9zKCRpZCkgewoJCWlmIHskYXJjaGVhZHMoJGEpIG5lIHt9fSB7CgkJICAgIHZhbGlkYXRlX2FyY2hlYWRzICRhCgkJICAgIGlmIHskYXJjaGVhZHMoJGEpIG5lIHt9fSB7CgkJCXNldCByZXQgW2NvbmNhdCAkcmV0ICRhcmNoZWFkcygkYSldCgkJICAgIH0KCQl9CgkJc2V0IGQgJGFyY3N0YXJ0KCRhKQoJCWlmIHshW2luZm8gZXhpc3RzIHNlZW4oJGQpXX0gewoJCSAgICBsYXBwZW5kIHRvZG8gJGQKCQkgICAgc2V0IHNlZW4oJGQpIDEKCQl9CgkgICAgfQoJfQogICAgfQogICAgc2V0IHJldCBbbHNvcnQgLXVuaXF1ZSAkcmV0XQogICAgc2V0IGNhY2hlZF9kaGVhZHMoJG9yaWdpZCkgJHJldAogICAgcmV0dXJuIFtjb25jYXQgJHJldCAkYXJldF0KfQoKcHJvYyBhZGRlZHRhZyB7aWR9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjb3V0IGNhY2hlZF9kdGFncyBjYWNoZWRfYXRhZ3MKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNub3MoJGlkKV19IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjb3V0KCRpZCldfSB7CglyZWNhbGNhcmMgW2xpbmRleCAkYXJjbm9zKCRpZCkgMF0KICAgIH0KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfZHRhZ3N9CiAgICBjYXRjaCB7dW5zZXQgY2FjaGVkX2F0YWdzfQp9Cgpwcm9jIGFkZGVkaGVhZCB7aGlkIGhlYWR9IHsKICAgIGdsb2JhbCBhcmNub3MgYXJjb3V0IGNhY2hlZF9kaGVhZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNub3MoJGhpZCldfSByZXR1cm4KICAgIGlmIHshW2luZm8gZXhpc3RzIGFyY291dCgkaGlkKV19IHsKCXJlY2FsY2FyYyBbbGluZGV4ICRhcmNub3MoJGhpZCkgMF0KICAgIH0KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfZGhlYWRzfQp9Cgpwcm9jIHJlbW92ZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGNhY2hlZF9kaGVhZHMKCiAgICBjYXRjaCB7dW5zZXQgY2FjaGVkX2RoZWFkc30KfQoKcHJvYyBtb3ZlZGhlYWQge2hpZCBoZWFkfSB7CiAgICBnbG9iYWwgYXJjbm9zIGFyY291dCBjYWNoZWRfZGhlYWRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYXJjbm9zKCRoaWQpXX0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhcmNvdXQoJGhpZCldfSB7CglyZWNhbGNhcmMgW2xpbmRleCAkYXJjbm9zKCRoaWQpIDBdCiAgICB9CiAgICBjYXRjaCB7dW5zZXQgY2FjaGVkX2RoZWFkc30KfQoKcHJvYyBjaGFuZ2VkcmVmcyB7fSB7CiAgICBnbG9iYWwgY2FjaGVkX2RoZWFkcyBjYWNoZWRfZHRhZ3MgY2FjaGVkX2F0YWdzCiAgICBnbG9iYWwgYXJjdGFncyBhcmNoZWFkcyBhcmNub3MgYXJjb3V0IGlkaGVhZHMgaWR0YWdzCgogICAgZm9yZWFjaCBpZCBbY29uY2F0IFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWR0YWdzXV0gewoJaWYge1tpbmZvIGV4aXN0cyBhcmNub3MoJGlkKV0gJiYgIVtpbmZvIGV4aXN0cyBhcmNvdXQoJGlkKV19IHsKCSAgICBzZXQgYSBbbGluZGV4ICRhcmNub3MoJGlkKSAwXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRvbmVhcmMoJGEpXX0gewoJCXJlY2FsY2FyYyAkYQoJCXNldCBkb25lYXJjKCRhKSAxCgkgICAgfQoJfQogICAgfQogICAgY2F0Y2gge3Vuc2V0IGNhY2hlZF9kdGFnc30KICAgIGNhdGNoIHt1bnNldCBjYWNoZWRfYXRhZ3N9CiAgICBjYXRjaCB7dW5zZXQgY2FjaGVkX2RoZWFkc30KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIHNldCByZWZpZHMgW2NvbmNhdCBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXX0gewoJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQoJfQogICAgfQogICAgc2V0IG9sZG1haW5oZWFkICRtYWluaGVhZAogICAgcmVhZHJlZnMKICAgIGNoYW5nZWRyZWZzCiAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglzZXQgdiBbbGlzdHJlZnMgJGlkXQoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdiB8fAoJICAgICgkaWQgZXEgJG9sZG1haW5oZWFkICYmICRpZCBuZSAkbWFpbmhlYWQpIHx8CgkgICAgKCRpZCBlcSAkbWFpbmhlYWQgJiYgJGlkIG5lICRvbGRtYWluaGVhZCl9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIGxpc3RyZWZzIHtpZH0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCgogICAgc2V0IHgge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgeCAkaWR0YWdzKCRpZCkKICAgIH0KICAgIHNldCB5IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCB5ICRpZGhlYWRzKCRpZCkKICAgIH0KICAgIHNldCB6IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR4ICR5ICR6XQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtIHRhZ29iamlkCgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIHNldCBsaW5rbnVtIDAKICAgIGlmIHshW2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJY2F0Y2ggewoJICAgIHNldCB0YWdjb250ZW50cygkdGFnKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICR0YWdvYmppZCgkdGFnKV0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnY29udGVudHMoJHRhZyldfSB7CglzZXQgdGV4dCAkdGFnY29udGVudHMoJHRhZykKICAgIH0gZWxzZSB7CglzZXQgdGV4dCAiVGFnOiAkdGFnXG5JZDogICR0YWdpZHMoJHRhZykiCiAgICB9CiAgICBhcHBlbmR3aXRobGlua3MgJHRleHQge30KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaW5pdF9mbGlzdCB7fQp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBzYXZlc3R1ZmYgLgogICAgZGVzdHJveSAuCn0KCnByb2MgZG9wcmVmcyB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3Mgc2hvd2xvY2FsY2hhbmdlcwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBjdGV4dCBkaWZmY29sb3JzIHNlbGVjdGJnY29sb3IKICAgIGdsb2JhbCB1aWZvbnQgdGFic3RvcAoKICAgIHNldCB0b3AgLmdpdGtwcmVmcwogICAgc2V0IHByZWZzdG9wICR0b3AKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzIHNob3dsb2NhbGNoYW5nZXN9IHsKCXNldCBvbGRwcmVmcygkdikgW3NldCAkdl0KICAgIH0KICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgIkdpdGsgcHJlZmVyZW5jZXMiCiAgICBsYWJlbCAkdG9wLmxkaXNwIC10ZXh0ICJDb21taXQgbGlzdCBkaXNwbGF5IG9wdGlvbnMiCiAgICAkdG9wLmxkaXNwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3Auc3BhY2VyIC10ZXh0ICIgIgogICAgbGFiZWwgJHRvcC5tYXh3aWR0aGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKGxpbmVzKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHdpZHRoIC1mcm9tIDAgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heHdpZHRoCiAgICBncmlkICR0b3Auc3BhY2VyICR0b3AubWF4d2lkdGhsICR0b3AubWF4d2lkdGggLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXhwY3QgLWZyb20gMSAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4Z3JhcGhwY3QKICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLnNob3dsb2NhbAogICAgbGFiZWwgJHRvcC5zaG93bG9jYWwubCAtdGV4dCAiU2hvdyBsb2NhbCBjaGFuZ2VzIiAtZm9udCBvcHRpb25mb250CiAgICBjaGVja2J1dHRvbiAkdG9wLnNob3dsb2NhbC5iIC12YXJpYWJsZSBzaG93bG9jYWxjaGFuZ2VzCiAgICBwYWNrICR0b3Auc2hvd2xvY2FsLmIgJHRvcC5zaG93bG9jYWwubCAtc2lkZSBsZWZ0CiAgICBncmlkIHggJHRvcC5zaG93bG9jYWwgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5kZGlzcCAtdGV4dCAiRGlmZiBkaXNwbGF5IG9wdGlvbnMiCiAgICAkdG9wLmRkaXNwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBncmlkICR0b3AuZGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZGlmZm9wdGwgLXRleHQgIk9wdGlvbnMgZm9yIGRpZmYgcHJvZ3JhbSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZW50cnkgJHRvcC5kaWZmb3B0IC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIGRpZmZvcHRzCiAgICBncmlkIHggJHRvcC5kaWZmb3B0bCAkdG9wLmRpZmZvcHQgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLm50YWcKICAgIGxhYmVsICR0b3AubnRhZy5sIC10ZXh0ICJEaXNwbGF5IG5lYXJieSB0YWdzIiAtZm9udCBvcHRpb25mb250CiAgICBjaGVja2J1dHRvbiAkdG9wLm50YWcuYiAtdmFyaWFibGUgc2hvd25lYXJ0YWdzCiAgICBwYWNrICR0b3AubnRhZy5iICR0b3AubnRhZy5sIC1zaWRlIGxlZnQKICAgIGdyaWQgeCAkdG9wLm50YWcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRhYnN0b3BsIC10ZXh0ICJ0YWJzdG9wIiAtZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AudGFic3RvcCAtZnJvbSAxIC10byAyMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIHRhYnN0b3AKICAgIGdyaWQgeCAkdG9wLnRhYnN0b3BsICR0b3AudGFic3RvcCAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmNkaXNwIC10ZXh0ICJDb2xvcnM6IHByZXNzIHRvIGNob29zZSIKICAgICR0b3AuY2Rpc3AgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGdyaWQgJHRvcC5jZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5iZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGJnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmJnYnV0IC10ZXh0ICJCYWNrZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGJnY29sb3IgMCAkdG9wLmJnIGJhY2tncm91bmQgc2V0YmddCiAgICBncmlkIHggJHRvcC5iZ2J1dCAkdG9wLmJnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5mZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGZnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmZnYnV0IC10ZXh0ICJGb3JlZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGZnY29sb3IgMCAkdG9wLmZnIGZvcmVncm91bmQgc2V0ZmddCiAgICBncmlkIHggJHRvcC5mZ2J1dCAkdG9wLmZnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmb2xkIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICBidXR0b24gJHRvcC5kaWZmb2xkYnV0IC10ZXh0ICJEaWZmOiBvbGQgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAwICR0b3AuZGlmZm9sZCAiZGlmZiBvbGQgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm9sZGJ1dCAkdG9wLmRpZmZvbGQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRpZmZuZXcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgIGJ1dHRvbiAkdG9wLmRpZmZuZXdidXQgLXRleHQgIkRpZmY6IG5ldyBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDEgJHRvcC5kaWZmbmV3ICJkaWZmIG5ldyBsaW5lcyIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5kaWZmbmV3YnV0ICR0b3AuZGlmZm5ldyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuaHVua3NlcCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgYnV0dG9uICR0b3AuaHVua3NlcGJ1dCAtdGV4dCAiRGlmZjogaHVuayBoZWFkZXIiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAyICR0b3AuaHVua3NlcCBcCgkJICAgICAgImRpZmYgaHVuayBoZWFkZXIiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5odW5rc2VwYnV0ICR0b3AuaHVua3NlcCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3Auc2VsYmdzZXAgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRzZWxlY3RiZ2NvbG9yCiAgICBidXR0b24gJHRvcC5zZWxiZ2J1dCAtdGV4dCAiU2VsZWN0IGJnIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIHNlbGVjdGJnY29sb3IgMCAkdG9wLnNlbGJnc2VwIGJhY2tncm91bmQgc2V0c2VsYmddCiAgICBncmlkIHggJHRvcC5zZWxiZ2J1dCAkdG9wLnNlbGJnc2VwIC1zdGlja3kgdwoKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIHByZWZzb2sgLWRlZmF1bHQgYWN0aXZlCiAgICAkdG9wLmJ1dHMub2sgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHByZWZzY2FuIC1kZWZhdWx0IG5vcm1hbAogICAgJHRvcC5idXRzLmNhbiBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgYmluZCAkdG9wIDxWaXNpYmlsaXR5PiAiZm9jdXMgJHRvcC5idXRzLm9rIgp9Cgpwcm9jIGNob29zZWNvbG9yIHt2IHZpIHcgeCBjbWR9IHsKICAgIGdsb2JhbCAkdgoKICAgIHNldCBjIFt0a19jaG9vc2VDb2xvciAtaW5pdGlhbGNvbG9yIFtsaW5kZXggW3NldCAkdl0gJHZpXSBcCgkgICAgICAgLXRpdGxlICJHaXRrOiBjaG9vc2UgY29sb3IgZm9yICR4Il0KICAgIGlmIHskYyBlcSB7fX0gcmV0dXJuCiAgICAkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICBsc2V0ICR2ICR2aSAkYwogICAgZXZhbCAkY21kICRjCn0KCnByb2Mgc2V0c2VsYmcge2N9IHsKICAgIGdsb2JhbCBiZ2xpc3QgY2ZsaXN0CiAgICBmb3JlYWNoIHcgJGJnbGlzdCB7CgkkdyBjb25maWd1cmUgLXNlbGVjdGJhY2tncm91bmQgJGMKICAgIH0KICAgICRjZmxpc3QgdGFnIGNvbmZpZ3VyZSBoaWdobGlnaHQgXAoJLWJhY2tncm91bmQgWyRjZmxpc3QgY2dldCAtc2VsZWN0YmFja2dyb3VuZF0KICAgIGFsbGNhbnZzIGl0ZW1jb25mIHNlY3NlbCAtZmlsbCAkYwp9Cgpwcm9jIHNldGJnIHtjfSB7CiAgICBnbG9iYWwgYmdsaXN0CgogICAgZm9yZWFjaCB3ICRiZ2xpc3QgewoJJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgfQp9Cgpwcm9jIHNldGZnIHtjfSB7CiAgICBnbG9iYWwgZmdsaXN0IGNhbnYKCiAgICBmb3JlYWNoIHcgJGZnbGlzdCB7CgkkdyBjb25mIC1mb3JlZ3JvdW5kICRjCiAgICB9CiAgICBhbGxjYW52cyBpdGVtY29uZiB0ZXh0IC1maWxsICRjCiAgICAkY2FudiBpdGVtY29uZiBjaXJjbGUgLW91dGxpbmUgJGMKfQoKcHJvYyBwcmVmc2NhbiB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3Mgc2hvd2xvY2FsY2hhbmdlcwoKICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzIHNob3dsb2NhbGNoYW5nZXN9IHsKCXNldCAkdiAkb2xkcHJlZnMoJHYpCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAp9Cgpwcm9jIHByZWZzb2sge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0CiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzIHNob3dsb2NhbGNoYW5nZXMKICAgIGdsb2JhbCBjaGFyc3BjIGN0ZXh0IHRhYnN0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAogICAgJGN0ZXh0IGNvbmZpZ3VyZSAtdGFicyAiW2V4cHIgeyR0YWJzdG9wICogJGNoYXJzcGN9XSIKICAgIGlmIHskc2hvd2xvY2FsY2hhbmdlcyAhPSAkb2xkcHJlZnMoc2hvd2xvY2FsY2hhbmdlcyl9IHsKCWlmIHskc2hvd2xvY2FsY2hhbmdlc30gewoJICAgIGRvc2hvd2xvY2FsY2hhbmdlcwoJfSBlbHNlIHsKCSAgICBkb2hpZGVsb2NhbGNoYW5nZXMKCX0KICAgIH0KICAgIGlmIHskbWF4d2lkdGggIT0gJG9sZHByZWZzKG1heHdpZHRoKQoJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKCXJlZGlzcGxheQogICAgfSBlbHNlaWYgeyRzaG93bmVhcnRhZ3MgIT0gJG9sZHByZWZzKHNob3duZWFydGFncyl9IHsKCXJlc2VsZWN0bGluZQogICAgfQp9Cgpwcm9jIGZvcm1hdGRhdGUge2R9IHsKICAgIGlmIHskZCBuZSB7fX0gewoJc2V0IGQgW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICByZXR1cm4gJGQKfQoKIyBUaGlzIGxpc3Qgb2YgZW5jb2RpbmcgbmFtZXMgYW5kIGFsaWFzZXMgaXMgZGlzdGlsbGVkIGZyb20KIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgojIE5vdCBhbGwgb2YgdGhlbSBhcmUgc3VwcG9ydGVkIGJ5IFRjbC4Kc2V0IGVuY29kaW5nX2FsaWFzZXMgewogICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCiAgICAgIElTTzY0Ni1VUyBVUy1BU0NJSSB1cyBJQk0zNjcgY3AzNjcgY3NBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1VVEYtMSBjc0lTTzEwNjQ2VVRGMSB9CiAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQogICAgeyBJTlZBUklBTlQgY3NJTlZBUklBTlQgfQogICAgeyBJU09fNjQ2LmlydjoxOTgzIGlzby1pci0yIGlydiBjc0lTTzJJbnRsUmVmVmVyc2lvbiB9CiAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQogICAgeyBOQVRTLVNFRkkgaXNvLWlyLTgtMSBjc05BVFNTRUZJIH0KICAgIHsgTkFUUy1TRUZJLUFERCBpc28taXItOC0yIGNzTkFUU1NFRklBREQgfQogICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KICAgIHsgTkFUUy1EQU5PLUFERCBpc28taXItOS0yIGNzTkFUU0RBTk9BREQgfQogICAgeyBTRU5fODUwMjAwX0IgaXNvLWlyLTEwIEZJIElTTzY0Ni1GSSBJU082NDYtU0Ugc2UgY3NJU08xMFN3ZWRpc2ggfQogICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQogICAgeyBLU19DXzU2MDEtMTk4NyBpc28taXItMTQ5IEtTX0NfNTYwMS0xOTg5IEtTQ181NjAxIGtvcmVhbiBjc0tTQzU2MDExOTg3IH0KICAgIHsgSVNPLTIwMjItS1IgY3NJU08yMDIyS1IgfQogICAgeyBFVUMtS1IgY3NFVUNLUiB9CiAgICB7IElTTy0yMDIyLUpQIGNzSVNPMjAyMkpQIH0KICAgIHsgSVNPLTIwMjItSlAtMiBjc0lTTzIwMjJKUDIgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNwogICAgICBjc0lTTzEzSklTQzYyMjBqcCB9CiAgICB7IEpJU19DNjIyMC0xOTY5LXJvIGlzby1pci0xNCBqcCBJU082NDYtSlAgY3NJU08xNEpJU0M2MjIwcm8gfQogICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KICAgIHsgUFQgaXNvLWlyLTE2IElTTzY0Ni1QVCBjc0lTTzE2UG9ydHVndWVzZSB9CiAgICB7IEVTIGlzby1pci0xNyBJU082NDYtRVMgY3NJU08xN1NwYW5pc2ggfQogICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KICAgIHsgbGF0aW4tZ3JlZWsgaXNvLWlyLTE5IGNzSVNPMTlMYXRpbkdyZWVrIH0KICAgIHsgRElOXzY2MDAzIGlzby1pci0yMSBkZSBJU082NDYtREUgY3NJU08yMUdlcm1hbiB9CiAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KICAgIHsgTGF0aW4tZ3JlZWstMSBpc28taXItMjcgY3NJU08yN0xhdGluR3JlZWsxIH0KICAgIHsgSVNPXzU0MjcgaXNvLWlyLTM3IGNzSVNPNTQyN0N5cmlsbGljIH0KICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQogICAgeyBCU192aWV3ZGF0YSBpc28taXItNDcgY3NJU080N0JTVmlld2RhdGEgfQogICAgeyBJTklTIGlzby1pci00OSBjc0lTTzQ5SU5JUyB9CiAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KICAgIHsgSU5JUy1jeXJpbGxpYyBpc28taXItNTEgY3NJU081MUlOSVNDeXJpbGxpYyB9CiAgICB7IElTT181NDI3OjE5ODEgaXNvLWlyLTU0IElTTzU0MjdDeXJpbGxpYzE5ODEgfQogICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CiAgICB7IEdCXzE5ODgtODAgaXNvLWlyLTU3IGNuIElTTzY0Ni1DTiBjc0lTTzU3R0IxOTg4IH0KICAgIHsgR0JfMjMxMi04MCBpc28taXItNTggY2hpbmVzZSBjc0lTTzU4R0IyMzEyODAgfQogICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCiAgICAgIGNzSVNPNjBOb3J3ZWdpYW4xIH0KICAgIHsgTlNfNDU1MS0yIElTTzY0Ni1OTzIgaXNvLWlyLTYxIG5vMiBjc0lTTzYxTm9yd2VnaWFuMiB9CiAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CiAgICB7IHZpZGVvdGV4LXN1cHBsIGlzby1pci03MCBjc0lTTzcwVmlkZW90ZXhTdXBwMSB9CiAgICB7IFBUMiBpc28taXItODQgSVNPNjQ2LVBUMiBjc0lTTzg0UG9ydHVndWVzZTIgfQogICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KICAgIHsgTVNaXzc3OTUuMyBpc28taXItODYgSVNPNjQ2LUhVIGh1IGNzSVNPODZIdW5nYXJpYW4gfQogICAgeyBKSVNfQzYyMjYtMTk4MyBpc28taXItODcgeDAyMDggSklTX1gwMjA4LTE5ODMgY3NJU084N0pJU1gwMjA4IH0KICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KICAgIHsgQVNNT180NDkgSVNPXzkwMzYgYXJhYmljNyBpc28taXItODkgY3NJU084OUFTTU80NDkgfQogICAgeyBpc28taXItOTAgY3NJU085MCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYiBpc28taXItOTIgSVNPNjQ2LUpQLU9DUi1CIGpwLW9jci1iCiAgICAgIGNzSVNPOTJKSVNDNjI5OTE5ODRiIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZCBpc28taXItOTQganAtb2NyLWhhbmQgY3NJU085NEpJUzYyMjkxOTg0aGFuZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQtYWRkIGlzby1pci05NSBqcC1vY3ItaGFuZC1hZGQKICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWthbmEgaXNvLWlyLTk2IGNzSVNPOTZKSVNDNjIyOTE5ODRrYW5hIH0KICAgIHsgSVNPXzIwMzMtMTk4MyBpc28taXItOTggZTEzYiBjc0lTTzIwMzMgfQogICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KICAgIHsgSVNPXzg4NTktMToxOTg3IGlzby1pci0xMDAgSVNPXzg4NTktMSBJU08tODg1OS0xIGxhdGluMSBsMSBJQk04MTkKICAgICAgQ1A4MTkgY3NJU09MYXRpbjEgfQogICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KICAgIHsgVC42MS03Yml0IGlzby1pci0xMDIgY3NJU08xMDJUNjE3Yml0IH0KICAgIHsgVC42MS04Yml0IFQuNjEgaXNvLWlyLTEwMyBjc0lTTzEwM1Q2MThiaXQgfQogICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KICAgIHsgSVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBJU08tODg1OS00IGxhdGluNCBsNCBjc0lTT0xhdGluNCB9CiAgICB7IEVDTUEtY3lyaWxsaWMgaXNvLWlyLTExMSBLT0k4LUUgY3NJU08xMTFFQ01BQ3lyaWxsaWMgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMiBpc28taXItMTIyIElTTzY0Ni1DQTIgY3NhNy0yIGNzSVNPMTIyQ2FuYWRpYW4yIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LWdyIGlzby1pci0xMjMgY3NJU08xMjNDU0FaMjQzNDE5ODVnciB9CiAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAogICAgICBhcmFiaWMgY3NJU09MYXRpbkFyYWJpYyB9CiAgICB7IElTT184ODU5LTYtRSBjc0lTTzg4NTk2RSBJU08tODg1OS02LUUgfQogICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KICAgIHsgSVNPXzg4NTktNzoxOTg3IGlzby1pci0xMjYgSVNPXzg4NTktNyBJU08tODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4CiAgICAgIGdyZWVrIGdyZWVrOCBjc0lTT0xhdGluR3JlZWsgfQogICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KICAgIHsgSVNPXzg4NTktODoxOTg4IGlzby1pci0xMzggSVNPXzg4NTktOCBJU08tODg1OS04IGhlYnJldwogICAgICBjc0lTT0xhdGluSGVicmV3IH0KICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CiAgICB7IElTT184ODU5LTgtSSBjc0lTTzg4NTk4SSBJU08tODg1OS04LUkgfQogICAgeyBDU05fMzY5MTAzIGlzby1pci0xMzkgY3NJU08xMzlDU04zNjkxMDMgfQogICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQogICAgeyBJU09fNjkzNy0yLWFkZCBpc28taXItMTQyIGNzSVNPVGV4dENvbW0gfQogICAgeyBJRUNfUDI3LTEgaXNvLWlyLTE0MyBjc0lTTzE0M0lFQ1AyNzEgfQogICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKICAgICAgY3NJU09MYXRpbkN5cmlsbGljIH0KICAgIHsgSlVTX0kuQjEuMDAzLXNlcmIgaXNvLWlyLTE0NiBzZXJiaWFuIGNzSVNPMTQ2U2VyYmlhbiB9CiAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CiAgICB7IElTT184ODU5LTk6MTk4OSBpc28taXItMTQ4IElTT184ODU5LTkgSVNPLTg4NTktOSBsYXRpbjUgbDUgY3NJU09MYXRpbjUgfQogICAgeyBncmVlay1jY2l0dCBpc28taXItMTUwIGNzSVNPMTUwIGNzSVNPMTUwR3JlZWtDQ0lUVCB9CiAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQogICAgeyBJU09fNjkzNy0yLTI1IGlzby1pci0xNTIgY3NJU082OTM3QWRkIH0KICAgIHsgR09TVF8xOTc2OC03NCBTVF9TRVZfMzU4LTg4IGlzby1pci0xNTMgY3NJU08xNTNHT1NUMTk3Njg3NCB9CiAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQogICAgeyBJU09fMTAzNjctYm94IGlzby1pci0xNTUgY3NJU08xMDM2N0JveCB9CiAgICB7IElTTy04ODU5LTEwIGlzby1pci0xNTcgbDYgSVNPXzg4NTktMTA6MTk5MiBjc0lTT0xhdGluNiBsYXRpbjYgfQogICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQogICAgeyBKSVNfWDAyMTItMTk5MCB4MDIxMiBpc28taXItMTU5IGNzSVNPMTU5SklTWDAyMTIxOTkwIH0KICAgIHsgRFNfMjA4OSBEUzIwODkgSVNPNjQ2LURLIGRrIGNzSVNPNjQ2RGFuaXNoIH0KICAgIHsgdXMtZGsgY3NVU0RLIH0KICAgIHsgZGstdXMgY3NES1VTIH0KICAgIHsgSklTX1gwMjAxIFgwMjAxIGNzSGFsZldpZHRoS2F0YWthbmEgfQogICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQogICAgeyBJU08tMTA2NDYtVUNTLTIgY3NVbmljb2RlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy00IGNzVUNTNCB9CiAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KICAgIHsgaHAtcm9tYW44IHJvbWFuOCByOCBjc0hQUm9tYW44IH0KICAgIHsgbWFjaW50b3NoIG1hYyBjc01hY2ludG9zaCB9CiAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKICAgICAgY3NJQk0wMzcgfQogICAgeyBJQk0wMzggRUJDRElDLUlOVCBjcDAzOCBjc0lCTTAzOCB9CiAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CiAgICB7IElCTTI3NCBFQkNESUMtQkUgQ1AyNzQgY3NJQk0yNzQgfQogICAgeyBJQk0yNzUgRUJDRElDLUJSIGNwMjc1IGNzSUJNMjc1IH0KICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQogICAgeyBJQk0yNzggQ1AyNzggZWJjZGljLWNwLWZpIGViY2RpYy1jcC1zZSBjc0lCTTI3OCB9CiAgICB7IElCTTI4MCBDUDI4MCBlYmNkaWMtY3AtaXQgY3NJQk0yODAgfQogICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQogICAgeyBJQk0yODQgQ1AyODQgZWJjZGljLWNwLWVzIGNzSUJNMjg0IH0KICAgIHsgSUJNMjg1IENQMjg1IGViY2RpYy1jcC1nYiBjc0lCTTI4NSB9CiAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CiAgICB7IElCTTI5NyBjcDI5NyBlYmNkaWMtY3AtZnIgY3NJQk0yOTcgfQogICAgeyBJQk00MjAgY3A0MjAgZWJjZGljLWNwLWFyMSBjc0lCTTQyMCB9CiAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQogICAgeyBJQk00MjQgY3A0MjQgZWJjZGljLWNwLWhlIGNzSUJNNDI0IH0KICAgIHsgSUJNNDM3IGNwNDM3IDQzNyBjc1BDOENvZGVQYWdlNDM3IH0KICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQogICAgeyBJQk03NzUgY3A3NzUgY3NQQzc3NUJhbHRpYyB9CiAgICB7IElCTTg1MCBjcDg1MCA4NTAgY3NQQzg1ME11bHRpbGluZ3VhbCB9CiAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQogICAgeyBJQk04NTIgY3A4NTIgODUyIGNzUENwODUyIH0KICAgIHsgSUJNODU1IGNwODU1IDg1NSBjc0lCTTg1NSB9CiAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQogICAgeyBJQk04NjAgY3A4NjAgODYwIGNzSUJNODYwIH0KICAgIHsgSUJNODYxIGNwODYxIDg2MSBjcC1pcyBjc0lCTTg2MSB9CiAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KICAgIHsgSUJNODYzIGNwODYzIDg2MyBjc0lCTTg2MyB9CiAgICB7IElCTTg2NCBjcDg2NCBjc0lCTTg2NCB9CiAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQogICAgeyBJQk04NjYgY3A4NjYgODY2IGNzSUJNODY2IH0KICAgIHsgSUJNODY4IENQODY4IGNwLWFyIGNzSUJNODY4IH0KICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CiAgICB7IElCTTg3MCBDUDg3MCBlYmNkaWMtY3Atcm9lY2UgZWJjZGljLWNwLXl1IGNzSUJNODcwIH0KICAgIHsgSUJNODcxIENQODcxIGViY2RpYy1jcC1pcyBjc0lCTTg3MSB9CiAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQogICAgeyBJQk04OTEgY3A4OTEgY3NJQk04OTEgfQogICAgeyBJQk05MDMgY3A5MDMgY3NJQk05MDMgfQogICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CiAgICB7IElCTTkwNSBDUDkwNSBlYmNkaWMtY3AtdHIgY3NJQk05MDUgfQogICAgeyBJQk05MTggQ1A5MTggZWJjZGljLWNwLWFyMiBjc0lCTTkxOCB9CiAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CiAgICB7IEVCQ0RJQy1BVC1ERSBjc0lCTUVCQ0RJQ0FUREUgfQogICAgeyBFQkNESUMtQVQtREUtQSBjc0VCQ0RJQ0FUREVBIH0KICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CiAgICB7IEVCQ0RJQy1ESy1OTyBjc0VCQ0RJQ0RLTk8gfQogICAgeyBFQkNESUMtREstTk8tQSBjc0VCQ0RJQ0RLTk9BIH0KICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CiAgICB7IEVCQ0RJQy1GSS1TRS1BIGNzRUJDRElDRklTRUEgfQogICAgeyBFQkNESUMtRlIgY3NFQkNESUNGUiB9CiAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KICAgIHsgRUJDRElDLVBUIGNzRUJDRElDUFQgfQogICAgeyBFQkNESUMtRVMgY3NFQkNESUNFUyB9CiAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KICAgIHsgRUJDRElDLUVTLVMgY3NFQkNESUNFU1MgfQogICAgeyBFQkNESUMtVUsgY3NFQkNESUNVSyB9CiAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KICAgIHsgVU5LTk9XTi04QklUIGNzVW5rbm93bjhCaVQgfQogICAgeyBNTkVNT05JQyBjc01uZW1vbmljIH0KICAgIHsgTU5FTSBjc01uZW0gfQogICAgeyBWSVNDSUkgY3NWSVNDSUkgfQogICAgeyBWSVFSIGNzVklRUiB9CiAgICB7IEtPSTgtUiBjc0tPSThSIH0KICAgIHsgSUJNMDA4NTggQ0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyB9CiAgICB7IElCTTAwOTI0IENDU0lEMDA5MjQgQ1AwMDkyNCBlYmNkaWMtTGF0aW45LS1ldXJvIH0KICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KICAgIHsgSUJNMDExNDEgQ0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyB9CiAgICB7IElCTTAxMTQyIENDU0lEMDExNDIgQ1AwMTE0MiBlYmNkaWMtZGstMjc3K2V1cm8gZWJjZGljLW5vLTI3NytldXJvIH0KICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQogICAgeyBJQk0wMTE0NCBDQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIH0KICAgIHsgSUJNMDExNDUgQ0NTSUQwMTE0NSBDUDAxMTQ1IGViY2RpYy1lcy0yODQrZXVybyB9CiAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQogICAgeyBJQk0wMTE0NyBDQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIH0KICAgIHsgSUJNMDExNDggQ0NTSUQwMTE0OCBDUDAxMTQ4IGViY2RpYy1pbnRlcm5hdGlvbmFsLTUwMCtldXJvIH0KICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CiAgICB7IElCTTEwNDcgSUJNLTEwNDcgfQogICAgeyBQVENQMTU0IGNzUFRDUDE1NCBQVDE1NCBDUDE1NCBDeXJpbGxpYy1Bc2lhbiB9CiAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQogICAgeyBVTklDT0RFLTEtMSBjc1VuaWNvZGUxMSB9CiAgICB7IENFU1UtOCBjc0NFU1UtOCB9CiAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CiAgICB7IFVOSUNPREUtMS0xLVVURi03IGNzVW5pY29kZTExVVRGNyB9CiAgICB7IElTTy04ODU5LTE0IGlzby1pci0xOTkgSVNPXzg4NTktMTQ6MTk5OCBJU09fODg1OS0xNCBsYXRpbjggaXNvLWNlbHRpYwogICAgICBsOCB9CiAgICB7IElTTy04ODU5LTE1IElTT184ODU5LTE1IExhdGluLTkgfQogICAgeyBJU08tODg1OS0xNiBpc28taXItMjI2IElTT184ODU5LTE2OjIwMDEgSVNPXzg4NTktMTYgbGF0aW4xMCBsMTAgfQogICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQogICAgeyBKSVNfRW5jb2RpbmcgY3NKSVNFbmNvZGluZyB9CiAgICB7IFNoaWZ0X0pJUyBNU19LYW5qaSBjc1NoaWZ0SklTIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKICAgICAgRVVDLUpQIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZSBjc0VVQ0ZpeFdpZEphcGFuZXNlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSBjc1VuaWNvZGVMYXRpbjEgSVNPLTEwNjQ2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjEgY3NVbmljb2RlSUJNMTI2MSB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI3NiBjc1VuaWNvZGVJQk0xMjc2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjQgY3NVbmljb2RlSUJNMTI2NCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEgY3NXaW5kb3dzMzBMYXRpbjEgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4xLUxhdGluLTEgY3NXaW5kb3dzMzFMYXRpbjEgfQogICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CiAgICB7IElTTy04ODU5LTktV2luZG93cy1MYXRpbi01IGNzV2luZG93czMxTGF0aW41IH0KICAgIHsgQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcgY3NBZG9iZVN0YW5kYXJkRW5jb2RpbmcgfQogICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KICAgIHsgVmVudHVyYS1JbnRlcm5hdGlvbmFsIGNzVmVudHVyYUludGVybmF0aW9uYWwgfQogICAgeyBQQzgtRGFuaXNoLU5vcndlZ2lhbiBjc1BDOERhbmlzaE5vcndlZ2lhbiB9CiAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CiAgICB7IElCTS1TeW1ib2xzIGNzSUJNU3ltYm9scyB9CiAgICB7IElCTS1UaGFpIGNzSUJNVGhhaSB9CiAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CiAgICB7IEhQLVBpLWZvbnQgY3NIUFBpRm9udCB9CiAgICB7IEhQLU1hdGg4IGNzSFBNYXRoOCB9CiAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KICAgIHsgSFAtRGVza1RvcCBjc0hQRGVza3RvcCB9CiAgICB7IFZlbnR1cmEtTWF0aCBjc1ZlbnR1cmFNYXRoIH0KICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KICAgIHsgV2luZG93cy0zMUogY3NXaW5kb3dzMzFKIH0KICAgIHsgR0IyMzEyIGNzR0IyMzEyIH0KICAgIHsgQmlnNSBjc0JpZzUgfQp9Cgpwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CiAgICBnbG9iYWwgZW5jb2RpbmdfYWxpYXNlcwogICAgc2V0IG5hbWVzIFtlbmNvZGluZyBuYW1lc10KICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCiAgICBzZXQgZW5jIFtzdHJpbmcgdG9sb3dlciAkZW5jXQogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmNdCiAgICBpZiB7JGkgPCAwfSB7CgkjIGxvb2sgZm9yICJpc29ubm4iIGluc3RlYWQgb2YgImlzby1ubm4iIG9yICJpc29fbm5uIgoJaWYge1tyZWdzdWIge15pc29bLV9dfSAkZW5jIGlzbyBlbmN4XX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KCX0KICAgIH0KICAgIGlmIHskaSA8IDB9IHsKCWZvcmVhY2ggbCAkZW5jb2RpbmdfYWxpYXNlcyB7CgkgICAgc2V0IGxsIFtzdHJpbmcgdG9sb3dlciAkbF0KCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCgkgICAgIyBsb29rIHRocm91Z2ggdGhlIGFsaWFzZXMgZm9yIG9uZSB0aGF0IHRjbCBrbm93cyBhYm91dAoJICAgIGZvcmVhY2ggZSAkbGwgewoJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIGlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGUgaXNvIGV4XX0gewoJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQoJCSAgICB9CgkJfQoJCWlmIHskaSA+PSAwfSBicmVhawoJICAgIH0KCSAgICBicmVhawoJfQogICAgfQogICAgaWYgeyRpID49IDB9IHsKCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KICAgIH0KICAgIHJldHVybiB7fQp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBkaWZmb3B0cyAiLVUgNSAtcCIKc2V0IHdyY29tY21kICJnaXQgZGlmZi10cmVlIC0tc3RkaW4gLXAgLS1wcmV0dHkiCgpzZXQgZ2l0ZW5jb2Rpbmcge30KY2F0Y2ggewogICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdCBjb25maWcgLS1nZXQgaTE4bi5jb21taXRlbmNvZGluZ10KfQppZiB7JGdpdGVuY29kaW5nID09ICIifSB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgInV0Zi04Igp9CnNldCB0Y2xlbmNvZGluZyBbdGNsX2VuY29kaW5nICRnaXRlbmNvZGluZ10KaWYgeyR0Y2xlbmNvZGluZyA9PSB7fX0gewogICAgcHV0cyBzdGRlcnIgIldhcm5pbmc6IGVuY29kaW5nICRnaXRlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IFRjbC9UayIKfQoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCB1aWZvbnQge0hlbHZldGljYSA5IGJvbGR9CnNldCB0YWJzdG9wIDgKc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKc2V0IGZhc3RkYXRlIDAKc2V0IHVwYXJyb3dsZW4gNwpzZXQgZG93bmFycm93bGVuIDcKc2V0IG1pbmdhcGxlbiAzMApzZXQgY21pdG1vZGUgInBhdGNoIgpzZXQgd3JhcGNvbW1lbnQgIm5vbmUiCnNldCBzaG93bmVhcnRhZ3MgMQpzZXQgbWF4cmVmcyAyMApzZXQgbWF4bGluZWxlbiAyMDAKc2V0IHNob3dsb2NhbGNoYW5nZXMgMQoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CnNldCBiZ2NvbG9yIHdoaXRlCnNldCBmZ2NvbG9yIGJsYWNrCnNldCBkaWZmY29sb3JzIHtyZWQgIiMwMGEwMDAiIGJsdWV9CnNldCBzZWxlY3RiZ2NvbG9yIGdyYXk4NQoKY2F0Y2gge3NvdXJjZSB+Ly5naXRrfQoKZm9udCBjcmVhdGUgb3B0aW9uZm9udCAtZmFtaWx5IHNhbnMtc2VyaWYgLXNpemUgLTEyCgojIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4Kc2V0IGdpdGRpciBbZ2l0ZGlyXQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CiAgICBzaG93X2Vycm9yIHt9IC4gIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKICAgIGV4aXQgMQp9CgpzZXQgcmV2dHJlZWFyZ3Mge30Kc2V0IGNtZGxpbmVfZmlsZXMge30Kc2V0IGkgMApmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLS0gJGFyZyB7CgkiIiB7IH0KCSItZCIgeyBzZXQgZGF0ZW1vZGUgMSB9CgkiLS0iIHsKCSAgICBzZXQgY21kbGluZV9maWxlcyBbbHJhbmdlICRhcmd2IFtleHByIHskaSArIDF9XSBlbmRdCgkgICAgYnJlYWsKCX0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQogICAgaW5jciBpCn0KCmlmIHskaSA+PSBbbGxlbmd0aCAkYXJndl0gJiYgJHJldnRyZWVhcmdzIG5lIHt9fSB7CiAgICAjIG5vIC0tIG9uIGNvbW1hbmQgbGluZSwgYnV0IHNvbWUgYXJndW1lbnRzIChvdGhlciB0aGFuIC1kKQogICAgaWYge1tjYXRjaCB7CglzZXQgZiBbZXZhbCBleGVjIGdpdCByZXYtcGFyc2UgLS1uby1yZXZzIC0tbm8tZmxhZ3MgJHJldnRyZWVhcmdzXQoJc2V0IGNtZGxpbmVfZmlsZXMgW3NwbGl0ICRmICJcbiJdCglzZXQgbiBbbGxlbmd0aCAkY21kbGluZV9maWxlc10KCXNldCByZXZ0cmVlYXJncyBbbHJhbmdlICRyZXZ0cmVlYXJncyAwIGVuZC0kbl0KCSMgVW5mb3J0dW5hdGVseSBnaXQgcmV2LXBhcnNlIGRvZXNuJ3QgcHJvZHVjZSBhbiBlcnJvciB3aGVuCgkjIHNvbWV0aGluZyBpcyBib3RoIGEgcmV2aXNpb24gYW5kIGEgZmlsZW5hbWUuICBUbyBiZSBjb25zaXN0ZW50CgkjIHdpdGggZ2l0IGxvZyBhbmQgZ2l0IHJldi1saXN0LCBjaGVjayByZXZ0cmVlYXJncyBmb3IgZmlsZW5hbWVzLgoJZm9yZWFjaCBhcmcgJHJldnRyZWVhcmdzIHsKCSAgICBpZiB7W2ZpbGUgZXhpc3RzICRhcmddfSB7CgkJc2hvd19lcnJvciB7fSAuICJBbWJpZ3VvdXMgYXJndW1lbnQgJyRhcmcnOiBib3RoIHJldmlzaW9uXAoJCQkJIGFuZCBmaWxlbmFtZSIKCQlleGl0IDEKCSAgICB9Cgl9CiAgICB9IGVycl19IHsKCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAoJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KCXNldCBpIFtzdHJpbmcgZmlyc3QgImZhdGFsOiIgJGVycl0KCWlmIHskaSA+IDB9IHsKCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQoJfQoJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgoJZXhpdCAxCiAgICB9Cn0KCnNldCBudWxsaWQgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCgpzZXQgcnVucSB7fQpzZXQgaGlzdG9yeSB7fQpzZXQgaGlzdG9yeWluZGV4IDAKc2V0IGZoX3NlcmlhbCAwCnNldCBuaGxfbmFtZXMge30Kc2V0IGhpZ2hsaWdodF9wYXRocyB7fQpzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKc2V0IGJvbGRyb3dzIHt9CnNldCBib2xkbmFtZXJvd3Mge30Kc2V0IGRpZmZlbGlkZSB7MCAwfQpzZXQgbWFya2luZ21hdGNoZXMgMAoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgbmV4dHZpZXdudW0gMQpzZXQgY3VydmlldyAwCnNldCBzZWxlY3RlZHZpZXcgMApzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQpzZXQgdmlld2ZpbGVzKDApIHt9CnNldCB2aWV3cGVybSgwKSAwCnNldCB2aWV3YXJncygwKSB7fQoKc2V0IGNtZGxpbmVvayAwCnNldCBzdG9wcGVkIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXQgbG9va2luZ2ZvcmhlYWQgMApzZXQgbG9jYWxyb3cgLTEKc2V0IGxzZXJpYWwgMApzZXRjb29yZHMKbWFrZXdpbmRvdwp3bSB0aXRsZSAuICJbZmlsZSB0YWlsICRhcmd2MF06IFtmaWxlIHRhaWwgW3B3ZF1dIgpyZWFkcmVmcwoKaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0gewogICAgIyBjcmVhdGUgYSB2aWV3IGZvciB0aGUgZmlsZXMvZGlycyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQogICAgc2V0IGN1cnZpZXcgMQogICAgc2V0IHNlbGVjdGVkdmlldyAxCiAgICBzZXQgbmV4dHZpZXdudW0gMgogICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCiAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCiAgICBzZXQgdmlld2FyZ3MoMSkgJHJldnRyZWVhcmdzCiAgICBzZXQgdmlld3Blcm0oMSkgMAogICAgYWRkdmlld21lbnUgMQogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgbm9ybWFsCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIG5vcm1hbAp9CgppZiB7W2luZm8gZXhpc3RzIHBlcm12aWV3c119IHsKICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKCXNldCBuICRuZXh0dmlld251bQoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCglzZXQgdmlld2ZpbGVzKCRuKSBbbGluZGV4ICR2IDFdCglzZXQgdmlld2FyZ3MoJG4pIFtsaW5kZXggJHYgMl0KCXNldCB2aWV3cGVybSgkbikgMQoJYWRkdmlld21lbnUgJG4KICAgIH0KfQpnZXRjb21taXRzCg==