IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0gICAgICAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mClRNUFJFRz0vdG1wL3dpbmVpbnN0YWxsLnJlZwoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC40IgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCiMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgpoYXNoIHJwbTsgUkVUPSQ/ICY+L2Rldi9udWxsCmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIGl0IGZpcnN0LiIKICAgIGVjaG8gLW4gIm9rIChZL24pID8gIgogICAgcmVhZCBET1dJTkUKICAgIGlmIFsgIiRET1dJTkUiICE9ICduJyAtYSAiJERPV0lORSIgIT0gJ04nIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdAogICAgZmkgCiAgZmkKZmkKCiMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCmlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCn0KZWxzZSB7CiAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgZWNobwogIGlmICEgLi9jb25maWd1cmUgJENPTkZBUkdTCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQogICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBlbGlmIFsgIiRhY19jdl9oZWFkZXJfWDExX3hwbV9oIiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYcG0gZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCn0KZmkKCiMgbm93IGRvIHRoZSBjb21waWxhdGlvbgoKaWYgWyAtZiB3aW5lIF0gJiYgWyB3aW5lIC1udCBNYWtlZmlsZSBdCnRoZW4gewogIGVjaG8gIkhtbSwgbG9va3MgbGlrZSBXSU5FIGlzIGFscmVhZHkgY29tcGlsZWQuIEknbGwgc2tpcCB0aGF0IHRvbywgSSBndWVzcy4iCn0KZWxzZSB7CiAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIGluIHRoZSBtZWFudGltZS4uLiIKICBlY2hvCiAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICBleGl0IDEKICB9CiAgZmkKICBlY2hvCn0KZmkKCiMgYW5kIGluc3RhbGxhdGlvbiwgaWYgcm9vdAoKaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQp0aGVuIHsKICBlY2hvICJZb3UgYXJlbid0IHJvb3QsIHNvIEknbGwgc2tpcCB0aGUgbWFrZSBpbnN0YWxsLiIKICAjIHNldHVwIHRvIHJ1biBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5CiAgRExMUEFUSD0iJFBXRC9kbGxzIgogIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICB0aGVuIExEX0xJQlJBUllfUEFUSD0iJFBXRDokRExMUEFUSCIKICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogIGZpCiAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogIERFQlVHR0VSPSIkUFdELyRIREVCVUdHRVIiCiAgZWNobwogIGVjaG8gIk5PVEUhIFRvIHJ1biBXaW5lIHdpdGhvdXQgaW5zdGFsbGluZywgeW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKICBlY2hvICJMRF9MSUJSQVJZX1BBVEggdG8gJFBXRDokRExMUEFUSCIKICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgp9CmVsc2UgewogIGVjaG8gIk5vdyBpbnN0YWxsaW5nIGJpbmFyaWVzIG9udG8gdGhlIHN5c3RlbS4uLiIKICBlY2hvCiAgaWYgISBtYWtlIGluc3RhbGwKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0gJiYgISBncmVwIC1xcyAiJGxpYmRpciIgL2V0Yy9sZC5zby5jb25mCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICIkbGliZGlyIGRpZG4ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgYWRkaW5nIGl0IG5vdy4uLiIKICAgIGVjaG8gIiRsaWJkaXIiID4+L2V0Yy9sZC5zby5jb25mCiAgICBlY2hvICJSZS1ydW5uaW5nIGxkY29uZmlnLi4uIgogICAgZXZhbCAiJGFjX2N2X3BhdGhfTERDT05GSUciCiAgfQogIGZpCn0KZmkKZWNobwoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9DT05GIiBdCnRoZW4gRE9DT05GPWF1dG8KZmkKCmlmIFsgIiRET0NPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgLWYgJENPTkYgXQogIHRoZW4gRE9DT05GPW5vCiAgZmkKfQpmaQoKaWYgWyAiJERPQ09ORiIgIT0gJ25vJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIENPTkY9fi8ud2luZXJjCiAgICBpZiAhIFsgLWYgJENPTkYgXQogICAgdGhlbiB7CiAgICAgIGlmIFsgIiRET0NPTkYiICE9ICd5ZXMnIF0KICAgICAgdGhlbiB7CiAgICAgICAgZWNobyAiU2luY2UgeW91IGFyZW4ndCByb290LCBhbmQgdGhlcmUncyBubyBzeXN0ZW0gd2luZS5jb25mLCBJIGFzc3VtZSIKICAgICAgICBlY2hvICJ5b3Ugd2FudCBhIHVzZXItc3BlY2lmaWMgLndpbmVyYy4gQW0gSSBjb3JyZWN0PyAoeWVzL25vKSIKICAgICAgICB3aGlsZSBbICIkRE9DT05GIiAhPSAneWVzJyBdICYmIFsgIiRET0NPTkYiICE9ICdubycgXQogICAgICAgIGRvIHJlYWQgRE9DT05GCiAgICAgICAgZG9uZQogICAgICB9CiAgICAgIGZpCiAgICAgIGlmIFsgIiRET0NPTkYiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGVjaG8gIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgZWNobwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogICAgRE9DT05GPXllcwogIH0KICBmaQp9CmZpCgojIGdlbmVyYXRlIHdpbmUuY29uZiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0NPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobyAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GID4gJENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkQ09ORgogICAgICBlY2hvCiAgICAgIGVjaG8gIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQgYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiIKICAgICAgZWNobyAiQW0gSSBjb3JyZWN0PyAoeWVzL25vKSIKICAgICAgd2hpbGUgWyAiJERPV0lORSIgIT0gJ3llcycgXSAmJiBbICIkRE9XSU5FIiAhPSAnbm8nIF0KICAgICAgZG8gcmVhZCBET1dJTkUKICAgICAgZG9uZQogICAgICBpZiBbICIkRE9XSU5FIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBlY2hvICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIgogICAgICAgIGVjaG8gIm9yIGNyZWF0ZSAkQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvCiAgICAgIGVjaG8gIkNyZWF0ZWQgJENPTkYgdXNpbmcgeW91ciBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4iCiAgICAgIGVjaG8gIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgRE9XSU5FPW5vCiAgICB9CiAgICBmaQogICAgZWNobwogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIFNvbWUgZmFrZSBXaW5kb3dzIGRpcmVjdG9yaWVzIG11c3QgYmUgY3JlYXRlZCwgdG8iCiAgZWNobyAiaG9sZCBhbnkgLmluaSBmaWxlcywgRExMcywgYW5kIHN0YXJ0IG1lbnUgZW50cmllcyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIKICB3aGlsZSBbIC16ICIkQ1JPT1QiIF0KICBkbyB7CiAgICBlY2hvICJXaGVyZSB3b3VsZCB5b3UgbGlrZSB5b3VyIGZha2UgQyBkcml2ZSB0byBiZSBwbGFjZWQ/IChkZWZhdWx0IGlzICREQ1JPT1QpIgogICAgcmVhZCBDUk9PVAogICAgaWYgWyAteiAiJENST09UIiBdCiAgICB0aGVuIENST09UPSIkRENST09UIgogICAgZmkKICAgIGlmICEgWyAtZCAiJENST09UIiBdCiAgICB0aGVuIHsKICAgICAgaWYgISBta2RpciAtcCAiJENST09UIgogICAgICB0aGVuIHVuc2V0IENST09UCiAgICAgIGZpCiAgICB9CiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgogIGZvciB0ZGlyIGluICIkQ1JPT1Qvd2luZG93cyIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUiICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51L1Byb2dyYW1zIiAiJENST09UL0NvbW1vbiBGaWxlcyIgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzL0FkbWluaXN0cmF0b3IiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcyIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgogIGlmIFsgIiRET0NPTkYiID0gJ3llcycgXQogIHRoZW4gewogICAgc2VkICJzfFBhdGg9L2NcJHxQYXRoPSR7Q1JPT1R9fCIgJFdJTkVJTkkgPiAkQ09ORgogICAgZWNobyAiQ3JlYXRlZCAkQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iCiAgICBlY2hvICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCiAgIyBub3cgd2UgcmVhbGx5IHNob3VsZCBpbnN0YWxsIHRoZSByZWdpc3RyeQogIGlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQogIHRoZW4gRE9SRUc9eWVzCiAgZmkKfQplbGlmIFsgLXogIiRDUk9PVCIgXQp0aGVuIHsKICBlY2hvICJSZWFkaW5nIGN1cnJlbnQgV2luZSBjb25maWd1cmF0aW9uIGZyb20gJENPTkYuLi4iCiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eUGF0aD1cKC4qXCkvXDEvcCcgJENPTkZgCiAgZWNobyAiRHJpdmUgQyBpcyBjb25maWd1cmVkIGF0ICRDUk9PVC4iCn0KZmkKZWNobwoKIyBmaXh1cCBFWFRSQV9MRF9MSUJSQVJZX1BBVEgKaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGVjaG8gIlNldHRpbmcgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIC53aW5lcmMgdG8gJERMTFBBVEguLi4iCiAgc2VkICJzfEVYVFJBX0xEX0xJQlJBUllfUEFUSD0uKnxFWFRSQV9MRF9MSUJSQVJZX1BBVEg9JHtETExQQVRIfXwiICRDT05GID4gJENPTkYubmV3CiAgbXYgLWYgJENPTkYubmV3ICRDT05GCiAgZWNobwp9CmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2FwaS4uLiIKICAgIGVjaG8KICAgIChjZCBwcm9ncmFtcy9yZWdhcGk7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLmNvbmYgZmlsZSB1c2luZyB0dHlkcnYsCiAgIyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcnVuIHJlZ2FwaSB1bmRlciBYCiAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRDT05GID4gJFRNUENPTkYKCiAgIyBjcmVhdGUgYSB0ZW1wb3Jhcnkgd2luZWluc3RhbGwucmVnIHdpdGggZml4ZWQgZGVidWdnZXIgcGF0aAogIHNlZCAic3xkZWJ1Z2dlci93aW5lZGJnfCR7REVCVUdHRVJ9fCIgJERFRlJFRyA+ICRUTVBSRUcKCiAgZWNobyAiSW5zdGFsbGluZyBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKICBlY2hvCiAgaWYgISAkUkVHQVBJIC0tY29uZmlnICRUTVBDT05GIHNldFZhbHVlIDwgJFRNUFJFRyA+IC9kZXYvbnVsbAogIHRoZW4gewogICAgcm0gLWYgJFRNUENPTkYgJFRNUFJFRwogICAgZWNobwogICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIgogICAgZXhpdCAxCiAgfQogIGVsc2UgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICBmaQogIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIK