IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBnZXRjb21taXRzIHtyYXJnc30gewogICAgZ2xvYmFsIGNvbW1pdHMgY29tbWZkIHBoYXNlIGNhbnYgbWFpbmZvbnQgZW52CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvciBsZWZ0b3ZlciBnaXRlbmNvZGluZwoKICAgICMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgogICAgc2V0IGdpdGRpciBbZ2l0ZGlyXQogICAgaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSAkZ2l0ZGlyXX0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKCWV4aXQgMQogICAgfQogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7JHN0YXJ0bXNlY3MgKyAxMDB9XQogICAgc2V0IG5jbXVwZGF0ZSAxCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAtLXBhcmVudHMgJHBhcnNlZF9hcmdzIiByXQogICAgfSBlcnJdIHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0LXJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgbGVmdG92ZXIge30KICAgIGZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nICRnaXRlbmNvZGluZwogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGNvbW1mZF0KICAgICRjYW52IGRlbGV0ZSBhbGwKICAgICRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJSZWFkaW5nIGNvbW1pdHMuLi4iIFwKCS1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKfQoKcHJvYyBnZXRjb21taXRsaW5lcyB7Y29tbWZkfSAgewogICAgZ2xvYmFsIGNvbW1pdHMgcGFyZW50cyBjZGF0ZSBjaGlsZHJlbgogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBwaGFzZSBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc3RvcHBlZCByZWRpc3BsYXlpbmcgbGVmdG92ZXIKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGNvbW1mZF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkY29tbWZkXX0gcmV0dXJuCgkjIHNldCBpdCBibG9ja2luZyBzbyB3ZSB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUKCWZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMQoJaWYgeyFbY2F0Y2gge2Nsb3NlICRjb21tZmR9IGVycl19IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCSAgICByZXR1cm4KCX0KCWlmIHtbc3RyaW5nIHJhbmdlICRlcnIgMCA0XSA9PSAidXNhZ2UifSB7CgkgICAgc2V0IGVyciBcCgkJIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0czogYmFkIGFyZ3VtZW50cyB0byBnaXQtcmV2LWxpc3QuXAoJCShOb3RlOiBhcmd1bWVudHMgdG8gZ2l0ayBhcmUgcGFzc2VkIHRvIGdpdC1yZXYtbGlzdFwKCQl0byBhbGxvdyBzZWxlY3Rpb24gb2YgY29tbWl0cyB0byBiZSBkaXNwbGF5ZWQuKSIKCX0gZWxzZSB7CgkgICAgc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzOiAkZXJyIgoJfQoJZXJyb3JfcG9wdXAgJGVycgoJZXhpdCAxCiAgICB9CiAgICBzZXQgc3RhcnQgMAogICAgd2hpbGUgMSB7CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcMCIgJHN0dWZmICRzdGFydF0KCWlmIHskaSA8IDB9IHsKCSAgICBhcHBlbmQgbGVmdG92ZXIgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IGVuZF0KCSAgICByZXR1cm4KCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJHN0dWZmICRzdGFydCBbZXhwciB7JGkgLSAxfV1dCglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAiJGxlZnRvdmVyJGNtaXQiCgkgICAgc2V0IGxlZnRvdmVyIHt9Cgl9CglzZXQgc3RhcnQgW2V4cHIgeyRpICsgMX1dCglzZXQgaiBbc3RyaW5nIGZpcnN0ICJcbiIgJGNtaXRdCglzZXQgb2sgMAoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgc2V0IG9rIDEKCSAgICBmb3JlYWNoIGlkICRpZHMgewoJCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglzZXQgb2xkcyBbbHJhbmdlICRpZHMgMSBlbmRdCglzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRjbWl0IFtleHByIHskaiArIDF9XSBlbmRdCglsYXBwZW5kIGNvbW1pdHMgJGlkCglzZXQgY29tbWl0bGlzdGVkKCRpZCkgMQoJcGFyc2Vjb21taXQgJGlkICRjbWl0IDEgW2xyYW5nZSAkaWRzIDEgZW5kXQoJZHJhd2NvbW1pdCAkaWQKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CgkgICAgZG91cGRhdGUgMQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUgMQoJCSAgICB9CgkJfQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlIG51bWNvbW1pdHMgbmNtdXBkYXRlCgogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSB7fQogICAgfQogICAgdXBkYXRlCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCiAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMX1dCiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPCAxMDAwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCiAgICB9IGVsc2UgewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMDB9XQogICAgfQogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiBbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQtY2F0LWZpbGUgY29tbWl0ICRpZF19XSByZXR1cm4KICAgIHBhcnNlY29tbWl0ICRpZCAkY29udGVudHMgMCB7fQp9Cgpwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWQgb2xkc30gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpICRvbGRzCiAgICBzZXQgbnBhcmVudHMoJGlkKSBbbGxlbmd0aCAkb2xkc10KICAgIGZvcmVhY2ggcCAkb2xkcyB7CglpZiB7IVtpbmZvIGV4aXN0cyBuY2hpbGRyZW4oJHApXX0gewoJICAgIHNldCBjaGlsZHJlbigkcCkgW2xpc3QgJGlkXQoJICAgIHNldCBuY2hpbGRyZW4oJHApIDEKCSAgICBzZXQgbmNsZWZ0KCRwKSAxCgl9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCSAgICBsYXBwZW5kIGNoaWxkcmVuKCRwKSAkaWQKCSAgICBpbmNyIG5jaGlsZHJlbigkcCkKCSAgICBpbmNyIG5jbGVmdCgkcCkKCX0KICAgIH0KICAgIHNldCBoZHJlbmQgW3N0cmluZyBmaXJzdCAiXG5cbiIgJGNvbnRlbnRzXQogICAgaWYgeyRoZHJlbmQgPCAwfSB7CgkjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KCXNldCBoZHJlbmQgW3N0cmluZyBsZW5ndGggJGNvbnRlbnRzXQogICAgfQogICAgc2V0IGhlYWRlciBbc3RyaW5nIHJhbmdlICRjb250ZW50cyAwIFtleHByIHskaGRyZW5kIC0gMX1dXQogICAgc2V0IGNvbW1lbnQgW3N0cmluZyByYW5nZSAkY29udGVudHMgW2V4cHIgeyRoZHJlbmQgKyAyfV0gZW5kXQogICAgZm9yZWFjaCBsaW5lIFtzcGxpdCAkaGVhZGVyICJcbiJdIHsKCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJaWYgeyR0YWcgPT0gImF1dGhvciJ9IHsKCSAgICBzZXQgYXVkYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGF1bmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9IGVsc2VpZiB7JHRhZyA9PSAiY29tbWl0dGVyIn0gewoJICAgIHNldCBjb21kYXRlIFtsaW5kZXggJGxpbmUgZW5kLTFdCgkgICAgc2V0IGNvbW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfQogICAgfQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICAjIHRha2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1lbnQgYXMgdGhlIGhlYWRsaW5lCiAgICBzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJGNvbW1lbnRdCiAgICBpZiB7JGkgPj0gMH0gewoJc2V0IGhlYWRsaW5lIFtzdHJpbmcgdHJpbSBbc3RyaW5nIHJhbmdlICRjb21tZW50IDAgJGldXQogICAgfSBlbHNlIHsKCXNldCBoZWFkbGluZSAkY29tbWVudAogICAgfQogICAgaWYgeyEkbGlzdGVkfSB7CgkjIGdpdC1yZXYtbGlzdCBpbmRlbnRzIHRoZSBjb21tZW50IGJ5IDQgc3BhY2VzOwoJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCglzZXQgbmV3Y29tbWVudCB7fQoJZm9yZWFjaCBsaW5lIFtzcGxpdCAkY29tbWVudCAiXG4iXSB7CgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIiAgICAiCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgJGxpbmUKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiXG4iCgl9CglzZXQgY29tbWVudCAkbmV3Y29tbWVudAogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQogICAgfQogICAgc2V0IGNvbW1pdGluZm8oJGlkKSBbbGlzdCAkaGVhZGxpbmUgJGF1bmFtZSAkYXVkYXRlIFwKCQkJICAgICAkY29tbmFtZSAkY29tZGF0ZSAkY29tbWVudF0KfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcwoKICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0LWxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pCXJlZnMvKFteXl0qKSR9ICRsaW5lIFwKCSAgICBtYXRjaCBpZCBwYXRoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKCSAgICBzZXQgdHlwZSBvdGhlcnMKCSAgICBzZXQgbmFtZSAkcGF0aAoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0LXJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHsiJGNvbW1pdCIgIT0gIiRpZCJ9IHsKCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAoJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQoJCX0KCSAgICB9CQkKCSAgICBjYXRjaCB7CgkgICAgICAgIHNldCB0YWdjb250ZW50cygkbmFtZSkgW2V4ZWMgZ2l0LWNhdC1maWxlIHRhZyAiJGlkIl0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IgY3VydGV4dGN1cnNvcgogICAgZ2xvYmFsIHJvd2N0eG1lbnUgbWVyZ2VtYXgKCiAgICBtZW51IC5iYXIKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKICAgIG1lbnUgLmJhci5maWxlCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZXJlYWQgcmVmZXJlbmNlcyIgLWNvbW1hbmQgcmVyZWFkcmVmcwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUXVpdCIgLWNvbW1hbmQgZG9xdWl0CiAgICBtZW51IC5iYXIuZWRpdAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAogICAgLmJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiUHJlZmVyZW5jZXMiIC1jb21tYW5kIGRvcHJlZnMKICAgIG1lbnUgLmJhci5oZWxwCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiSGVscCIgLW1lbnUgLmJhci5oZWxwCiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJBYm91dCBnaXRrIiAtY29tbWFuZCBhYm91dAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KGNhbnYxKV19IHsKCXNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIgezQ1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciB7MzAgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIHsxNSAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgezI1ICogJGxpbmVzcGMgKyA0fV0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtc2lkZSBsZWZ0CiAgICBzZXQgZmluZHN0cmluZyB7fQogICAgc2V0IGZzdHJpbmcgLmN0b3AudG9wLmJhci5maW5kc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJGZzdHJpbmcKICAgIGVudHJ5ICRmc3RyaW5nIC13aWR0aCAzMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBmaW5kc3RyaW5nCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlciBGaWxlcyBQaWNrYXhlCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CiAgICAjIGZvciBtYWtpbmcgc3VyZSB0eXBlPT1FeGFjdCB3aGVuZXZlciBsb2M9PVBpY2theGUKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRsb2NjaGFuZ2UKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJnIHdoaXRlIC1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXdpZHRoICRnZW9tZXRyeShjdGV4dHcpIC1oZWlnaHQgJGdlb21ldHJ5KGN0ZXh0aCkgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LmxlZnQuc2Igc2V0IiAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZSAiIzAwYTAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBtMSAtZm9yZSBibHVlCiAgICAkY3RleHQgdGFnIGNvbmYgbTIgLWZvcmUgZ3JlZW4KICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKICAgICRjdGV4dCB0YWcgY29uZiBtNCAtZm9yZSBicm93bgogICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKICAgIHNldCBtZXJnZW1heCA1CiAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIG1zZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBmb3VuZCAtYmFjayB5ZWxsb3cKCiAgICBmcmFtZSAuY3RvcC5jZGV0LnJpZ2h0CiAgICBzZXQgY2ZsaXN0IC5jdG9wLmNkZXQucmlnaHQuY2ZpbGVzCiAgICBsaXN0Ym94ICRjZmxpc3QgLWJnIHdoaXRlIC1zZWxlY3Rtb2RlIGV4dGVuZGVkIC13aWR0aCAkZ2VvbWV0cnkoY2ZsaXN0dykgXAoJLXlzY3JvbGxjb21tYW5kICIuY3RvcC5jZGV0LnJpZ2h0LnNiIHNldCIKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LnJpZ2h0CiAgICBiaW5kIC5jdG9wLmNkZXQgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNkZXRwYW5lcyAlVyAld30KCiAgICBwYWNrIC5jdG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKICAgIGJpbmRhbGwgPDE+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgICNiaW5kYWxsIDxCMS1Nb3Rpb24+IHtzZWxjYW52bGluZSAlVyAleCAleX0KICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtND4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtNSB1bml0cyIKICAgIGJpbmRhbGwgPEJ1dHRvblJlbGVhc2UtNT4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCA1IHVuaXRzIgogICAgYmluZGFsbCA8Mj4gImFsbGNhbnZzIHNjYW4gbWFyayAwICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiYWxsY2FudnMgc2NhbiBkcmFndG8gMCAleSIKICAgIGJpbmQgLiA8S2V5LVVwPiAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5kIC4gPEtleS1Eb3duPiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmQgLiA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZCAuIDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZCAuIDxLZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQogICAgYmluZCAuIDxDb250cm9sLXI+IGZpbmRwcmV2CiAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLUtQX0FkZD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQogICAgYmluZCAkY2ZsaXN0IDw8TGlzdGJveFNlbGVjdD4+IGxpc3Rib3hzZWwKICAgIGJpbmQgLiA8RGVzdHJveT4ge3NhdmVzdHVmZiAlV30KICAgIGJpbmQgLiA8QnV0dG9uLTE+ICJjbGljayAlVyIKICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAogICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CiAgICBiaW5kICRzaGExZW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IGNsZWFyc2hhMQoKICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KICAgIHNldCB0ZXh0Y3Vyc29yIFskY3RleHQgY2dldCAtY3Vyc29yXQogICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udAogICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBtYXh3aWR0aAoKICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCiAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAuXX0gcmV0dXJuCiAgICBjYXRjaCB7CglzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCglwdXRzICRmIFtsaXN0IHNldCBtYWluZm9udCAkbWFpbmZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0ZXh0Zm9udCAkdGV4dGZvbnRdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBtYXhncmFwaHBjdCAkbWF4Z3JhcGhwY3RdCglwdXRzICRmIFtsaXN0IHNldCBtYXh3aWR0aCAkbWF4d2lkdGhdCglwdXRzICRmICJzZXQgZ2VvbWV0cnkod2lkdGgpIFt3aW5mbyB3aWR0aCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoaGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIge1t3aW5mbyB3aWR0aCAkY2Fudl0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52Ml0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52M10tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7W3dpbmZvIGhlaWdodCAkY2Fudl0tMn1dIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY3RleHRdIC0gOCkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgJHRleHRmb250ICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGN0ZXh0dykgJHdpZCIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGNmbGlzdF0gLSAxMSkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgWyRjZmxpc3QgY2dldCAtZm9udF0gIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgJHdpZCIKCWNsb3NlICRmCglmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKICAgIH0KICAgIHNldCBzdHVmZnNhdmVkIDEKfQoKcHJvYyByZXNpemVjbGlzdHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglzZXQgczEgWyR3aW4gc2FzaCBjb29yZCAxXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdy8yIC0gMil9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCR3KjUvNiAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCAzMH0gewoJCXNldCBzYXNoMCAzMAoJICAgIH0KCSAgICBpZiB7JHNhc2gxIDwgJHNhc2gwICsgMjB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyRzYXNoMCArIDIwfV0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyR3IC0gMTB9XQoJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0gewoJCSAgICBzZXQgc2FzaDAgW2V4cHIgeyRzYXNoMSAtIDIwfV0KCQl9CgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCgkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIHJlc2l6ZWNkZXRwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYgW2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb21tY29sb3JzIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuIG5jaGlsZHJlbgogICAgZ2xvYmFsIGNvcm5lcmNyb3NzaW5ncyBjcm9zc2luZ3MKCiAgICBpZiBbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYgeyRucGFyZW50cygkaWQpIDw9IDEgJiYgJG5jaGlsZHJlbigkaWQpID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRjaGlsZHJlbigkaWQpIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgJG5wYXJlbnRzKCRjaGlsZCkgPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkaWQpXX0gewoJZm9yZWFjaCB4ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMge30KCX0KICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJaWYge1tpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJGlkKV19IHsKCSAgICBmb3JlYWNoIHggJGNyb3NzaW5ncygkaWQpIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCQl9CgkgICAgfQoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCSAgICB9Cgl9CglzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRjaGlsZCldfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjaGlsZCkgewoJCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgaW5pdGdyYXBoIHt9IHsKICAgIGdsb2JhbCBjYW52eSBjYW52eTAgbGluZW5vIG51bWNvbW1pdHMgbmV4dGNvbG9yIGxpbmVzcGMKICAgIGdsb2JhbCBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGNhdGNoIHt1bnNldCBtYWlubGluZX0KICAgIGNhdGNoIHt1bnNldCBtYWlubGluZWFycm93fQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQogICAgc2V0IGRpc3BsaXN0IHt9CiAgICBzZXQgbmh5cGVyc3BhY2UgMAp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd2xpbmVzIHtpZCB4dHJhIGRlbG9sZH0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MgY29sb3JtYXAgY2FudgoKICAgIGlmIHskZGVsb2xkfSB7CgkkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJG1haW5saW5lKCRpZCkgXAoJCSAgIC13aWR0aCBbZXhwciB7KCR4dHJhICsgMSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgXAoJCSAgIC1hcnJvdyAkbWFpbmxpbmVhcnJvdygkaWQpXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCWZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCSAgICBzZXQgY29vcmRzIFtsaW5kZXggJGxzIDBdCgkgICAgc2V0IHRoaWNrIFtsaW5kZXggJGxzIDFdCgkgICAgc2V0IGFycm93IFtsaW5kZXggJGxzIDJdCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLWZpbGwgJGNvbG9ybWFwKCRpZCkgXAoJCSAgICAgICAtd2lkdGggW2V4cHIgeygkdGhpY2sgKyAkeHRyYSkgKiAkbHRoaWNrbmVzc31dIFwKCQkgICAgICAgLWFycm93ICRhcnJvdyAtdGFncyBsaW5lcy4kaWRdCgkgICAgJGNhbnYgbG93ZXIgJHQKCSAgICBiaW5kbGluZSAkdCAkaWQKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIGRpc3BsaXN0CnByb2MgZHJhd2NvbW1pdGxpbmUge2xldmVsfSB7CiAgICBnbG9iYWwgcGFyZW50cyBjaGlsZHJlbiBucGFyZW50cyBkaXNwbGlzdAogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbWFpbmZvbnQgbmFtZWZvbnQgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29sb3JtYXAgbnVtY29tbWl0cyBjdXJyZW50cGFyZW50cyBkdXBwYXJlbnRzCiAgICBnbG9iYWwgaWR0YWdzIGlkbGluZSBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcm93dGV4dHggaWRwb3MgbGFzdHVzZSBkaXNwbGlzdAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKCiAgICBpbmNyIG51bWNvbW1pdHMKICAgIGluY3IgbGluZW5vCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxpc3QgJGxldmVsXQogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCiAgICBzZXQgbGluZWlkKCRsaW5lbm8pICRpZAogICAgc2V0IGlkbGluZSgkaWQpICRsaW5lbm8KICAgIHNldCBvZmlsbCBbZXhwciB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXT8gImJsdWUiOiAid2hpdGUifV0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJICAgIHNldCBucGFyZW50cygkaWQpIDAKCX0KICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGN1cnJlbnRwYXJlbnRzIHt9CiAgICBzZXQgZHVwcGFyZW50cyB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRsaXN0ZWQoJGlkKV0gJiYgW2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjdXJyZW50cGFyZW50cyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjdXJyZW50cGFyZW50cyAkcAoJICAgIH0gZWxzZSB7CgkJIyByZW1lbWJlciB0aGF0IHRoaXMgcGFyZW50IHdhcyBsaXN0ZWQgdHdpY2UKCQlsYXBwZW5kIGR1cHBhcmVudHMgJHAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgeCBbeGNvb3JkICRsZXZlbCAkbGV2ZWwgJGxpbmVub10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciB7JGNhbnZ5ICsgJGxpbmVzcGN9XQogICAgYWxsY2FudnMgY29uZiAtc2Nyb2xscmVnaW9uIFwKCVtsaXN0IDAgMCAwIFtleHByIHskeTEgKyAwLjUgKiAkbGluZXNwYyArIDJ9XV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCWxhcHBlbmQgbWFpbmxpbmUoJGlkKSAkeCAkeTEKCWlmIHskbWFpbmxpbmVhcnJvdygkaWQpIG5lICJub25lIn0gewoJICAgIHNldCBtYWlubGluZSgkaWQpIFt0cmltZGlhZ3N0YXJ0ICRtYWlubGluZSgkaWQpXQoJfQogICAgfQogICAgZHJhd2xpbmVzICRpZCAwIDAKICAgIHNldCBvcmFkIFtleHByIHskbGluZXNwYyAvIDN9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5MSAtICRvcmFkfV0gXAoJICAgICAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeTEgKyAkb3JhZCAtIDF9XSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbeGNvb3JkIFtsbGVuZ3RoICRkaXNwbGlzdF0gJGxldmVsICRsaW5lbm9dCiAgICBpZiB7W2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA+IDJ9IHsKCXNldCB4dCBbZXhwciB7JHh0ICsgKFtsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gLSAyKSAqICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCByb3d0ZXh0eCgkbGluZW5vKSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeTFdCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQoJfHwgW2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHkxXQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGxpbmVodGFnKCRsaW5lbm8pIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJG1haW5mb250IF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRsaW5lbm8pIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRsaW5lbm8pIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRuYW1lIC1mb250ICRuYW1lZm9udF0KICAgIHNldCBsaW5lZHRhZygkbGluZW5vKSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkxIC1hbmNob3IgdyBcCgkJCSAgICAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnRdCgogICAgc2V0IG9sZGRsZXZlbCAkbGV2ZWwKICAgIHNldCBvbGRkaXNwbGlzdCAkZGlzcGxpc3QKICAgIHNldCBvbGRubGluZXMgW2xsZW5ndGggJGRpc3BsaXN0XQp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGlkbGluZSByb3d0ZXh0eAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByIHskeTEgLSAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgeWIgW2V4cHIgeyR5dCArICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCXNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByIHskeCArICRkZWx0YX1dCglzZXQgeHIgW2V4cHIgeyR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzfV0KCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciB7JHl0ICsgJGRlbHRhfV0gJHhsICR5dCBcCgkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkaWRsaW5lKCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciB7JHhsIC0gJGRlbHRhLzJ9XQoJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKCQktd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCAkY29sIC10YWdzIHRhZy4kaWQKCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIFwKCQkgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGFnLiRpZF0KCWlmIHskbnRhZ3MgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIG5vdGVjcm9zc2luZ3Mge2lkIGxvIGhpIGNvcm5lcn0gewogICAgZ2xvYmFsIG9sZGRpc3BsaXN0IGNyb3NzaW5ncyBjb3JuZXJjcm9zc2luZ3MKCiAgICBmb3Ige3NldCBpICRsb30ge1tpbmNyIGldIDwgJGhpfSB7fSB7CglzZXQgcCBbbGluZGV4ICRvbGRkaXNwbGlzdCAkaV0KCWlmIHskcCA9PSB7fX0gY29udGludWUKCWlmIHskaSA9PSAkY29ybmVyfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0gewogICAgZ2xvYmFsIGNhbnZ4MCB4c3BjMSB4c3BjMgoKICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCiAgICBpZiB7JGkgPiAwICYmICRpID09ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCiAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArICR4c3BjMiAtICR4c3BjMSgkbG4pfV0KICAgIH0KICAgIHJldHVybiAkeAp9CgojIGl0IHNlZW1zIFRrIGNhbid0IGRyYXcgYXJyb3dzIG9uIHRoZSBlbmQgb2YgZGlhZ29uYWwgbGluZSBzZWdtZW50cy4uLgpwcm9jIHRyaW1kaWFnZW5kIHtsaW5lfSB7CiAgICB3aGlsZSB7W2xsZW5ndGggJGxpbmVdID4gNH0gewoJc2V0IHgxIFtsaW5kZXggJGxpbmUgZW5kLTNdCglzZXQgeTEgW2xpbmRleCAkbGluZSBlbmQtMl0KCXNldCB4MiBbbGluZGV4ICRsaW5lIGVuZC0xXQoJc2V0IHkyIFtsaW5kZXggJGxpbmUgZW5kXQoJaWYgeygkeDEgPT0gJHgyKSAhPSAoJHkxID09ICR5Mil9IGJyZWFrCglzZXQgbGluZSBbbHJlcGxhY2UgJGxpbmUgZW5kLTEgZW5kXQogICAgfQogICAgcmV0dXJuICRsaW5lCn0KCnByb2MgdHJpbWRpYWdzdGFydCB7bGluZX0gewogICAgd2hpbGUge1tsbGVuZ3RoICRsaW5lXSA+IDR9IHsKCXNldCB4MSBbbGluZGV4ICRsaW5lIDBdCglzZXQgeTEgW2xpbmRleCAkbGluZSAxXQoJc2V0IHgyIFtsaW5kZXggJGxpbmUgMl0KCXNldCB5MiBbbGluZGV4ICRsaW5lIDNdCglpZiB7KCR4MSA9PSAkeDIpICE9ICgkeTEgPT0gJHkyKX0gYnJlYWsKCXNldCBsaW5lIFtscmVwbGFjZSAkbGluZSAwIDFdCiAgICB9CiAgICByZXR1cm4gJGxpbmUKfQoKcHJvYyBkcmF3c2xhbnRzIHtpZCBuZWVkb25zY3JlZW4gbm9oc30gewogICAgZ2xvYmFsIGNhbnYgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMKICAgIGdsb2JhbCBjYW52eDAgY2FudnkgeHNwYzEgeHNwYzIgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBsdGhpY2tuZXNzIGxpbmVzcGMgY2FudnkgY29sb3JtYXAgbGluZW5vIGdlb21ldHJ5CiAgICBnbG9iYWwgbWF4Z3JhcGhwY3QgbWF4d2lkdGgKICAgIGdsb2JhbCBkaXNwbGlzdCBvbnNjcmVlbiBsYXN0dXNlCiAgICBnbG9iYWwgcGFyZW50cyBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBvbGRubGluZXMgb2xkZGxldmVsIG9sZGRpc3BsaXN0CiAgICBnbG9iYWwgbmh5cGVyc3BhY2UgbnVtY29tbWl0cyBubmV3cGFyZW50cwoKICAgIGlmIHskbGluZW5vIDwgMH0gewoJbGFwcGVuZCBkaXNwbGlzdCAkaWQKCXNldCBvbnNjcmVlbigkaWQpIDEKCXJldHVybiAwCiAgICB9CgogICAgc2V0IHkxIFtleHByIHskY2FudnkgLSAkbGluZXNwY31dCiAgICBzZXQgeTIgJGNhbnZ5CgogICAgIyB3b3JrIG91dCB3aGF0IHdlIG5lZWQgdG8gZ2V0IGJhY2sgb24gc2NyZWVuCiAgICBzZXQgcmVpbnMge30KICAgIGlmIHskb25zY3JlZW4oJGlkKSA8IDB9IHsKCSMgbmV4dCB0byBkbyBpc24ndCBkaXNwbGF5ZWQsIGJldHRlciBnZXQgaXQgb24gc2NyZWVuLi4uCglsYXBwZW5kIHJlaW5zIFtsaXN0ICRpZCAwXQogICAgfQogICAgIyBtYWtlIHN1cmUgYWxsIHRoZSBwcmV2aW91cyBjb21taXRzJ3MgcGFyZW50cyBhcmUgb24gdGhlIHNjcmVlbgogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglpZiB7JG9uc2NyZWVuKCRwKSA8IDB9IHsKCSAgICBsYXBwZW5kIHJlaW5zIFtsaXN0ICRwIDBdCgl9CiAgICB9CiAgICAjIGJyaW5nIGJhY2sgYW55dGhpbmcgcmVxdWVzdGVkIGJ5IGNhbGxlcgogICAgaWYgeyRuZWVkb25zY3JlZW4gbmUge319IHsKCWxhcHBlbmQgcmVpbnMgJG5lZWRvbnNjcmVlbgogICAgfQoKICAgICMgdHJ5IHRoZSBzaG9ydGN1dAogICAgaWYgeyRjdXJyZW50cGFyZW50cyA9PSAkaWQgJiYgJG9uc2NyZWVuKCRpZCkgPT0gMCAmJiAkcmVpbnMgZXEge319IHsKCXNldCBkbGV2ZWwgJG9sZGRsZXZlbAoJc2V0IHggW3hjb29yZCAkZGxldmVsICRkbGV2ZWwgJGxpbmVub10KCXNldCBtYWlubGluZSgkaWQpIFtsaXN0ICR4ICR5MV0KCXNldCBtYWlubGluZWFycm93KCRpZCkgbm9uZQoJc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCglzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkZGxldmVsICRkbGV2ZWwgJGlkXQoJc2V0IG9uc2NyZWVuKCRpZCkgMQoJc2V0IHhzcGMxKFtleHByIHskbGluZW5vICsgMX1dKSAkeHNwYzEoJGxpbmVubykKCXJldHVybiAkZGxldmVsCiAgICB9CgogICAgIyB1cGRhdGUgZGlzcGxpc3QKICAgIHNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRvbGRkbGV2ZWwgJG9sZGRsZXZlbF0KICAgIHNldCBqICRvbGRkbGV2ZWwKICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJc2V0IGxhc3R1c2UoJHApICRsaW5lbm8KCWlmIHskb25zY3JlZW4oJHApID09IDB9IHsKCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0ICRqICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMQoJICAgIGluY3IgagoJfQogICAgfQogICAgaWYgeyRvbnNjcmVlbigkaWQpID09IDB9IHsKCWxhcHBlbmQgZGlzcGxpc3QgJGlkCglzZXQgb25zY3JlZW4oJGlkKSAxCiAgICB9CgogICAgIyByZW1vdmUgdGhlIG51bGwgZW50cnkgaWYgcHJlc2VudAogICAgc2V0IG51bGxlbnRyeSBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0IHt9XQogICAgaWYgeyRudWxsZW50cnkgPj0gMH0gewoJc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG51bGxlbnRyeSAkbnVsbGVudHJ5XQogICAgfQoKICAgICMgYnJpbmcgYmFjayB0aGUgb25lcyB3ZSBuZWVkIG5vdyAoaWYgd2UgZGlkIGl0IGVhcmxpZXIKICAgICMgaXQgd291bGQgY2hhbmdlIGRpc3BsaXN0IGFuZCBpbnZhbGlkYXRlIG9sZGRsZXZlbCkKICAgIGZvcmVhY2ggcGkgJHJlaW5zIHsKCSMgdGVzdCBhZ2FpbiBpbiBjYXNlIG9mIGR1cGxpY2F0ZXMgaW4gcmVpbnMKCXNldCBwIFtsaW5kZXggJHBpIDBdCglpZiB7JG9uc2NyZWVuKCRwKSA8IDB9IHsKCSAgICBzZXQgb25zY3JlZW4oJHApIDEKCSAgICBzZXQgbGFzdHVzZSgkcCkgJGxpbmVubwoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgW2xpbmRleCAkcGkgMV0gJHBdCgkgICAgaW5jciBuaHlwZXJzcGFjZSAtMQoJfQogICAgfQoKICAgIHNldCBsYXN0dXNlKCRpZCkgJGxpbmVubwoKICAgICMgc2VlIGlmIHdlIG5lZWQgdG8gbWFrZSBhbnkgbGluZXMganVtcCBvZmYgaW50byBoeXBlcnNwYWNlCiAgICBzZXQgZGlzcGwgW2xsZW5ndGggJGRpc3BsaXN0XQogICAgaWYgeyRkaXNwbCA+ICRtYXh3aWR0aH0gewoJc2V0IGFnZXMge30KCWZvcmVhY2ggeCAkZGlzcGxpc3QgewoJICAgIGxhcHBlbmQgYWdlcyBbbGlzdCAkbGFzdHVzZSgkeCkgJHhdCgl9CglzZXQgYWdlcyBbbHNvcnQgLWludGVnZXIgLWluZGV4IDAgJGFnZXNdCglzZXQgayAwCgl3aGlsZSB7JGRpc3BsID4gJG1heHdpZHRofSB7CgkgICAgc2V0IHVzZSBbbGluZGV4ICRhZ2VzICRrIDBdCgkgICAgc2V0IHZpY3RpbSBbbGluZGV4ICRhZ2VzICRrIDFdCgkgICAgaWYgeyR1c2UgPj0gJGxpbmVubyAtIDV9IGJyZWFrCgkgICAgaW5jciBrCgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkdmljdGltXSA+PSAwfSBjb250aW51ZQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJHZpY3RpbV0KCSAgICBzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkaSAkaV0KCSAgICBzZXQgb25zY3JlZW4oJHZpY3RpbSkgLTEKCSAgICBpbmNyIG5oeXBlcnNwYWNlCgkgICAgaW5jciBkaXNwbCAtMQoJICAgIGlmIHskaSA8ICRudWxsZW50cnl9IHsKCQlpbmNyIG51bGxlbnRyeSAtMQoJICAgIH0KCSAgICBzZXQgeCBbbGluZGV4ICRtYWlubGluZSgkdmljdGltKSBlbmQtMV0KCSAgICBsYXBwZW5kIG1haW5saW5lKCR2aWN0aW0pICR4ICR5MQoJICAgIHNldCBsaW5lIFt0cmltZGlhZ2VuZCAkbWFpbmxpbmUoJHZpY3RpbSldCgkgICAgc2V0IGFycm93ICJsYXN0IgoJICAgIGlmIHskbWFpbmxpbmVhcnJvdygkdmljdGltKSBuZSAibm9uZSJ9IHsKCQlzZXQgbGluZSBbdHJpbWRpYWdzdGFydCAkbGluZV0KCQlzZXQgYXJyb3cgImJvdGgiCgkgICAgfQoJICAgIGxhcHBlbmQgc2lkZWxpbmVzKCR2aWN0aW0pIFtsaXN0ICRsaW5lIDEgJGFycm93XQoJICAgIHVuc2V0IG1haW5saW5lKCR2aWN0aW0pCgl9CiAgICB9CgogICAgc2V0IGRsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCiAgICAjIElmIHdlIGFyZSByZWR1Y2luZywgcHV0IGluIGEgbnVsbCBlbnRyeQogICAgaWYgeyRkaXNwbCA8ICRvbGRubGluZXN9IHsKCSMgZG9lcyB0aGUgbmV4dCBsaW5lIGxvb2sgbGlrZSBhIG1lcmdlPwoJIyBpLmUuIGRvZXMgaXQgaGF2ZSA+IDEgbmV3IHBhcmVudD8KCWlmIHskbm5ld3BhcmVudHMoJGlkKSA+IDF9IHsKCSAgICBzZXQgaSBbZXhwciB7JGRsZXZlbCArIDF9XQoJfSBlbHNlaWYgeyRubmV3cGFyZW50cyhbbGluZGV4ICRvbGRkaXNwbGlzdCAkb2xkZGxldmVsXSkgPT0gMH0gewoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBpZiB7JG51bGxlbnRyeSA+PSAwICYmICRudWxsZW50cnkgPCAkaX0gewoJCWluY3IgaSAtMQoJICAgIH0KCX0gZWxzZWlmIHskbnVsbGVudHJ5ID49IDB9IHsKCSAgICBzZXQgaSAkbnVsbGVudHJ5CgkgICAgd2hpbGUgeyRpIDwgJGRpc3BsCgkJICAgJiYgW2xpbmRleCAkb2xkZGlzcGxpc3QgJGldID09IFtsaW5kZXggJGRpc3BsaXN0ICRpXX0gewoJCWluY3IgaQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGlmIHskZGxldmVsID49ICRpfSB7CgkJaW5jciBpCgkgICAgfQoJfQoJaWYgeyRpIDwgJGRpc3BsfSB7CgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCAkaSB7fV0KCSAgICBpbmNyIGRpc3BsCgkgICAgaWYgeyRkbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGRsZXZlbAoJICAgIH0KCX0KICAgIH0KCiAgICAjIGRlY2lkZSBvbiB0aGUgbGluZSBzcGFjaW5nIGZvciB0aGUgbmV4dCBsaW5lCiAgICBzZXQgbGogW2V4cHIgeyRsaW5lbm8gKyAxfV0KICAgIHNldCBtYXh3IFtleHByIHskbWF4Z3JhcGhwY3QgKiAkZ2VvbWV0cnkoY2FudjEpIC8gMTAwfV0KICAgIGlmIHskZGlzcGwgPD0gMSB8fCAkY2FudngwICsgJGRpc3BsICogJHhzcGMyIDw9ICRtYXh3fSB7CglzZXQgeHNwYzEoJGxqKSAkeHNwYzIKICAgIH0gZWxzZSB7CglzZXQgeHNwYzEoJGxqKSBbZXhwciB7KCRtYXh3IC0gJGNhbnZ4MCAtICR4c3BjMikgLyAoJGRpc3BsIC0gMSl9XQoJaWYgeyR4c3BjMSgkbGopIDwgJGx0aGlja25lc3N9IHsKCSAgICBzZXQgeHNwYzEoJGxqKSAkbHRoaWNrbmVzcwoJfQogICAgfQoKICAgIGZvcmVhY2ggaWRpICRyZWlucyB7CglzZXQgaWQgW2xpbmRleCAkaWRpIDBdCglzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJc2V0IG1haW5saW5lKCRpZCkgW2xpc3QgJHhqICR5Ml0KCXNldCBtYWlubGluZWFycm93KCRpZCkgZmlyc3QKICAgIH0KCiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCBpZCAkb2xkZGlzcGxpc3QgewoJaW5jciBpCglpZiB7JGlkID09IHt9fSBjb250aW51ZQoJaWYgeyRvbnNjcmVlbigkaWQpIDw9IDB9IGNvbnRpbnVlCglzZXQgeGkgW3hjb29yZCAkaSAkb2xkZGxldmVsICRsaW5lbm9dCglpZiB7JGkgPT0gJG9sZGRsZXZlbH0gewoJICAgIGZvcmVhY2ggcCAkY3VycmVudHBhcmVudHMgewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJHBdCgkJc2V0IGNvb3JkcyBbbGlzdCAkeGkgJHkxXQoJCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJCWlmIHskeGogPCAkeGkgLSAkbGluZXNwY30gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciB7JHhqICsgJGxpbmVzcGN9XSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaiAkaSBbZXhwciB7JGogKyAxfV0KCQl9IGVsc2VpZiB7JHhqID4gJHhpICsgJGxpbmVzcGN9IHsKCQkgICAgbGFwcGVuZCBjb29yZHMgW2V4cHIgeyR4aiAtICRsaW5lc3BjfV0gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGkgJGogW2V4cHIgeyRqIC0gMX1dCgkJfQoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGR1cHBhcmVudHMgJHBdID49IDB9IHsKCQkgICAgIyBkcmF3IGEgZG91YmxlLXdpZHRoIGxpbmUgdG8gaW5kaWNhdGUgdGhlIGRvdWJsZWQgcGFyZW50CgkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkgICAgbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMiBub25lXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCXNldCBtYWlubGluZSgkcCkgW2xpc3QgJHhqICR5Ml0KCQkJc2V0IG1haW5saW5lYXJyb3coJHApIG5vbmUKCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgICMgbm9ybWFsIGNhc2UsIG5vIHBhcmVudCBkdXBsaWNhdGVkCgkJICAgIHNldCB5YiAkeTIKCQkgICAgc2V0IGR4IFtleHByIHthYnMoJHhpIC0gJHhqKX1dCgkJICAgIGlmIHswICYmICRkeCA8ICRsaW5lc3BjfSB7CgkJCXNldCB5YiBbZXhwciB7JHkxICsgJGR4fV0KCQkgICAgfQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCWlmIHskeGkgIT0gJHhqfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHliCgkJCX0KCQkJc2V0IG1haW5saW5lKCRwKSAkY29vcmRzCgkJCXNldCBtYWlubGluZWFycm93KCRwKSBub25lCgkJICAgIH0gZWxzZSB7CgkJCWxhcHBlbmQgY29vcmRzICR4aiAkeWIKCQkJaWYgeyR5YiA8ICR5Mn0gewoJCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCQl9CgkJCWxhcHBlbmQgc2lkZWxpbmVzKCRwKSBbbGlzdCAkY29vcmRzIDEgbm9uZV0KCQkgICAgfQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBqICRpCgkgICAgaWYge1tsaW5kZXggJGRpc3BsaXN0ICRpXSAhPSAkaWR9IHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGRpc3BsaXN0ICRpZF0KCSAgICB9CgkgICAgaWYgeyRqICE9ICRpIHx8ICR4c3BjMSgkbGluZW5vKSAhPSAkeHNwYzEoJGxqKQoJCXx8ICgkb2xkZGxldmVsIDwgJGkgJiYgJGkgPCAkZGxldmVsKQoJCXx8ICgkZGxldmVsIDwgJGkgJiYgJGkgPCAkb2xkZGxldmVsKX0gewoJCXNldCB4aiBbeGNvb3JkICRqICRkbGV2ZWwgJGxqXQoJCWxhcHBlbmQgbWFpbmxpbmUoJGlkKSAkeGkgJHkxICR4aiAkeTIKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJGRsZXZlbAp9CgojIHNlYXJjaCBmb3IgeCBpbiBhIGxpc3Qgb2YgbGlzdHMKcHJvYyBsbHNlYXJjaCB7bGxpc3QgeH0gewogICAgc2V0IGkgMAogICAgZm9yZWFjaCBsICRsbGlzdCB7CglpZiB7JGwgPT0gJHggfHwgW2xzZWFyY2ggLWV4YWN0ICRsICR4XSA+PSAwfSB7CgkgICAgcmV0dXJuICRpCgl9CglpbmNyIGkKICAgIH0KICAgIHJldHVybiAtMQp9Cgpwcm9jIGRyYXdtb3JlIHtyZWFkaW5nfSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG51bWNvbW1pdHMgbmNtdXBkYXRlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdG9wcGVkIG5oeXBlcnNwYWNlIHBhcmVudHMgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgbWF4d2lkdGggb25zY3JlZW4gZGlzcGxpc3QgY3VycmVudHBhcmVudHMgb2xkZGxldmVsCgogICAgc2V0IG4gW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KICAgIHdoaWxlIHskbnVtY29tbWl0cyA8ICRufSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRudW1jb21taXRzXQoJc2V0IGN0eGVuZCBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCglpZiB7ISRyZWFkaW5nICYmICRjdHhlbmQgPiAkbn0gewoJICAgIHNldCBjdHhlbmQgJG4KCX0KCXNldCBkbGlzdCB7fQoJaWYgeyRudW1jb21taXRzID4gMH0gewoJICAgIHNldCBkbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRvbGRkbGV2ZWwgJG9sZGRsZXZlbF0KCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CgkJaWYgeyRvbnNjcmVlbigkcCkgPT0gMH0gewoJCSAgICBzZXQgZGxpc3QgW2xpbnNlcnQgJGRsaXN0ICRpICRwXQoJCSAgICBpbmNyIGkKCQl9CgkgICAgfQoJfQoJc2V0IG5vaHMge30KCXNldCByZWlucyB7fQoJc2V0IGlzZmF0IFtleHByIHtbbGxlbmd0aCAkZGxpc3RdID4gJG1heHdpZHRofV0KCWlmIHskbmh5cGVyc3BhY2UgPiAwIHx8ICRpc2ZhdH0gewoJICAgIGlmIHskY3R4ZW5kID4gJG59IGJyZWFrCgkgICAgIyB3b3JrIG91dCB3aGF0IHRvIGJyaW5nIGJhY2sgYW5kCgkgICAgIyB3aGF0IHdlIHdhbnQgdG8gZG9uJ3Qgd2FudCB0byBzZW5kIGludG8gaHlwZXJzcGFjZQoJICAgIHNldCByb29tIDEKCSAgICBmb3Ige3NldCBrICRudW1jb21taXRzfSB7JGsgPCAkY3R4ZW5kfSB7aW5jciBrfSB7CgkJc2V0IHggW2xpbmRleCAkZGlzcGxheW9yZGVyICRrXQoJCXNldCBpIFtsbHNlYXJjaCAkZGxpc3QgJHhdCgkJaWYgeyRpIDwgMH0gewoJCSAgICBzZXQgaSBbbGxlbmd0aCAkZGxpc3RdCgkJICAgIGxhcHBlbmQgZGxpc3QgJHgKCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkeF0gPCAwfSB7CgkJICAgIGxhcHBlbmQgbm9ocyAkeAoJCX0KCQlpZiB7JHJlaW5zIGVxIHt9ICYmICRvbnNjcmVlbigkeCkgPCAwICYmICRyb29tfSB7CgkJICAgIHNldCByZWlucyBbbGlzdCAkeCAkaV0KCQl9CgkJc2V0IG5ld3Age30KCQlpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkeCldfSB7CgkJICAgIHNldCByaWdodCAwCgkJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkeCkgewoJCQlpZiB7W2xsc2VhcmNoICRkbGlzdCAkcF0gPCAwfSB7CgkJCSAgICBsYXBwZW5kIG5ld3AgJHAKCQkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG5vaHMgJHBdIDwgMH0gewoJCQkJbGFwcGVuZCBub2hzICRwCgkJCSAgICB9CgkJCSAgICBpZiB7JHJlaW5zIGVxIHt9ICYmICRvbnNjcmVlbigkcCkgPCAwICYmICRyb29tfSB7CgkJCQlzZXQgcmVpbnMgW2xpc3QgJHAgW2V4cHIgeyRpICsgJHJpZ2h0fV1dCgkJCSAgICB9CgkJCX0KCQkJc2V0IHJpZ2h0IDEKCQkgICAgfQoJCX0KCQlzZXQgbCBbbGluZGV4ICRkbGlzdCAkaV0KCQlpZiB7W2xsZW5ndGggJGxdID09IDF9IHsKCQkgICAgc2V0IGwgJG5ld3AKCQl9IGVsc2UgewoJCSAgICBzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJGwgJHhdCgkJICAgIHNldCBsIFtjb25jYXQgW2xyZXBsYWNlICRsICRqICRqXSAkbmV3cF0KCQl9CgkJc2V0IGRsaXN0IFtscmVwbGFjZSAkZGxpc3QgJGkgJGkgJGxdCgkJaWYgeyRyb29tICYmICRpc2ZhdCAmJiBbbGxlbmd0aCAkbmV3cF0gPD0gMX0gewoJCSAgICBzZXQgcm9vbSAwCgkJfQoJICAgIH0KCX0KCglzZXQgZGxldmVsIFtkcmF3c2xhbnRzICRpZCAkcmVpbnMgJG5vaHNdCglkcmF3Y29tbWl0bGluZSAkZGxldmVsCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZQoJICAgICYmICRudW1jb21taXRzID49ICRuY211cGRhdGV9IHsKCSAgICBkb3VwZGF0ZSAkcmVhZGluZwoJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCX0KICAgIH0KfQoKIyBsZXZlbCBoZXJlIGlzIGFuIGluZGV4IGluIHRvZG8KcHJvYyB1cGRhdGV0b2RvIHtsZXZlbCBub3Nob3J0Y3V0fSB7CiAgICBnbG9iYWwgbmNsZWZ0IHRvZG8gbm5ld3BhcmVudHMKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcGFyZW50cyBvbnNjcmVlbgoKICAgIHNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KICAgIHNldCBvbGRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdIDwgMH0gewoJCWxhcHBlbmQgb2xkcyAkcAoJICAgIH0KCX0KICAgIH0KICAgIGlmIHshJG5vc2hvcnRjdXQgJiYgW2xsZW5ndGggJG9sZHNdID09IDF9IHsKCXNldCBwIFtsaW5kZXggJG9sZHMgMF0KCWlmIHskbmNsZWZ0KCRwKSA9PSAxICYmIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0gPCAwfSB7CgkgICAgc2V0IG5jbGVmdCgkcCkgMAoJICAgIHNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbGV2ZWwgJGxldmVsICRwXQoJICAgIHNldCBvbnNjcmVlbigkcCkgMAoJICAgIHNldCBubmV3cGFyZW50cygkaWQpIDEKCSAgICByZXR1cm4gMAoJfQogICAgfQoKICAgIHNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbGV2ZWwgJGxldmVsXQogICAgc2V0IGkgJGxldmVsCiAgICBzZXQgbiAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaW5jciBuY2xlZnQoJHApIC0xCglzZXQgayBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdCglpZiB7JGsgPCAwfSB7CgkgICAgc2V0IHRvZG8gW2xpbnNlcnQgJHRvZG8gJGkgJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAwCgkgICAgaW5jciBpCgkgICAgaW5jciBuCgl9CiAgICB9CiAgICBzZXQgbm5ld3BhcmVudHMoJGlkKSAkbgoKICAgIHJldHVybiAxCn0KCnByb2MgZGVjaWRlbmV4dCB7e25vcmVhZCAwfX0gewogICAgZ2xvYmFsIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgZGF0ZW1vZGUgY2RhdGUKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgIyBjaG9vc2Ugd2hpY2ggb25lIHRvIGRvIG5leHQgdGltZSBhcm91bmQKICAgIHNldCB0b2RvbCBbbGxlbmd0aCAkdG9kb10KICAgIHNldCBsZXZlbCAtMQogICAgc2V0IGxhdGVzdCB7fQogICAgZm9yIHtzZXQgayAkdG9kb2x9IHtbaW5jciBrIC0xXSA+PSAwfSB7fSB7CglzZXQgcCBbbGluZGV4ICR0b2RvICRrXQoJaWYgeyRuY2xlZnQoJHApID09IDB9IHsKCSAgICBpZiB7JGRhdGVtb2RlfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CgkJICAgIGlmIHskbm9yZWFkfSB7CgkJCXJldHVybiB7fQoJCSAgICB9CgkJICAgIHJlYWRjb21taXQgJHAKCQl9CgkJaWYgeyRsYXRlc3QgPT0ge30gfHwgJGNkYXRlKCRwKSA+ICRsYXRlc3R9IHsKCQkgICAgc2V0IGxldmVsICRrCgkJICAgIHNldCBsYXRlc3QgJGNkYXRlKCRwKQoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBsZXZlbCAkawoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRsZXZlbCA8IDB9IHsKCWlmIHskdG9kbyAhPSB7fX0gewoJICAgIHB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCSAgICBmb3JlYWNoIHAgJHRvZG8gewoJCXB1dHMgIiAgJHAgKCRuY2xlZnQoJHApKSIKCSAgICB9Cgl9CglyZXR1cm4gLTEKICAgIH0KCiAgICByZXR1cm4gJGxldmVsCn0KCnByb2MgZHJhd2NvbW1pdCB7aWR9IHsKICAgIGdsb2JhbCBwaGFzZSB0b2RvIG5jaGlsZHJlbiBkYXRlbW9kZSBuZXh0dXBkYXRlIHJldmxpc3RvcmRlcgogICAgZ2xvYmFsIG51bWNvbW1pdHMgbmNtdXBkYXRlIGRpc3BsYXlvcmRlciB0b2RvIG9uc2NyZWVuIHBhcmVudHMKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IGRpc3BsYXlvcmRlciB7fQoJc2V0IHRvZG8ge30KCWluaXRncmFwaAogICAgfQogICAgaWYgeyRuY2hpbGRyZW4oJGlkKSA9PSAwfSB7CglsYXBwZW5kIHRvZG8gJGlkCglzZXQgb25zY3JlZW4oJGlkKSAwCiAgICB9CiAgICBpZiB7JHJldmxpc3RvcmRlcn0gewoJc2V0IGxldmVsIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkaWRdCglpZiB7JGxldmVsIDwgMH0gewoJICAgIGVycm9yX3BvcHVwICJvb3BzLCAkaWQgaXNuJ3QgaW4gdG9kbyIKCSAgICByZXR1cm4KCX0KCWxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJdXBkYXRldG9kbyAkbGV2ZWwgMAogICAgfSBlbHNlIHsKCXNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJaWYgeyRsZXZlbCA9PSB7fSB8fCAkaWQgIT0gW2xpbmRleCAkdG9kbyAkbGV2ZWxdfSB7CgkgICAgcmV0dXJuCgl9Cgl3aGlsZSAxIHsKCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBpZiB7W3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV19IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCQlpZiB7JGxldmVsID09IHt9fSBicmVhawoJICAgIH0KCSAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldfSB7CgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBkcmF3bW9yZSAxCn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgcGhhc2UKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJJGNhbnYgZGVsZXRlIGFsbAoJJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiIFwKCSAgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCglzZXQgcGhhc2Uge30KICAgIH0gZWxzZSB7CglkcmF3cmVzdAogICAgfQogICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgogICAgc2V0dGV4dGN1cnNvciAkdGV4dGN1cnNvcgp9CgojIERvbid0IGNoYW5nZSB0aGUgdGV4dCBwYW5lIGN1cnNvciBpZiBpdCBpcyBjdXJyZW50bHkgdGhlIGhhbmQgY3Vyc29yLAojIHNob3dpbmcgdGhhdCB3ZSBhcmUgb3ZlciBhIHNoYTEgSUQgbGluay4KcHJvYyBzZXR0ZXh0Y3Vyc29yIHtjfSB7CiAgICBnbG9iYWwgY3RleHQgY3VydGV4dGN1cnNvcgoKICAgIGlmIHtbJGN0ZXh0IGNnZXQgLWN1cnNvcl0gPT0gJGN1cnRleHRjdXJzb3J9IHsKCSRjdGV4dCBjb25maWcgLWN1cnNvciAkYwogICAgfQogICAgc2V0IGN1cnRleHRjdXJzb3IgJGMKfQoKcHJvYyBkcmF3Z3JhcGgge30gewogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyBuY211cGRhdGUKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgb25zY3JlZW4KCiAgICBpZiB7JGRpc3BsYXlvcmRlciA9PSB7fX0gcmV0dXJuCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7JHN0YXJ0bXNlY3MgKyAxMDB9XQogICAgc2V0IG5jbXVwZGF0ZSAxCiAgICBpbml0Z3JhcGgKICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CglzZXQgb25zY3JlZW4oJGlkKSAwCiAgICB9CiAgICBkcmF3bW9yZSAwCn0KCnByb2MgZHJhd3Jlc3Qge30gewogICAgZ2xvYmFsIHBoYXNlIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGRhdGVtb2RlIHRvZG8gZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgbnVtY29tbWl0cyBuY211cGRhdGUKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgcmV2bGlzdG9yZGVyCgogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0XQogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCgl3aGlsZSAxIHsKCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJICAgIGlmIHskaGFyZH0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCQlpZiB7JGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBkcmF3bW9yZSAwCiAgICBzZXQgcGhhc2Uge30KICAgIHNldCBkcmF3bXNlY3MgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc31dCiAgICAjcHV0cyAib3ZlcmFsbCAkZHJhd21zZWNzIG1zIGZvciAkbnVtY29tbWl0cyBjb21taXRzIgogICAgaWYgeyRyZWRpc3BsYXlpbmd9IHsKCWlmIHskc3RvcHBlZCA9PSAwICYmIFtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CgkgICAgc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKCX0KCWlmIHskc3RvcHBlZCA9PSAxfSB7CgkgICAgc2V0IHN0b3BwZWQgMAoJICAgIGFmdGVyIGlkbGUgZHJhd2dyYXBoCgl9IGVsc2UgewoJICAgIHNldCByZWRpc3BsYXlpbmcgMAoJfQogICAgfQp9Cgpwcm9jIGZpbmRtYXRjaGVzIHtmfSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KICAgIGlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCXNldCBtYXRjaGVzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lICRmb3VuZHN0cmluZyAkZl0KICAgIH0gZWxzZSB7CglpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJICAgIHNldCBzdHIgW3N0cmluZyB0b2xvd2VyICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgc3RyICRmCgl9CglzZXQgbWF0Y2hlcyB7fQoJc2V0IGkgMAoJd2hpbGUge1tzZXQgaiBbc3RyaW5nIGZpcnN0ICRmb3VuZHN0cmluZyAkc3RyICRpXV0gPj0gMH0gewoJICAgIGxhcHBlbmQgbWF0Y2hlcyBbbGlzdCAkaiBbZXhwciB7JGorJGZvdW5kc3RybGVuLTF9XV0KCSAgICBzZXQgaSBbZXhwciB7JGogKyAkZm91bmRzdHJsZW59XQoJfQogICAgfQogICAgcmV0dXJuICRtYXRjaGVzCn0KCnByb2MgZG9maW5kIHt9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kbG9jIGZpbmRzdHJpbmcgbWFya2VkbWF0Y2hlcyBjb21taXRpbmZvCiAgICBnbG9iYWwgbnVtY29tbWl0cyBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCBjYW52IGNhbnYyIGNhbnYzIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZm91bmRzdHJpbmcgZm91bmRzdHJsZW4KCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGZvY3VzIC4KICAgIHNldCBtYXRjaGluZ2xpbmVzIHt9CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglmaW5kcGF0Y2hlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGZpbmR0eXBlID09ICJJZ25DYXNlIn0gewoJc2V0IGZvdW5kc3RyaW5nIFtzdHJpbmcgdG9sb3dlciAkZmluZHN0cmluZ10KICAgIH0gZWxzZSB7CglzZXQgZm91bmRzdHJpbmcgJGZpbmRzdHJpbmcKICAgIH0KICAgIHNldCBmb3VuZHN0cmxlbiBbc3RyaW5nIGxlbmd0aCAkZmluZHN0cmluZ10KICAgIGlmIHskZm91bmRzdHJsZW4gPT0gMH0gcmV0dXJuCiAgICBpZiB7JGZpbmRsb2MgPT0gIkZpbGVzIn0gewoJZmluZGZpbGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBvbGRzZWwgLTEKICAgIH0gZWxzZSB7CglzZXQgb2xkc2VsICRzZWxlY3RlZGxpbmUKICAgIH0KICAgIHNldCBkaWRzZWwgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudH0KICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCXNldCBpZCAkbGluZWlkKCRsKQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJBdXRob3IifSB7CgkJbWFya21hdGNoZXMgJGNhbnYyICRsICRmICRsaW5lbnRhZygkbCkgJG1hdGNoZXMgJG5hbWVmb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiRGF0ZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIGZpbmRsb2NjaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGZpbmR0eXBlIGZpbmR0eXBlbWVudQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJc2V0IGZpbmR0eXBlIEV4YWN0CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAxIC1zdGF0ZSAkc3RhdGUKICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDIgLXN0YXRlICRzdGF0ZQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpbnByb2dyZXNzXX0gewoJdW5zZXQgZmluZGlucHJvZ3Jlc3MKCWlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCSAgICBzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgl9CiAgICB9Cn0KCnByb2MgZmluZHBhdGNoZXMge30gewogICAgZ2xvYmFsIGZpbmRzdHJpbmcgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUKICAgIGdsb2JhbCBmaW5kZGlkc2VsIGN0ZXh0IGxpbmVpZCBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRpbnNlcnRwb3MKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgIyBtYWtlIGEgbGlzdCBvZiBhbGwgdGhlIGlkcyB0byBzZWFyY2gsIHN0YXJ0aW5nIGF0IHRoZSBvbmUKICAgICMgYWZ0ZXIgdGhlIHNlbGVjdGVkIGxpbmUgKGlmIGFueSkKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgJHNlbGVjdGVkbGluZQogICAgfSBlbHNlIHsKCXNldCBsIC0xCiAgICB9CiAgICBzZXQgaW5wdXRpZHMge30KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG51bWNvbW1pdHN9IHtpbmNyIGl9IHsKCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWFwcGVuZCBpbnB1dGlkcyAkbGluZWlkKCRsKSAiXG4iCiAgICB9CgogICAgaWYge1tjYXRjaCB7CglzZXQgZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcyAtciAtUyRmaW5kc3RyaW5nIFwKCQkJIDw8ICRpbnB1dGlkc10gcl0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgZmluZHByb2NmaWxlICRmCiAgICBzZXQgZmluZHByb2NwaWQgW3BpZCAkZl0KICAgIGZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZiByZWFkYWJsZSByZWFkZmluZHByb2MKICAgIHNldCBmaW5kZGlkc2VsIDAKICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCn0KCnByb2MgcmVhZGZpbmRwcm9jIHt9IHsKICAgIGdsb2JhbCBmaW5kcHJvY2ZpbGUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGlkbGluZSBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MKCiAgICBzZXQgbiBbZ2V0cyAkZmluZHByb2NmaWxlIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZmluZHByb2NmaWxlXX0gewoJICAgIHN0b3BmaW5kcHJvYyAxCgkgICAgaWYgeyEkZmluZGRpZHNlbH0gewoJCWJlbGwKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfX0gJGxpbmUgaWRdfSB7CgllcnJvcl9wb3B1cCAiQ2FuJ3QgcGFyc2UgZ2l0LWRpZmYtdHJlZSBvdXRwdXQ6ICRsaW5lIgoJc3RvcGZpbmRwcm9jCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJcHV0cyBzdGRlcnIgInNwdXJpb3VzIGlkOiAkaWQiCglyZXR1cm4KICAgIH0KICAgIHNldCBsICRpZGxpbmUoJGlkKQogICAgaW5zZXJ0bWF0Y2ggJGwgJGlkCn0KCnByb2MgaW5zZXJ0bWF0Y2gge2wgaWR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpbnNlcnRwb3MgZmluZGRpZHNlbAoKICAgIGlmIHskZmluZGluc2VydHBvcyA9PSAiZW5kIn0gewoJaWYgeyRtYXRjaGluZ2xpbmVzICE9IHt9ICYmICRsIDwgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXX0gewoJICAgIHNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzIDAgJGxdCgkgICAgc2V0IGZpbmRpbnNlcnRwb3MgMQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCX0KICAgIH0gZWxzZSB7CglzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAkZmluZGluc2VydHBvcyAkbF0KCWluY3IgZmluZGluc2VydHBvcwogICAgfQogICAgbWFya2hlYWRsaW5lICRsICRpZAogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgJGwKCXNldCBmaW5kZGlkc2VsIDEKICAgIH0KfQoKcHJvYyBmaW5kZmlsZXMge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBudW1jb21taXRzIGxpbmVpZCBjdGV4dAogICAgZ2xvYmFsIGZmaWxlbGluZSBmaW5kZGlkc2VsIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcyBmaW5kc3RhcnRsaW5lIGZpbmRpbnNlcnRwb3MKICAgIGdsb2JhbCB0cmVlZGlmZnMgZmRpZmZpZHMgZmRpZmZzbmVlZGVkIGZkaWZmcG9zCiAgICBnbG9iYWwgZmluZG1lcmdlZmlsZXMKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gcmV0dXJuCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArIDF9XQogICAgfSBlbHNlIHsKCXNldCBsIDAKICAgIH0KICAgIHNldCBmZmlsZWxpbmUgJGwKICAgIHNldCBmaW5kc3RhcnRsaW5lICRsCiAgICBzZXQgZGlmZnNuZWVkZWQge30KICAgIHNldCBmZGlmZnNuZWVkZWQge30KICAgIHdoaWxlIDEgewoJc2V0IGlkICRsaW5laWQoJGwpCglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKFtsaXN0ICRpZCAkcF0pXX0gewoJCSAgICBhcHBlbmQgZGlmZnNuZWVkZWQgIiRpZCAkcFxuIgoJCSAgICBsYXBwZW5kIGZkaWZmc25lZWRlZCBbbGlzdCAkaWQgJHBdCgkJfQoJICAgIH0KCX0KCWlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBsIDAKCX0KCWlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKICAgIH0KCiAgICAjIHN0YXJ0IG9mZiBhIGdpdC1kaWZmLXRyZWUgcHJvY2VzcyBpZiBuZWVkZWQKICAgIGlmIHskZGlmZnNuZWVkZWQgbmUge319IHsKCWlmIHtbY2F0Y2ggewoJICAgIHNldCBkZiBbb3BlbiBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLXIgLS1zdGRpbiA8PCAkZGlmZnNuZWVkZWRdIHJdCgl9IGVyciBdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHN0YXJ0aW5nIHNlYXJjaCBwcm9jZXNzOiAkZXJyIgoJICAgIHJldHVybgoJfQoJY2F0Y2gge3Vuc2V0IGZkaWZmaWRzfQoJc2V0IGZkaWZmcG9zIDAKCWZjb25maWd1cmUgJGRmIC1ibG9ja2luZyAwCglmaWxlZXZlbnQgJGRmIHJlYWRhYmxlIFtsaXN0IHJlYWRmaWxlZGlmZnMgJGRmXQogICAgfQoKICAgIHNldCBmaW5kZGlkc2VsIDAKICAgIHNldCBmaW5kaW5zZXJ0cG9zIGVuZAogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgMF0KICAgIC4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldHRleHRjdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCiAgICBmaW5kY29udCBbbGlzdCAkaWQgJHBdCiAgICB1cGRhdGUKfQoKcHJvYyByZWFkZmlsZWRpZmZzIHtkZn0gewogICAgZ2xvYmFsIGZpbmRpZHMgZmRpZmZpZHMgZmRpZmZzCgogICAgc2V0IG4gW2dldHMgJGRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZGZdfSB7CgkgICAgZG9uZWZpbGVkaWZmCgkgICAgaWYge1tjYXRjaCB7Y2xvc2UgJGRmfSBlcnJdfSB7CgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJFcnJvciBpbiBnaXQtZGlmZi10cmVlOiAkZXJyIgoJICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc119IHsKCQlzZXQgaWRzICRmaW5kaWRzCgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJDb3VsZG4ndCBmaW5kIGRpZmZzIGZvciB7JGlkc30iCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pIFwoZnJvbSAoWzAtOWEtZl17NDB9KVwpfSAkbGluZSBtYXRjaCBpZCBwXX0gewoJIyBzdGFydCBvZiBhIG5ldyBzdHJpbmcgb2YgZGlmZnMKCWRvbmVmaWxlZGlmZgoJc2V0IGZkaWZmaWRzIFtsaXN0ICRpZCAkcF0KCXNldCBmZGlmZnMge30KICAgIH0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoICI6KiIgJGxpbmVdfSB7CglsYXBwZW5kIGZkaWZmcyBbbGluZGV4ICRsaW5lIDVdCiAgICB9Cn0KCnByb2MgZG9uZWZpbGVkaWZmIHt9IHsKICAgIGdsb2JhbCBmZGlmZmlkcyBmZGlmZnMgdHJlZWRpZmZzIGZpbmRpZHMKICAgIGdsb2JhbCBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZkaWZmaWRzXX0gewoJd2hpbGUge1tsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdIG5lICRmZGlmZmlkcwoJICAgICAgICYmICRmZGlmZnBvcyA8IFtsbGVuZ3RoICRmZGlmZnNuZWVkZWRdfSB7CgkgICAgIyBnaXQtZGlmZi10cmVlIGRvZXNuJ3Qgb3V0cHV0IGFueXRoaW5nIGZvciBhIGNvbW1pdAoJICAgICMgd2hpY2ggZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcKCSAgICBzZXQgbnVsbGlkcyBbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXQoJICAgIHNldCB0cmVlZGlmZnMoJG51bGxpZHMpIHt9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkbnVsbGlkcyBlcSAkZmluZGlkc30gewoJCXVuc2V0IGZpbmRpZHMKCQlmaW5kY29udCAkbnVsbGlkcwoJICAgIH0KCSAgICBpbmNyIGZkaWZmcG9zCgl9CglpbmNyIGZkaWZmcG9zCgoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRmZGlmZmlkcyldfSB7CgkgICAgc2V0IHRyZWVkaWZmcygkZmRpZmZpZHMpICRmZGlmZnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc10gJiYgJGZkaWZmaWRzIGVxICRmaW5kaWRzfSB7CgkgICAgdW5zZXQgZmluZGlkcwoJICAgIGZpbmRjb250ICRmZGlmZmlkcwoJfQogICAgfQp9Cgpwcm9jIGZpbmRjb250IHtpZHN9IHsKICAgIGdsb2JhbCBmaW5kaWRzIHRyZWVkaWZmcyBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRzdGFydGxpbmUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzIG1hdGNoaW5nbGluZXMgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQogICAgc2V0IHBpIFtsc2VhcmNoIC1leGFjdCAkcGFyZW50cygkaWQpICRwXQogICAgc2V0IGwgJGZmaWxlbGluZQogICAgd2hpbGUgMSB7CglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkJc2V0IGZpbmRpZHMgJGlkcwoJCXNldCBmZmlsZWxpbmUgJGwKCQlyZXR1cm4KCSAgICB9CgkgICAgc2V0IGRvZXNtYXRjaCAwCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoJGlkcykgewoJCXNldCB4IFtmaW5kbWF0Y2hlcyAkZl0KCQlpZiB7JHggIT0ge319IHsKCQkgICAgc2V0IGRvZXNtYXRjaCAxCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCSAgICBpZiB7JGRvZXNtYXRjaH0gewoJCWluc2VydG1hdGNoICRsICRpZAoJCXNldCBwaSAkbnBhcmVudHMoJGlkKQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IHBpICRucGFyZW50cygkaWQpCgl9CglpZiB7W2luY3IgcGldID49ICRucGFyZW50cygkaWQpfSB7CgkgICAgc2V0IHBpIDAKCSAgICBpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCQlzZXQgbCAwCgkgICAgfQoJICAgIGlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKCSAgICBzZXQgaWQgJGxpbmVpZCgkbCkKCX0KCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcGldCglzZXQgaWRzIFtsaXN0ICRpZCAkcF0KICAgIH0KICAgIHN0b3BmaW5kcHJvYwogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJYmVsbAogICAgfQp9CgojIG1hcmsgYSBjb21taXQgYXMgbWF0Y2hpbmcgYnkgcHV0dGluZyBhIHllbGxvdyBiYWNrZ3JvdW5kCiMgYmVoaW5kIHRoZSBoZWFkbGluZQpwcm9jIG1hcmtoZWFkbGluZSB7bCBpZH0gewogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgbGluZWh0YWcgY29tbWl0aW5mbwoKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcgcm93dGV4dHgKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0KICAgIGlmIHskdyBlcSAkY2Fudn0gewoJaWYgeyFbaW5mbyBleGlzdHMgcm93dGV4dHgoJGwpXSB8fCAkeCA8ICRyb3d0ZXh0eCgkbCl9IHJldHVybgogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgY29tbWl0X2Rlc2NyaXB0b3Ige3B9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvCiAgICBzZXQgbCAiLi4uIgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCXNldCBsIFtsaW5kZXggJGNvbW1pdGluZm8oJHApIDBdCiAgICB9CiAgICByZXR1cm4gIiRwICgkbCkiCn0KCiMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAojIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgpwcm9jIGFwcGVuZHdpdGhsaW5rcyB7dGV4dH0gewogICAgZ2xvYmFsIGN0ZXh0IGlkbGluZSBsaW5rbnVtCgogICAgc2V0IHN0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KICAgICRjdGV4dCBpbnNlcnQgZW5kICR0ZXh0CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICBzZXQgbGlua3MgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUge1swLTlhLWZdezQwfX0gJHRleHRdCiAgICBmb3JlYWNoIGwgJGxpbmtzIHsKCXNldCBzIFtsaW5kZXggJGwgMF0KCXNldCBlIFtsaW5kZXggJGwgMV0KCXNldCBsaW5raWQgW3N0cmluZyByYW5nZSAkdGV4dCAkcyAkZV0KCWlmIHshW2luZm8gZXhpc3RzIGlkbGluZSgkbGlua2lkKV19IGNvbnRpbnVlCglpbmNyIGUKCSRjdGV4dCB0YWcgYWRkIGxpbmsgIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBhZGQgbGluayRsaW5rbnVtICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYmluZCBsaW5rJGxpbmtudW0gPDE+IFtsaXN0IHNlbGVjdGxpbmUgJGlkbGluZSgkbGlua2lkKSAxXQoJaW5jciBsaW5rbnVtCiAgICB9CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cn0KCnByb2Mgc2VsZWN0bGluZSB7bCBpc25ld30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY29tbWl0aW5mbyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBsaW5laWQgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYyBwYXJlbnRzIG5wYXJlbnRzIGNoaWxkcmVuCiAgICBnbG9iYWwgY2ZsaXN0IGN1cnJlbnRpZCBzaGExZW50cnkKICAgIGdsb2JhbCBjb21tZW50ZW5kIGlkdGFncyBpZGxpbmUgbGlua251bQoKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWlkKCRsKV0gfHwgIVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KICAgIHNldCB3Ym90IFtleHByIHtbbGluZGV4ICR3bm93IDFdICogJHltYXh9XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2VsZWN0bGluZSAkbCAwXQogICAgfQoKICAgIHNldCBzZWxlY3RlZGxpbmUgJGwKCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICBzZXQgbGlua251bSAwCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgJGRhdGVcbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gNF1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQ29tbWl0dGVyOiBbbGluZGV4ICRpbmZvIDNdICAkZGF0ZVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogCiAgICBzZXQgY29tbWVudCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBwYXJlbnRzKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgYXBwZW5kIGNvbW1lbnQgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXVxuIgoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkaWQpXX0gewoJZm9yZWFjaCBjICRjaGlsZHJlbigkaWQpIHsKCSAgICBhcHBlbmQgY29tbWVudCAiQ2hpbGQ6ICBbY29tbWl0X2Rlc2NyaXB0b3IgJGNdXG4iCgl9CiAgICB9CiAgICBhcHBlbmQgY29tbWVudCAiXG4iCiAgICBhcHBlbmQgY29tbWVudCBbbGluZGV4ICRpbmZvIDVdCgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRjb21tZW50CgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIkNvbW1lbnRzIgogICAgaWYgeyRucGFyZW50cygkaWQpID09IDF9IHsKCXN0YXJ0ZGlmZiAkaWQKICAgIH0gZWxzZWlmIHskbnBhcmVudHMoJGlkKSA+IDF9IHsKCW1lcmdlZGlmZiAkaWQKICAgIH0KfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcn1dCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyB1bnNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCn0KCnByb2MgYWRkdG9oaXN0b3J5IHtjbWR9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGNtZH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkY21kXQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkY21kCiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29iYWNrIHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJaW5jciBoaXN0b3J5aW5kZXggLTEKCXNldCBjbWQgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0KCWV2YWwgJGNtZAoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZXZhbCAkY21kCgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBtZXJnZWRpZmYge2lkfSB7CiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmbWVyZ2VnY2EgbWVyZ2VmaWxlbGlzdCBkaWZmcGluZGV4CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgc2V0IGRpZmZwaW5kZXggLTEKICAgIHNldCBkaWZmbWVyZ2VnY2EgW2ZpbmRnY2EgJHBhcmVudHMoJGlkKV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWVyZ2VmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyRtZXJnZWZpbGVsaXN0KCRpZCkgbmUge319IHsKCSAgICBzaG93bWVyZ2VkaWZmCgl9CiAgICB9IGVsc2UgewoJY29udG1lcmdlZGlmZiB7fQogICAgfQp9Cgpwcm9jIGZpbmRnY2Ege2lkc30gewogICAgc2V0IGdjYSB7fQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWlmIHskZ2NhIGVxIHt9fSB7CgkgICAgc2V0IGdjYSAkaWQKCX0gZWxzZSB7CgkgICAgaWYge1tjYXRjaCB7CgkJc2V0IGdjYSBbZXhlYyBnaXQtbWVyZ2UtYmFzZSAkZ2NhICRpZF0KCSAgICB9IGVycl19IHsKCQlyZXR1cm4ge30KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJGdjYQp9Cgpwcm9jIGNvbnRtZXJnZWRpZmYge2lkc30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZwaW5kZXggcGFyZW50cyBucGFyZW50cyBkaWZmbWVyZ2VnY2EKICAgIGdsb2JhbCB0cmVlZGlmZnMgbWVyZ2VmaWxlbGlzdCBkaWZmaWRzIHRyZWVwZW5kaW5nCgogICAgIyBkaWZmIHRoZSBjaGlsZCBhZ2FpbnN0IGVhY2ggb2YgdGhlIHBhcmVudHMsIGFuZCBkaWZmCiAgICAjIGVhY2ggb2YgdGhlIHBhcmVudHMgYWdhaW5zdCB0aGUgR0NBLgogICAgd2hpbGUgMSB7CglpZiB7W2xpbmRleCAkaWRzIDFdID09ICRkaWZmbWVyZ2VpZCAmJiAkZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlZ2NhIFtsaW5kZXggJGlkcyAwXV0KCX0gZWxzZSB7CgkgICAgaWYge1tpbmNyIGRpZmZwaW5kZXhdID49ICRucGFyZW50cygkZGlmZm1lcmdlaWQpfSBicmVhawoJICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAkZGlmZnBpbmRleF0KCSAgICBzZXQgaWRzIFtsaXN0ICRwICRkaWZmbWVyZ2VpZF0KCX0KCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCSAgICBzZXQgZGlmZmlkcyAkaWRzCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkJZ2V0dHJlZWRpZmZzICRpZHMKCSAgICB9CgkgICAgcmV0dXJuCgl9CiAgICB9CgogICAgIyBJZiBhIGZpbGUgaW4gc29tZSBwYXJlbnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGFuZCBhbHNvCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBHQ0EsIHRoZW4gaXQncyBpbnRlcmVzdGluZy4KICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIEdDQSwgdGhlbiBhIGZpbGUgaXMgaW50ZXJlc3RpbmcgaWYgaXQgaXMKICAgICMgZGlmZmVyZW50IGZyb20gdGhlIGNoaWxkIGluIGFsbCB0aGUgcGFyZW50cy4KICAgIGlmIHskZGlmZm1lcmdlZ2NhIG5lIHt9fSB7CglzZXQgZmlsZXMge30KCWZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCSAgICBzZXQgZ2NhZGlmZnMgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlZ2NhICRwXSkKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcyhbbGlzdCAkcCAkZGlmZm1lcmdlaWRdKSB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZmlsZXMgJGZdIDwgMAoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGdjYWRpZmZzICRmXSA+PSAwfSB7CgkJICAgIGxhcHBlbmQgZmlsZXMgJGYKCQl9CgkgICAgfQoJfQoJc2V0IGZpbGVzIFtsc29ydCAkZmlsZXNdCiAgICB9IGVsc2UgewoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIDBdCglzZXQgZmlsZXMgJHRyZWVkaWZmcyhbbGlzdCAkZGlmZm1lcmdlaWQgJHBdKQoJZm9yIHtzZXQgaSAxfSB7JGkgPCAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKSAmJiAkZmlsZXMgbmUge319IHtpbmNyIGl9IHsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGldCgkgICAgc2V0IGRmICR0cmVlZGlmZnMoW2xpc3QgJHAgJGRpZmZtZXJnZWlkXSkKCSAgICBzZXQgbmYge30KCSAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRkZiAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIG5mICRmCgkJfQoJICAgIH0KCSAgICBzZXQgZmlsZXMgJG5mCgl9CiAgICB9CgogICAgc2V0IG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZmlsZXMKICAgIGlmIHskZmlsZXMgbmUge319IHsKCXNob3dtZXJnZWRpZmYKICAgIH0KfQoKcHJvYyBzaG93bWVyZ2VkaWZmIHt9IHsKICAgIGdsb2JhbCBjZmxpc3QgZGlmZm1lcmdlaWQgbWVyZ2VmaWxlbGlzdCBwYXJlbnRzCiAgICBnbG9iYWwgZGlmZm9wdHMgZGlmZmluaHVuayBjdXJyZW50ZmlsZSBjdXJyZW50aHVuayBmaWxlbGluZXMKICAgIGdsb2JhbCBkaWZmYmxvY2tlZCBncm91cGZpbGVsYXN0IG1lcmdlZmRzIGdyb3VwZmlsZW51bSBncm91cGh1bmtzCgogICAgc2V0IGZpbGVzICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkKICAgIGZvcmVhY2ggZiAkZmlsZXMgewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmCiAgICB9CiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGZsaXN0IHt9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGZpbGV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGh1bmt9CiAgICBjYXRjaCB7dW5zZXQgZmlsZWxpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGdyb3VwZmlsZW51bX0KICAgIGNhdGNoIHt1bnNldCBncm91cGh1bmtzfQogICAgc2V0IGdyb3VwZmlsZWxhc3QgLTEKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCXNldCBjbWQgW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1wICRwICRkaWZmbWVyZ2VpZF0KCXNldCBjbWQgW2NvbmNhdCAkY21kICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCglpZiB7W2NhdGNoIHtzZXQgZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCgkgICAgZm9yZWFjaCBmICRmbGlzdCB7CgkJY2F0Y2gge2Nsb3NlICRmfQoJICAgIH0KCSAgICByZXR1cm4KCX0KCWxhcHBlbmQgZmxpc3QgJGYKCXNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJc2V0IG1lcmdlZmRzKCRpZHMpICRmCglzZXQgZGlmZmluaHVuaygkaWRzKSAwCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgMAoJZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJGYgJGlkcyAkZGlmZm1lcmdlaWRdCiAgICB9Cn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7ZiBpZHMgaWR9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmaW5odW5rIGRpZmZvbGRsaW5lcyBkaWZmbmV3bGluZXMKICAgIGdsb2JhbCBjdXJyZW50ZmlsZSBjdXJyZW50aHVuawogICAgZ2xvYmFsIGRpZmZvbGRzdGFydCBkaWZmbmV3c3RhcnQgZGlmZm9sZGxubyBkaWZmbmV3bG5vCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgbWVyZ2VmaWxlbGlzdAogICAgZ2xvYmFsIG5vbGRsaW5lcyBubmV3bGluZXMgZGlmZmxjb3VudHMgZmlsZWxpbmVzCgogICAgc2V0IG4gW2dldHMgJGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHshW2VvZiAkZl19IHJldHVybgogICAgfQoKICAgIGlmIHshKFtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF0gJiYgJGRpZmZtZXJnZWlkID09ICRpZCl9IHsKCWlmIHskbiA8IDB9IHsKCSAgICBjbG9zZSAkZgoJfQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRkaWZmaW5odW5rKCRpZHMpICE9IDB9IHsKCXNldCBmaSAkY3VycmVudGZpbGUoJGlkcykKCWlmIHskbiA+IDAgJiYgW3JlZ2V4cCB7XlstKyBcXF19ICRsaW5lIG1hdGNoXX0gewoJICAgICMgY29udGludWluZyBhbiBleGlzdGluZyBodW5rCgkgICAgc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KCSAgICBpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZmksJGRpZmZvbGRsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmb2xkbG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIisiIHx8ICRtYXRjaCBlcSAiICJ9IHsKCQlzZXQgZmlsZWxpbmVzKCRpZCwkZmksJGRpZmZuZXdsbm8oJGlkcykpICRsaW5lCgkJaW5jciBkaWZmbmV3bG5vKCRpZHMpCgkgICAgfQoJICAgIGlmIHskbWF0Y2ggZXEgIiAifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDJ9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBcCgkJCVtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDEKCQl9CgkJaW5jciBub2xkbGluZXMoJGlkcykKCSAgICB9IGVsc2VpZiB7JG1hdGNoIGVxICItIiB8fCAkbWF0Y2ggZXEgIisifSB7CgkJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDF9IHsKCQkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCQkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgkJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDIKCQl9CgkJaWYgeyRtYXRjaCBlcSAiLSJ9IHsKCQkgICAgaW5jciBub2xkbGluZXMoJGlkcykKCQl9IGVsc2UgewoJCSAgICBpbmNyIG5uZXdsaW5lcygkaWRzKQoJCX0KCSAgICB9CgkgICAgIyBhbmQgaWYgaXQncyBcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGxpbmUsIHRoZW4gd2hhdD8KCSAgICByZXR1cm4KCX0KCSMgZW5kIG9mIGEgaHVuawoJaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDEgJiYgJG5vbGRsaW5lcygkaWRzKSAhPSAwfSB7CgkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpXQoJfSBlbHNlaWYgeyRkaWZmaW5odW5rKCRpZHMpID09IDIKCQkgICYmICgkbm9sZGxpbmVzKCRpZHMpICE9IDAgfHwgJG5uZXdsaW5lcygkaWRzKSAhPSAwKX0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKSAkbm5ld2xpbmVzKCRpZHMpXQoJfQoJc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSBcCgkJCQkgICAkZGlmZm9sZHN0YXJ0KCRpZHMpICRkaWZmbmV3c3RhcnQoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRsbm8oJGlkcykgJGRpZmZuZXdsbm8oJGlkcykgXAoJCQkJICAgJGRpZmZsY291bnRzKCRpZHMpXQoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJIyAtMSA9IG5lZWQgdG8gYmxvY2ssIDAgPSB1bmJsb2NrZWQsIDEgPSBpcyBibG9ja2VkCglzZXQgZGlmZmJsb2NrZWQoJGlkcykgLTEKCXByb2Nlc3NodW5rcwoJaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA9PSAtMX0gewoJICAgIGZpbGVldmVudCAkZiByZWFkYWJsZSB7fQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAxCgl9CiAgICB9CgogICAgaWYgeyRuIDwgMH0gewoJIyBlb2YKCWlmIHshJGRpZmZibG9ja2VkKCRpZHMpfSB7CgkgICAgY2xvc2UgJGYKCSAgICBzZXQgY3VycmVudGZpbGUoJGlkcykgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KCSAgICBzZXQgY3VycmVudGh1bmsoJGlkcykgW2xpc3QgJGN1cnJlbnRmaWxlKCRpZHMpIDAgMCAwIDAge31dCgkgICAgcHJvY2Vzc2h1bmtzCgl9CiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFwKCSAgICBbbHNlYXJjaCAtZXhhY3QgJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKSAkZm5hbWVdCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJaWYge1tpbmZvIGV4aXN0cyBjdXJyZW50ZmlsZSgkaWRzKV0gJiYgJGN1cnJlbnRmaWxlKCRpZHMpID49IDB9IHsKCSAgICAjIHN0YXJ0IG9mIGEgbmV3IGh1bmsKCSAgICBpZiB7JGYxbCA9PSAwICYmICRmMWMgPT0gMH0gewoJCXNldCBmMWwgMQoJICAgIH0KCSAgICBpZiB7JGYybCA9PSAwICYmICRmMmMgPT0gMH0gewoJCXNldCBmMmwgMQoJICAgIH0KCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkgICAgc2V0IGRpZmZvbGRzdGFydCgkaWRzKSAkZjFsCgkgICAgc2V0IGRpZmZuZXdzdGFydCgkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZvbGRsbm8oJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3bG5vKCRpZHMpICRmMmwKCSAgICBzZXQgZGlmZmxjb3VudHMoJGlkcykge30KCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCSAgICBzZXQgbm5ld2xpbmVzKCRpZHMpIDAKCX0KICAgIH0KfQoKcHJvYyBwcm9jZXNzaHVua3Mge30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIHBhcmVudHMgbnBhcmVudHMgY3VycmVudGh1bmsKICAgIGdsb2JhbCBtZXJnZWZpbGVsaXN0IGRpZmZibG9ja2VkIG1lcmdlZmRzCiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgZ3JvdXBmaWxlbnVtCgogICAgc2V0IG5maWxlcyBbbGxlbmd0aCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQogICAgd2hpbGUgMSB7CglzZXQgZmkgJG5maWxlcwoJc2V0IGxubyAwCgkjIGxvb2sgZm9yIHRoZSBlYXJsaWVzdCBodW5rCglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGh1bmsoJGlkcyldfSByZXR1cm4KCSAgICBzZXQgaSBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAwXQoJICAgIHNldCBsIFtsaW5kZXggJGN1cnJlbnRodW5rKCRpZHMpIDJdCgkgICAgaWYgeyRpIDwgJGZpIHx8ICgkaSA9PSAkZmkgJiYgJGwgPCAkbG5vKX0gewoJCXNldCBmaSAkaQoJCXNldCBsbm8gJGwKCQlzZXQgcGkgJHAKCSAgICB9Cgl9CgoJaWYgeyRmaSA8ICRuZmlsZXN9IHsKCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcGldCgkgICAgc2V0IGh1bmsgJGN1cnJlbnRodW5rKCRpZHMpCgkgICAgdW5zZXQgY3VycmVudGh1bmsoJGlkcykKCSAgICBpZiB7JGRpZmZibG9ja2VkKCRpZHMpID4gMH0gewoJCWZpbGVldmVudCAkbWVyZ2VmZHMoJGlkcykgcmVhZGFibGUgXAoJCSAgICBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZXJnZWZkcygkaWRzKSAkaWRzICRkaWZmbWVyZ2VpZF0KCSAgICB9CgkgICAgc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCgkgICAgaWYge1tpbmZvIGV4aXN0cyBncm91cGZpbGVudW1dICYmICRncm91cGZpbGVudW0gPT0gJGZpCgkJJiYgJGxubyA8PSAkZ3JvdXBsaW5lZW5kfSB7CgkJIyBhZGQgdGhpcyBodW5rIHRvIHRoZSBwZW5kaW5nIGdyb3VwCgkJbGFwcGVuZCBncm91cGh1bmtzKCRwaSkgJGh1bmsKCQlzZXQgZW5kbG4gW2xpbmRleCAkaHVuayA0XQoJCWlmIHskZW5kbG4gPiAkZ3JvdXBsaW5lZW5kfSB7CgkJICAgIHNldCBncm91cGxpbmVlbmQgJGVuZGxuCgkJfQoJCWNvbnRpbnVlCgkgICAgfQoJfQoKCSMgc3VjY2VlZGluZyBzdHVmZiBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGdyb3VwLCBzbwoJIyBwcm9jZXNzIHRoZSBncm91cCBub3cKCWlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXX0gewoJICAgIHByb2Nlc3Nncm91cAoJICAgIHVuc2V0IGdyb3VwZmlsZW51bQoJICAgIHVuc2V0IGdyb3VwaHVua3MKCX0KCglpZiB7JGZpID49ICRuZmlsZXN9IGJyZWFrCgoJIyBzdGFydCBhIG5ldyBncm91cAoJc2V0IGdyb3VwZmlsZW51bSAkZmkKCXNldCBncm91cGh1bmtzKCRwaSkgW2xpc3QgJGh1bmtdCglzZXQgZ3JvdXBsaW5lc3RhcnQgJGxubwoJc2V0IGdyb3VwbGluZWVuZCBbbGluZGV4ICRodW5rIDRdCiAgICB9Cn0KCnByb2MgcHJvY2Vzc2dyb3VwIHt9IHsKICAgIGdsb2JhbCBncm91cGZpbGVsYXN0IGdyb3VwZmlsZW51bSBkaWZmZmlsZXN0YXJ0CiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmbWVyZ2VpZCBjdGV4dCBmaWxlbGluZXMKICAgIGdsb2JhbCBwYXJlbnRzIGRpZmZtZXJnZWlkIGRpZmZvZmZzZXQKICAgIGdsb2JhbCBncm91cGh1bmtzIGdyb3VwbGluZXN0YXJ0IGdyb3VwbGluZWVuZCBucGFyZW50cwogICAgZ2xvYmFsIG1lcmdlbWF4CgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IGYgJGdyb3VwZmlsZW51bQogICAgaWYgeyRncm91cGZpbGVsYXN0ICE9ICRmfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgZGlmZmZpbGVzdGFydCgkZikgJGhlcmUKCXNldCBtYXJrIGZtYXJrLltleHByIHskZiArIDF9XQoJJGN0ZXh0IG1hcmsgc2V0ICRtYXJrICRoZXJlCgkkY3RleHQgbWFyayBncmF2aXR5ICRtYXJrIGxlZnQKCXNldCBoZWFkZXIgW2xpbmRleCAkbWVyZ2VmaWxlbGlzdCgkaWQpICRmXQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRoZWFkZXJdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGhlYWRlciAkcGFkXG4iIGZpbGVzZXAKCXNldCBncm91cGZpbGVsYXN0ICRmCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgc2V0IGRpZmZvZmZzZXQoJHApIDAKCX0KICAgIH0KCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQEAiIG1zZXAKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgc2V0IGV2ZW50cyB7fQogICAgc2V0IHBudW0gMAogICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJc2V0IHN0YXJ0bGluZSBbZXhwciB7JGdyb3VwbGluZXN0YXJ0ICsgJGRpZmZvZmZzZXQoJHApfV0KCXNldCBvbCAkc3RhcnRsaW5lCglzZXQgbmwgJGdyb3VwbGluZXN0YXJ0CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwaHVua3MoJHApXX0gewoJICAgIGZvcmVhY2ggaCAkZ3JvdXBodW5rcygkcCkgewoJCXNldCBsIFtsaW5kZXggJGggMl0KCQlpZiB7JG5sIDwgJGx9IHsKCQkgICAgZm9yIHt9IHskbmwgPCAkbH0ge2luY3Igbmx9IHsKCQkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQkJaW5jciBvbAoJCSAgICB9CgkJfQoJCWZvcmVhY2ggY2h1bmsgW2xpbmRleCAkaCA1XSB7CgkJICAgIGlmIHtbbGxlbmd0aCAkY2h1bmtdID09IDJ9IHsKCQkJc2V0IG9sYyBbbGluZGV4ICRjaHVuayAwXQoJCQlzZXQgbmxjIFtsaW5kZXggJGNodW5rIDFdCgkJCXNldCBubmwgW2V4cHIgeyRubCArICRubGN9XQoJCQlsYXBwZW5kIGV2ZW50cyBbbGlzdCAkbmwgJG5ubCAkcG51bSAkb2xjICRubGNdCgkJCWluY3Igb2wgJG9sYwoJCQlzZXQgbmwgJG5ubAoJCSAgICB9IGVsc2UgewoJCQlpbmNyIG9sIFtsaW5kZXggJGNodW5rIDBdCgkJCWluY3IgbmwgW2xpbmRleCAkY2h1bmsgMF0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CglpZiB7JG5sIDwgJGdyb3VwbGluZWVuZH0gewoJICAgIGZvciB7fSB7JG5sIDwgJGdyb3VwbGluZWVuZH0ge2luY3Igbmx9IHsKCQlzZXQgZmlsZWxpbmVzKCRwLCRmLCRvbCkgJGZpbGVsaW5lcygkaWQsJGYsJG5sKQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgbmxpbmVzIFtleHByIHskb2wgLSAkc3RhcnRsaW5lfV0KCSRjdGV4dCBpbnNlcnQgZW5kICIgLSRzdGFydGxpbmUsJG5saW5lcyIgbXNlcAoJaW5jciBwbnVtCiAgICB9CgogICAgc2V0IG5saW5lcyBbZXhwciB7JGdyb3VwbGluZWVuZCAtICRncm91cGxpbmVzdGFydH1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICskZ3JvdXBsaW5lc3RhcnQsJG5saW5lcyBAQFxuIiBtc2VwCgogICAgc2V0IGV2ZW50cyBbbHNvcnQgLWludGVnZXIgLWluZGV4IDAgJGV2ZW50c10KICAgIHNldCBuZXZlbnRzIFtsbGVuZ3RoICRldmVudHNdCiAgICBzZXQgbm1lcmdlICRucGFyZW50cygkZGlmZm1lcmdlaWQpCiAgICBzZXQgbCAkZ3JvdXBsaW5lc3RhcnQKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG5ldmVudHN9IHtzZXQgaSAkan0gewoJc2V0IG5sIFtsaW5kZXggJGV2ZW50cyAkaSAwXQoJd2hpbGUgeyRsIDwgJG5sfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIKCSAgICBpbmNyIGwKCX0KCXNldCBlIFtsaW5kZXggJGV2ZW50cyAkaV0KCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJc2V0IGogJGkKCXNldCBhY3RpdmUge30KCXdoaWxlIDEgewoJICAgIHNldCBwbnVtIFtsaW5kZXggJGUgMl0KCSAgICBzZXQgb2xjIFtsaW5kZXggJGUgM10KCSAgICBzZXQgbmxjIFtsaW5kZXggJGUgNF0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldfSB7CgkJc2V0IGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJCWxhcHBlbmQgYWN0aXZlICRwbnVtCgkgICAgfSBlbHNlIHsKCQlpbmNyIGRlbHRhKCRwbnVtKSBbZXhwciB7JG9sYyAtICRubGN9XQoJICAgIH0KCSAgICBpZiB7W2luY3Igal0gPj0gJG5ldmVudHN9IGJyZWFrCgkgICAgc2V0IGUgW2xpbmRleCAkZXZlbnRzICRqXQoJICAgIGlmIHtbbGluZGV4ICRlIDBdID49ICRlbmx9IGJyZWFrCgkgICAgaWYge1tsaW5kZXggJGUgMV0gPiAkZW5sfSB7CgkJc2V0IGVubCBbbGluZGV4ICRlIDFdCgkgICAgfQoJfQoJc2V0IG5sYyBbZXhwciB7JGVubCAtICRsfV0KCXNldCBuY29sIG1yZXN1bHQKCXNldCBiZXN0cG4gLTEKCWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlIC0gMX0gewoJICAgICMgbm8gZGlmZiBmb3Igb25lIG9mIHRoZSBwYXJlbnRzLCBpLmUuIGl0J3MgaWRlbnRpY2FsCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCSAgICBpZiB7JHBudW0gPCAkbWVyZ2VtYXh9IHsKCQkJbGFwcGVuZCBuY29sIG0kcG51bQoJCSAgICB9IGVsc2UgewoJCQlsYXBwZW5kIG5jb2wgbW1heAoJCSAgICB9CgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCX0gZWxzZWlmIHtbbGxlbmd0aCAkYWN0aXZlXSA9PSAkbm1lcmdlfSB7CgkgICAgIyBhbGwgcGFyZW50cyBhcmUgZGlmZmVyZW50LCBzZWUgaWYgb25lIGlzIHZlcnkgc2ltaWxhcgoJICAgIHNldCBiZXN0c2ltIDMwCgkgICAgZm9yIHtzZXQgcG51bSAwfSB7JHBudW0gPCAkbm1lcmdlfSB7aW5jciBwbnVtfSB7CgkJc2V0IHNpbSBbc2ltaWxhcml0eSAkcG51bSAkbCAkbmxjICRmIFwKCQkJICAgICBbbHJhbmdlICRldmVudHMgJGkgW2V4cHIgeyRqLTF9XV1dCgkJaWYgeyRzaW0gPiAkYmVzdHNpbX0gewoJCSAgICBzZXQgYmVzdHNpbSAkc2ltCgkJICAgIHNldCBiZXN0cG4gJHBudW0KCQl9CgkgICAgfQoJICAgIGlmIHskYmVzdHBuID49IDB9IHsKCQlsYXBwZW5kIG5jb2wgbSRiZXN0cG4KCSAgICB9Cgl9CglzZXQgcG51bSAtMQoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGluY3IgcG51bQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV0gfHwgJHBudW0gPT0gJGJlc3Rwbn0gY29udGludWUKCSAgICBzZXQgb2xjIFtleHByIHskbmxjICsgJGRlbHRhKCRwbnVtKX1dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJHBudW0pCgkgICAgdW5zZXQgZGVsdGEoJHBudW0pCgkgICAgZm9yIHt9IHskb2xjID4gMH0ge2luY3Igb2xjIC0xfSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIi0kZmlsZWxpbmVzKCRwLCRmLCRvbClcbiIgbSRwbnVtCgkJaW5jciBvbAoJICAgIH0KCX0KCXNldCBlbmRsIFtleHByIHskbCArICRubGN9XQoJaWYgeyRiZXN0cG4gPj0gMH0gewoJICAgICMgc2hvdyB0aGlzIHByZXR0eSBtdWNoIGFzIGEgbm9ybWFsIGRpZmYKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJGJlc3Rwbl0KCSAgICBzZXQgb2wgW2V4cHIgeyRsICsgJGRpZmZvZmZzZXQoJHApfV0KCSAgICBpbmNyIGRpZmZvZmZzZXQoJHApICRkZWx0YSgkYmVzdHBuKQoJICAgIHVuc2V0IGRlbHRhKCRiZXN0cG4pCgkgICAgZm9yIHtzZXQgayAkaX0geyRrIDwgJGp9IHtpbmNyIGt9IHsKCQlzZXQgZSBbbGluZGV4ICRldmVudHMgJGtdCgkJaWYge1tsaW5kZXggJGUgMl0gIT0gJGJlc3Rwbn0gY29udGludWUKCQlzZXQgbmwgW2xpbmRleCAkZSAwXQoJCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCQkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCQl9CgkJc2V0IGMgW2xpbmRleCAkZSAzXQoJCWZvciB7fSB7JGMgPiAwfSB7aW5jciBjIC0xfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kYmVzdHBuCgkJICAgIGluY3Igb2wKCQl9CgkJc2V0IG5sIFtsaW5kZXggJGUgMV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iIG1yZXN1bHQKCQl9CgkgICAgfQoJfQoJZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgJG5jb2wKCX0KICAgIH0KICAgIHdoaWxlIHskbCA8ICRncm91cGxpbmVlbmR9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCglpbmNyIGwKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNpbWlsYXJpdHkge3BudW0gbCBubGMgZiBldmVudHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIGRpZmZvZmZzZXQgZmlsZWxpbmVzCgogICAgc2V0IGlkICRkaWZmbWVyZ2VpZAogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwbnVtXQogICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCiAgICBzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KICAgIHNldCBzYW1lIDAKICAgIHNldCBkaWZmIDAKICAgIGZvcmVhY2ggZSAkZXZlbnRzIHsKCWlmIHtbbGluZGV4ICRlIDJdICE9ICRwbnVtfSBjb250aW51ZQoJc2V0IG5sIFtsaW5kZXggJGUgMF0KCXNldCBvbCBbZXhwciB7JG9sICsgJG5sIC0gJGx9XQoJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJICAgIGluY3Igc2FtZSBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRpZCwkZiwkbCldCgkgICAgaW5jciBzYW1lCgl9CglzZXQgb2MgW2xpbmRleCAkZSAzXQoJZm9yIHt9IHskb2MgPiAwfSB7aW5jciBvYyAtMX0gewoJICAgIGluY3IgZGlmZiBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRwLCRmLCRvbCldCgkgICAgaW5jciBkaWZmCgkgICAgaW5jciBvbAoJfQoJc2V0IG5sIFtsaW5kZXggJGUgMV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3IgZGlmZgoJfQogICAgfQogICAgZm9yIHt9IHskbCA8ICRlbmRsfSB7aW5jciBsfSB7CglpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJaW5jciBzYW1lCiAgICB9CiAgICBpZiB7JHNhbWUgPT0gMH0gewoJcmV0dXJuIDAKICAgIH0KICAgIHJldHVybiBbZXhwciB7MjAwICogJHNhbWUgLyAoMiAqICRzYW1lICsgJGRpZmYpfV0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKCRpZHMpIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgZ2V0YmxvYmRpZmZzICRpZHMKfQoKcHJvYyBnZXR0cmVlZGlmZnMge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHBhcmVudHMgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgJGlkc10gcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgZW52KEdJVF9ESUZGX09QVFMpICRkaWZmb3B0cwogICAgc2V0IGNtZCBbY29uY2F0IHwgZ2l0LWRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAtcCAtQyAkaWRzXQogICAgaWYge1tjYXRjaCB7c2V0IGJkZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CglwdXRzICJlcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgZGlmZmluaGRyIDAKICAgIGZjb25maWd1cmUgJGJkZiAtYmxvY2tpbmcgMAogICAgc2V0IGJsb2JkaWZmZmQoJGlkcykgJGJkZgogICAgc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKICAgIHNldCBjdXJ0YWdzdGFydCAwLjAKICAgIGNhdGNoIHt1bnNldCBkaWZmZmlsZXN0YXJ0fQogICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2MgZ2V0YmxvYmRpZmZsaW5lIHtiZGYgaWRzfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBoZWFkZXIgJG5ld25hbWUKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRkaWZmaWRzKSAkZm5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldCBkaWZmZmlsZXN0YXJ0KCRpKSAkaGVyZQoJICAgIGluY3IgaQoJICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4kaSAkaGVyZQoJICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGkgbGVmdAoJfQoJaWYgeyRuZXduYW1lICE9ICRmbmFtZX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRkaWZmaWRzKSAkbmV3bmFtZV0KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldCBkaWZmZmlsZXN0YXJ0KCRpKSAkaGVyZQoJCWluY3IgaQoJCSRjdGV4dCBtYXJrIHNldCBmbWFyay4kaSAkaGVyZQoJCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuJGkgbGVmdAoJICAgIH0KCX0KCXNldCBjdXJkaWZmdGFnICJmOiRmbmFtZSIKCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGRpZmZpbmhkciAxCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XigtLS18XCtcK1wrKX0gJGxpbmVdfSB7CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspLChbMC05XSspIFwrKFswLTldKyksKFswLTldKykgQEAoLiopfSBcCgkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2UgewoJc2V0IHggW3N0cmluZyByYW5nZSAkbGluZSAwIDBdCglpZiB7JHggPT0gIi0iIHx8ICR4ID09ICIrIn0gewoJICAgIHNldCB0YWcgW2V4cHIgeyR4ID09ICIrIn1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGQkdGFnCgl9IGVsc2VpZiB7JHggPT0gIiAifSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7MyArIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCBjYW52eDAgW2V4cHIgezMgKyAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgbHRoaWNrbmVzcyBbZXhwciB7aW50KCRsaW5lc3BjIC8gOSkgKyAxfV0KICAgIHNldCB4c3BjMSgwKSAkbGluZXNwYwogICAgc2V0IHhzcGMyICRsaW5lc3BjCn0KCnByb2MgcmVkaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkIHJlZGlzcGxheWluZyBwaGFzZQogICAgaWYgeyRzdG9wcGVkID4gMX0gcmV0dXJuCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIn0gcmV0dXJuCiAgICBzZXQgcmVkaXNwbGF5aW5nIDEKICAgIGlmIHskcGhhc2UgPT0gImRyYXdncmFwaCIgfHwgJHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCXNldCBzdG9wcGVkIDEKICAgIH0gZWxzZSB7CglkcmF3Z3JhcGgKICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQogICAgZ2xvYmFsIHN0b3BwZWQgZW50cmllcwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KICAgIHNldCBuYW1lZm9udCBbbHJlcGxhY2UgJG5hbWVmb250IDEgMSBbZXhwciB7W2xpbmRleCAkbmFtZWZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQogICAgc2V0Y29vcmRzCiAgICAkY3RleHQgY29uZiAtZm9udCAkdGV4dGZvbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJJGUgY29uZiAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSB7CgkkY2FudiBpdGVtY29uZiB0ZXh0aXRlbXMgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICByZWRpc3BsYXkKfQoKcHJvYyBjbGVhcnNoYTEge30gewogICAgZ2xvYmFsIHNoYTFlbnRyeSBzaGExc3RyaW5nCiAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7Cgkkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgfQp9Cgpwcm9jIHNoYTFjaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHtbJHNoYTFidXQgY2dldCAtc3RhdGVdID09ICRzdGF0ZX0gcmV0dXJuCiAgICBpZiB7JHN0YXRlID09ICJub3JtYWwifSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKICAgIH0gZWxzZSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgLXRleHQgIlNIQTEgSUQ6ICIKICAgIH0KfQoKcHJvYyBnb3RvY29tbWl0IHt9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBpZGxpbmUgdGFnaWRzCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMKCiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJHRhZ2lkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZSB7CglzZXQgaWQgW3N0cmluZyB0b2xvd2VyICRzaGExc3RyaW5nXQoJaWYge1tyZWdleHAge15bMC05YS1mXXs0LDM5fSR9ICRpZF19IHsKCSAgICBzZXQgbWF0Y2hlcyB7fQoJICAgIGZvciB7c2V0IGwgMH0geyRsIDwgJG51bWNvbW1pdHN9IHtpbmNyIGx9IHsKCQlpZiB7W3N0cmluZyBtYXRjaCAkaWQqICRsaW5laWQoJGwpXX0gewoJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGxpbmVpZCgkbCkKCQl9CgkgICAgfQoJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0gewoJCWlmIHtbbGxlbmd0aCAkbWF0Y2hlc10gPiAxfSB7CgkJICAgIGVycm9yX3BvcHVwICJTaG9ydCBTSEExIGlkICRpZCBpcyBhbWJpZ3VvdXMiCgkJICAgIHJldHVybgoJCX0KCQlzZXQgaWQgW2xpbmRleCAkbWF0Y2hlcyAwXQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKSAxCglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZkEtRl17NCx9JH0gJHNoYTFzdHJpbmddfSB7CglzZXQgdHlwZSAiU0hBMSBpZCIKICAgIH0gZWxzZSB7CglzZXQgdHlwZSAiVGFnIgogICAgfQogICAgZXJyb3JfcG9wdXAgIiR0eXBlICRzaGExc3RyaW5nIGlzIG5vdCBrbm93biIKfQoKcHJvYyBsaW5lZW50ZXIge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjYW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgLWZvbnQgJG1haW5mb250XQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIG1haW5saW5lIG1haW5saW5lYXJyb3cgc2lkZWxpbmVzIGx0aGlja25lc3MKCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCWlmIHskbWFpbmxpbmVhcnJvdygkaWQpIG5lICJub25lIn0gewoJICAgIGlmIHthYnMoW2xpbmRleCAkbWFpbmxpbmUoJGlkKSAxXSAtICR5KSA8ICR0aHJlc2h9IHsKCQlyZXR1cm4gInVwIgoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7Cglmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkgICAgc2V0IGNvb3JkcyBbbGluZGV4ICRscyAwXQoJICAgIHNldCBhcnJvdyBbbGluZGV4ICRscyAyXQoJICAgIGlmIHskYXJyb3cgZXEgImZpcnN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgMV0gLSAkeSkgPCAkdGhyZXNofSB7CgkJICAgIHJldHVybiAidXAiCgkJfQoJICAgIH0KCSAgICBpZiB7JGFycm93IGVxICJsYXN0IiB8fCAkYXJyb3cgZXEgImJvdGgifSB7CgkJaWYge2FicyhbbGluZGV4ICRjb29yZHMgZW5kXSAtICR5KSA8ICR0aHJlc2h9IHsKCQkgICAgcmV0dXJuICJkb3duIgoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBhcnJvd2p1bXAge2lkIGRpcm4geX0gewogICAgZ2xvYmFsIG1haW5saW5lIHNpZGVsaW5lcyBjYW52IGNhbnYyIGNhbnYzCgogICAgc2V0IHl0IHt9CiAgICBpZiB7JGRpcm4gZXEgImRvd24ifSB7CglpZiB7W2luZm8gZXhpc3RzIG1haW5saW5lKCRpZCldfSB7CgkgICAgc2V0IHkxIFtsaW5kZXggJG1haW5saW5lKCRpZCkgMV0KCSAgICBpZiB7JHkxID4gJHl9IHsKCQlzZXQgeXQgJHkxCgkgICAgfQoJfQoJaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCSAgICBmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkJc2V0IHkxIFtsaW5kZXggJGxzIDAgMV0KCQlpZiB7JHkxID4gJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPCAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWlmIHtbaW5mbyBleGlzdHMgc2lkZWxpbmVzKCRpZCldfSB7CgkgICAgZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJCXNldCB5MSBbbGluZGV4ICRscyAwIGVuZF0KCQlpZiB7JHkxIDwgJHkgJiYgKCR5dCBlcSB7fSB8fCAkeTEgPiAkeXQpfSB7CgkJICAgIHNldCB5dCAkeTEKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgeyR5dCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCiAgICBzZXQgdmlldyBbJGNhbnYgeXZpZXddCiAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KICAgIGlmIHskeWZyYWMgPCAwfSB7CglzZXQgeWZyYWMgMAogICAgfQogICAgJGNhbnYgeXZpZXcgbW92ZXRvICR5ZnJhYwogICAgJGNhbnYyIHl2aWV3IG1vdmV0byAkeWZyYWMKICAgICRjYW52MyB5dmlldyBtb3ZldG8gJHlmcmFjCn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNmbGlzdCBjYW52IHRoaWNrZXJsaW5lCgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAogICAgZHJhd2xpbmVzICRpZCAxIDEKICAgIHNldCB0aGlja2VybGluZSAkaWQKICAgIGlmIHskaXNuZXd9IHsKCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCWlmIHskeW1heCBlcSB7fX0gcmV0dXJuCglzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCglzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICB9CiAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQogICAgaWYgeyRkaXJuIG5lIHt9fSB7CglhcnJvd2p1bXAgJGlkICRkaXJuICR5CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQogICAgfQogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkaWQpIHsKCSAgICBpbmNyIGkKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCWRyYXdsaW5lcyAkdGhpY2tlcmxpbmUgMCAxCgl1bnNldCB0aGlja2VybGluZQogICAgfQp9Cgpwcm9jIHNlbGJ5aWQge2lkfSB7CiAgICBnbG9iYWwgaWRsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkbGluZSgkaWQpXX0gewoJc2VsZWN0bGluZSAkaWRsaW5lKCRpZCkgMQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGlkbGluZSBzZWxlY3RlZGxpbmUgcm93bWVudWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSB8fCAkaWRsaW5lKCRpZCkgZXEgJHNlbGVjdGVkbGluZX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMCAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAxIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDIgLXN0YXRlICRzdGF0ZQogICAgc2V0IHJvd21lbnVpZCAkaWQKICAgIHRrX3BvcHVwICRyb3djdHhtZW51ICR4ICR5Cn0KCnByb2MgZGlmZnZzc2VsIHtkaXJufSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBsaW5laWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHskZGlybn0gewoJc2V0IG9sZGlkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCiAgICB9CiAgICBhZGR0b2hpc3RvcnkgW2xpc3QgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWRdCiAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAp9Cgpwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQtZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBpZGxpbmUgaWRwb3Mgc2VsZWN0ZWRsaW5lCgogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkaWRsaW5lKCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHNlbGVjdGVkbGluZSA9PSAkaWRsaW5lKCRpZCl9IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgbWt0YWdjYW4ge30gewogICAgZ2xvYmFsIG1rdGFndG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQogICAgdW5zZXQgbWt0YWd0b3AKfQoKcHJvYyBta3RhZ2dvIHt9IHsKICAgIGRvbWt0YWcKICAgIG1rdGFnY2FuCn0KCnByb2Mgd3JpdGVjb21taXQge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCB3cmNvbXRvcCBjb21taXRpbmZvIHdyY29tY21kCgogICAgc2V0IHRvcCAud3JpdGVjb21taXQKICAgIHNldCB3cmNvbXRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCiAgICBlbnRyeSAkdG9wLmNtZCAtd2lkdGggNjAgLXRleHR2YXJpYWJsZSB3cmNvbWNtZAogICAgZ3JpZCAkdG9wLmNsYWIgJHRvcC5jbWQgLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAiY29tbWl0LVtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDZdIl0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJXcml0ZSIgLWNvbW1hbmQgd3Jjb21nbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIHdyY29tZ28ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgc2V0IGlkIFskd3Jjb210b3Auc2hhMSBnZXRdCiAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCiAgICBzZXQgZm5hbWUgWyR3cmNvbXRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICRjbWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIHdyY29tY2FuIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2MgbGlzdHJlZnMge2lkfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgeCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCB4ICRpZHRhZ3MoJGlkKQogICAgfQogICAgc2V0IHkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHkgJGlkaGVhZHMoJGlkKQogICAgfQogICAgc2V0IHoge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB6ICRpZG90aGVycmVmcygkaWQpCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCn0KCnByb2MgcmVyZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCB0YWdpZHMgaGVhZGlkcyBvdGhlcnJlZmlkcwoKICAgIHNldCByZWZpZHMgW2NvbmNhdCBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXX0gewoJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQoJfQogICAgfQogICAgZm9yZWFjaCB2IHt0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyBvdGhlcnJlZmlkcyBpZG90aGVycmVmc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgcmVhZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2fSB7CgkgICAgcmVkcmF3dGFncyAkaWQKCX0KICAgIH0KfQoKcHJvYyBzaG93dGFnIHt0YWcgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QgdGFnY29udGVudHMgdGFnaWRzIGxpbmtudW0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2hvd3RhZyAkdGFnIDBdCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgIHNldCBsaW5rbnVtIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnY29udGVudHMoJHRhZyldfSB7CglzZXQgdGV4dCAkdGFnY29udGVudHMoJHRhZykKICAgIH0gZWxzZSB7CglzZXQgdGV4dCAiVGFnOiAkdGFnXG5JZDogICR0YWdpZHMoJHRhZykiCiAgICB9CiAgICBhcHBlbmR3aXRobGlua3MgJHRleHQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgZGVzdHJveSAuCn0KCnByb2MgZG9wcmVmcyB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgZmluZG1lcmdlZmlsZXMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcAoKICAgIHNldCB0b3AgLmdpdGtwcmVmcwogICAgc2V0IHByZWZzdG9wICR0b3AKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgZmluZG1lcmdlZmlsZXN9IHsKCXNldCBvbGRwcmVmcygkdikgW3NldCAkdl0KICAgIH0KICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgIkdpdGsgcHJlZmVyZW5jZXMiCiAgICBsYWJlbCAkdG9wLmxkaXNwIC10ZXh0ICJDb21taXQgbGlzdCBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3Auc3BhY2VyIC10ZXh0ICIgIgogICAgbGFiZWwgJHRvcC5tYXh3aWR0aGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKGxpbmVzKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHdpZHRoIC1mcm9tIDAgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heHdpZHRoCiAgICBncmlkICR0b3Auc3BhY2VyICR0b3AubWF4d2lkdGhsICR0b3AubWF4d2lkdGggLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXhwY3QgLWZyb20gMSAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4Z3JhcGhwY3QKICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CiAgICBjaGVja2J1dHRvbiAkdG9wLmZpbmRtIC12YXJpYWJsZSBmaW5kbWVyZ2VmaWxlcwogICAgbGFiZWwgJHRvcC5maW5kbWwgLXRleHQgIkluY2x1ZGUgbWVyZ2VzIGZvciBcIkZpbmRcIiBpbiBcIkZpbGVzXCIiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIGdyaWQgJHRvcC5maW5kbSAkdG9wLmZpbmRtbCAtIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kZGlzcCAtdGV4dCAiRGlmZiBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AuZGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZGlmZm9wdGwgLXRleHQgIk9wdGlvbnMgZm9yIGRpZmYgcHJvZ3JhbSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZW50cnkgJHRvcC5kaWZmb3B0IC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIGRpZmZvcHRzCiAgICBncmlkIHggJHRvcC5kaWZmb3B0bCAkdG9wLmRpZmZvcHQgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBwcmVmc2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC0gLXBhZHkgMTAgLXN0aWNreSBldwp9Cgpwcm9jIHByZWZzY2FuIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlcwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wCgogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlc30gewoJc2V0ICR2ICRvbGRwcmVmcygkdikKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCn0KCnByb2MgcHJlZnNvayB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCiAgICBpZiB7JG1heHdpZHRoICE9ICRvbGRwcmVmcyhtYXh3aWR0aCkKCXx8ICRtYXhncmFwaHBjdCAhPSAkb2xkcHJlZnMobWF4Z3JhcGhwY3QpfSB7CglyZWRpc3BsYXkKICAgIH0KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICByZXR1cm4gW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBnaXRlbmNvZGluZyAiIgpjYXRjaCB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgW2V4ZWMgZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewoJc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCBmaW5kbWVyZ2VmaWxlcyAwCnNldCBtYXhncmFwaHBjdCA1MApzZXQgbWF4d2lkdGggMTYKc2V0IHJldmxpc3RvcmRlciAwCnNldCBmYXN0ZGF0ZSAwCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCnNldCBuYW1lZm9udCAkbWFpbmZvbnQKCmZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJIl4tciIgeyBzZXQgcmV2bGlzdG9yZGVyIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMAoKc2V0IHN0b3BwZWQgMApzZXQgcmVkaXNwbGF5aW5nIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwpyZWFkcmVmcwpnZXRjb21taXRzICRyZXZ0cmVlYXJncwo=