IyEvYmluL3NoCiMgdWRoY3BjIHNjcmlwdCBlZGl0ZWQgYnkgVGltIFJpa2VyIDxUaW1AUmlrZXJzLm9yZz4KCnBhdGhfc2g9YG52IGdldCBwYXRoX3NoYAouICRwYXRoX3NoL2dsb2JhbC5zaAoKZWNobyAiSW5mbzogdWRoY3BjLnNoICQxICQyIHN0YXJ0IiA+PiAkdGVzdF9sb2cKClsgLXogIiQxIiBdICYmIGVjaG8gIkVycm9yOiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdWRoY3BjIiAmJiBleGl0IDEKClJFU09MVl9DT05GPSRwYXRoX2NvbmYiL3Jlc29sdi5jb25mIgojYnJvYWRjYXN0tObU2sqxuvKjrMno1sNCUk9BRENBU1QKWyAtbiAiJGJyb2FkY2FzdCIgXSAmJiBCUk9BRENBU1Q9ImJyb2FkY2FzdCAkYnJvYWRjYXN0Igojc3VibmV0tObU2sqxuvKjrMno1sNORVRNQVNLClsgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgoKZGVjb25maWdfd2FuKCkKeyAgIAogICAgbnYgc2V0ICQxIl9pcCI9MC4wLjAuMAogICAgbnYgc2V0ICQxIl9ubSI9MC4wLjAuMAogICAgbnYgc2V0ICQxIl9ndyI9MC4wLjAuMAogICAgbnYgc2V0ICQxIl9wcmlkbnMiPTAuMC4wLjAKICAgIG52IHNldCAkMSJfc2VjZG5zIj0wLjAuMC4wCQp9CgpnZXRfd2FuX25hbWUoKQp7CiAgICBjX2lkPSIwIgoJcHNfbmFtZT1gbnYgZ2V0IHBzd2FuYAoJcmo0NV9uYW1lPWBudiBnZXQgZXRod2FuYAoJd2lmaV9uYW1lPWBudiBnZXQgd2lmaXdhbmAKCWNhc2UgIiQxIiBpbgoJICAgICRwc19uYW1lIjEiKQogICAgICAgICAgICB3YW5uYW1lPSJwc3dhbiIJCgkJCWNfaWQ9IjEiIDs7CgkJJHBzX25hbWUiMiIpCiAgICAgICAgICAgIHdhbm5hbWU9InBzd2FuIgkKCQkJY19pZD0iMiIgOzsKCQkkcHNfbmFtZSIzIikKICAgICAgICAgICAgd2FubmFtZT0icHN3YW4iCQoJCQljX2lkPSIzIiA7OwoJCSRwc19uYW1lIjQiKQogICAgICAgICAgICB3YW5uYW1lPSJwc3dhbiIJCgkJCWNfaWQ9IjQiIDs7CiAgICAgICAgJHJqNDVfbmFtZSkKICAgICAgICAgICAgd2FubmFtZT0iZXRod2FuIiAgOzsKICAgICAgICAkd2lmaV9uYW1lKQogICAgICAgICAgICB3YW5uYW1lPSJ3aWZpd2FuIiA7OwkJCiAgICBlc2FjCQp9CgoKY2FzZSAiJDEiIGluCiAgICBkZWNvbmZpZykKICAgCQllY2hvICJjYXNlIGRlY29uZmlnICIKICAgICAgICBpZmNvbmZpZyAkaW50ZXJmYWNlIDAuMC4wLjAgMj4+JHRlc3RfbG9nCiAgICAgICAgaWYgWyAkPyAtbmUgMCBdO3RoZW4KCSAgICAgICAgZWNobyAiRXJyb3I6IGlmY29uZmlnICRpbnRlcmZhY2UgMC4wLjAuMCBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgICAgICBmaQoJCWRlY29uZmlnX3dhbiAkaW50ZXJmYWNlIDI+PiR0ZXN0X2xvZwoJCShyb3V0ZXJfbXNnX3Byb3h5IGlwdjQgdWRoY3BjLnNoID4+ICR0ZXN0X2xvZyAyPiYxIHx8IGVjaG8gIkVycm9yOiByb3V0ZXJfbXNnX3Byb3h5IGlwdjQgdWRoY3BjLnNoIGZhaWxlZC4iID4+ICR0ZXN0X2xvZykgJgogICAgICAgICBlY2hvICJjYXNlIGRlY29uZmlnIG92ZXIiCgkJIAoJCSBzdGVwPWBudnJhbV9nZXQgMjg2MCBzdGVwX3RtcGAKCQkgaWYgWyAiLSRzdGVwIiA9ICItIiBdO3RoZW4KCQkJc3RlcD0wCgkJIGZpCgkJIAoJCSBlY2hvICJzdGVwPSRzdGVwIgoJCSAKCQkgc3RlcD1gZXhwciAkc3RlcCArIDFgCgkJIG52IHNldCBzdGVwX3RtcD0kc3RlcAoJCSAKCQkgaWYgWyAiLSRzdGVwIiA9ICItMyIgXTt0aGVuCgkJCW52IHNldCBzdGVwX3RtcD0wCgkJIGZpCgkJIAkgCiAgICAgICAgOzsKCiAgICByZW5ld3xib3VuZCkKICAgIAllY2hvICJjYXNlIHJlbmV3IGJvdW5kIgogICAgICAgIAoJCWdldF93YW5fbmFtZSAkaW50ZXJmYWNlCQoJCWlmIFsgIi0kd2FubmFtZSIgPT0gIi1ldGh3YW4iIC1vICItJHdhbm5hbWUiID09ICItd2lmaXdhbiIgXTsgdGhlbgoJCQkocm91dGVyX21zZ19wcm94eSBkZWxfdGltZXIgJHdhbm5hbWUgPj4gJHRlc3RfbG9nIDI+JjEgfHwgZWNobyAiRXJyb3I6IHJvdXRlcl9tc2dfcHJveHkgZGVsX3RpbWVyIGZhaWxlZC4iID4+ICR0ZXN0X2xvZykgJgoJCWZpCgogICAgICAgICO199PDuMO9xbG+xvB1ZGhjcMqxuvKjrMXQts9pbnRlcmZhY2XKx7fxus1ldGh3YW7GpcXko6zGpcXk1PLG8GV0aHdhbiy38dTy08PUrWludGVyZmFjZQoJCWV0aHdhbl90bXA9YG52IGdldCBldGh3YW5gCiAgICAgICAgc3cwX2ZsYWc9YGVjaG8gJGV0aHdhbl90bXAgfCBncmVwICRpbnRlcmZhY2VgCiAgICAgICAgaWYgWyAiLSR7c3cwX2ZsYWd9IiAhPSAiLSIgXTt0aGVuCiAgICAgICAgICAgIGludGVyZmFjZT0ke2V0aHdhbl90bXB9CiAgICAgICAgZmkKCQlpZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLIDI+PiR0ZXN0X2xvZwoJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkgICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgICAgIGZpCgkJaWYgWyAiLSR3YW5uYW1lIiA9PSAiLXdpZml3YW4iIF07IHRoZW4KCQkJbnYgc2V0IHdpZmlfc3RhdGU9IndvcmtpbmciCgkgICAgZWxpZiBbICItJHdhbm5hbWUiID09ICItZXRod2FuIiBdOyB0aGVuCgkJICAgICPX1MrK06ajrGRoY3C78cihaXCzybmm1PLJscvAcHBwb2W9+LPMCgkJICAgIHBwcG9lX3BpZD1gcHMgfCBncmVwIC12IGdyZXAgfCBncmVwICRpbnRlcmZhY2UgfCBncmVwIHBwcG9lY2QgfCBhd2sgJ3twcmludCAkMX0nYAoJCQlraWxsICRwcHBvZV9waWQKCQkJbnYgc2V0IHJqNDVfc3RhdGU9IndvcmtpbmciCgkJCW52IHNldCBldGhfY3VybW9kZT0iZGhjcCIKCSAgICBmaQoJCQogICAgICAgIGVjaG8gImludGVyZmFjZTokaW50ZXJmYWNlLCBpcDokaXAsIE5FVE1BU0s6JHN1Ym5ldCIKICAgICAgICBlY2hvICJyb3V0ZXI6JHJvdXRlciIKICAgICAgICBlY2hvICJkbnM6JGRucyIKICAgICAgIAogICAgICAgICNzZXQgbmV3IHZhbHVlIHRvIGlwLCBuZXRtYXNrLCBnYXRld2F5IGFuZCBkbnMgaW4gbnYgCiAgICAgICAgbnYgc2V0ICRpbnRlcmZhY2UiX2lwIj0kaXAKICAgICAgICBudiBzZXQgJGludGVyZmFjZSJfbm0iPSRzdWJuZXQKICAgICAgICBudiBzZXQgJGludGVyZmFjZSJfZ3ciPSRyb3V0ZXIKCQkjc2V0IGRucyB0byBudgogICAgICAgIGZvciBpIGluICRkbnMgOyBkbwogICAgICAgICAgICBbIC1uICIkcHNwcmlkbnMiIF0gfHwgeyBudiBzZXQgJGludGVyZmFjZSJfcHJpZG5zIj0kaTsgcHNwcmlkbnM9InBzcHJpZG5zIjsgfQogICAgICAgICAgICBudiBzZXQgJGludGVyZmFjZSJfc2VjZG5zIj0kaSAgIAogICAgICAgIGRvbmUKCQkJCgkJI2NfaWQ9MNTyysdyajQ1u/JXaUZpo6xjX2lkPWRlZmF1bHTU8s6q08PT2s3izfi1xHBzv9oKICAgICAgICBkZWZfY2lkPWBudiBnZXQgZGVmYXVsdF9jaWRgCgkgICAgaWYgWyAiLSRjX2lkIiA9PSAiLTAiIC1vICItJGNfaWQiID09ICItJGRlZl9jaWQiIF07IHRoZW4KCQkJKHJvdXRlcl9tc2dfcHJveHkgaXB2NCB1ZGhjcGMuc2ggPj4gJHRlc3RfbG9nIDI+JjEgfHwgZWNobyAiRXJyb3I6IHJvdXRlcl9tc2dfcHJveHkgaXB2NCB1ZGhjcGMuc2ggZmFpbGVkLiIgPj4gJHRlc3RfbG9nKSAmCgkJZWxzZQoJCQkjcG9saWN5IHJvdXRlcgoJCQl3YW5fcHJpPWBudiBnZXQgJHdhbm5hbWUiX3ByaW9yaXR5ImAKCQkJcnRfbnVtPWBleHByICR3YW5fcHJpIFwqIDEwICsgJGNfaWRgCgkJCWlwIHJ1bGUgYWRkIGZyb20gJGlwIHRhYmxlICRydF9udW0gMj4+JHRlc3RfbG9nCgkJCWlmIFsgJD8gLW5lIDAgXTt0aGVuCgkJCQllY2hvICJFcnJvcjogaXAgcnVsZSBhZGQgZnJvbSAkaXAgdGFibGUgJHJ0X251bSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKCQkJZmkKCQkJaXAgcm91dGUgYWRkIGRlZmF1bHQgdmlhICRyb3V0ZXIgdGFibGUgJHJ0X251bSAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCQkJCWVjaG8gIkVycm9yOiBpcCByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgJHJvdXRlciB0YWJsZSAkcnRfbnVtIGZhaWxlZC4iID4+ICR0ZXN0X2xvZwoJCQlmaQoJCQlpcCByb3V0ZSBmbHVzaCBjYWNoZSAyPj4kdGVzdF9sb2cKCQkJaWYgWyAkPyAtbmUgMCBdO3RoZW4KCQkJCWVjaG8gIkVycm9yOiBpcCByb3V0ZSBmbHVzaCBjYWNoZSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKCQkJZmkKCSAgICBmaQogICAgIAoJCSMgbm90aWZ5IGdvYWhlYWQgd2hlbiB0aGUgV0FOIElQIGhhcyBiZWVuIGFjcXVpcmVkLiAtLXl5CgkJZWNobyAiY2FzZSByZW5ldyBib3VuZCBvdmVyIgoJCQogICAgICAgICNudiBzZXQgcHBwX3N0YXR1cz1wcHBfY29ubmVjdGVkCgkJbnYgc2V0IHN0ZXBfdG1wPTAKCQk7Owplc2FjCgoKCmV4aXQgMAoK