ZGlmZiAtLWdpdCBhLy5naXRodWIvQ09OVFJJQlVUSU5HLm1kIGIvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQKaW5kZXggNTM4ZWQ1Mi4uOGRiYWNiNyAxMDA2NDQKLS0tIGEvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQKKysrIGIvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQKQEAgLTgsNyArOCw3IEBACiAKICMjIFByaXZhdGUgcmVwb3J0cwogCi1Vc3VhbGx5LCBhbGwgaXNzdWVzIGFyZSB0cmFja2VkIHB1YmxpY2x5IG9uIFtHaXRodWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3VlcykuIElmIHlvdSB3YW50IHRvIG1ha2UgYSBwcml2YXRlIHJlcG9ydCAoZS5nLiwgZm9yIGEgdnVsbmVyYWJpbGl0eSBvciB0byBhdHRhY2ggYW4gZXhhbXBsZSB0aGF0IGlzIG5vdCBtZWFudCB0byBiZSBwdWJsaXNoZWVkKSwgcGxlYXNlIHNlbmQgYW4gZW1haWwgdG8gPG1haWxAbmxvaG1hbm4ubWU+LgorVXN1YWxseSwgYWxsIGlzc3VlcyBhcmUgdHJhY2tlZCBwdWJsaWNseSBvbiBbR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMpLiBJZiB5b3Ugd2FudCB0byBtYWtlIGEgcHJpdmF0ZSByZXBvcnQgKGUuZy4sIGZvciBhIHZ1bG5lcmFiaWxpdHkgb3IgdG8gYXR0YWNoIGFuIGV4YW1wbGUgdGhhdCBpcyBub3QgbWVhbnQgdG8gYmUgcHVibGlzaGVkKSwgcGxlYXNlIHNlbmQgYW4gZW1haWwgdG8gPG1haWxAbmxvaG1hbm4ubWU+LgogCiAjIyBQcmVyZXF1aXNpdGVzCiAKQEAgLTI2LDkgKzI2LDExIEBACiAKICMjIEZpbGVzIHRvIGNoYW5nZQogCi1UaGVyZSBhcmUgY3VycmVudGx5IHR3byBmaWxlcyB3aGljaCBuZWVkIHRvIGJlIGVkaXRlZDoKKzpleGNsYW1hdGlvbjogQmVmb3JlIHlvdSBtYWtlIGFueSBjaGFuZ2VzLCBub3RlIHRoZSBzaW5nbGUtaGVhZGVyIGZpbGUgW2BzaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9zaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcCkgaXMgKipnZW5lcmF0ZWQqKiBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgaW4gdGhlIFtgaW5jbHVkZS9ubG9obWFubmAgZGlyZWN0b3J5XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi90cmVlL2RldmVsb3AvaW5jbHVkZS9ubG9obWFubikuIFBsZWFzZSAqKmRvIG5vdCoqIGVkaXQgZmlsZSBgc2luZ2xlX2luY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHBgIGRpcmVjdGx5LCBidXQgY2hhbmdlIHRoZSBgaW5jbHVkZS9ubG9obWFubmAgc291cmNlcyBhbmQgcmVnZW5lcmF0ZSBmaWxlIGBzaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcGAgYnkgZXhlY3V0aW5nIGBtYWtlIGFtYWxnYW1hdGVgLgogCi0xLiBbYHNyYy9qc29uLmhwcGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvbWFzdGVyL3NyYy9qc29uLmhwcCkKK1RvIG1ha2UgY2hhbmdlcywgeW91IG5lZWQgdG8gZWRpdCB0aGUgZm9sbG93aW5nIGZpbGVzOgorCisxLiBbYGluY2x1ZGUvbmxvaG1hbm4vKmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3RyZWUvZGV2ZWxvcC9pbmNsdWRlL25sb2htYW5uKSAtIFRoZXNlIGZpbGVzIGFyZSB0aGUgc291cmNlcyBvZiB0aGUgbGlicmFyeS4gQmVmb3JlIHRlc3Rpbmcgb3IgY3JlYXRpbmcgYSBwdWxsIHJlcXVlc3QsIGV4ZWN1dGUgYG1ha2UgYW1hbGdhbWF0ZWAgdG8gcmVnZW5lcmF0ZSBgc2luZ2xlX2luY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHBgLgogCiAyLiBbYHRlc3Qvc3JjL3VuaXQtKi5jcHBgXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi90cmVlL2RldmVsb3AvdGVzdC9zcmMpIC0gVGhlc2UgZmlsZXMgY29udGFpbiB0aGUgW0NhdGNoXShodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gpIHVuaXQgdGVzdHMgd2hpY2ggY3VycmVudGx5IGNvdmVyIFsxMDAgJV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vZ2l0aHViL25sb2htYW5uL2pzb24pIG9mIHRoZSBsaWJyYXJ5J3MgY29kZS4KIApkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZAppbmRleCA5OTNiOTAwLi5kNzVhNjdiIDEwMDY0NAotLS0gYS8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZAorKysgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApAQCAtNCw5ICs0LDEyIEBACiAKICMjIFB1bGwgcmVxdWVzdCBjaGVja2xpc3QKIAorUmVhZCB0aGUgW0NvbnRyaWJ1dGlvbiBHdWlkZWxpbmVzXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9ibG9iL2RldmVsb3AvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQpIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKwogLSBbIF0gIENoYW5nZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgcHVsbCByZXF1ZXN0LCBvciBhbiBbZXhpc3RpbmcgaXNzdWUgaXMgcmVmZXJlbmNlZF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzKS4KIC0gWyBdICBUaGUgdGVzdCBzdWl0ZSBbY29tcGlsZXMgYW5kIHJ1bnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9SRUFETUUubWQjZXhlY3V0ZS11bml0LXRlc3RzKSB3aXRob3V0IGVycm9yLgogLSBbIF0gIFtDb2RlIGNvdmVyYWdlXShodHRwczovL2NvdmVyYWxscy5pby9naXRodWIvbmxvaG1hbm4vanNvbikgaXMgMTAwJS4gVGVzdCBjYXNlcyBjYW4gYmUgYWRkZWQgYnkgZWRpdGluZyB0aGUgW3Rlc3Qgc3VpdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3RyZWUvZGV2ZWxvcC90ZXN0L3NyYykuCistIFsgXSAgVGhlIHNvdXJjZSBjb2RlIGlzIGFtYWxnYW1hdGVkOyB0aGF0IGlzLCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgc291cmNlcyBpbiB0aGUgYGluY2x1ZGUvbmxvaG1hbm5gIGRpcmVjdG9yeSwgcnVuIGBtYWtlIGFtYWxnYW1hdGVgIHRvIGNyZWF0ZSB0aGUgc2luZ2xlLWhlYWRlciBmaWxlIGBzaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcGAuIFRoZSB3aG9sZSBwcm9jZXNzIGlzIGRlc2NyaWJlZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vYmxvYi9kZXZlbG9wLy5naXRodWIvQ09OVFJJQlVUSU5HLm1kI2ZpbGVzLXRvLWNoYW5nZSkuCiAKICMjIFBsZWFzZSBkb24ndAogCmRpZmYgLS1naXQgYS8udHJhdmlzLnltbCBiLy50cmF2aXMueW1sCmluZGV4IDYzOTFjMDguLjIyYTliNjcgMTAwNjQ0Ci0tLSBhLy50cmF2aXMueW1sCisrKyBiLy50cmF2aXMueW1sCkBAIC03NCw2ICs3NCwyMCBAQAogICAgICAgICBzb3VyY2VzOiBbJ3VidW50dS10b29sY2hhaW4tci10ZXN0J10KICAgICAgICAgcGFja2FnZXM6IFsnZysrLTQuOScsICduaW5qYS1idWlsZCddCiAKKyAgIyBjaGVjayBhbWFsZ2FtYXRpb24KKyAgLSBvczogbGludXgKKyAgICBjb21waWxlcjogZ2NjCisgICAgZW52OgorICAgICAgLSBDT01QSUxFUj1nKystNC45CisgICAgICAtIFNQRUNJQUw9YW1hbGdhbWF0aW9uCisgICAgICAtIENNQUtFX09QVElPTlM9LURKU09OX011bHRpcGxlSGVhZGVyPU9OCisgICAgYWRkb25zOgorICAgICAgYXB0OgorICAgICAgICBzb3VyY2VzOiBbJ3VidW50dS10b29sY2hhaW4tci10ZXN0J10KKyAgICAgICAgcGFja2FnZXM6IFsnZysrLTQuOScsICdhc3R5bGUnLCAnbmluamEtYnVpbGQnXQorICAgIGFmdGVyX3N1Y2Nlc3M6CisgICAgICAtIG1ha2UgY2hlY2stYW1hbGdhbWF0aW9uCisKICAgIyBDb3ZlcmFsbHMgKGh0dHA6Ly9ncm9ubGllci5mci9ibG9nLzIwMTUvMDEvYWRkaW5nLWNvZGUtY292ZXJhZ2UtdG8teW91ci1jLXByb2plY3QvKQogCiAgIC0gb3M6IGxpbnV4CkBAIC0yNzcsMTEgKzI5MSwzIEBACiAgIC0gY21ha2UgLi4gJHtDTUFLRV9PUFRJT05TfSAtR05pbmphICYmIGNtYWtlIC0tYnVpbGQgLiAtLWNvbmZpZyBSZWxlYXNlCiAgIC0gY3Rlc3QgLUMgUmVsZWFzZSAtViAtagogICAtIGNkIC4uCi0KLSAgIyBjaGVjayBpZiBob21lYnJldyB3b3JrcyAob25seSBjaGVja3MgZGV2ZWxvcCBicmFuY2gpCi0gIC0gaWYgWyBgd2hpY2ggYnJld2AgXTsgdGhlbgotICAgIGJyZXcgdXBkYXRlIDsKLSAgICBicmV3IHRhcCBubG9obWFubi9qc29uIDsKLSAgICBicmV3IGluc3RhbGwgbmxvaG1hbm5fanNvbiAtLUhFQUQgOwotICAgIGJyZXcgdGVzdCBubG9obWFubl9qc29uIDsKLSAgICBmaQpkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dAppbmRleCAyNTdiZWU4Li4yMjQwOGZmIDEwMDY0NAotLS0gYS9DTWFrZUxpc3RzLnR4dAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtNCwyNyArNCwzOCBAQAogIyMgUFJPSkVDVAogIyMgbmFtZSBhbmQgdmVyc2lvbgogIyMKLXByb2plY3QobmxvaG1hbm5fanNvbiBWRVJTSU9OIDMuMC4xIExBTkdVQUdFUyBDWFgpCitwcm9qZWN0KG5sb2htYW5uX2pzb24gVkVSU0lPTiAzLjEuMCBMQU5HVUFHRVMgQ1hYKQorCisjIworIyMgSU5DTFVERQorIyMKKyMjCitpbmNsdWRlKEV4dGVybmFsUHJvamVjdCkKIAogIyMKICMjIE9QVElPTlMKICMjCiBvcHRpb24oSlNPTl9CdWlsZFRlc3RzICJCdWlsZCB0aGUgdW5pdCB0ZXN0cyB3aGVuIEJVSUxEX1RFU1RJTkcgaXMgZW5hYmxlZC4iIE9OKQorb3B0aW9uKEpTT05fTXVsdGlwbGVIZWFkZXJzICJVc2Ugbm9uLWFtYWxnYW1hdGVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIiBPRkYpCiAKICMjCiAjIyBDT05GSUdVUkFUSU9OCiAjIwogc2V0KE5MT0hNQU5OX0pTT05fVEFSR0VUX05BTUUgICAgICAgICAgICAgICAke1BST0pFQ1RfTkFNRX0pCi1zZXQoTkxPSE1BTk5fSlNPTl9TT1VSQ0VfRElSICAgICAgICAgICAgICAgICJzcmMvIikKIHNldChOTE9ITUFOTl9KU09OX0NPTkZJR19JTlNUQUxMX0RJUiAgICAgICAgImxpYi9jbWFrZS8ke1BST0pFQ1RfTkFNRX0iKQogc2V0KE5MT0hNQU5OX0pTT05fSU5DTFVERV9JTlNUQUxMX0RJUiAgICAgICAiaW5jbHVkZSIpCi1zZXQoTkxPSE1BTk5fSlNPTl9IRUFERVJfSU5TVEFMTF9ESVIgICAgICAgICIke05MT0hNQU5OX0pTT05fSU5DTFVERV9JTlNUQUxMX0RJUn0vbmxvaG1hbm4iKQogc2V0KE5MT0hNQU5OX0pTT05fVEFSR0VUU19FWFBPUlRfTkFNRSAgICAgICAiJHtQUk9KRUNUX05BTUV9VGFyZ2V0cyIpCiBzZXQoTkxPSE1BTk5fSlNPTl9DTUFLRV9DT05GSUdfVEVNUExBVEUgICAgICJjbWFrZS9jb25maWcuY21ha2UuaW4iKQogc2V0KE5MT0hNQU5OX0pTT05fQ01BS0VfQ09ORklHX0RJUiAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NtYWtlX2NvbmZpZyIpCiBzZXQoTkxPSE1BTk5fSlNPTl9DTUFLRV9WRVJTSU9OX0NPTkZJR19GSUxFICIke05MT0hNQU5OX0pTT05fQ01BS0VfQ09ORklHX0RJUn0vJHtQUk9KRUNUX05BTUV9Q29uZmlnVmVyc2lvbi5jbWFrZSIpCiBzZXQoTkxPSE1BTk5fSlNPTl9DTUFLRV9QUk9KRUNUX0NPTkZJR19GSUxFICIke05MT0hNQU5OX0pTT05fQ01BS0VfQ09ORklHX0RJUn0vJHtQUk9KRUNUX05BTUV9Q29uZmlnLmNtYWtlIikKIAoraWYgKEpTT05fTXVsdGlwbGVIZWFkZXJzKQorICAgIHNldChOTE9ITUFOTl9KU09OX0lOQ0xVREVfQlVJTERfRElSICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS8iKQorZWxzZSgpCisgICAgc2V0KE5MT0hNQU5OX0pTT05fSU5DTFVERV9CVUlMRF9ESVIgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zaW5nbGVfaW5jbHVkZS8iKQorZW5kaWYoKQorCiAjIwogIyMgVEFSR0VUCiAjIyBjcmVhdGUgdGFyZ2V0IGFuZCBhZGQgaW5jbHVkZSBwYXRoCkBAIC0zNCw3ICs0NSw3IEBACiB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcygKICAgICAke05MT0hNQU5OX0pTT05fVEFSR0VUX05BTUV9CiAgICAgSU5URVJGQUNFCi0gICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3NyYz4KKyAgICAkPEJVSUxEX0lOVEVSRkFDRToke05MT0hNQU5OX0pTT05fSU5DTFVERV9CVUlMRF9ESVJ9PgogICAgICQ8SU5TVEFMTF9JTlRFUkZBQ0U6aW5jbHVkZT4KICkKIApAQCAtNTgsNyArNjksNiBAQAogCiBpZihCVUlMRF9URVNUSU5HIEFORCBKU09OX0J1aWxkVGVzdHMpCiAgICAgZW5hYmxlX3Rlc3RpbmcoKQotICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtOTE9ITUFOTl9KU09OX1NPVVJDRV9ESVJ9KQogICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKIGVuZGlmKCkKIApAQCAtNzUsOSArODUsMTAgQEAKICAgICAke05MT0hNQU5OX0pTT05fQ01BS0VfUFJPSkVDVF9DT05GSUdfRklMRX0KICAgICBJTlNUQUxMX0RFU1RJTkFUSU9OICR7TkxPSE1BTk5fSlNPTl9DT05GSUdfSU5TVEFMTF9ESVJ9CiApCisKIGluc3RhbGwoCi0gICAgRElSRUNUT1JZICR7TkxPSE1BTk5fSlNPTl9TT1VSQ0VfRElSfQotICAgIERFU1RJTkFUSU9OICR7TkxPSE1BTk5fSlNPTl9IRUFERVJfSU5TVEFMTF9ESVJ9CisgICAgRElSRUNUT1JZICR7TkxPSE1BTk5fSlNPTl9JTkNMVURFX0JVSUxEX0RJUn0KKyAgICBERVNUSU5BVElPTiAke05MT0hNQU5OX0pTT05fSU5DTFVERV9JTlNUQUxMX0RJUn0KICkKIGluc3RhbGwoCiAgICAgRklMRVMgJHtOTE9ITUFOTl9KU09OX0NNQUtFX1BST0pFQ1RfQ09ORklHX0ZJTEV9ICR7TkxPSE1BTk5fSlNPTl9DTUFLRV9WRVJTSU9OX0NPTkZJR19GSUxFfQpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nLm1kIGIvQ2hhbmdlTG9nLm1kCmluZGV4IGJiOTVmOTMuLmJjMDNiYTIgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZy5tZAorKysgYi9DaGFuZ2VMb2cubWQKQEAgLTEsNiArMSw2OSBAQAogIyBDaGFuZ2UgTG9nCiBBbGwgbm90YWJsZSBjaGFuZ2VzIHRvIHRoaXMgcHJvamVjdCB3aWxsIGJlIGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLiBUaGlzIHByb2plY3QgYWRoZXJlcyB0byBbU2VtYW50aWMgVmVyc2lvbmluZ10oaHR0cDovL3NlbXZlci5vcmcvKS4KIAorIyMgW3YzLjEuMF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcmVsZWFzZXMvdGFnL3YzLjEuMCkgKDIwMTgtMDItMDEpCitbRnVsbCBDaGFuZ2Vsb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2NvbXBhcmUvdjMuMC4xLi4udjMuMS4wKQorCistIEkgaGF2ZSBhIHByb3Bvc2FsIFtcIzk0OV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzk0OSkKKy0gVkVSU0lPTiBkZWZpbmVcKHNcKSBbXCM5NDhdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDgpCistIHYzLjAuMSBjb21waWxlIGVycm9yIGluIGljYyAxNi4wLjQgW1wjOTQ3XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvOTQ3KQorLSBVc2UgaW4gVlMyMDE3IDE1LjUuNSBbXCM5NDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDYpCistIFByb2Nlc3MgZm9yIHJlcG9ydGluZyBTZWN1cml0eSBCdWdzPyBbXCM5NDVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDUpCistIFBsZWFzZSBleHBvc2UgYSBOTE9ITUFOTlxfSlNPTlxfVkVSU0lPTiBtYWNybyBbXCM5NDNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDMpCistIENoYW5nZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnkgdG8gbmxvaG1hbm4vanNvbiBbXCM5NDJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDIpCistIHN0cmluZ1xfdHlwZSBpbiBiaW5hcnlcX3JlYWRlciBbXCM5NDFdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85NDEpCistIGNvbXBpbGUgZXJyb3Igd2l0aCBjbGFuZyA1LjAgLXN0ZD1jKysxeiBhbmQgbm8gc3RyaW5nXF92aWV3IFtcIzkzOV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkzOSkKKy0gQWxsb3cgb3ZlcnJpZGluZyBKU09OXF9USFJPVyB0byBzb21ldGhpbmcgZWxzZSB0aGFuIGFib3J0XChcKSBbXCM5MzhdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MzgpCistIEhhbmRsZSBpbnZhbGlkIHN0cmluZyBpbiBKc29uIGZpbGUgW1wjOTM3XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvOTM3KQorLSBVbnVzZWQgdmFyaWFibGUgJ2tNaW5FeHAnIFtcIzkzNV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkzNSkKKy0gdGVzdCBbXCM5MzRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MzQpCistIHl5dGV4dCBpcyBhbHJlYWR5IGRlZmluZWQgW1wjOTMzXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvOTMzKQorLSBFcXVhbGl0eSBvcGVyYXRvciBmYWlscyBbXCM5MzFdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MzEpCistIHVzZSBpbiB2aXN1YWwgc3R1ZGlvIDIwMTUgW1wjOTI5XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvOTI5KQorLSBSZWxhdGl2ZSBpbmNsdWRlcyBvZiBqc29uXF9md2QuaHBwIGluIGRldGFpbC9tZXRhLmhwcC4gXFtEZXZlbG9wIGJyYW5jaFxdIFtcIzkyOF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkyOCkKKy0gR0NDIDcueCBpc3N1ZSBbXCM5MjZdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MjYpCistIGpzb25cX2Z3ZC5ocHAgbm90IGluc3RhbGxlZCBbXCM5MjNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MjMpCistIFVzZSBHb29nbGUgQmVuY2htYXJrcyBbXCM5MjFdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MjEpCistIE1vdmUgY2xhc3MganNvblxfcG9pbnRlciB0byBzZXBhcmF0ZSBmaWxlIFtcIzkyMF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkyMCkKKy0gVW5hYmxlIHRvIGxvY2F0ZSAndG9cX2pzb25cKFwpJyBhbmQgJ2Zyb21cX2pzb25cKFwpJyBtZXRob2RzIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBbXCM5MTddKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MTcpCistIFxbYW5zd2VyZWRcXVJlYWQga2V5MSBmcm9tIC52YWx1ZSBleGFtcGxlICBbXCM5MTRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MTQpCistIERvbid0IHVzZSBgZGVmaW5lIHByaXZhdGUgcHVibGljYCBpbiB0ZXN0IGZpbGVzIFtcIzkxM10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkxMykKKy0gdmFsdWVcKFwpIHRlbXBsYXRlIGFyZ3VtZW50IHR5cGUgZGVkdWN0aW9uIFtcIzkxMl0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkxMikKKy0gSW5zdGFsbGF0aW9uIHBhdGggaXMgaW5jb3JyZWN0IFtcIzkxMF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkxMCkKKy0gSCBbXCM5MDldKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MDkpCistIEJ1aWxkIGZhaWx1cmUgdXNpbmcgY2xhbmcgNSBbXCM5MDhdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MDgpCistIEFtYWxnYXRlIFtcIzkwN10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkwNykKKy0gVXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIHRlc3RzIHdydC4gc3BsaXQgaGVhZGVycyBbXCM5MDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MDYpCistIExpYiBub3Qgd29ya2luZyBvbiB1YnVudHUgMTYuMDQgW1wjOTA1XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvOTA1KQorLSBQcm9ibGVtIHdoZW4gd3JpdGluZyB0byBmaWxlLiBbXCM5MDRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MDQpCistIEMyODY0IGVycm9yIHdoZW4gY29tcGlsaW5nIHdpdGggVlMyMDE1IGFuZCBWUyAyMDE3IFtcIzkwM10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzkwMykKKy0gXFtqc29uLmV4Y2VwdGlvbi50eXBlXF9lcnJvci4zMDRcXSBjYW5ub3QgdXNlIGF0XChcKSB3aXRoIG9iamVjdCBbXCM5MDJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy85MDIpCistIEhvdyBkbyBJIGZvcndhcmQgbmxvaG1hbm46Ompzb24gZGVjbGFyYXRpb24/IFtcIzg5OV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzg5OSkKKy0gSG93IHRvIGVmZmVjdGl2ZWx5IHN0b3JlIGJpbmFyeSBkYXRhPyBbXCM4OThdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy84OTgpCistIEhvdyB0byBnZXQgdGhlIGxlbmd0aCBvZiBhIEpTT04gc3RyaW5nIHdpdGhvdXQgcmV0cmlldmluZyBpdHMgc3RkOjpzdHJpbmc/IFtcIzg5N10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzg5NykKKy0gUmVncmVzc2lvbiBUZXN0cyBGYWlsdXJlIHVzaW5nICJjdGVzdCIgW1wjODg3XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvODg3KQorLSBEaXNjdXNzOiBhZGQgSlNPTiBNZXJnZSBQYXRjaCBcKFJGQyA3Mzk2XCk/IFtcIzg3N10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzg3NykKKy0gRGlzY3VzczogcmVwbGFjZSBzdGF0aWMgIml0ZXJhdG9yXF93cmFwcGVyIiBmdW5jdGlvbiB3aXRoICJpdGVtcyIgbWVtYmVyIGZ1bmN0aW9uIFtcIzg3NF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzg3NCkKKy0gTWFrZSBvcHRpb25hbCB1c2VyLWRhdGEgYXZhaWxhYmxlIGluIGZyb21cX2pzb24gW1wjODY0XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvODY0KQorLSBDYXN0aW5nIHRvIHN0ZDo6c3RyaW5nIG5vdCB3b3JraW5nIGluIFZTMjAxNSBbXCM4NjFdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy84NjEpCistIFNlcXVlbnRpYWwgcmVhZGluZyBvZiBKU09OIGFycmF5cyBbXCM4NTFdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy84NTEpCistIElkZWE6IEhhbmRsZSBNdWx0aW1hcHMgQmV0dGVyIFtcIzgxNl0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzgxNikKKy0gRmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgW1wjNzc3XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvNzc3KQorLSBMb3NzIG9mIHByZWNpc2lvbiB3aGVuIHNlcmlhbGl6aW5nIFw8ZG91YmxlXD4gW1wjMzYwXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvMzYwKQorCistIFRlbXBsYXRpemUgc3RkOjpzdHJpbmcgaW4gYmluYXJ5XF9yZWFkZXIgXCM5NDEgW1wjOTUwXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9wdWxsLzk1MCkgKFtrYWlkb2tlcnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9rYWlkb2tlcnQpKQorLSBmaXggY21ha2UgaW5zdGFsbCBkaXJlY3RvcnkgXChmb3IgcmVhbCB0aGlzIHRpbWVcKSBbXCM5NDRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3B1bGwvOTQ0KSAoW3RoZW9kZWxyaWV1XShodHRwczovL2dpdGh1Yi5jb20vdGhlb2RlbHJpZXUpKQorLSBBbGxvdyBvdmVycmlkaW5nIFRIUk9XL0NBVENIL1RSWSBtYWNyb3Mgd2l0aCBuby1leGNlcHRpb25zIFwjOTM4IFtcIzk0MF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85NDApIChba2FpZG9rZXJ0XShodHRwczovL2dpdGh1Yi5jb20va2FpZG9rZXJ0KSkKKy0gUmVtb3ZlZCBjb21waWxlciB3YXJuaW5nIGFib3V0IHVudXNlZCB2YXJpYWJsZSAna01pbkV4cCcgW1wjOTM2XShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9wdWxsLzkzNikgKFt6ZXJvZGVmZWN0XShodHRwczovL2dpdGh1Yi5jb20vemVyb2RlZmVjdCkpCistIEZpeCBhIHR5cG8gaW4gUkVBRE1FLm1kIFtcIzkzMF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85MzApIChbUGlwZWxpbmVyXShodHRwczovL2dpdGh1Yi5jb20vUGlwZWxpbmVyKSkKKy0gSG93dG8gaW5zdGFsbGF0aW9uIG9mIGpzb25cX2Z3ZC5ocHAgXChmaXhlcyBcIzkyM1wpIFtcIzkyNV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85MjUpIChbemVyb2RlZmVjdF0oaHR0cHM6Ly9naXRodWIuY29tL3plcm9kZWZlY3QpKQorLSBmaXggc2ZpbmFlIG9uIGJhc2ljXF9qc29uIFVEVCBjb25zdHJ1Y3RvciBbXCM5MTldKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3B1bGwvOTE5KSAoW3RoZW9kZWxyaWV1XShodHRwczovL2dpdGh1Yi5jb20vdGhlb2RlbHJpZXUpKQorLSBGbG9hdGluZy1wb2ludCBmb3JtYXR0aW5nIFtcIzkxNV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85MTUpIChbYWJvbHpdKGh0dHBzOi8vZ2l0aHViLmNvbS9hYm9seikpCistIEZpeC9jbWFrZSBpbnN0YWxsIFtcIzkxMV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85MTEpIChbdGhlb2RlbHJpZXVdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGVvZGVscmlldSkpCistIGZpeCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBlbXBsYWNlIGZ1bmN0aW9uIFtcIzkwMF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC85MDApIChbRG9iaWFzZF0oaHR0cHM6Ly9naXRodWIuY29tL0RvYmlhc2QpKQorLSBKU09OIE1lcmdlIFBhdGNoIFwoUkZDIDczOTZcKSBbXCM4NzZdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3B1bGwvODc2KSAoW25sb2htYW5uXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4pKQorLSBSZWZhY3Rvci9zcGxpdCBpdCBbXCM3MDBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3B1bGwvNzAwKSAoW3RoZW9kZWxyaWV1XShodHRwczovL2dpdGh1Yi5jb20vdGhlb2RlbHJpZXUpKQorCiAjIyBbdjMuMC4xXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9yZWxlYXNlcy90YWcvdjMuMC4xKSAoMjAxNy0xMi0yOSkKIFtGdWxsIENoYW5nZWxvZ10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vY29tcGFyZS92My4wLjAuLi52My4wLjEpCiAKQEAgLTY1Myw3ICs3MTYsNyBAQAogLSBDb21waWxhdGlvbiBlcnJvci4gW1wjMjczXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvMjczKQogLSBkdW1wXChcKSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpbiB2MiBbXCMyNzJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy8yNzIpCiAKLS0gZml4ZWQgYSB0aW55IHR5cG8gW1wjMjcxXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9wdWxsLzI3MSkgKFt0aGVsb3N0dF0oaHR0cHM6Ly9naXRodWIuY29tL3RoZWxvc3R0KSkKKy0gZml4ZWQgYSB0aW55IHR5cG8gW1wjMjcxXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9wdWxsLzI3MSkgKFtmZXJvbGRpXShodHRwczovL2dpdGh1Yi5jb20vZmVyb2xkaSkpCiAKICMjIFt2Mi4wLjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3JlbGVhc2VzL3RhZy92Mi4wLjApICgyMDE2LTA2LTIzKQogW0Z1bGwgQ2hhbmdlbG9nXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9jb21wYXJlL3YxLjEuMC4uLnYyLjAuMCkKZGlmZiAtLWdpdCBhL0xJQ0VOU0UuTUlUIGIvTElDRU5TRS5NSVQKaW5kZXggMDA1OTlhZi4uOGIwZjcwMCAxMDA2NDQKLS0tIGEvTElDRU5TRS5NSVQKKysrIGIvTElDRU5TRS5NSVQKQEAgLTEsNiArMSw2IEBACiBNSVQgTGljZW5zZSAKIAotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBiMDdmYjZiLi5mY2EyZTBkIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw4ICsxLDQyIEBACiAuUEhPTlk6IHByZXR0eSBjbGVhbiBDaGFuZ2VMb2cubWQKIAorU1JDUyA9IGluY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vanNvbl9md2QuaHBwIFwKKyAgICAgICBpbmNsdWRlL25sb2htYW5uL2FkbF9zZXJpYWxpemVyLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvZnJvbV9qc29uLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvdG9fY2hhcnMuaHBwIFwKKyAgICAgICBpbmNsdWRlL25sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2lucHV0L2JpbmFyeV9yZWFkZXIuaHBwIFwKKyAgICAgICBpbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9pbnB1dF9hZGFwdGVycy5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2lucHV0L2xleGVyLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaW5wdXQvcGFyc2VyLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2ludGVybmFsX2l0ZXJhdG9yLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2l0ZXJfaW1wbC5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9pdGVyYXRpb25fcHJveHkuaHBwIFwKKyAgICAgICBpbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvanNvbl9yZXZlcnNlX2l0ZXJhdG9yLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL3ByaW1pdGl2ZV9pdGVyYXRvci5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2pzb25fcG9pbnRlci5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2pzb25fcmVmLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwIFwKKyAgICAgICBpbmNsdWRlL25sb2htYW5uL2RldGFpbC9tYWNyb191bnNjb3BlLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvbWV0YS5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9iaW5hcnlfd3JpdGVyLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvb3V0cHV0L291dHB1dF9hZGFwdGVycy5ocHAgXAorICAgICAgIGluY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9zZXJpYWxpemVyLmhwcCBcCisgICAgICAgaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHAKKworVU5BTUUgPSAkKHNoZWxsIHVuYW1lKQorQ1hYPWNsYW5nKysKKworQU1BTEdBTUFURURfRklMRT1zaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcAorCisjIG1haW4gdGFyZ2V0CiBhbGw6CisJQGVjaG8gImFtYWxnYW1hdGUgLSBhbWFsZ2FtYXRlIGZpbGUgc2luZ2xlX2luY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHAgZnJvbSB0aGUgaW5jbHVkZS9ubG9obWFubiBzb3VyY2VzIgogCUBlY2hvICJDaGFuZ2VMb2cubWQgLSBnZW5lcmF0ZSBDaGFuZ2VMb2cgZmlsZSIKIAlAZWNobyAiY2hlY2sgLSBjb21waWxlIGFuZCBleGVjdXRlIHRlc3Qgc3VpdGUiCisJQGVjaG8gImNoZWNrLWFtYWxnYW1hdGlvbiAtIGNoZWNrIHdoZXRoZXIgc291cmNlcyBoYXZlIGJlZW4gYW1hbGdhbWF0ZWQiCiAJQGVjaG8gImNoZWNrLWZhc3QgLSBjb21waWxlIGFuZCBleGVjdXRlIHRlc3Qgc3VpdGUgKHNraXAgbG9uZy1ydW5uaW5nIHRlc3RzKSIKIAlAZWNobyAiY2xlYW4gLSByZW1vdmUgYnVpbHQgZmlsZXMiCiAJQGVjaG8gImNvdmVyYWdlIC0gY3JlYXRlIGNvdmVyYWdlIGluZm9ybWF0aW9uIHdpdGggbGNvdiIKQEAgLTExLDEyICs0NSwxMiBAQAogCUBlY2hvICJmdXp6X3Rlc3RpbmcgLSBwcmVwYXJlIGZ1enogdGVzdGluZyBvZiB0aGUgSlNPTiBwYXJzZXIiCiAJQGVjaG8gImZ1enpfdGVzdGluZ19jYm9yIC0gcHJlcGFyZSBmdXp6IHRlc3Rpbmcgb2YgdGhlIENCT1IgcGFyc2VyIgogCUBlY2hvICJmdXp6X3Rlc3RpbmdfbXNncGFjayAtIHByZXBhcmUgZnV6eiB0ZXN0aW5nIG9mIHRoZSBNZXNzYWdlUGFjayBwYXJzZXIiCisJQGVjaG8gImZ1enpfdGVzdGluZ191Ympzb24gLSBwcmVwYXJlIGZ1enogdGVzdGluZyBvZiB0aGUgVUJKU09OIHBhcnNlciIKIAlAZWNobyAianNvbl91bml0IC0gY3JlYXRlIHNpbmdsZS1maWxlIHRlc3QgZXhlY3V0YWJsZSIKIAlAZWNobyAicGVkYW50aWNfY2xhbmcgLSBydW4gQ2xhbmcgd2l0aCBtYXhpbWFsIHdhcm5pbmcgZmxhZ3MiCiAJQGVjaG8gInBlZGFudGljX2djYyAtIHJ1biBHQ0Mgd2l0aCBtYXhpbWFsIHdhcm5pbmcgZmxhZ3MiCiAJQGVjaG8gInByZXR0eSAtIGJlYXV0aWZ5IGNvZGUgd2l0aCBBcnRpc3RpYyBTdHlsZSIKIAotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyB1bml0IHRlc3RzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMzksNyArNzMsNiBAQAogCXJtIC1mciBidWlsZF9jb3ZlcmFnZQogCSQoTUFLRSkgY2xlYW4gLUNkb2MKIAkkKE1BS0UpIGNsZWFuIC1DdGVzdAotCSQoTUFLRSkgY2xlYW4gLUNiZW5jaG1hcmtzCiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTUwLDcgKzgzLDcgQEAKIAlta2RpciBidWlsZF9jb3ZlcmFnZQogCWNkIGJ1aWxkX2NvdmVyYWdlIDsgQ1hYPWcrKy01IGNtYWtlIC4uIC1HTmluamEgLURKU09OX0NvdmVyYWdlPU9OCiAJY2QgYnVpbGRfY292ZXJhZ2UgOyBuaW5qYQotCWNkIGJ1aWxkX2NvdmVyYWdlIDsgY3Rlc3QKKwljZCBidWlsZF9jb3ZlcmFnZSA7IGN0ZXN0IC1qMTAKIAljZCBidWlsZF9jb3ZlcmFnZSA7IG5pbmphIGxjb3ZfaHRtbAogCW9wZW4gYnVpbGRfY292ZXJhZ2UvdGVzdC9odG1sL2luZGV4Lmh0bWwKIApAQCAtNzQsNyArMTA3LDcgQEAKICMgLVduby1rZXl3b3JkLW1hY3JvOiB1bml0LXRlc3RzIHVzZSAiI2RlZmluZSBwcml2YXRlIHB1YmxpYyIKICMgLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9uczogdGhlIGxpYnJhcnkgZGVwcmVjYXRlZCBzb21lIGZ1bmN0aW9ucwogIyAtV25vLXdlYWstdnRhYmxlczogZXhjZXB0aW9uIGNsYXNzIGlzIGRlZmluZWQgaW5saW5lLCBidXQgaGFzIHZpcnR1YWwgbWV0aG9kCi0jIC1Xbm8tcmFuZ2UtbG9vcC1hbmFseXNpczogaXRlcmF0b3Jfd3JhcHBlciB0ZXN0cyAiZm9yKGNvbnN0IGF1dG8gaS4uLikiCisjIC1Xbm8tcmFuZ2UtbG9vcC1hbmFseXNpczogaXRlbXMgdGVzdHMgImZvcihjb25zdCBhdXRvIGkuLi4pIgogIyAtV25vLWZsb2F0LWVxdWFsOiBub3QgYWxsIGNvbXBhcmlzb25zIGluIHRoZSB0ZXN0cyBjYW4gYmUgcmVwbGFjZWQgYnkgQXBwcm94CiAjIC1Xbm8tc3dpdGNoLWVudW0gLVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0OiBwZWRhbnRpYy9jb250cmFkaWN0aW5nIHdhcm5pbmdzIGFib3V0IHN3aXRjaGVzCiAjIC1Xbm8tcGFkZGVkOiBwYWRkaW5nIGlzIG5vdGhpbmcgdG8gd2FybiBhYm91dApAQCAtMTg0LDYgKzIxNywxNCBAQAogCWZpbmQgdGVzdC9kYXRhIC1zaXplIC01ayAtbmFtZSAqLm1zZ3BhY2sgfCB4YXJncyAtSXt9IGNwICJ7fSIgZnV6ei10ZXN0aW5nL3Rlc3RjYXNlcwogCUBlY2hvICJFeGVjdXRlOiBhZmwtZnV6eiAtaSBmdXp6LXRlc3RpbmcvdGVzdGNhc2VzIC1vIGZ1enotdGVzdGluZy9vdXQgZnV6ei10ZXN0aW5nL2Z1enplciIKIAorZnV6el90ZXN0aW5nX3VianNvbjoKKwlybSAtZnIgZnV6ei10ZXN0aW5nCisJbWtkaXIgLXAgZnV6ei10ZXN0aW5nIGZ1enotdGVzdGluZy90ZXN0Y2FzZXMgZnV6ei10ZXN0aW5nL291dAorCSQoTUFLRSkgcGFyc2VfdWJqc29uX2Z1enplciAtQyB0ZXN0IENYWD1hZmwtY2xhbmcrKworCW12IHRlc3QvcGFyc2VfdWJqc29uX2Z1enplciBmdXp6LXRlc3RpbmcvZnV6emVyCisJZmluZCB0ZXN0L2RhdGEgLXNpemUgLTVrIC1uYW1lICoudWJqc29uIHwgeGFyZ3MgLUl7fSBjcCAie30iIGZ1enotdGVzdGluZy90ZXN0Y2FzZXMKKwlAZWNobyAiRXhlY3V0ZTogYWZsLWZ1enogLWkgZnV6ei10ZXN0aW5nL3Rlc3RjYXNlcyAtbyBmdXp6LXRlc3Rpbmcvb3V0IGZ1enotdGVzdGluZy9mdXp6ZXIiCisKIGZ1enppbmctc3RhcnQ6CiAJYWZsLWZ1enogLVMgZnV6emVyMSAtaSBmdXp6LXRlc3RpbmcvdGVzdGNhc2VzIC1vIGZ1enotdGVzdGluZy9vdXQgZnV6ei10ZXN0aW5nL2Z1enplciA+IC9kZXYvbnVsbCAmCiAJYWZsLWZ1enogLVMgZnV6emVyMiAtaSBmdXp6LXRlc3RpbmcvdGVzdGNhc2VzIC1vIGZ1enotdGVzdGluZy9vdXQgZnV6ei10ZXN0aW5nL2Z1enplciA+IC9kZXYvbnVsbCAmCkBAIC0yMDQsNyArMjQ1LDcgQEAKIAogIyBjYWxsIGNwcGNoZWNrIG9uIHRoZSBtYWluIGhlYWRlciBmaWxlCiBjcHBjaGVjazoKLQljcHBjaGVjayAtLWVuYWJsZT13YXJuaW5nIC0taW5jb25jbHVzaXZlIC0tZm9yY2UgLS1zdGQ9YysrMTEgc3JjL2pzb24uaHBwIC0tZXJyb3ItZXhpdGNvZGU9MQorCWNwcGNoZWNrIC0tZW5hYmxlPXdhcm5pbmcgLS1pbmNvbmNsdXNpdmUgLS1mb3JjZSAtLXN0ZD1jKysxMSAkKEFNQUxHQU1BVEVEX0ZJTEUpIC0tZXJyb3ItZXhpdGNvZGU9MQogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0yMTgsOSArMjU5LDMxIEBACiAJICAgLS1pbmRlbnQtY29sMS1jb21tZW50cyAtLXBhZC1vcGVyIC0tcGFkLWhlYWRlciAtLWFsaWduLXBvaW50ZXI9dHlwZSBcCiAJICAgLS1hbGlnbi1yZWZlcmVuY2U9dHlwZSAtLWFkZC1icmFja2V0cyAtLWNvbnZlcnQtdGFicyAtLWNsb3NlLXRlbXBsYXRlcyBcCiAJICAgLS1saW5lZW5kPWxpbnV4IC0tcHJlc2VydmUtZGF0ZSAtLXN1ZmZpeD1ub25lIC0tZm9ybWF0dGVkIFwKLQkgICBzcmMvanNvbi5ocHAgdGVzdC9zcmMvKi5jcHAgXAorCSAgICQoU1JDUykgJChBTUFMR0FNQVRFRF9GSUxFKSB0ZXN0L3NyYy8qLmNwcCBcCiAJICAgYmVuY2htYXJrcy9zcmMvYmVuY2htYXJrcy5jcHAgZG9jL2V4YW1wbGVzLyouY3BwCiAKKyMgY3JlYXRlIHNpbmdsZSBoZWFkZXIgZmlsZQorYW1hbGdhbWF0ZTogJChBTUFMR0FNQVRFRF9GSUxFKQorCiskKEFNQUxHQU1BVEVEX0ZJTEUpOiAkKFNSQ1MpCisJdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9hbWFsZ2FtYXRlLnB5IC1jIHRoaXJkX3BhcnR5L2FtYWxnYW1hdGUvY29uZmlnLmpzb24gLXMgLiAtLXZlcmJvc2U9eWVzCisJJChNQUtFKSBwcmV0dHkKKworIyBjaGVjayBpZiBzaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcCBoYXMgYmVlbiBhbWFsZ2FtYXRlZCBmcm9tIHRoZSBubG9obWFubiBzb3VyY2VzCitjaGVjay1hbWFsZ2FtYXRpb246CisJQG12ICQoQU1BTEdBTUFURURfRklMRSkgJChBTUFMR0FNQVRFRF9GSUxFKX4KKwlAJChNQUtFKSBhbWFsZ2FtYXRlCisJQGRpZmYgJChBTUFMR0FNQVRFRF9GSUxFKSAkKEFNQUxHQU1BVEVEX0ZJTEUpfiB8fCAoZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBBbWFsZ2FtYXRpb24gcmVxdWlyZWQhIFBsZWFzZSByZWFkIHRoZSBjb250cmlidXRpb24gZ3VpZGVsaW5lc1xuICBpbiBmaWxlIC5naXRodWIvQ09OVFJJQlVUSU5HLm1kLlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIgOyBtdiAkKEFNQUxHQU1BVEVEX0ZJTEUpfiAkKEFNQUxHQU1BVEVEX0ZJTEUpIDsgZmFsc2UpCisJQG12ICQoQU1BTEdBTUFURURfRklMRSl+ICQoQU1BTEdBTUFURURfRklMRSkKKworIyBjaGVjayBpZiBldmVyeSBoZWFkZXIgaW4gbmxvaG1hbm4gaW5jbHVkZXMgc3VmZmljaWVudCBoZWFkZXJzIHRvIGJlIGNvbXBpbGVkCisjIGluZGl2aWR1YWxseQorY2hlY2stc2luZ2xlLWluY2x1ZGVzOgorCWZvciB4IGluICQoU1JDUyk7IGRvIFwKKwkgIGVjaG8gIiNpbmNsdWRlIDwkJHg+XG5pbnQgbWFpbigpIHt9XG4iIHwgc2VkICdzfGluY2x1ZGUvfHwnID4gc2luZ2xlX2luY2x1ZGVfdGVzdC5jcHA7IFwKKwkgICQoQ1hYKSAkKENYWEZMQUdTKSAtSWluY2x1ZGUgLXN0ZD1jKysxMSBzaW5nbGVfaW5jbHVkZV90ZXN0LmNwcCAtbyBzaW5nbGVfaW5jbHVkZV90ZXN0OyBcCisJICBybSBzaW5nbGVfaW5jbHVkZV90ZXN0LmNwcCBzaW5nbGVfaW5jbHVkZV90ZXN0OyBcCisJZG9uZQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBjaGFuZ2Vsb2cKZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCAyNTY0MDllLi41ZjZhOWJhIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC01LDExICs1LDExIEBACiBbIVtDb3ZlcmFnZSBTdGF0dXNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vY292ZXJhbGxzL25sb2htYW5uL2pzb24uc3ZnKV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vci9ubG9obWFubi9qc29uKQogWyFbQ292ZXJpdHkgU2NhbiBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvNTU1MC9iYWRnZS5zdmcpXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzL25sb2htYW5uLWpzb24pCiBbIVtDb2RhY3kgQmFkZ2VdKGh0dHBzOi8vYXBpLmNvZGFjeS5jb20vcHJvamVjdC9iYWRnZS9HcmFkZS9mMzczMmIzMzI3ZTM0MzU4YTBlOWQxZmU5ZjY2MWYwOCldKGh0dHBzOi8vd3d3LmNvZGFjeS5jb20vYXBwL25sb2htYW5uL2pzb24/dXRtX3NvdXJjZT1naXRodWIuY29tJmFtcDt1dG1fbWVkaXVtPXJlZmVycmFsJmFtcDt1dG1fY29udGVudD1ubG9obWFubi9qc29uJmFtcDt1dG1fY2FtcGFpZ249QmFkZ2VfR3JhZGUpCi1bIVtUcnkgb25saW5lXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3RyeS1vbmxpbmUtYmx1ZS5zdmcpXShodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL09wNTdYMFY3ZlRmMnRkd2wpCitbIVtUcnkgb25saW5lXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3RyeS1vbmxpbmUtYmx1ZS5zdmcpXShodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1ZIcGJhWkJPbnJaY2JuN2opCiBbIVtEb2N1bWVudGF0aW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2RvY3MtZG94eWdlbi1ibHVlLnN2ZyldKGh0dHA6Ly9ubG9obWFubi5naXRodWIuaW8vanNvbikKIFshW0dpdEh1YiBsaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2xpY2Vuc2UtTUlULWJsdWUuc3ZnKV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25sb2htYW5uL2pzb24vbWFzdGVyL0xJQ0VOU0UuTUlUKQotWyFbR2l0aHViIFJlbGVhc2VzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL25sb2htYW5uL2pzb24uc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcmVsZWFzZXMpCi1bIVtHaXRodWIgSXNzdWVzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9pc3N1ZXMvbmxvaG1hbm4vanNvbi5zdmcpXShodHRwOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3VlcykKK1shW0dpdEh1YiBSZWxlYXNlc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvcmVsZWFzZS9ubG9obWFubi9qc29uLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3JlbGVhc2VzKQorWyFbR2l0SHViIElzc3Vlc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvaXNzdWVzL25sb2htYW5uL2pzb24uc3ZnKV0oaHR0cDovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMpCiBbIVtBdmVyYWdlIHRpbWUgdG8gcmVzb2x2ZSBhbiBpc3N1ZV0oaHR0cDovL2lzaXRtYWludGFpbmVkLmNvbS9iYWRnZS9yZXNvbHV0aW9uL25sb2htYW5uL2pzb24uc3ZnKV0oaHR0cDovL2lzaXRtYWludGFpbmVkLmNvbS9wcm9qZWN0L25sb2htYW5uL2pzb24gIkF2ZXJhZ2UgdGltZSB0byByZXNvbHZlIGFuIGlzc3VlIikKIFshW0NJSSBCZXN0IFByYWN0aWNlc10oaHR0cHM6Ly9iZXN0cHJhY3RpY2VzLmNvcmVpbmZyYXN0cnVjdHVyZS5vcmcvcHJvamVjdHMvMjg5L2JhZGdlKV0oaHR0cHM6Ly9iZXN0cHJhY3RpY2VzLmNvcmVpbmZyYXN0cnVjdHVyZS5vcmcvcHJvamVjdHMvMjg5KQogCkBAIC0yMSw5ICsyMSwxMCBAQAogICAtIFtTVEwtbGlrZSBhY2Nlc3NdKCNzdGwtbGlrZS1hY2Nlc3MpCiAgIC0gW0NvbnZlcnNpb24gZnJvbSBTVEwgY29udGFpbmVyc10oI2NvbnZlcnNpb24tZnJvbS1zdGwtY29udGFpbmVycykKICAgLSBbSlNPTiBQb2ludGVyIGFuZCBKU09OIFBhdGNoXSgjanNvbi1wb2ludGVyLWFuZC1qc29uLXBhdGNoKQorICAtIFtKU09OIE1lcmdlIFBhdGNoXSgjanNvbi1tZXJnZS1wYXRjaCkKICAgLSBbSW1wbGljaXQgY29udmVyc2lvbnNdKCNpbXBsaWNpdC1jb252ZXJzaW9ucykKICAgLSBbQ29udmVyc2lvbnMgdG8vZnJvbSBhcmJpdHJhcnkgdHlwZXNdKCNhcmJpdHJhcnktdHlwZXMtY29udmVyc2lvbnMpCi0gIC0gW0JpbmFyeSBmb3JtYXRzIChDQk9SIGFuZCBNZXNzYWdlUGFjayldKCNiaW5hcnktZm9ybWF0cy1jYm9yLWFuZC1tZXNzYWdlcGFjaykKKyAgLSBbQmluYXJ5IGZvcm1hdHMgKENCT1IsIE1lc3NhZ2VQYWNrLCBhbmQgVUJKU09OKV0oI2JpbmFyeS1mb3JtYXRzLWNib3ItbWVzc2FnZXBhY2stYW5kLXVianNvbikKIC0gW1N1cHBvcnRlZCBjb21waWxlcnNdKCNzdXBwb3J0ZWQtY29tcGlsZXJzKQogLSBbTGljZW5zZV0oI2xpY2Vuc2UpCiAtIFtDb250YWN0XSgjY29udGFjdCkKQEAgLTM5LDcgKzQwLDcgQEAKIAogLSAqKkludHVpdGl2ZSBzeW50YXgqKi4gSW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgUHl0aG9uLCBKU09OIGZlZWxzIGxpa2UgYSBmaXJzdCBjbGFzcyBkYXRhIHR5cGUuIFdlIHVzZWQgYWxsIHRoZSBvcGVyYXRvciBtYWdpYyBvZiBtb2Rlcm4gQysrIHRvIGFjaGlldmUgdGhlIHNhbWUgZmVlbGluZyBpbiB5b3VyIGNvZGUuIENoZWNrIG91dCB0aGUgW2V4YW1wbGVzIGJlbG93XSgjZXhhbXBsZXMpIGFuZCB5b3UnbGwga25vdyB3aGF0IEkgbWVhbi4KIAotLSAqKlRyaXZpYWwgaW50ZWdyYXRpb24qKi4gT3VyIHdob2xlIGNvZGUgY29uc2lzdHMgb2YgYSBzaW5nbGUgaGVhZGVyIGZpbGUgW2Bqc29uLmhwcGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9zcmMvanNvbi5ocHApLiBUaGF0J3MgaXQuIE5vIGxpYnJhcnksIG5vIHN1YnByb2plY3QsIG5vIGRlcGVuZGVuY2llcywgbm8gY29tcGxleCBidWlsZCBzeXN0ZW0uIFRoZSBjbGFzcyBpcyB3cml0dGVuIGluIHZhbmlsbGEgQysrMTEuIEFsbCBpbiBhbGwsIGV2ZXJ5dGhpbmcgc2hvdWxkIHJlcXVpcmUgbm8gYWRqdXN0bWVudCBvZiB5b3VyIGNvbXBpbGVyIGZsYWdzIG9yIHByb2plY3Qgc2V0dGluZ3MuCistICoqVHJpdmlhbCBpbnRlZ3JhdGlvbioqLiBPdXIgd2hvbGUgY29kZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBoZWFkZXIgZmlsZSBbYGpzb24uaHBwYF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vYmxvYi9zaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcCkuIFRoYXQncyBpdC4gTm8gbGlicmFyeSwgbm8gc3VicHJvamVjdCwgbm8gZGVwZW5kZW5jaWVzLCBubyBjb21wbGV4IGJ1aWxkIHN5c3RlbS4gVGhlIGNsYXNzIGlzIHdyaXR0ZW4gaW4gdmFuaWxsYSBDKysxMS4gQWxsIGluIGFsbCwgZXZlcnl0aGluZyBzaG91bGQgcmVxdWlyZSBubyBhZGp1c3RtZW50IG9mIHlvdXIgY29tcGlsZXIgZmxhZ3Mgb3IgcHJvamVjdCBzZXR0aW5ncy4KIAogLSAqKlNlcmlvdXMgdGVzdGluZyoqLiBPdXIgY2xhc3MgaXMgaGVhdmlseSBbdW5pdC10ZXN0ZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvbWFzdGVyL3Rlc3Qvc3JjL3VuaXQuY3BwKSBhbmQgY292ZXJzIFsxMDAlXShodHRwczovL2NvdmVyYWxscy5pby9yL25sb2htYW5uL2pzb24pIG9mIHRoZSBjb2RlLCBpbmNsdWRpbmcgYWxsIGV4Y2VwdGlvbmFsIGJlaGF2aW9yLiBGdXJ0aGVybW9yZSwgd2UgY2hlY2tlZCB3aXRoIFtWYWxncmluZF0oaHR0cDovL3ZhbGdyaW5kLm9yZykgdGhhdCB0aGVyZSBhcmUgbm8gbWVtb3J5IGxlYWtzLiBUbyBtYWludGFpbiBoaWdoIHF1YWxpdHksIHRoZSBwcm9qZWN0IGlzIGZvbGxvd2luZyB0aGUgW0NvcmUgSW5mcmFzdHJ1Y3R1cmUgSW5pdGlhdGl2ZSAoQ0lJKSBiZXN0IHByYWN0aWNlc10oaHR0cHM6Ly9iZXN0cHJhY3RpY2VzLmNvcmVpbmZyYXN0cnVjdHVyZS5vcmcvcHJvamVjdHMvMjg5KS4KIApAQCAtNTQsNyArNTUsNyBAQAogCiAjIyBJbnRlZ3JhdGlvbgogCi1UaGUgc2luZ2xlIHJlcXVpcmVkIHNvdXJjZSwgZmlsZSBganNvbi5ocHBgIGlzIGluIHRoZSBgc3JjYCBkaXJlY3Rvcnkgb3IgW3JlbGVhc2VkIGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3JlbGVhc2VzKS4gQWxsIHlvdSBuZWVkIHRvIGRvIGlzIGFkZAorVGhlIHNpbmdsZSByZXF1aXJlZCBzb3VyY2UsIGZpbGUgYGpzb24uaHBwYCBpcyBpbiB0aGUgYHNpbmdsZV9pbmNsdWRlL25sb2htYW5uYCBkaXJlY3Rvcnkgb3IgW3JlbGVhc2VkIGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3JlbGVhc2VzKS4gQWxsIHlvdSBuZWVkIHRvIGRvIGlzIGFkZAogCiBgYGBjcHAKICNpbmNsdWRlICJqc29uLmhwcCIKQEAgLTY1LDIwICs2NiwyNiBAQAogCiB0byB0aGUgZmlsZXMgeW91IHdhbnQgdG8gdXNlIEpTT04gb2JqZWN0cy4gVGhhdCdzIGl0LiBEbyBub3QgZm9yZ2V0IHRvIHNldCB0aGUgbmVjZXNzYXJ5IHN3aXRjaGVzIHRvIGVuYWJsZSBDKysxMSAoZS5nLiwgYC1zdGQ9YysrMTFgIGZvciBHQ0MgYW5kIENsYW5nKS4KIAorWW91IGNhbiBmdXJ0aGVyIHVzZSBmaWxlIFtgaW5jbHVkZS9qc29uX2Z3ZC5ocHBgXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9ibG9iL2RldmVsb3AvZGV2ZWxvcC9qc29uX2Z3ZC5ocHApIGZvciBmb3J3YXJkLWRlY2xhcmF0aW9ucy4gVGhlIGluc3RhbGxhdGlvbiBvZiBqc29uX2Z3ZC5ocHAgKGFzIHBhcnQgb2YgY21ha2UncyBpbnN0YWxsIHN0ZXApLCBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZyBgLURKU09OX011bHRpcGxlSGVhZGVycz1PTmA6CisKKyMjIyBQYWNrYWdlIE1hbmFnZXJzCisKIDpiZWVyOiBJZiB5b3UgYXJlIHVzaW5nIE9TIFggYW5kIFtIb21lYnJld10oaHR0cDovL2JyZXcuc2gpLCBqdXN0IHR5cGUgYGJyZXcgdGFwIG5sb2htYW5uL2pzb25gIGFuZCBgYnJldyBpbnN0YWxsIG5sb2htYW5uX2pzb25gIGFuZCB5b3UncmUgc2V0LiBJZiB5b3Ugd2FudCB0aGUgYmxlZWRpbmcgZWRnZSByYXRoZXIgdGhhbiB0aGUgbGF0ZXN0IHJlbGVhc2UsIHVzZSBgYnJldyBpbnN0YWxsIG5sb2htYW5uX2pzb24gLS1IRUFEYC4KIAotSWYgeW91IGFyZSB1c2luZyB0aGUgW01lc29uIEJ1aWxkIFN5c3RlbV0oaHR0cDovL21lc29uYnVpbGQuY29tKSwgdGhlbiB5b3UgY2FuIHdyYXAgdGhpcyByZXBvIGFzIGEgc3VicHJvamVjdC4KK0lmIHlvdSBhcmUgdXNpbmcgdGhlIFtNZXNvbiBCdWlsZCBTeXN0ZW1dKGh0dHA6Ly9tZXNvbmJ1aWxkLmNvbSksIHRoZW4geW91IGNhbiB3cmFwIHRoaXMgcmVwb3NpdG9yeSBhcyBhIHN1YnByb2plY3QuCiAKIElmIHlvdSBhcmUgdXNpbmcgW0NvbmFuXShodHRwczovL3d3dy5jb25hbi5pby8pIHRvIG1hbmFnZSB5b3VyIGRlcGVuZGVuY2llcywgbWVyZWx5IGFkZCBganNvbmZvcm1vZGVybmNwcC94LnkuekB2dGhpZXJ5L3N0YWJsZWAgdG8geW91ciBgY29uYW5maWxlLnB5YCdzIHJlcXVpcmVzLCB3aGVyZSBgeC55LnpgIGlzIHRoZSByZWxlYXNlIHZlcnNpb24geW91IHdhbnQgdG8gdXNlLiBQbGVhc2UgZmlsZSBpc3N1ZXMgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS92dGhpZXJ5L2NvbmFuLWpzb25mb3Jtb2Rlcm5jcHAvaXNzdWVzKSBpZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoZSBwYWNrYWdlcy4KIAogSWYgeW91IGFyZSB1c2luZyBbaHVudGVyXShodHRwczovL2dpdGh1Yi5jb20vcnVzbG8vaHVudGVyLykgb24geW91ciBwcm9qZWN0IGZvciBleHRlcm5hbCBkZXBlbmRlbmNpZXMsIHRoZW4geW91IGNhbiB1c2UgdGhlIFtubG9obWFubl9qc29uIHBhY2thZ2VdKGh0dHBzOi8vZG9jcy5odW50ZXIuc2gvZW4vbGF0ZXN0L3BhY2thZ2VzL3BrZy9ubG9obWFubl9qc29uLmh0bWwpLiBQbGVhc2Ugc2VlIHRoZSBodW50ZXIgcHJvamVjdCBmb3IgYW55IGlzc3VlcyByZWdhcmRpbmcgdGhlIHBhY2thZ2luZy4KIAorSWYgeW91IGFyZSB1c2luZyBbQnVja2Fyb29dKGh0dHBzOi8vYnVja2Fyb28ucG0pLCB5b3UgY2FuIGluc3RhbGwgdGhpcyBsaWJyYXJ5J3MgbW9kdWxlIHdpdGggYGJ1Y2thcm9vIGluc3RhbGwgbmxvaG1hbm4vanNvbmAuIFBsZWFzZSBmaWxlIGlzc3VlcyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL0xvb3BQZXJmZWN0L2J1Y2thcm9vLXJlY2lwZXMvaXNzdWVzL25ldz90aXRsZT1ubG9obWFubi9ubG9obWFubi9qc29uKS4KKwogSWYgeW91IGFyZSB1c2luZyBbdmNwa2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdmNwa2cvKSBvbiB5b3VyIHByb2plY3QgZm9yIGV4dGVybmFsIGRlcGVuZGVuY2llcywgdGhlbiB5b3UgY2FuIHVzZSB0aGUgW25sb2htYW5uLWpzb24gcGFja2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC92Y3BrZy90cmVlL21hc3Rlci9wb3J0cy9ubG9obWFubi1qc29uKS4gUGxlYXNlIHNlZSB0aGUgdmNwa2cgcHJvamVjdCBmb3IgYW55IGlzc3VlcyByZWdhcmRpbmcgdGhlIHBhY2thZ2luZy4KIAogCiAjIyBFeGFtcGxlcwogCi1CZXNpZGUgdGhlIGV4YW1wbGVzIGJlbG93LCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgdGhlIFtkb2N1bWVudGF0aW9uXShodHRwczovL25sb2htYW5uLmdpdGh1Yi5pby9qc29uLykgd2hlcmUgZWFjaCBmdW5jdGlvbiBjb250YWlucyBhIHNlcGFyYXRlIGNvZGUgZXhhbXBsZSAoZS5nLiwgY2hlY2sgb3V0IFtgZW1wbGFjZSgpYF0oaHR0cHM6Ly9ubG9obWFubi5naXRodWIuaW8vanNvbi9jbGFzc25sb2htYW5uXzFfMWJhc2ljX19qc29uX2E2MDJmMjc1ZjAzNTlhYjE4MTIyMTM4NDk4OTgxMDYwNC5odG1sI2E2MDJmMjc1ZjAzNTlhYjE4MTIyMTM4NDk4OTgxMDYwNCkpLiBBbGwgW2V4YW1wbGUgZmlsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3RyZWUvZGV2ZWxvcC9kb2MvZXhhbXBsZXMpIGNhbiBiZSBjb21waWxlZCBhbmQgZXhlY3V0ZWQgb24gdGhlaXIgb3duIChlLmcuLCBmaWxlIFtlbXBsYWNlLmNwcF0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vYmxvYi9kZXZlbG9wL2RvYy9leGFtcGxlcy9lbXBsYWNlLmNwcCkpLgorQmVzaWRlIHRoZSBleGFtcGxlcyBiZWxvdywgeW91IG1heSB3YW50IHRvIGNoZWNrIHRoZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9ubG9obWFubi5naXRodWIuaW8vanNvbi8pIHdoZXJlIGVhY2ggZnVuY3Rpb24gY29udGFpbnMgYSBzZXBhcmF0ZSBjb2RlIGV4YW1wbGUgKGUuZy4sIGNoZWNrIG91dCBbYGVtcGxhY2UoKWBdKGh0dHBzOi8vbmxvaG1hbm4uZ2l0aHViLmlvL2pzb24vY2xhc3NubG9obWFubl8xXzFiYXNpY19fanNvbl9hNTMzOGUyODJkMWQwMmJlZDM4OWQ4NTJkZDY3MGQ5OGQuaHRtbCNhNTMzOGUyODJkMWQwMmJlZDM4OWQ4NTJkZDY3MGQ5OGQpKS4gQWxsIFtleGFtcGxlIGZpbGVzXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi90cmVlL2RldmVsb3AvZG9jL2V4YW1wbGVzKSBjYW4gYmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG9uIHRoZWlyIG93biAoZS5nLiwgZmlsZSBbZW1wbGFjZS5jcHBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9kb2MvZXhhbXBsZXMvZW1wbGFjZS5jcHApKS4KIAogIyMjIEpTT04gYXMgZmlyc3QtY2xhc3MgZGF0YSB0eXBlCiAKQEAgLTQ1MCw2ICs0NTcsMzcgQEAKIC8vIF0KIGBgYAogCisjIyMgSlNPTiBNZXJnZSBQYXRjaAorCitUaGUgbGlicmFyeSBzdXBwb3J0cyAqKkpTT04gTWVyZ2UgUGF0Y2gqKiAoW1JGQyA3Mzg2XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzM4NikpIGFzIGEgcGF0Y2ggZm9ybWF0LiBJbnN0ZWFkIG9mIHVzaW5nIEpTT04gUG9pbnRlciAoc2VlIGFib3ZlKSB0byBzcGVjaWZ5IHZhbHVlcyB0byBiZSBtYW5pcHVsYXRlZCwgaXQgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzIHVzaW5nIGEgc3ludGF4IHRoYXQgY2xvc2VseSBtaW1pY3MgdGhlIGRvY3VtZW50IGJlaW5nIG1vZGlmaWVkLgorCitgYGBjcHAKKy8vIGEgSlNPTiB2YWx1ZQoranNvbiBqX2RvY3VtZW50ID0gUiIoeworICAiYSI6ICJiIiwKKyAgImMiOiB7CisgICAgImQiOiAiZSIsCisgICAgImYiOiAiZyIKKyAgfQorfSkiX2pzb247CisKKy8vIGEgcGF0Y2gKK2pzb24gal9wYXRjaCA9IFIiKHsKKyAgImEiOiJ6IiwKKyAgImMiOiB7CisgICAgImYiOiBudWxsCisgIH0KK30pIl9qc29uOworCisvLyBhcHBseSB0aGUgcGF0Y2gKK2pfb3JpZ2luYWwubWVyZ2VfcGF0Y2goal9wYXRjaCk7CisvLyB7CisvLyAgImEiOiAieiIsCisvLyAgImMiOiB7CisvLyAgICAiZCI6ICJlIgorLy8gIH0KKy8vIH0KK2BgYAogCiAjIyMgSW1wbGljaXQgY29udmVyc2lvbnMKIApAQCAtNzA5LDkgKzc0Nyw5IEBACiB9OwogYGBgCiAKLSMjIyBCaW5hcnkgZm9ybWF0cyAoQ0JPUiBhbmQgTWVzc2FnZVBhY2spCisjIyMgQmluYXJ5IGZvcm1hdHMgKENCT1IsIE1lc3NhZ2VQYWNrLCBhbmQgVUJKU09OKQogCi1UaG91Z2ggSlNPTiBpcyBhIHViaXF1aXRvdXMgZGF0YSBmb3JtYXQsIGl0IGlzIG5vdCBhIHZlcnkgY29tcGFjdCBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGEgZXhjaGFuZ2UsIGZvciBpbnN0YW5jZSBvdmVyIGEgbmV0d29yay4gSGVuY2UsIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIFtDQk9SXShodHRwOi8vY2Jvci5pbykgKENvbmNpc2UgQmluYXJ5IE9iamVjdCBSZXByZXNlbnRhdGlvbikgYW5kIFtNZXNzYWdlUGFja10oaHR0cDovL21zZ3BhY2sub3JnKSB0byBlZmZpY2llbnRseSBlbmNvZGUgSlNPTiB2YWx1ZXMgdG8gYnl0ZSB2ZWN0b3JzIGFuZCB0byBkZWNvZGUgc3VjaCB2ZWN0b3JzLgorVGhvdWdoIEpTT04gaXMgYSB1YmlxdWl0b3VzIGRhdGEgZm9ybWF0LCBpdCBpcyBub3QgYSB2ZXJ5IGNvbXBhY3QgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhIGV4Y2hhbmdlLCBmb3IgaW5zdGFuY2Ugb3ZlciBhIG5ldHdvcmsuIEhlbmNlLCB0aGUgbGlicmFyeSBzdXBwb3J0cyBbQ0JPUl0oaHR0cDovL2Nib3IuaW8pIChDb25jaXNlIEJpbmFyeSBPYmplY3QgUmVwcmVzZW50YXRpb24pLCBbTWVzc2FnZVBhY2tdKGh0dHA6Ly9tc2dwYWNrLm9yZyksIGFuZCBbVUJKU09OXShodHRwOi8vdWJqc29uLm9yZykgKFVuaXZlcnNhbCBCaW5hcnkgSlNPTiBTcGVjaWZpY2F0aW9uKSB0byBlZmZpY2llbnRseSBlbmNvZGUgSlNPTiB2YWx1ZXMgdG8gYnl0ZSB2ZWN0b3JzIGFuZCB0byBkZWNvZGUgc3VjaCB2ZWN0b3JzLgogCiBgYGBjcHAKIC8vIGNyZWF0ZSBhIEpTT04gdmFsdWUKQEAgLTcyMCw3ICs3NTgsNyBAQAogLy8gc2VyaWFsaXplIHRvIENCT1IKIHN0ZDo6dmVjdG9yPHN0ZDo6dWludDhfdD4gdl9jYm9yID0ganNvbjo6dG9fY2JvcihqKTsKIAotLy8gMHhhMiwgMHg2NywgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2MSwgMHg2MywgMHg3NCwgMHhmNSwgMHg2NiwgMHg3MywgMHg2MywgMHg2OCwgMHg2NSwgMHg2ZCwgMHg2MSwgMHgwMAorLy8gMHhBMiwgMHg2NywgMHg2MywgMHg2RiwgMHg2RCwgMHg3MCwgMHg2MSwgMHg2MywgMHg3NCwgMHhGNSwgMHg2NiwgMHg3MywgMHg2MywgMHg2OCwgMHg2NSwgMHg2RCwgMHg2MSwgMHgwMAogCiAvLyByb3VuZHRyaXAKIGpzb24gal9mcm9tX2Nib3IgPSBqc29uOjpmcm9tX2Nib3Iodl9jYm9yKTsKQEAgLTcyOCwxNiArNzY2LDI0IEBACiAvLyBzZXJpYWxpemUgdG8gTWVzc2FnZVBhY2sKIHN0ZDo6dmVjdG9yPHN0ZDo6dWludDhfdD4gdl9tc2dwYWNrID0ganNvbjo6dG9fbXNncGFjayhqKTsKIAotLy8gMHg4MiwgMHhhNywgMHg2MywgMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2MSwgMHg2MywgMHg3NCwgMHhjMywgMHhhNiwgMHg3MywgMHg2MywgMHg2OCwgMHg2NSwgMHg2ZCwgMHg2MSwgMHgwMAorLy8gMHg4MiwgMHhBNywgMHg2MywgMHg2RiwgMHg2RCwgMHg3MCwgMHg2MSwgMHg2MywgMHg3NCwgMHhDMywgMHhBNiwgMHg3MywgMHg2MywgMHg2OCwgMHg2NSwgMHg2RCwgMHg2MSwgMHgwMAogCiAvLyByb3VuZHRyaXAKIGpzb24gal9mcm9tX21zZ3BhY2sgPSBqc29uOjpmcm9tX21zZ3BhY2sodl9tc2dwYWNrKTsKKworLy8gc2VyaWFsaXplIHRvIFVCSlNPTgorc3RkOjp2ZWN0b3I8c3RkOjp1aW50OF90PiB2X3VianNvbiA9IGpzb246OnRvX3VianNvbihqKTsKKworLy8gMHg3QiwgMHg2OSwgMHgwNywgMHg2MywgMHg2RiwgMHg2RCwgMHg3MCwgMHg2MSwgMHg2MywgMHg3NCwgMHg1NCwgMHg2OSwgMHgwNiwgMHg3MywgMHg2MywgMHg2OCwgMHg2NSwgMHg2RCwgMHg2MSwgMHg2OSwgMHgwMCwgMHg3RAorCisvLyByb3VuZHRyaXAKK2pzb24gal9mcm9tX3VianNvbiA9IGpzb246OmZyb21fdWJqc29uKHZfdWJqc29uKTsKIGBgYAogCiAKICMjIFN1cHBvcnRlZCBjb21waWxlcnMKIAotVGhvdWdoIGl0J3MgMjAxNyBhbHJlYWR5LCB0aGUgc3VwcG9ydCBmb3IgQysrMTEgaXMgc3RpbGwgYSBiaXQgc3BhcnNlLiBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byB3b3JrOgorVGhvdWdoIGl0J3MgMjAxOCBhbHJlYWR5LCB0aGUgc3VwcG9ydCBmb3IgQysrMTEgaXMgc3RpbGwgYSBiaXQgc3BhcnNlLiBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byB3b3JrOgogCiAtIEdDQyA0LjkgLSA3LjIgKGFuZCBwb3NzaWJseSBsYXRlcikKIC0gQ2xhbmcgMy40IC0gNS4wIChhbmQgcG9zc2libHkgbGF0ZXIpCkBAIC03OTUsNyArODQxLDcgQEAKIAogVGhlIGNsYXNzIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBbTUlUIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpOgogCi1Db3B5cmlnaHQgJmNvcHk7IDIwMTMtMjAxNyBbTmllbHMgTG9obWFubl0oaHR0cDovL25sb2htYW5uLm1lKQorQ29weXJpZ2h0ICZjb3B5OyAyMDEzLTIwMTggW05pZWxzIExvaG1hbm5dKGh0dHA6Ly9ubG9obWFubi5tZSkKIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogCkBAIC04MDcsOSArODUzLDExIEBACiAKIFRoZSBjbGFzcyBjb250YWlucyB0aGUgVVRGLTggRGVjb2RlciBmcm9tIEJqb2VybiBIb2Vocm1hbm4gd2hpY2ggaXMgbGljZW5zZWQgdW5kZXIgdGhlIFtNSVQgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkgKHNlZSBhYm92ZSkuIENvcHlyaWdodCAmY29weTsgMjAwOC0yMDA5IFtCasO2cm4gSG9laHJtYW5uXShodHRwOi8vYmpvZXJuLmhvZWhybWFubi5kZS8pIDxiam9lcm5AaG9laHJtYW5uLmRlPgogCitUaGUgY2xhc3MgY29udGFpbnMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBHcmlzdTIgYWxnb3JpdGhtIGZyb20gRmxvcmlhbiBMb2l0c2NoIHdoaWNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBbTUlUIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpIChzZWUgYWJvdmUpLiBDb3B5cmlnaHQgJmNvcHk7IDIwMDkgW0Zsb3JpYW4gTG9pdHNjaF0oaHR0cDovL2Zsb3JpYW4ubG9pdHNjaC5jb20vKQorCiAjIyBDb250YWN0CiAKLUlmIHlvdSBoYXZlIHF1ZXN0aW9ucyByZWdhcmRpbmcgdGhlIGxpYnJhcnksIEkgd291bGQgbGlrZSB0byBpbnZpdGUgeW91IHRvIFtvcGVuIGFuIGlzc3VlIGF0IEdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzL25ldykuIFBsZWFzZSBkZXNjcmliZSB5b3VyIHJlcXVlc3QsIHByb2JsZW0sIG9yIHF1ZXN0aW9uIGFzIGRldGFpbGVkIGFzIHBvc3NpYmxlLCBhbmQgYWxzbyBtZW50aW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHlvdSBhcmUgdXNpbmcgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbiBvZiB5b3VyIGNvbXBpbGVyIGFuZCBvcGVyYXRpbmcgc3lzdGVtLiBPcGVuaW5nIGFuIGlzc3VlIGF0IEdpdGh1YiBhbGxvd3Mgb3RoZXIgdXNlcnMgYW5kIGNvbnRyaWJ1dG9ycyB0byB0aGlzIGxpYnJhcnkgdG8gY29sbGFib3JhdGUuIEZvciBpbnN0YW5jZSwgSSBoYXZlIGxpdHRsZSBleHBlcmllbmNlIHdpdGggTVNWQywgYW5kIG1vc3QgaXNzdWVzIGluIHRoaXMgcmVnYXJkIGhhdmUgYmVlbiBzb2x2ZWQgYnkgYSBncm93aW5nIGNvbW11bml0eS4gSWYgeW91IGhhdmUgYSBsb29rIGF0IHRoZSBbY2xvc2VkIGlzc3Vlc10oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzP3E9aXMlM0Fpc3N1ZStpcyUzQWNsb3NlZCksIHlvdSB3aWxsIHNlZSB0aGF0IHdlIHJlYWN0IHF1aXRlIHRpbWVseSBpbiBtb3N0IGNhc2VzLgorSWYgeW91IGhhdmUgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgbGlicmFyeSwgSSB3b3VsZCBsaWtlIHRvIGludml0ZSB5b3UgdG8gW29wZW4gYW4gaXNzdWUgYXQgR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvbmV3KS4gUGxlYXNlIGRlc2NyaWJlIHlvdXIgcmVxdWVzdCwgcHJvYmxlbSwgb3IgcXVlc3Rpb24gYXMgZGV0YWlsZWQgYXMgcG9zc2libGUsIGFuZCBhbHNvIG1lbnRpb24gdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgeW91IGFyZSB1c2luZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uIG9mIHlvdXIgY29tcGlsZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0uIE9wZW5pbmcgYW4gaXNzdWUgYXQgR2l0SHViIGFsbG93cyBvdGhlciB1c2VycyBhbmQgY29udHJpYnV0b3JzIHRvIHRoaXMgbGlicmFyeSB0byBjb2xsYWJvcmF0ZS4gRm9yIGluc3RhbmNlLCBJIGhhdmUgbGl0dGxlIGV4cGVyaWVuY2Ugd2l0aCBNU1ZDLCBhbmQgbW9zdCBpc3N1ZXMgaW4gdGhpcyByZWdhcmQgaGF2ZSBiZWVuIHNvbHZlZCBieSBhIGdyb3dpbmcgY29tbXVuaXR5LiBJZiB5b3UgaGF2ZSBhIGxvb2sgYXQgdGhlIFtjbG9zZWQgaXNzdWVzXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXM/cT1pcyUzQWlzc3VlK2lzJTNBY2xvc2VkKSwgeW91IHdpbGwgc2VlIHRoYXQgd2UgcmVhY3QgcXVpdGUgdGltZWx5IGluIG1vc3QgY2FzZXMuCiAKIE9ubHkgaWYgeW91ciByZXF1ZXN0IHdvdWxkIGNvbnRhaW4gY29uZmlkZW50aWFsIGluZm9ybWF0aW9uLCBwbGVhc2UgW3NlbmQgbWUgYW4gZW1haWxdKG1haWx0bzptYWlsQG5sb2htYW5uLm1lKS4gRm9yIGVuY3J5cHRlZCBtZXNzYWdlcywgcGxlYXNlIHVzZSBbdGhpcyBrZXldKGh0dHBzOi8va2V5YmFzZS5pby9ubG9obWFubi9wZ3Bfa2V5cy5hc2MpLgogCkBAIC04NDcsNyArODk1LDcgQEAKIC0gW0NvcmJpbiBIdWdoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9uaWJyb2MpIGZpeGVkIHNvbWUgdHlwb3MgaW4gdGhlIGNvbnRyaWJ1dGlvbiBndWlkZWxpbmVzLgogLSBbdHdlbHNieV0oaHR0cHM6Ly9naXRodWIuY29tL3R3ZWxzYnkpIGZpeGVkIHRoZSBhcnJheSBzdWJzY3JpcHQgb3BlcmF0b3IsIGFuIGlzc3VlIHRoYXQgZmFpbGVkIHRoZSBNU1ZDIGJ1aWxkLCBhbmQgZmxvYXRpbmctcG9pbnQgcGFyc2luZy9kdW1waW5nLiBIZSBmdXJ0aGVyIGFkZGVkIHN1cHBvcnQgZm9yIHVuc2lnbmVkIGludGVnZXIgbnVtYmVycyBhbmQgaW1wbGVtZW50ZWQgYmV0dGVyIHJvdW5kdHJpcCBzdXBwb3J0IGZvciBwYXJzZWQgbnVtYmVycy4KIC0gW1ZvbGtlciBEaWVscy1HcmFic2NoXShodHRwczovL2dpdGh1Yi5jb20vdm9nKSBmaXhlZCBhIGxpbmsgaW4gdGhlIFJFQURNRSBmaWxlLgotLSBbbXNtLV0oaHR0cHM6Ly9naXRodWIuY29tL21zbS0pIGFkZGVkIHN1cHBvcnQgZm9yIGFtZXJpY2FuIGZ1enp5IGxvcC4gCistIFttc20tXShodHRwczovL2dpdGh1Yi5jb20vbXNtLSkgYWRkZWQgc3VwcG9ydCBmb3IgQW1lcmljYW4gRnV6enkgTG9wLiAKIC0gW0FubmloaWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9Bbm5paGlsKSBmaXhlZCBhbiBleGFtcGxlIGluIHRoZSBSRUFETUUgZmlsZS4KIC0gW1RoZW1lcmNlZV0oaHR0cHM6Ly9naXRodWIuY29tL1RoZW1lcmNlZSkgbm90ZWQgYSB3cm9uZyBVUkwgaW4gdGhlIFJFQURNRSBmaWxlLgogLSBbTHYgWmhlbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9sdi16aGVuZykgZml4ZWQgYSBuYW1lc3BhY2UgaXNzdWUgd2l0aCBgaW50NjRfdGAgYW5kIGB1aW50NjRfdGAuCkBAIC04NjAsNyArOTA4LDcgQEAKIC0gW2R1bmNhbndlcm5lcl0oaHR0cHM6Ly9naXRodWIuY29tL2R1bmNhbndlcm5lcikgZm91bmQgYSByZWFsbHkgZW1iYXJyYXNzaW5nIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gaW4gdGhlIDIuMC4wIHJlbGVhc2UuCiAtIFtEYW1pZW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9kdG9tYSkgZml4ZWQgb25lIG9mIHRoZSBsYXN0IGNvbnZlcnNpb24gd2FybmluZ3MuCiAtIFtUaG9tYXMgQnJhdW5dKGh0dHBzOi8vZ2l0aHViLmNvbS90LWIpIGZpeGVkIGEgd2FybmluZyBpbiBhIHRlc3QgY2FzZS4KLS0gW1Row6lvIERFTFJJRVVdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGVvZGVscmlldSkgcGF0aWVudGx5IGFuZCBjb25zdHJ1Y3RpdmVseSBvdmVyc2F3IHRoZSBsb25nIHdheSB0b3dhcmQgW2l0ZXJhdG9yLXJhbmdlIHBhcnNpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy8yOTApLiBIZSBhbHNvIGltcGxlbWVudGVkIHRoZSBtYWdpYyBiZWhpbmQgdGhlIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIG9mIHVzZXItZGVmaW5lZCB0eXBlcy4KKy0gW1Row6lvIERFTFJJRVVdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGVvZGVscmlldSkgcGF0aWVudGx5IGFuZCBjb25zdHJ1Y3RpdmVseSBvdmVyc2F3IHRoZSBsb25nIHdheSB0b3dhcmQgW2l0ZXJhdG9yLXJhbmdlIHBhcnNpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2lzc3Vlcy8yOTApLiBIZSBhbHNvIGltcGxlbWVudGVkIHRoZSBtYWdpYyBiZWhpbmQgdGhlIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIG9mIHVzZXItZGVmaW5lZCB0eXBlcyBhbmQgc3BsaXQgdGhlIHNpbmdsZSBoZWFkZXIgZmlsZSBpbnRvIHNtYWxsZXIgY2h1bmtzLgogLSBbU3RlZmFuXShodHRwczovL2dpdGh1Yi5jb20vNXRlZmFuKSBmaXhlZCBhIG1pbm9yIGlzc3VlIGluIHRoZSBkb2N1bWVudGF0aW9uLgogLSBbVmFzaWwgRGltb3ZdKGh0dHBzOi8vZ2l0aHViLmNvbS92YXNpbGQpIGZpeGVkIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBjb252ZXJzaW9ucyBmcm9tIGBzdGQ6Om11bHRpc2V0YC4KIC0gW0NocmlzdG9waEp1ZF0oaHR0cHM6Ly9naXRodWIuY29tL0NocmlzdG9waEp1ZCkgb3ZlcndvcmtlZCB0aGUgQ01ha2UgZmlsZXMgdG8gZWFzZSBwcm9qZWN0IGluY2x1c2lvbi4KQEAgLTg5Myw3ICs5NDEsNyBAQAogLSBbVmluY2VudCBUaGllcnldKGh0dHBzOi8vZ2l0aHViLmNvbS92dGhpZXJ5KSBtYWludGFpbnMgYSBwYWNrYWdlIGZvciB0aGUgQ29uYW4gcGFja2FnZSBtYW5hZ2VyLgogLSBbU3RlZmZlbl0oaHR0cHM6Ly9naXRodWIuY29tL2tvZW1lZXQpIGZpeGVkIGEgcG90ZW50aWFsIGlzc3VlIHdpdGggTVNWQyBhbmQgYHN0ZDo6bWluYC4KIC0gW01pa2UgVHpvdV0oaHR0cHM6Ly9naXRodWIuY29tL0Nob2NvYm8xKSBmaXhlZCBzb21lIHR5cG9zLgotLSBbYW1yY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FtcmNvZGUpIG5vdGVkIGEgbWlzc2xlYWRpbmcgZG9jdW1lbnRhdGlvbiBhYm91dCBjb21wYXJpc29uIG9mIGZsb2F0cy4KKy0gW2FtcmNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbXJjb2RlKSBub3RlZCBhIG1pc2xlYWRpbmcgZG9jdW1lbnRhdGlvbiBhYm91dCBjb21wYXJpc29uIG9mIGZsb2F0cy4KIC0gW09sZWcgRW5kb10oaHR0cHM6Ly9naXRodWIuY29tL29sZWdlbmRvKSByZWR1Y2VkIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gYnkgcmVwbGFjaW5nIGA8aW9zdHJlYW0+YCB3aXRoIGA8aW9zZndkPmAuCiAtIFtkYW4tNDJdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW4tNDIpIGNsZWFuZWQgdXAgdGhlIENNYWtlIGZpbGVzIHRvIHNpbXBsaWZ5IGluY2x1ZGluZy9yZXVzaW5nIG9mIHRoZSBsaWJyYXJ5LgogLSBbTmlraXRhIE9maXRzZXJvdl0oaHR0cHM6Ly9naXRodWIuY29tL2hpbWlrb2YpIGFsbG93ZWQgZm9yIG1vdmluZyB2YWx1ZXMgZnJvbSBpbml0aWFsaXplciBsaXN0cy4KQEAgLTkxMCwxMyArOTU4LDE3IEBACiAtIFtOYXRlIFZhcmdhc10oaHR0cHM6Ly9naXRodWIuY29tL2VsZDAwZCkgYWRkZWQgYSBEb3h5Z2VuIHRhZyBmaWxlLgogLSBbcHZsZXV2ZW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9wdmxldXZlbikgaGVscGVkIGZpeGluZyBhIHdhcm5pbmcgaW4gSUNDLgogLSBbUGF2ZWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9jcmVhN29yKSBoZWxwZWQgZml4aW5nIHNvbWUgd2FybmluZ3MgaW4gTVNWQy4KLS0gW0phbWllIFNld2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL2pzZXdhcmQpIGF2b2lkZWQgdW5uZWNjZXNzYXJ5IHN0cmluZyBjb3BpZXMgaW4gYGZpbmQoKWAgYW5kIGBjb3VudCgpYC4KKy0gW0phbWllIFNld2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL2pzZXdhcmQpIGF2b2lkZWQgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvcGllcyBpbiBgZmluZCgpYCBhbmQgYGNvdW50KClgLgogLSBbTWl0amFdKGh0dHBzOi8vZ2l0aHViLmNvbS9JdGphKSBmaXhlZCBzb21lIHR5cG9zLgogLSBbSm9ycml0IFdyb25za2ldKGh0dHBzOi8vZ2l0aHViLmNvbS9qb3dyKSB1cGRhdGVkIHRoZSBIdW50ZXIgcGFja2FnZSBsaW5rcy4KIC0gW01hdHRoaWFzIE3DtmxsZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9UaW55VGlubmkpIGFkZGVkIGEgYC5uYXR2aXNgIGZvciB0aGUgTVNWQyBkZWJ1ZyB2aWV3LgogLSBbYm9nZW1pY10oaHR0cHM6Ly9naXRodWIuY29tL2JvZ2VtaWMpIGZpeGVkIHNvbWUgQysrMTcgZGVwcmVjYXRpb24gd2FybmluZ3MuCiAtIFtFcmVuIE9ra2FdKGh0dHBzOi8vZ2l0aHViLmNvbS9lcmVuZ3kpIGZpeGVkIHNvbWUgTVNWQyB3YXJuaW5ncy4KLQorLSBbYWJvbHpdKGh0dHBzOi8vZ2l0aHViLmNvbS9hYm9seikgaW50ZWdyYXRlZCB0aGUgR3Jpc3UyIGFsZ29yaXRobSBmb3IgcHJvcGVyIGZsb2F0aW5nLXBvaW50IGZvcm1hdHRpbmcsIGFsbG93aW5nIG1vcmUgcm91bmR0cmlwIGNoZWNrcyB0byBzdWNjZWVkLgorLSBbVmFkaW0gRXZhcmRdKGh0dHBzOi8vZ2l0aHViLmNvbS9QaXBlbGluZXIpIGZpeGVkIGEgTWFya2Rvd24gaXNzdWUgaW4gdGhlIFJFQURNRS4KKy0gW3plcm9kZWZlY3RdKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJvZGVmZWN0KSBmaXhlZCBhIGNvbXBpbGVyIHdhcm5pbmcuCistIFtLZXJ0XShodHRwczovL2dpdGh1Yi5jb20va2FpZG9rZXJ0KSBhbGxvd2VkIHRvIHRlbXBsYXRlIHRoZSBzdHJpbmcgdHlwZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBhbmQgYWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIG92ZXJyaWRlIHRoZSBleGNlcHRpb25hbCBiZWhhdmlvci4KKy0gW21hcmstOTldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrLTk5KSBoZWxwZWQgZml4aW5nIGFuIElDQyBlcnJvci4KIAogVGhhbmtzIGEgbG90IGZvciBoZWxwaW5nIG91dCEgUGxlYXNlIFtsZXQgbWUga25vd10obWFpbHRvOm1haWxAbmxvaG1hbm4ubWUpIGlmIEkgZm9yZ290IHNvbWVvbmUuCiAKQEAgLTkyNSwxMCArOTc3LDEwIEBACiAKIFRoZSBsaWJyYXJ5IGl0c2VsZiBjb250YWlucyBvZiBhIHNpbmdsZSBoZWFkZXIgZmlsZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIEhvd2V2ZXIsIGl0IGlzIGJ1aWx0LCB0ZXN0ZWQsIGRvY3VtZW50ZWQsIGFuZCB3aGF0bm90IHVzaW5nIGEgbG90IG9mIHRoaXJkLXBhcnR5IHRvb2xzIGFuZCBzZXJ2aWNlcy4gVGhhbmtzIGEgbG90IQogCistIFsqKmFtYWxnYW1hdGUucHkgLSBBbWFsZ2FtYXRlIEMgc291cmNlIGFuZCBoZWFkZXIgZmlsZXMqKl0oaHR0cHM6Ly9naXRodWIuY29tL2VkbHVuZC9hbWFsZ2FtYXRlKSB0byBjcmVhdGUgYSBzaW5nbGUgaGVhZGVyIGZpbGUKIC0gWyoqQW1lcmljYW4gZnV6enkgbG9wKipdKGh0dHA6Ly9sY2FtdHVmLmNvcmVkdW1wLmN4L2FmbC8pIGZvciBmdXp6IHRlc3RpbmcKIC0gWyoqQXBwVmV5b3IqKl0oaHR0cHM6Ly93d3cuYXBwdmV5b3IuY29tKSBmb3IgW2NvbnRpbnVvdXMgaW50ZWdyYXRpb25dKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvbmxvaG1hbm4vanNvbikgb24gV2luZG93cwogLSBbKipBcnRpc3RpYyBTdHlsZSoqXShodHRwOi8vYXN0eWxlLnNvdXJjZWZvcmdlLm5ldCkgZm9yIGF1dG9tYXRpYyBzb3VyY2UgY29kZSBpZGVudGF0aW9uCi0tIFsqKmJlbmNocHJlc3MqKl0oaHR0cHM6Ly9naXRodWIuY29tL3Nicy1hYmxldG9uL2JlbmNocHJlc3MpIHRvIGJlbmNobWFyayB0aGUgY29kZQogLSBbKipDYXRjaCoqXShodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gpIGZvciB0aGUgdW5pdCB0ZXN0cwogLSBbKipDbGFuZyoqXShodHRwOi8vY2xhbmcubGx2bS5vcmcpIGZvciBjb21waWxhdGlvbiB3aXRoIGNvZGUgc2FuaXRpemVycwogLSBbKipDbWFrZSoqXShodHRwczovL2NtYWtlLm9yZykgZm9yIGJ1aWxkIGF1dG9tYXRpb24KQEAgLTkzNiwxNyArOTg4LDE3IEBACiAtIFsqKkNvdmVyYWxscyoqXShodHRwczovL2NvdmVyYWxscy5pbykgdG8gbWVhc3VyZSBbY29kZSBjb3ZlcmFnZV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vZ2l0aHViL25sb2htYW5uL2pzb24pCiAtIFsqKkNvdmVyaXR5IFNjYW4qKl0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbSkgZm9yIFtzdGF0aWMgYW5hbHlzaXNdKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvbmxvaG1hbm4tanNvbikKIC0gWyoqY3BwY2hlY2sqKl0oaHR0cDovL2NwcGNoZWNrLnNvdXJjZWZvcmdlLm5ldCkgZm9yIHN0YXRpYyBhbmFseXNpcwotLSBbKipjeHhvcHRzKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXJybzI3ODMvY3h4b3B0cykgdG8gbGV0IGJlbmNocHJlc3MgcGFyc2UgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMKIC0gWyoqRG94eWdlbioqXShodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vKSB0byBnZW5lcmF0ZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9ubG9obWFubi5naXRodWIuaW8vanNvbi8pCiAtIFsqKmdpdC11cGRhdGUtZ2hwYWdlcyoqXShodHRwczovL2dpdGh1Yi5jb20vcnN0YWNydXovZ2l0LXVwZGF0ZS1naHBhZ2VzKSB0byB1cGxvYWQgdGhlIGRvY3VtZW50YXRpb24gdG8gZ2gtcGFnZXMKLS0gWyoqR2l0aHViIENoYW5nZWxvZyBHZW5lcmF0b3IqKl0oaHR0cHM6Ly9naXRodWIuY29tL3NreXdpbmRlci9naXRodWItY2hhbmdlbG9nLWdlbmVyYXRvcikgdG8gZ2VuZXJhdGUgdGhlIFtDaGFuZ2VMb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9DaGFuZ2VMb2cubWQpCistIFsqKkdpdEh1YiBDaGFuZ2Vsb2cgR2VuZXJhdG9yKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9za3l3aW5kZXIvZ2l0aHViLWNoYW5nZWxvZy1nZW5lcmF0b3IpIHRvIGdlbmVyYXRlIHRoZSBbQ2hhbmdlTG9nXShodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9ibG9iL2RldmVsb3AvQ2hhbmdlTG9nLm1kKQorLSBbKipHb29nbGUgQmVuY2htYXJrKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrKSB0byBpbXBsZW1lbnQgdGhlIGJlbmNobWFya3MKIC0gWyoqbGliRnV6emVyKipdKGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sKSB0byBpbXBsZW1lbnQgZnV6eiB0ZXN0aW5nIGZvciBPU1MtRnV6egotLSBbKipPU1MtRnV6eioqXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6KSBmb3IgY29udGludW91cyBmdXp6IHRlc3Rpbmcgb2YgdGhlIGxpYnJhcnkKKy0gWyoqT1NTLUZ1enoqKl0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6eikgZm9yIGNvbnRpbnVvdXMgZnV6eiB0ZXN0aW5nIG9mIHRoZSBsaWJyYXJ5IChbcHJvamVjdCByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6L3RyZWUvbWFzdGVyL3Byb2plY3RzL2pzb24pKQogLSBbKipQcm9ib3QqKl0oaHR0cHM6Ly9wcm9ib3QuZ2l0aHViLmlvKSBmb3IgYXV0b21hdGluZyBtYWludGFpbmVyIHRhc2tzIHN1Y2ggYXMgY2xvc2luZyBzdGFsZSBpc3N1ZXMsIHJlcXVlc3RpbmcgbWlzc2luZyBpbmZvcm1hdGlvbiwgb3IgZGV0ZWN0aW5nIHRveGljIGNvbW1lbnRzLgogLSBbKipzZW5kX3RvX3dhbmRib3gqKl0oaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vYmxvYi9kZXZlbG9wL2RvYy9zY3JpcHRzL3NlbmRfdG9fd2FuZGJveC5weSkgdG8gc2VuZCBjb2RlIGV4YW1wbGVzIHRvIFtXYW5kYm94XShodHRwOi8vbWVscG9uLm9yZy93YW5kYm94KQogLSBbKipUcmF2aXMqKl0oaHR0cHM6Ly90cmF2aXMtY2kub3JnKSBmb3IgW2NvbnRpbnVvdXMgaW50ZWdyYXRpb25dKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9ubG9obWFubi9qc29uKSBvbiBMaW51eCBhbmQgbWFjT1MKIC0gWyoqVmFsZ3JpbmQqKl0oaHR0cDovL3ZhbGdyaW5kLm9yZykgdG8gY2hlY2sgZm9yIGNvcnJlY3QgbWVtb3J5IG1hbmFnZW1lbnQKLS0gWyoqV2FuZGJveCoqXShodHRwOi8vbWVscG9uLm9yZy93YW5kYm94KSBmb3IgW29ubGluZSBleGFtcGxlc10oaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9PcDU3WDBWN2ZUZjJ0ZHdsKQorLSBbKipXYW5kYm94KipdKGh0dHA6Ly9tZWxwb24ub3JnL3dhbmRib3gpIGZvciBbb25saW5lIGV4YW1wbGVzXShodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1ZIcGJhWkJPbnJaY2JuN2opCiAKIAogIyMgUHJvamVjdHMgdXNpbmcgSlNPTiBmb3IgTW9kZXJuIEMrKwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9DTWFrZUxpc3RzLnR4dCBiL2JlbmNobWFya3MvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwZDQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNiBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMCkKK3Byb2plY3QoSlNPTl9CZW5jaG1hcmtzIExBTkdVQUdFUyBDWFgpCisKKyMgc2V0IGNvbXBpbGVyIGZsYWdzCitpZigoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgR05VKSBPUiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgQ2xhbmcpKQorICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEgLWZsdG8gLUROREVCVUcgLU8zIikKK2VuZGlmKCkKKworIyBjb25maWd1cmUgR29vZ2xlIEJlbmNobWFya3MKK3NldChCRU5DSE1BUktfRU5BQkxFX1RFU1RJTkcgT0ZGIENBQ0hFIElOVEVSTkFMICIiIEZPUkNFKQorYWRkX3N1YmRpcmVjdG9yeSh0aGlyZHBhcnR5L2JlbmNobWFyaykKKworIyBoZWFkZXIgZGlyZWN0b3JpZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXModGhpcmRwYXJ0eSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi9zaW5nbGVfaW5jbHVkZSkKKworIyBjb3B5IHRlc3QgZmlsZXMgdG8gYnVpbGQgZm9sZGVyCitmaWxlKENPUFkgJHtDTUFLRV9TT1VSQ0VfRElSfS9kYXRhIERFU1RJTkFUSU9OIC4pCitmaWxlKENPUFkgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2RhdGEvcmVncmVzc2lvbi9mbG9hdHMuanNvbgorICAgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vLi4vdGVzdC9kYXRhL3JlZ3Jlc3Npb24vdW5zaWduZWRfaW50cy5qc29uCisgICAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS8uLi90ZXN0L2RhdGEvcmVncmVzc2lvbi9zaWduZWRfaW50cy5qc29uCisgICAgREVTVElOQVRJT04gZGF0YS9udW1iZXJzKQorCisjIGJlbmNobWFyayBiaW5hcnkKK2FkZF9leGVjdXRhYmxlKGpzb25fYmVuY2htYXJrcyBzcmMvYmVuY2htYXJrcy5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoanNvbl9iZW5jaG1hcmtzIGJlbmNobWFyayAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9NYWtlZmlsZSBiL2JlbmNobWFya3MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmRlOGEuLjAwMDAwMDAKLS0tIGEvYmVuY2htYXJrcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQotIwotIyBCdWlsZC9ydW4ganNvbi5ocHAgYmVuY2htYXJrcywgZWcuIENYWD1nKystNyBtYWtlCi0jIAotIyBUaGUgZXhpc3RpbmcganNvbl9iZW5jaG1hcmtzIGRpZCBub3QgYWxsb3cgb3B0aW1pemF0aW9uIHVuZGVyIHNvbWUgY29tcGlsZXJzCi0jIAotYWxsOiBqc29uX2JlbmNobWFya3MganNvbl9iZW5jaG1hcmtzX3NpbXBsZSBudW1iZXJfanNvbnMKLQliYXNoIC1jICd0aW1lIC4vanNvbl9iZW5jaG1hcmtzJwotCWJhc2ggLWMgJ3RpbWUgLi9qc29uX2JlbmNobWFya3Nfc2ltcGxlJwotCi1qc29uX2JlbmNobWFya3M6IHNyYy9iZW5jaG1hcmtzLmNwcCAuLi9zcmMvanNvbi5ocHAKLQkkKENYWCkgLXN0ZD1jKysxMSAtcHRocmVhZCAkKENYWEZMQUdTKSAtRE5ERUJVRyAtTzMgLWZsdG8gLUkgdGhpcmRwYXJ0eS9iZW5jaHByZXNzIC1JIHRoaXJkcGFydHkvY3h4b3B0cyAtSS4uL3NyYyBzcmMvYmVuY2htYXJrcy5jcHAgJChMREZMQUdTKSAtbyAkQAotCi1qc29uX2JlbmNobWFya3Nfc2ltcGxlOiBzcmMvYmVuY2htYXJrc19zaW1wbGUuY3BwIC4uL3NyYy9qc29uLmhwcAotCSQoQ1hYKSAtc3RkPWMrKzExICQoQ1hYRkxBR1MpIC1ETkRFQlVHIC1PMyAtZmx0byAtSS4uL3NyYyAkKDwpICQoTERGTEFHUykgLW8gJEAKLQotbnVtYmVyX2pzb25zOgotCSh0ZXN0IC1lIGZpbGVzL251bWJlcnMvZmxvYXRzLmpzb24gLWEgLWUgZmlsZXMvbnVtYmVycy9zaWduZWRfaW50cy5qc29uIC1hIC1lIGZpbGVzL251bWJlcnMvdW5zaWduZWRfaW50cy5qc29uKSB8fCAoY2QgZmlsZXMvbnVtYmVycyA7IHB5dGhvbiBnZW5lcmF0ZS5weSkKLQotY2xlYW46Ci0Jcm0gLWYganNvbl9iZW5jaG1hcmtzIGpzb25fYmVuY2htYXJrc19zaW1wbGUgZmlsZXMvbnVtYmVycy8qLmpzb24KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvUkVBRE1FLm1kIGIvYmVuY2htYXJrcy9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzU4MmIuLjAwMDAwMDAKLS0tIGEvYmVuY2htYXJrcy9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgQmVjaG1hcmtzCi0KLVJ1biBgbWFrZWAgdG8gY29tcGlsZSBhbmQgcnVuIGEgc21hbGwgc2V0IG9mIGJlbmNobWFya3MuCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL2ZpbGVzL2plb3BhcmR5L2plb3BhcmR5Lmpzb24gYi9iZW5jaG1hcmtzL2RhdGEvamVvcGFyZHkvamVvcGFyZHkuanNvbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYmVuY2htYXJrcy9maWxlcy9qZW9wYXJkeS9qZW9wYXJkeS5qc29uCnJlbmFtZSB0byBiZW5jaG1hcmtzL2RhdGEvamVvcGFyZHkvamVvcGFyZHkuanNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL2ZpbGVzL25hdGl2ZWpzb24tYmVuY2htYXJrL2NhbmFkYS5qc29uIGIvYmVuY2htYXJrcy9kYXRhL25hdGl2ZWpzb24tYmVuY2htYXJrL2NhbmFkYS5qc29uCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBiZW5jaG1hcmtzL2ZpbGVzL25hdGl2ZWpzb24tYmVuY2htYXJrL2NhbmFkYS5qc29uCnJlbmFtZSB0byBiZW5jaG1hcmtzL2RhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2FuYWRhLmpzb24KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvZmlsZXMvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2l0bV9jYXRhbG9nLmpzb24gYi9iZW5jaG1hcmtzL2RhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2l0bV9jYXRhbG9nLmpzb24Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJlbmNobWFya3MvZmlsZXMvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2l0bV9jYXRhbG9nLmpzb24KcmVuYW1lIHRvIGJlbmNobWFya3MvZGF0YS9uYXRpdmVqc29uLWJlbmNobWFyay9jaXRtX2NhdGFsb2cuanNvbgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9maWxlcy9uYXRpdmVqc29uLWJlbmNobWFyay90d2l0dGVyLmpzb24gYi9iZW5jaG1hcmtzL2RhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvdHdpdHRlci5qc29uCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBiZW5jaG1hcmtzL2ZpbGVzL25hdGl2ZWpzb24tYmVuY2htYXJrL3R3aXR0ZXIuanNvbgpyZW5hbWUgdG8gYmVuY2htYXJrcy9kYXRhL25hdGl2ZWpzb24tYmVuY2htYXJrL3R3aXR0ZXIuanNvbgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy9maWxlcy9udW1iZXJzL2dlbmVyYXRlLnB5IGIvYmVuY2htYXJrcy9maWxlcy9udW1iZXJzL2dlbmVyYXRlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTRlZTNhLi4wMDAwMDAwCi0tLSBhL2JlbmNobWFya3MvZmlsZXMvbnVtYmVycy9nZW5lcmF0ZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi1pbXBvcnQganNvbgotaW1wb3J0IHJhbmRvbQotaW1wb3J0IHN5cwotCi1yYW5kb20uc2VlZCgwKQotCi0jIGZsb2F0cwotcmVzdWx0X2Zsb2F0cyA9IFtdCi1mb3IgeCBpbiByYW5nZSgwLCAxMDAwMDAwKToKLQlyZXN1bHRfZmxvYXRzLmFwcGVuZChyYW5kb20udW5pZm9ybSgtMTAwMDAwMDAwLjAsIDEwMDAwMDAwMC4wKSkKLWpzb24uZHVtcChyZXN1bHRfZmxvYXRzLCBvcGVuKCJmbG9hdHMuanNvbiIsICJ3IiksIGluZGVudD0yKQotCi0jIHVuc2lnbmVkIGludGVnZXJzCi1yZXN1bHRfdWludHMgPSBbXQotZm9yIHggaW4gcmFuZ2UoMCwgMTAwMDAwMCk6Ci0JcmVzdWx0X3VpbnRzLmFwcGVuZChyYW5kb20ucmFuZGludCgwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCi1qc29uLmR1bXAocmVzdWx0X3VpbnRzLCBvcGVuKCJ1bnNpZ25lZF9pbnRzLmpzb24iLCAidyIpLCBpbmRlbnQ9MikKLQotIyBzaWduZWQgaW50ZWdlcnMKLXJlc3VsdF9zaW50cyA9IFtdCi1mb3IgeCBpbiByYW5nZSgwLCAxMDAwMDAwKToKLQlyZXN1bHRfc2ludHMuYXBwZW5kKHJhbmRvbS5yYW5kaW50KC05MjIzMzcyMDM2ODU0Nzc1ODA4LCA5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKLWpzb24uZHVtcChyZXN1bHRfc2ludHMsIG9wZW4oInNpZ25lZF9pbnRzLmpzb24iLCAidyIpLCBpbmRlbnQ9MikKZGlmZiAtLWdpdCBhL2JlbmNobWFya3Mvc3JjL2JlbmNobWFya3MuY3BwIGIvYmVuY2htYXJrcy9zcmMvYmVuY2htYXJrcy5jcHAKaW5kZXggYTc2YzM3OC4uYmViZWY2MCAxMDA2NDQKLS0tIGEvYmVuY2htYXJrcy9zcmMvYmVuY2htYXJrcy5jcHAKKysrIGIvYmVuY2htYXJrcy9zcmMvYmVuY2htYXJrcy5jcHAKQEAgLTEsMTMyICsxLDEwNiBAQAotI2RlZmluZSBCRU5DSFBSRVNTX0NPTkZJR19NQUlOCi0KKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGJlbmNocHJlc3MuaHBwPgotI2luY2x1ZGUgPGpzb24uaHBwPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDx0aHJlYWQ+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIAotc3RydWN0IFN0YXJ0VXAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gcGFyc2UgSlNPTiBmcm9tIGZpbGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBQYXJzZUZpbGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQogewotICAgIFN0YXJ0VXAoKQorICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKQogICAgIHsKLSNpZm5kZWYgX19sbHZtX18KLSAgICAgICAgLy8gcGluIHRocmVhZCB0byBhIHNpbmdsZSBDUFUKLSAgICAgICAgY3B1X3NldF90IGNwdXNldDsKLSAgICAgICAgcHRocmVhZF90IHRocmVhZDsKLSAgICAgICAgdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0gICAgICAgIENQVV9aRVJPKCZjcHVzZXQpOwotICAgICAgICBDUFVfU0VUKHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpIC0gMSwgJmNwdXNldCk7Ci0gICAgICAgIHB0aHJlYWRfc2V0YWZmaW5pdHlfbnAodGhyZWFkLCBzaXplb2YoY3B1X3NldF90KSwgJmNwdXNldCk7Ci0jZW5kaWYKKyAgICAgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICAgICAgYXV0byogZiA9IG5ldyBzdGQ6Omlmc3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgYXV0byogaiA9IG5ldyBqc29uKCk7CisgICAgICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworCisgICAgICAgICpqID0ganNvbjo6cGFyc2UoKmYpOworCisgICAgICAgIHN0YXRlLlBhdXNlVGltaW5nKCk7CisgICAgICAgIGRlbGV0ZSBmOworICAgICAgICBkZWxldGUgajsKKyAgICAgICAgc3RhdGUuUmVzdW1lVGltaW5nKCk7CiAgICAgfQotfTsKLVN0YXJ0VXAgc3RhcnR1cDsKIAotZW51bSBjbGFzcyBFTW9kZSB7IGlucHV0LCBvdXRwdXRfbm9faW5kZW50LCBvdXRwdXRfd2l0aF9pbmRlbnQgfTsKLQotc3RhdGljIHZvaWQgYmVuY2goYmVuY2hwcmVzczo6Y29udGV4dCYgY3R4LAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX3BhdGgsCi0gICAgICAgICAgICAgICAgICBjb25zdCBFTW9kZSBtb2RlKQotewotICAgIC8vIHVzaW5nIHN0cmluZyBzdHJlYW1zIGZvciBiZW5jaG1hcmtpbmcgdG8gZmFjdG9yLW91dCBjb2xkLWNhY2hlIGRpc2sKLSAgICAvLyBhY2Nlc3MuCi0jaWYgZGVmaW5lZCggRlJPTUZJTEUgKQotICAgIHN0ZDo6aWZzdHJlYW0gaXN0cjsKLSAgICB7Ci0gICAgICAgIGlzdHIub3BlbiggaW5fcGF0aCwgc3RkOjppZnN0cmVhbTo6aW4gKTsKLQotICAgICAgICAvLyByZWFkIHRoZSBzdHJlYW0gb25jZQotICAgICAgICBqc29uIGo7Ci0gICAgICAgIGlzdHIgPj4gajsKLSAgICAgICAgLy8gY2xlYXIgZmxhZ3MgYW5kIHJld2luZAotICAgICAgICBpc3RyLmNsZWFyKCk7Ci0gICAgICAgIGlzdHIuc2Vla2coMCk7Ci0gICAgfQotI2Vsc2UKLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpc3RyOwotICAgIHsKLSAgICAgICAgLy8gcmVhZCBmaWxlIGludG8gc3RyaW5nIHN0cmVhbQotICAgICAgICBzdGQ6Omlmc3RyZWFtIGlucHV0X2ZpbGUoaW5fcGF0aCk7Ci0gICAgICAgIGlzdHIgPDwgaW5wdXRfZmlsZS5yZGJ1ZigpOwotICAgICAgICBpbnB1dF9maWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gcmVhZCB0aGUgc3RyZWFtIG9uY2UKLSAgICAgICAganNvbiBqOwotICAgICAgICBpc3RyID4+IGo7Ci0gICAgICAgIC8vIGNsZWFyIGZsYWdzIGFuZCByZXdpbmQKLSAgICAgICAgaXN0ci5jbGVhcigpOwotICAgICAgICBpc3RyLnNlZWtnKDApOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICAgICAgLy8gYmVuY2htYXJraW5nIGlucHV0Ci0gICAgICAgIGNhc2UgRU1vZGU6OmlucHV0OgotICAgICAgICB7Ci0gICAgICAgICAgICBjdHgucmVzZXRfdGltZXIoKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjdHgubnVtX2l0ZXJhdGlvbnMoKTsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGZsYWdzIGFuZCByZXdpbmQKLSAgICAgICAgICAgICAgICBpc3RyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaXN0ci5zZWVrZygwKTsKLSAgICAgICAgICAgICAgICBqc29uIGo7Ci0gICAgICAgICAgICAgICAgaXN0ciA+PiBqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJlbmNobWFya2luZyBvdXRwdXQKLSAgICAgICAgY2FzZSBFTW9kZTo6b3V0cHV0X25vX2luZGVudDoKLSAgICAgICAgY2FzZSBFTW9kZTo6b3V0cHV0X3dpdGhfaW5kZW50OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSBmcm9tIGlucHV0Ci0gICAgICAgICAgICBqc29uIGo7Ci0gICAgICAgICAgICBpc3RyID4+IGo7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvc3RyOwotCi0gICAgICAgICAgICBjdHgucmVzZXRfdGltZXIoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3R4Lm51bV9pdGVyYXRpb25zKCk7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBFTW9kZTo6b3V0cHV0X25vX2luZGVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9zdHIgPDwgajsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3N0ciA8PCBzdGQ6OnNldHcoNCkgPDwgajsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZXNldCBkYXRhCi0gICAgICAgICAgICAgICAgb3N0ci5zdHIoc3RkOjpzdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQorICAgIHN0ZDo6aWZzdHJlYW0gZmlsZShmaWxlbmFtZSwgc3RkOjppb3M6OmJpbmFyeSB8IHN0ZDo6aW9zOjphdGUpOworICAgIHN0YXRlLlNldEJ5dGVzUHJvY2Vzc2VkKHN0YXRlLml0ZXJhdGlvbnMoKSAqIGZpbGUudGVsbGcoKSk7CiB9CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZUZpbGUsIGplb3BhcmR5LCAgICAgICJkYXRhL2plb3BhcmR5L2plb3BhcmR5Lmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlRmlsZSwgY2FuYWRhLCAgICAgICAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2FuYWRhLmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlRmlsZSwgY2l0bV9jYXRhbG9nLCAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2l0bV9jYXRhbG9nLmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlRmlsZSwgdHdpdHRlciwgICAgICAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvdHdpdHRlci5qc29uIik7CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZUZpbGUsIGZsb2F0cywgICAgICAgICJkYXRhL251bWJlcnMvZmxvYXRzLmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlRmlsZSwgc2lnbmVkX2ludHMsICAgImRhdGEvbnVtYmVycy9zaWduZWRfaW50cy5qc29uIik7CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZUZpbGUsIHVuc2lnbmVkX2ludHMsICJkYXRhL251bWJlcnMvdW5zaWduZWRfaW50cy5qc29uIik7CiAKLSNkZWZpbmUgQkVOQ0hNQVJLX0kobW9kZSwgdGl0bGUsIGluX3BhdGgpICAgICAgICAgICBcCi0gICAgQkVOQ0hNQVJLKCh0aXRsZSksIFtdKGJlbmNocHJlc3M6OmNvbnRleHQqIGN0eCkgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYmVuY2goKmN0eCwgKGluX3BhdGgpLCAobW9kZSkpOyAgICAgICAgICAgICBcCi0gICAgfSkKIAotQkVOQ0hNQVJLX0koRU1vZGU6OmlucHV0LCAicGFyc2UgamVvcGFyZHkuanNvbiIsICAgICAgICAgICAgICAiZmlsZXMvamVvcGFyZHkvamVvcGFyZHkuanNvbiIpOwotQkVOQ0hNQVJLX0koRU1vZGU6OmlucHV0LCAicGFyc2UgY2FuYWRhLmpzb24iLCAgICAgICAgICAgICAgICAiZmlsZXMvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2FuYWRhLmpzb24iKTsKLUJFTkNITUFSS19JKEVNb2RlOjppbnB1dCwgInBhcnNlIGNpdG1fY2F0YWxvZy5qc29uIiwgICAgICAgICAgImZpbGVzL25hdGl2ZWpzb24tYmVuY2htYXJrL2NpdG1fY2F0YWxvZy5qc29uIik7Ci1CRU5DSE1BUktfSShFTW9kZTo6aW5wdXQsICJwYXJzZSB0d2l0dGVyLmpzb24iLCAgICAgICAgICAgICAgICJmaWxlcy9uYXRpdmVqc29uLWJlbmNobWFyay90d2l0dGVyLmpzb24iKTsKLUJFTkNITUFSS19JKEVNb2RlOjppbnB1dCwgInBhcnNlIG51bWJlcnMvZmxvYXRzLmpzb24iLCAgICAgICAgImZpbGVzL251bWJlcnMvZmxvYXRzLmpzb24iKTsKLUJFTkNITUFSS19JKEVNb2RlOjppbnB1dCwgInBhcnNlIG51bWJlcnMvc2lnbmVkX2ludHMuanNvbiIsICAgImZpbGVzL251bWJlcnMvc2lnbmVkX2ludHMuanNvbiIpOwotQkVOQ0hNQVJLX0koRU1vZGU6OmlucHV0LCAicGFyc2UgbnVtYmVycy91bnNpZ25lZF9pbnRzLmpzb24iLCAiZmlsZXMvbnVtYmVycy91bnNpZ25lZF9pbnRzLmpzb24iKTsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gcGFyc2UgSlNPTiBmcm9tIHN0cmluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUJFTkNITUFSS19JKEVNb2RlOjpvdXRwdXRfbm9faW5kZW50LCAgICJkdW1wIGplb3BhcmR5Lmpzb24iLCAgICAgICAgICAgICAiZmlsZXMvamVvcGFyZHkvamVvcGFyZHkuanNvbiIpOwotQkVOQ0hNQVJLX0koRU1vZGU6Om91dHB1dF93aXRoX2luZGVudCwgImR1bXAgamVvcGFyZHkuanNvbiB3aXRoIGluZGVudCIsICJmaWxlcy9qZW9wYXJkeS9qZW9wYXJkeS5qc29uIik7Ci1CRU5DSE1BUktfSShFTW9kZTo6b3V0cHV0X25vX2luZGVudCwgICAiZHVtcCBudW1iZXJzL2Zsb2F0cy5qc29uIiwgICAgICAgImZpbGVzL251bWJlcnMvZmxvYXRzLmpzb24iKTsKLUJFTkNITUFSS19JKEVNb2RlOjpvdXRwdXRfbm9faW5kZW50LCAgICJkdW1wIG51bWJlcnMvc2lnbmVkX2ludHMuanNvbiIsICAiZmlsZXMvbnVtYmVycy9zaWduZWRfaW50cy5qc29uIik7CitzdGF0aWMgdm9pZCBQYXJzZVN0cmluZyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisgICAgc3RkOjppZnN0cmVhbSBmKGZpbGVuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBzdHIoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmKSksIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKKworICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKQorICAgIHsKKyAgICAgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICAgICAgYXV0byogaiA9IG5ldyBqc29uKCk7CisgICAgICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworCisgICAgICAgICpqID0ganNvbjo6cGFyc2Uoc3RyKTsKKworICAgICAgICBzdGF0ZS5QYXVzZVRpbWluZygpOworICAgICAgICBkZWxldGUgajsKKyAgICAgICAgc3RhdGUuUmVzdW1lVGltaW5nKCk7CisgICAgfQorCisgICAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoc3RhdGUuaXRlcmF0aW9ucygpICogc3RyLnNpemUoKSk7Cit9CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZVN0cmluZywgamVvcGFyZHksICAgICAgImRhdGEvamVvcGFyZHkvamVvcGFyZHkuanNvbiIpOworQkVOQ0hNQVJLX0NBUFRVUkUoUGFyc2VTdHJpbmcsIGNhbmFkYSwgICAgICAgICJkYXRhL25hdGl2ZWpzb24tYmVuY2htYXJrL2NhbmFkYS5qc29uIik7CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZVN0cmluZywgY2l0bV9jYXRhbG9nLCAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2l0bV9jYXRhbG9nLmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlU3RyaW5nLCB0d2l0dGVyLCAgICAgICAiZGF0YS9uYXRpdmVqc29uLWJlbmNobWFyay90d2l0dGVyLmpzb24iKTsKK0JFTkNITUFSS19DQVBUVVJFKFBhcnNlU3RyaW5nLCBmbG9hdHMsICAgICAgICAiZGF0YS9udW1iZXJzL2Zsb2F0cy5qc29uIik7CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZVN0cmluZywgc2lnbmVkX2ludHMsICAgImRhdGEvbnVtYmVycy9zaWduZWRfaW50cy5qc29uIik7CitCRU5DSE1BUktfQ0FQVFVSRShQYXJzZVN0cmluZywgdW5zaWduZWRfaW50cywgImRhdGEvbnVtYmVycy91bnNpZ25lZF9pbnRzLmpzb24iKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlcmlhbGl6ZSBKU09OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgRHVtcChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBpbmRlbnQpCit7CisgICAgc3RkOjppZnN0cmVhbSBmKGZpbGVuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBzdHIoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmKSksIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKKyAgICBqc29uIGogPSBqc29uOjpwYXJzZShzdHIpOworCisgICAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpCisgICAgeworICAgICAgICBqLmR1bXAoaW5kZW50KTsKKyAgICB9CisKKyAgICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChzdGF0ZS5pdGVyYXRpb25zKCkgKiBqLmR1bXAoaW5kZW50KS5zaXplKCkpOworfQorQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgamVvcGFyZHkgLyAtLCAgICAgICJkYXRhL2plb3BhcmR5L2plb3BhcmR5Lmpzb24iLCAgICAgICAgICAgICAgICAgLTEpOworQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgamVvcGFyZHkgLyA0LCAgICAgICJkYXRhL2plb3BhcmR5L2plb3BhcmR5Lmpzb24iLCAgICAgICAgICAgICAgICAgNCk7CitCRU5DSE1BUktfQ0FQVFVSRShEdW1wLCBjYW5hZGEgLyAtLCAgICAgICAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2FuYWRhLmpzb24iLCAgICAgICAtMSk7CitCRU5DSE1BUktfQ0FQVFVSRShEdW1wLCBjYW5hZGEgLyA0LCAgICAgICAgImRhdGEvbmF0aXZlanNvbi1iZW5jaG1hcmsvY2FuYWRhLmpzb24iLCAgICAgICA0KTsKK0JFTkNITUFSS19DQVBUVVJFKER1bXAsIGNpdG1fY2F0YWxvZyAvIC0sICAiZGF0YS9uYXRpdmVqc29uLWJlbmNobWFyay9jaXRtX2NhdGFsb2cuanNvbiIsIC0xKTsKK0JFTkNITUFSS19DQVBUVVJFKER1bXAsIGNpdG1fY2F0YWxvZyAvIDQsICAiZGF0YS9uYXRpdmVqc29uLWJlbmNobWFyay9jaXRtX2NhdGFsb2cuanNvbiIsIDQpOworQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgdHdpdHRlciAvIC0sICAgICAgICJkYXRhL25hdGl2ZWpzb24tYmVuY2htYXJrL3R3aXR0ZXIuanNvbiIsICAgICAgLTEpOworQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgdHdpdHRlciAvIDQsICAgICAgICJkYXRhL25hdGl2ZWpzb24tYmVuY2htYXJrL3R3aXR0ZXIuanNvbiIsICAgICAgNCk7CitCRU5DSE1BUktfQ0FQVFVSRShEdW1wLCBmbG9hdHMgLyAtLCAgICAgICAgImRhdGEvbnVtYmVycy9mbG9hdHMuanNvbiIsICAgICAgICAgICAgICAgICAgICAtMSk7CitCRU5DSE1BUktfQ0FQVFVSRShEdW1wLCBmbG9hdHMgLyA0LCAgICAgICAgImRhdGEvbnVtYmVycy9mbG9hdHMuanNvbiIsICAgICAgICAgICAgICAgICAgICA0KTsKK0JFTkNITUFSS19DQVBUVVJFKER1bXAsIHNpZ25lZF9pbnRzIC8gLSwgICAiZGF0YS9udW1iZXJzL3NpZ25lZF9pbnRzLmpzb24iLCAgICAgICAgICAgICAgIC0xKTsKK0JFTkNITUFSS19DQVBUVVJFKER1bXAsIHNpZ25lZF9pbnRzIC8gNCwgICAiZGF0YS9udW1iZXJzL3NpZ25lZF9pbnRzLmpzb24iLCAgICAgICAgICAgICAgIDQpOworQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgdW5zaWduZWRfaW50cyAvIC0sICJkYXRhL251bWJlcnMvdW5zaWduZWRfaW50cy5qc29uIiwgICAgICAgICAgICAgLTEpOworQkVOQ0hNQVJLX0NBUFRVUkUoRHVtcCwgdW5zaWduZWRfaW50cyAvIDQsICJkYXRhL251bWJlcnMvdW5zaWduZWRfaW50cy5qc29uIiwgICAgICAgICAgICAgNCk7CisKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3Mvc3JjL2JlbmNobWFya3Nfc2ltcGxlLmNwcCBiL2JlbmNobWFya3Mvc3JjL2JlbmNobWFya3Nfc2ltcGxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhZDY4MC4uMDAwMDAwMAotLS0gYS9iZW5jaG1hcmtzL3NyYy9iZW5jaG1hcmtzX3NpbXBsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8gCi0vLyBiZW5jaG1hcmtzX3NpbXBsZS5jcHAgLS0gYSBsZXNzIGNvbXBsZXggdmVyc2lvbiBvZiBiZW5jaG1hcmtzLmNwcCwgdGhhdCBiZXR0ZXIgcmVmbGVjdHMgYWN0dWFsIHBlcmZvcm1hbmNlCi0vLyAKLS8vICAgICBGb3Igc29tZSByZWFzb24sIHRoZSBjb21wbGV4aXR5IG9mIGJlbmNobWFya3MuY3BwIGRvZXNuJ3QgYWxsb3cKLS8vIHRoZSBjb21waWxlciB0byBvcHRpbWl6ZSBjb2RlIHVzaW5nIGpzb24uaHBwIGVmZmVjdGl2ZWx5LiAgVGhlCi0vLyBleGFjdCBzYW1lIHRlc3RzLCB3aXRoIHRoZSB1c2Ugb2YgYmVuY2hwcmVzcyBhbmQgY3h4b3B0cyBwcm9kdWNlcwotLy8gbXVjaCBmYXN0ZXIgY29kZSwgYXQgbGVhc3QgdW5kZXIgZysrLgotLy8gCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDx0dXBsZT4KLQotI2luY2x1ZGUgPGpzb24uaHBwPgotCi11c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247Ci0KLWVudW0gY2xhc3MgRU1vZGUgeyBpbnB1dCwgb3V0cHV0LCBpbmRlbnQgfTsKLQotc3RhdGljIGRvdWJsZSBiZW5jaChjb25zdCBFTW9kZSBtb2RlLCBzaXplX3QgaXRlcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9wYXRoICkKLXsKLSAgICAvLyB1c2luZyBzdHJpbmcgc3RyZWFtcyBmb3IgYmVuY2htYXJraW5nIHRvIGZhY3Rvci1vdXQgY29sZC1jYWNoZSBkaXNrCi0gICAgLy8gYWNjZXNzLiAgRGVmaW5lIEZST01GSUxFIHRvIHVzZSBmaWxlIEkvTyBpbnN0ZWFkLgotI2lmIGRlZmluZWQoIEZST01GSUxFICkKLSAgICBzdGQ6Omlmc3RyZWFtIGlzdHI7Ci0gICAgewotICAgICAgICBpc3RyLm9wZW4oIGluX3BhdGgsIHN0ZDo6aWZzdHJlYW06OmluICk7Ci0KLSAgICAgICAgLy8gcmVhZCB0aGUgc3RyZWFtIG9uY2UKLSAgICAgICAganNvbiBqOwotICAgICAgICBpc3RyID4+IGo7Ci0gICAgICAgIC8vIGNsZWFyIGZsYWdzIGFuZCByZXdpbmQKLSAgICAgICAgaXN0ci5jbGVhcigpOwotICAgICAgICBpc3RyLnNlZWtnKDApOwotICAgIH0KLSNlbHNlCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gaXN0cjsKLSAgICB7Ci0gICAgICAgIC8vIHJlYWQgZmlsZSBpbnRvIHN0cmluZyBzdHJlYW0KLSAgICAgICAgc3RkOjppZnN0cmVhbSBpbnB1dF9maWxlKGluX3BhdGgpOwotICAgICAgICBpc3RyIDw8IGlucHV0X2ZpbGUucmRidWYoKTsKLSAgICAgICAgaW5wdXRfZmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vIHJlYWQgdGhlIHN0cmVhbSBvbmNlCi0gICAgICAgIGpzb24gajsKLSAgICAgICAgaXN0ciA+PiBqOwotICAgICAgICAvLyBjbGVhciBmbGFncyBhbmQgcmV3aW5kCi0gICAgICAgIGlzdHIuY2xlYXIoKTsKLSAgICAgICAgaXN0ci5zZWVrZygwKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBkb3VibGUgdHBzID0gMDsKLSAgICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgICAgICAvLyBiZW5jaG1hcmtpbmcgaW5wdXQKLSAgICAgICAgY2FzZSBFTW9kZTo6aW5wdXQ6Ci0gICAgICAgIHsKLQkgICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVyczsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGZsYWdzIGFuZCByZXdpbmQKLSAgICAgICAgICAgICAgICBpc3RyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaXN0ci5zZWVrZygwKTsKLSAgICAgICAgICAgICAgICBqc29uIGo7Ci0gICAgICAgICAgICAgICAgaXN0ciA+PiBqOwotICAgICAgICAgICAgfQotCSAgICBhdXRvIGVuZGVkID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7Ci0JICAgIHRwcyA9IDEuMCAvIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+KCBlbmRlZCAtIHN0YXJ0ICkuY291bnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYmVuY2htYXJraW5nIG91dHB1dAotICAgICAgICBjYXNlIEVNb2RlOjpvdXRwdXQ6Ci0gICAgICAgIGNhc2UgRU1vZGU6OmluZGVudDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgZnJvbSBpbnB1dAotICAgICAgICAgICAganNvbiBqOwotICAgICAgICAgICAgaXN0ciA+PiBqOwotICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gb3N0cjsKLQotCSAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZXJzOyArK2kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gRU1vZGU6OmluZGVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9zdHIgPDwgajsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3N0ciA8PCBzdGQ6OnNldHcoNCkgPDwgajsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZXNldCBkYXRhCi0gICAgICAgICAgICAgICAgb3N0ci5zdHIoc3RkOjpzdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0JICAgIGF1dG8gZW5kZWQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKLQkgICAgdHBzID0gMS4wIC8gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4oIGVuZGVkIC0gc3RhcnQgKS5jb3VudCgpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHBzOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cnVjdCBhdmVyYWdlIHsKLSAgICBUIF9zdW0geyAwIH07Ci0gICAgc2l6ZV90IF9jb3VudCB7IDAgfTsKLSAgICBUIG9wZXJhdG9yKz0oIGNvbnN0IFQgJnZhbF8gKSB7IF9zdW0gKz0gdmFsXzsgK19jb3VudCsrOyByZXR1cm4gdmFsXzsgfQotICAgIG9wZXJhdG9yIFQoKSB7IHJldHVybiBfc3VtIC8gX2NvdW50OyB9Ci19OwotCi0vLyBFeGVjdXRlIGVhY2ggdGVzdCBhcHByb3hpbWF0ZWx5IGVub3VnaCB0aW1lcyB0byBnZXQgbmVhciAxCi0vLyB0cmFuc2FjdGlvbiBwZXIgc2Vjb25kLCBhbmQgY29tcHV0ZSB0aGUgYXZlcmFnZTsgYSBzaW5nbGUgYWdncmVnYXRlCi0vLyBudW1iZXIgdGhhdCBnaXZlcyBhIHBlcmZvcm1hbmNlIG1ldHJpYyByZXByZXNlbnRpbmcgYm90aCBwYXJzaW5nCi0vLyBhbmQgb3V0cHV0LgotCi1pbnQgbWFpbiggaW50LCBjaGFyICoqICkKLXsKLSAgICBzdGQ6Omxpc3Q8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgRU1vZGUsIHNpemVfdCwgc3RkOjpzdHJpbmc+PiB0ZXN0cyB7Ci0JeyAicGFyc2UgamVvcGFyZHkuanNvbiIsCUVNb2RlOjppbnB1dCwgICAyLCAiZmlsZXMvamVvcGFyZHkvamVvcGFyZHkuanNvbiIgfSwKLQl7ICJwYXJzZSBjYW5hZGEuanNvbiIsCQlFTW9kZTo6aW5wdXQsICAzMCwgImZpbGVzL25hdGl2ZWpzb24tYmVuY2htYXJrL2NhbmFkYS5qc29uIiB9LAotCXsgInBhcnNlIGNpdG1fY2F0YWxvZy5qc29uIiwJRU1vZGU6OmlucHV0LCAxMjAsICJmaWxlcy9uYXRpdmVqc29uLWJlbmNobWFyay9jaXRtX2NhdGFsb2cuanNvbiIgfSwKLQl7ICJwYXJzZSB0d2l0dGVyLmpzb24iLAkJRU1vZGU6OmlucHV0LCAyMjUsICJmaWxlcy9uYXRpdmVqc29uLWJlbmNobWFyay90d2l0dGVyLmpzb24iIH0sCi0JeyAicGFyc2UgZmxvYXRzLmpzb24iLAkJRU1vZGU6OmlucHV0LCAgIDUsICJmaWxlcy9udW1iZXJzL2Zsb2F0cy5qc29uIiB9LAotCXsgInBhcnNlIHNpZ25lZF9pbnRzLmpzb24iLAlFTW9kZTo6aW5wdXQsICAgNiwgImZpbGVzL251bWJlcnMvc2lnbmVkX2ludHMuanNvbiIgfSwKLQl7ICJwYXJzZSB1bnNpZ25lZF9pbnRzLmpzb24iLAlFTW9kZTo6aW5wdXQsICAgNiwgImZpbGVzL251bWJlcnMvdW5zaWduZWRfaW50cy5qc29uIiB9LAotCXsgImR1bXAgamVvcGFyZHkuanNvbiIsCQlFTW9kZTo6b3V0cHV0LCAgNSwgImZpbGVzL2plb3BhcmR5L2plb3BhcmR5Lmpzb24iIH0sCi0JeyAiZHVtcCBqZW9wYXJkeS5qc29uIHcvaW5kLiIsCUVNb2RlOjppbmRlbnQsICA1LCAiZmlsZXMvamVvcGFyZHkvamVvcGFyZHkuanNvbiIgfSwKLQl7ICJkdW1wIGZsb2F0cy5qc29uIiwJCUVNb2RlOjpvdXRwdXQsICAyLCAiZmlsZXMvbnVtYmVycy9mbG9hdHMuanNvbiIgfSwKLQl7ICJkdW1wIHNpZ25lZF9pbnRzLmpzb24iLAlFTW9kZTo6b3V0cHV0LCAyMCwgImZpbGVzL251bWJlcnMvc2lnbmVkX2ludHMuanNvbiIgfSwKLSAgICB9OwotICAgIAotICAgIGF2ZXJhZ2U8ZG91YmxlPiBhdmc7Ci0gICAgZm9yICggYXV0byB0IDogdGVzdHMgKSB7Ci0Jc3RkOjpzdHJpbmcgbmFtZSwgcGF0aDsKLQlFTW9kZSBtb2RlOwotCXNpemVfdCBpdGVyczsKLQlzdGQ6OnRpZShuYW1lLCBtb2RlLCBpdGVycywgcGF0aCkgPSB0OwotCWF1dG8gdHBzID0gYmVuY2goIG1vZGUsIGl0ZXJzLCBwYXRoICk7Ci0JYXZnICs9IHRwczsKLQlzdGQ6OmNvdXQKLQkgICAgPDwgc3RkOjpsZWZ0IAotCSAgICA8PCBzdGQ6OnNldHcoIDMwICkgPDwgbmFtZQotCSAgICA8PCBzdGQ6OnJpZ2h0CSAgICAKLQkgICAgPDwgIiB4ICIgCTw8IHN0ZDo6c2V0dyggIDMgKSA8PCBpdGVycwotCSAgICA8PCBzdGQ6OmxlZnQKLQkgICAgPDwgIiA9PSAiIAk8PCBzdGQ6OnNldHcoIDEwICkgPDwgdHBzCi0JICAgIDw8IHN0ZDo6cmlnaHQKLQkgICAgPDwgIiBUUFMsICIJPDwgc3RkOjpzZXR3KCAgOCApIDw8IHN0ZDo6cm91bmQoIHRwcyAqIDFlNiAvIGl0ZXJzICkKLQkgICAgPDwgIiBtcy9vcCIKLQkgICAgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KCA0MCApIDw8ICIiIDw8IHN0ZDo6c3RyaW5nKCAxMCwgJy0nICkgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoIDQwICkgPDwgIiIgPDwgc3RkOjpzZXR3KCAxMCApIDw8IHN0ZDo6bGVmdCA8PCBhdmcgPDwgIiBUUFMgQXZlcmFnZSIgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9BVVRIT1JTIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGM0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL0FVVEhPUlMKQEAgLTAsMCArMSw0MyBAQAorIyBUaGlzIGlzIHRoZSBvZmZpY2lhbCBsaXN0IG9mIGJlbmNobWFyayBhdXRob3JzIGZvciBjb3B5cmlnaHQgcHVycG9zZXMuCisjIFRoaXMgZmlsZSBpcyBkaXN0aW5jdCBmcm9tIHRoZSBDT05UUklCVVRPUlMgZmlsZXMuCisjIFNlZSB0aGUgbGF0dGVyIGZvciBhbiBleHBsYW5hdGlvbi4KKyMKKyMgTmFtZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgZmlsZSBhczoKKyMJTmFtZSBvciBPcmdhbml6YXRpb24gPGVtYWlsIGFkZHJlc3M+CisjIFRoZSBlbWFpbCBhZGRyZXNzIGlzIG5vdCByZXF1aXJlZCBmb3Igb3JnYW5pemF0aW9ucy4KKyMKKyMgUGxlYXNlIGtlZXAgdGhlIGxpc3Qgc29ydGVkLgorCitBbGJlcnQgUHJldG9yaXVzIDxwcmV0b2FsYkBnbWFpbC5jb20+CitBcm5lIEJlZXIgPGFybmVAdHdvYmVlci5kZT4KK0NhcnRvCitDaHJpc3RvcGhlciBTZXltb3VyIDxjaHJpcy5qLnNleW1vdXJAaG90bWFpbC5jb20+CitEYXZpZCBDb2V1cmpvbGx5IDxkYXZpZC5jb2V1cmpvbGx5QGxpcmlzLmNucnMuZnI+CitEaXJhYyBSZXNlYXJjaCAKK0RvbWluaWsgQ3phcm5vdGEgPGRvbWluaWsuYi5jemFybm90YUBnbWFpbC5jb20+CitFcmljIEZpc2VsaWVyIDxlcmljQGVmY3MuY2E+CitFdWdlbmUgWmh1ayA8ZXVnZW5lLnpodWtAZ21haWwuY29tPgorRXZnZW55IFNhZnJvbm92IDxkaXZpc2lvbjQ5NEBnbWFpbC5jb20+CitGZWxpeCBIb21hbm4gPGxpbnV4YXVkaW9Ac2hvd2xhYm9yLmRlPgorR29vZ2xlIEluYy4KK0ludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24KK0lzbWFlbCBKaW1lbmV6IE1hcnRpbmV6IDxpc21hZWwuamltZW5lei5tYXJ0aW5lekBnbWFpbC5jb20+CitKZXJuLUt1YW4gTGVvbmcgPGplcm5rdWFuQGdtYWlsLmNvbT4KK0ppYW5YaW9uZyBaaG91IDx6aG91amlhbnhpb25nMkBnbWFpbC5jb20+CitKb2FvIFBhdWxvIE1hZ2FsaGFlcyA8am9hb3BwbWFnYWxoYWVzQGdtYWlsLmNvbT4KK0p1c3NpIEtudXV0dGlsYSA8anVzc2kua251dXR0aWxhQGdtYWlsLmNvbT4KK0thaXRvIFVkYWdhd2EgPHVtaXJlb25AZ21haWwuY29tPgorS2lzaGFuIEt1bWFyIDxrdW1hci5raXNoYW5Ab3V0bG9vay5jb20+CitMZWkgWHUgPGVkZHl4dUBnbWFpbC5jb20+CitNYXR0IENsYXJrc29uIDxtYXR0eWNsYXJrc29uQGdtYWlsLmNvbT4KK01heGltIFZhZmluIDxtYXh2YWZpbkBnbWFpbC5jb20+CitOaWNrIEh1dGNoaW5zb24gPG5zaHV0Y2hpbnNvbkBnbWFpbC5jb20+CitPbGVrc2FuZHIgU29jaGthIDxzYXNoYS5zb2Noa2FAZ21haWwuY29tPgorUGF1bCBSZWRtb25kIDxwYXVsLnJlZG1vbmRAZ21haWwuY29tPgorUmFkb3NsYXYgWW92Y2hldiA8cmFkb3NsYXYudG1AZ21haWwuY29tPgorUm9tYW4gTGViZWRldiA8bGViZWRldi5yaUBnbWFpbC5jb20+CitTaHVvIENoZW4gPGNoZW5zaHVvQGNoZW5zaHVvLmNvbT4KK1N0ZWluYXIgSC4gR3VuZGVyc29uIDxzZ3VuZGVyc29uQGJpZ2Zvb3QuY29tPgorWWl4dWFuIFFpdSA8eWl4dWFucUBnbWFpbC5jb20+CitZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+CitaYmlnbmlldyBTa293cm9uIDx6YnljaHNAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9DTWFrZUxpc3RzLnR4dCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwODI2NwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMTMgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQgKFZFUlNJT04gMi44LjEyKQorCitwcm9qZWN0IChiZW5jaG1hcmspCisKK2ZvcmVhY2gocAorICAgIENNUDAwNTQgIyBDTWFrZSAzLjEKKyAgICBDTVAwMDU2ICMgZXhwb3J0IEVYRV9MSU5LRVJfRkxBR1MgdG8gdHJ5X3J1bgorICAgIENNUDAwNTcgIyBTdXBwb3J0IG5vIGlmKCkgSU5fTElTVCBvcGVyYXRvcgorICAgICkKKyAgaWYoUE9MSUNZICR7cH0pCisgICAgY21ha2VfcG9saWN5KFNFVCAke3B9IE5FVykKKyAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX1RFU1RJTkcgIkVuYWJsZSB0ZXN0aW5nIG9mIHRoZSBiZW5jaG1hcmsgbGlicmFyeS4iIE9OKQorb3B0aW9uKEJFTkNITUFSS19FTkFCTEVfRVhDRVBUSU9OUyAiRW5hYmxlIHRoZSB1c2Ugb2YgZXhjZXB0aW9ucyBpbiB0aGUgYmVuY2htYXJrIGxpYnJhcnkuIiBPTikKK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX0xUTyAiRW5hYmxlIGxpbmsgdGltZSBvcHRpbWlzYXRpb24gb2YgdGhlIGJlbmNobWFyayBsaWJyYXJ5LiIgT0ZGKQorb3B0aW9uKEJFTkNITUFSS19VU0VfTElCQ1hYICJCdWlsZCBhbmQgdGVzdCB1c2luZyBsaWJjKysgYXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkuIiBPRkYpCitvcHRpb24oQkVOQ0hNQVJLX0JVSUxEXzMyX0JJVFMgIkJ1aWxkIGEgMzIgYml0IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIiBPRkYpCitvcHRpb24oQkVOQ0hNQVJLX0VOQUJMRV9JTlNUQUxMICJFbmFibGUgaW5zdGFsbGF0aW9uIG9mIGJlbmNobWFyay4gKFByb2plY3RzIGVtYmVkZGluZyBiZW5jaG1hcmsgbWF5IHdhbnQgdG8gdHVybiB0aGlzIE9GRi4pIiBPTikKKworIyBBbGxvdyB1bm1ldCBkZXBlbmRlbmNpZXMgdG8gYmUgbWV0IHVzaW5nIENNYWtlJ3MgRXh0ZXJuYWxQcm9qZWN0IG1lY2hhbmljcywgd2hpY2gKKyMgbWF5IHJlcXVpcmUgZG93bmxvYWRpbmcgdGhlIHNvdXJjZSBjb2RlLgorb3B0aW9uKEJFTkNITUFSS19ET1dOTE9BRF9ERVBFTkRFTkNJRVMgIkFsbG93IHRoZSBkb3dubG9hZGluZyBhbmQgaW4tdHJlZSBidWlsZGluZyBvZiB1bm1ldCBkZXBlbmRlbmNpZXMiIE9GRikKKworIyBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHVuaXQgdGVzdHMgd2hpY2ggZGVwZW5kIG9uIGd0ZXN0CisjIGluIGNhc2VzIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBidWlsZCBvciBmaW5kIGEgdmFsaWQgdmVyc2lvbiBvZiBndGVzdC4KK29wdGlvbihCRU5DSE1BUktfRU5BQkxFX0dURVNUX1RFU1RTICJFbmFibGUgYnVpbGRpbmcgdGhlIHVuaXQgdGVzdHMgd2hpY2ggZGVwZW5kIG9uIGd0ZXN0IiBPTikKKworIyBNYWtlIHN1cmUgd2UgY2FuIGltcG9ydCBvdXQgQ01ha2UgZnVuY3Rpb25zCitsaXN0KEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlL01vZHVsZXMiKQorbGlzdChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZSIpCisKKyMgUmVhZCB0aGUgZ2l0IHRhZ3MgdG8gZGV0ZXJtaW5lIHRoZSBwcm9qZWN0IHZlcnNpb24KK2luY2x1ZGUoR2V0R2l0VmVyc2lvbikKK2dldF9naXRfdmVyc2lvbihHSVRfVkVSU0lPTikKKworIyBUZWxsIHRoZSB1c2VyIHdoYXQgdmVyc2lvbnMgd2UgYXJlIHVzaW5nCitzdHJpbmcoUkVHRVggTUFUQ0ggIlswLTldK1xcLlswLTldK1xcLlswLTldKyIgVkVSU0lPTiAke0dJVF9WRVJTSU9OfSkKK21lc3NhZ2UoIi0tIFZlcnNpb246ICR7VkVSU0lPTn0iKQorCisjIFRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMKK3NldChHRU5FUklDX0xJQl9WRVJTSU9OICR7VkVSU0lPTn0pCitzdHJpbmcoU1VCU1RSSU5HICR7VkVSU0lPTn0gMCAxIEdFTkVSSUNfTElCX1NPVkVSU0lPTikKKworIyBJbXBvcnQgb3VyIENNYWtlIG1vZHVsZXMKK2luY2x1ZGUoQ2hlY2tDWFhDb21waWxlckZsYWcpCitpbmNsdWRlKEFkZENYWENvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ1hYRmVhdHVyZUNoZWNrKQorCitpZiAoQkVOQ0hNQVJLX0JVSUxEXzMyX0JJVFMpCisgIGFkZF9yZXF1aXJlZF9jeHhfY29tcGlsZXJfZmxhZygtbTMyKQorZW5kaWYoKQorCitpZiAoIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIk1TVkMiKQorICAjIFR1cm4gY29tcGlsZXIgd2FybmluZ3MgdXAgdG8gMTEKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlstL11XWzEtNF0iICIiIENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9XNCIpCisgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKQorCisgIGlmIChOT1QgQkVOQ0hNQVJLX0VOQUJMRV9FWENFUFRJT05TKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtRUhzLSkKKyAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLUVIYS0pCisgIGVuZGlmKCkKKyAgIyBMaW5rIHRpbWUgb3B0aW1pc2F0aW9uCisgIGlmIChCRU5DSE1BUktfRU5BQkxFX0xUTykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0V9IC9HTCIpCisgICAgc2V0KENNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTEVBU0V9IC9MVENHIikKKyAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxFQVNFICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfUkVMRUFTRX0gL0xUQ0ciKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX1JFTEVBU0UgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU19SRUxFQVNFfSAvTFRDRyIpCisKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GT30gL0dMIikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiWy0vXUlOQ1JFTUVOVEFMIiAiL0lOQ1JFTUVOVEFMOk5PIiBDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk99IikKKyAgICBzZXQoQ01BS0VfU1RBVElDX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9TVEFUSUNfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSAvTFRDRyIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlstL11JTkNSRU1FTlRBTCIgIi9JTkNSRU1FTlRBTDpOTyIgQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPfSIpCisgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk8gIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GT30gL0xUQ0ciKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbLS9dSU5DUkVNRU5UQUwiICIvSU5DUkVNRU5UQUw6Tk8iIENNQUtFX0VYRV9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk8gIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU19SRUxXSVRIREVCSU5GT30iKQorICAgIHNldChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX1JFTFdJVEhERUJJTkZPICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1NfUkVMV0lUSERFQklORk99IC9MVENHIikKKworICAgIHNldChDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTCAiJHtDTUFLRV9DWFhfRkxBR1NfTUlOU0laRVJFTH0gL0dMIikKKyAgICBzZXQoQ01BS0VfU1RBVElDX0xJTktFUl9GTEFHU19NSU5TSVpFUkVMICIke0NNQUtFX1NUQVRJQ19MSU5LRVJfRkxBR1NfTUlOU0laRVJFTH0gL0xUQ0ciKQorICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX01JTlNJWkVSRUwgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU19NSU5TSVpFUkVMfSAvTFRDRyIpCisgICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1NfTUlOU0laRVJFTCAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX01JTlNJWkVSRUx9IC9MVENHIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICMgVHJ5IGFuZCBlbmFibGUgQysrMTEuIERvbid0IHVzZSBDKysxNCBiZWNhdXNlIGl0IGRvZXNuJ3Qgd29yayBpbiBzb21lCisgICMgY29uZmlndXJhdGlvbnMuCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzExKQorICBpZiAoTk9UIEhBVkVfQ1hYX0ZMQUdfU1REX0NYWDExKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzB4KQorICBlbmRpZigpCisKKyAgIyBUdXJuIGNvbXBpbGVyIHdhcm5pbmdzIHVwIHRvIDExCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV2FsbCkKKworICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdleHRyYSkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1Xc2hhZG93KQorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdlcnJvciBSRUxFQVNFKQorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLVdlcnJvciBSRUxXSVRIREVCSU5GTykKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XZXJyb3IgTUlOU0laRVJFTCkKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1wZWRhbnRpYykKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1wZWRhbnRpYy1lcnJvcnMpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV3Nob3J0ZW4tNjQtdG8tMzIpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtV2Zsb2F0LWVxdWFsKQorICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLWZzdHJpY3QtYWxpYXNpbmcpCisgIGlmIChOT1QgQkVOQ0hNQVJLX0VOQUJMRV9FWENFUFRJT05TKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtZm5vLWV4Y2VwdGlvbnMpCisgIGVuZGlmKCkKKworICBpZiAoSEFWRV9DWFhfRkxBR19GU1RSSUNUX0FMSUFTSU5HKQorICAgIGlmIChOT1QgQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpICNJQ0MxN3UyOiBNYW55IGZhbHNlIHBvc2l0aXZlcyBmb3IgV3N0cmljdC1hbGlhc2luZworICAgICAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1Xc3RyaWN0LWFsaWFzaW5nKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICAjIElDQzE3dTI6IG92ZXJsb2FkZWQgdmlydHVhbCBmdW5jdGlvbiAiYmVuY2htYXJrOjpGaXh0dXJlOjpTZXRVcCIgaXMgb25seSBwYXJ0aWFsbHkgb3ZlcnJpZGRlbgorICAjIChiZWNhdXNlIG9mIGRlcHJlY2F0ZWQgb3ZlcmxvYWQpCisgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtd2Q2NTQpICAKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XdGhyZWFkLXNhZmV0eSkKKyAgaWYgKEhBVkVfQ1hYX0ZMQUdfV1RIUkVBRF9TQUZFVFkpCisgICAgY3h4X2ZlYXR1cmVfY2hlY2soVEhSRUFEX1NBRkVUWV9BVFRSSUJVVEVTKQorICBlbmRpZigpCisKKyAgIyBPbiBtb3N0IFVOSVggbGlrZSBwbGF0Zm9ybXMgZysrIGFuZCBjbGFuZysrIGRlZmluZSBfR05VX1NPVVJDRSBhcyBhCisgICMgcHJlZGVmaW5lZCBtYWNybywgd2hpY2ggdHVybnMgb24gYWxsIG9mIHRoZSB3b25kZXJmdWwgbGliYyBleHRlbnNpb25zLgorICAjIEhvd2V2ZXIgZysrIGRvZXNuJ3QgZG8gdGhpcyBpbiBDeWd3aW4gc28gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsZnMKKyAgIyBzaW5jZSB3ZSBkZXBlbmQgb24gR05VL1BPU0lYL0JTRCBleHRlbnNpb25zLgorICBpZiAoQ1lHV0lOKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9HTlVfU09VUkNFPTEpCisgIGVuZGlmKCkKKworICAjIExpbmsgdGltZSBvcHRpbWlzYXRpb24KKyAgaWYgKEJFTkNITUFSS19FTkFCTEVfTFRPKQorICAgIGFkZF9jeHhfY29tcGlsZXJfZmxhZygtZmx0bykKKyAgICBpZiAoIiR7Q01BS0VfQ19DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJHTlUiKQorICAgICAgZmluZF9wcm9ncmFtKEdDQ19BUiBnY2MtYXIpCisgICAgICBpZiAoR0NDX0FSKQorICAgICAgICBzZXQoQ01BS0VfQVIgJHtHQ0NfQVJ9KQorICAgICAgZW5kaWYoKQorICAgICAgZmluZF9wcm9ncmFtKEdDQ19SQU5MSUIgZ2NjLXJhbmxpYikKKyAgICAgIGlmIChHQ0NfUkFOTElCKQorICAgICAgICBzZXQoQ01BS0VfUkFOTElCICR7R0NDX1JBTkxJQn0pCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCIke0NNQUtFX0NfQ09NUElMRVJfSUR9IiBTVFJFUVVBTCAiQ2xhbmciKQorICAgICAgaW5jbHVkZShsbHZtLXRvb2xjaGFpbikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICAjIENvdmVyYWdlIGJ1aWxkIHR5cGUKKyAgc2V0KEJFTkNITUFSS19DWFhfRkxBR1NfQ09WRVJBR0UgIiR7Q01BS0VfQ1hYX0ZMQUdTX0RFQlVHfSIKKyAgICBDQUNIRSBTVFJJTkcgIkZsYWdzIHVzZWQgYnkgdGhlIEMrKyBjb21waWxlciBkdXJpbmcgY292ZXJhZ2UgYnVpbGRzLiIKKyAgICBGT1JDRSkKKyAgc2V0KEJFTkNITUFSS19FWEVfTElOS0VSX0ZMQUdTX0NPVkVSQUdFICIke0NNQUtFX0VYRV9MSU5LRVJfRkxBR1NfREVCVUd9IgorICAgIENBQ0hFIFNUUklORyAiRmxhZ3MgdXNlZCBmb3IgbGlua2luZyBiaW5hcmllcyBkdXJpbmcgY292ZXJhZ2UgYnVpbGRzLiIKKyAgICBGT1JDRSkKKyAgc2V0KEJFTkNITUFSS19TSEFSRURfTElOS0VSX0ZMQUdTX0NPVkVSQUdFICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfREVCVUd9IgorICAgIENBQ0hFIFNUUklORyAiRmxhZ3MgdXNlZCBieSB0aGUgc2hhcmVkIGxpYnJhcmllcyBsaW5rZXIgZHVyaW5nIGNvdmVyYWdlIGJ1aWxkcy4iCisgICAgRk9SQ0UpCisgIG1hcmtfYXNfYWR2YW5jZWQoCisgICAgQkVOQ0hNQVJLX0NYWF9GTEFHU19DT1ZFUkFHRQorICAgIEJFTkNITUFSS19FWEVfTElOS0VSX0ZMQUdTX0NPVkVSQUdFCisgICAgQkVOQ0hNQVJLX1NIQVJFRF9MSU5LRVJfRkxBR1NfQ09WRVJBR0UpCisgIHNldChDTUFLRV9CVUlMRF9UWVBFICIke0NNQUtFX0JVSUxEX1RZUEV9IiBDQUNIRSBTVFJJTkcKKyAgICAiQ2hvb3NlIHRoZSB0eXBlIG9mIGJ1aWxkLCBvcHRpb25zIGFyZTogTm9uZSBEZWJ1ZyBSZWxlYXNlIFJlbFdpdGhEZWJJbmZvIE1pblNpemVSZWwgQ292ZXJhZ2UuIikKKyAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC0tY292ZXJhZ2UgQ09WRVJBR0UpCitlbmRpZigpCisKK2lmIChCRU5DSE1BUktfVVNFX0xJQkNYWCkKKyAgaWYgKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJDbGFuZyIpCisgICAgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1zdGRsaWI9bGliYysrKQorICBlbHNlaWYgKCIke0NNQUtFX0NYWF9DT01QSUxFUl9JRH0iIFNUUkVRVUFMICJHTlUiIE9SCisgICAgICAgICAgIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkludGVsIikKKyAgICBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLW5vc3RkaW5jKyspCisgICAgbWVzc2FnZSgibGliYysrIGhlYWRlciBwYXRoIG11c3QgYmUgbWFudWFsbHkgc3BlY2lmaWVkIHVzaW5nIENNQUtFX0NYWF9GTEFHUyIpCisgICAgIyBBZGRpbmcgLW5vZGVmYXVsdGxpYnMgZGlyZWN0bHkgdG8gQ01BS0VfPFRZUEU+X0xJTktFUl9GTEFHUyB3aWxsIGJyZWFrCisgICAgIyBjb25maWd1cmF0aW9uIGNoZWNrcyBzdWNoIGFzICdmaW5kX3BhY2thZ2UoVGhyZWFkcyknCisgICAgbGlzdChBUFBFTkQgQkVOQ0hNQVJLX0NYWF9MSU5LRVJfRkxBR1MgLW5vZGVmYXVsdGxpYnMpCisgICAgIyAtbGMrKyBjYW5ub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gQ01BS0VfPFRZUEU+X0xJTktFUl9GTEFHUyBiZWNhdXNlCisgICAgIyBsaW5rZXIgZmxhZ3MgYXBwZWFyIGJlZm9yZSBhbGwgbGlua2VyIGlucHV0cyBhbmQgLWxjKysgbXVzdCBhcHBlYXIgYWZ0ZXIuCisgICAgbGlzdChBUFBFTkQgQkVOQ0hNQVJLX0NYWF9MSUJSQVJJRVMgYysrKQorICBlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMICItREJFTkNITUFSS19VU0VfTElCQ1hYOkJPT0w9T04gaXMgbm90IHN1cHBvcnRlZCBmb3IgY29tcGlsZXIiKQorICBlbmRpZigpCitlbmRpZihCRU5DSE1BUktfVVNFX0xJQkNYWCkKKworIyBDKysgZmVhdHVyZSBjaGVja3MKKyMgRGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgdG8gdXNlCitjeHhfZmVhdHVyZV9jaGVjayhTVERfUkVHRVgpCitjeHhfZmVhdHVyZV9jaGVjayhHTlVfUE9TSVhfUkVHRVgpCitjeHhfZmVhdHVyZV9jaGVjayhQT1NJWF9SRUdFWCkKK2lmKE5PVCBIQVZFX1NURF9SRUdFWCBBTkQgTk9UIEhBVkVfR05VX1BPU0lYX1JFR0VYIEFORCBOT1QgSEFWRV9QT1NJWF9SRUdFWCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRmFpbGVkIHRvIGRldGVybWluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIGJhY2tlbmQiKQorZW5kaWYoKQoraWYgKE5PVCBCRU5DSE1BUktfRU5BQkxFX0VYQ0VQVElPTlMgQU5EIEhBVkVfU1REX1JFR0VYCisgICAgICAgIEFORCBOT1QgSEFWRV9HTlVfUE9TSVhfUkVHRVggQU5EIE5PVCBIQVZFX1BPU0lYX1JFR0VYKQorICBtZXNzYWdlKFdBUk5JTkcgIlVzaW5nIHN0ZDo6cmVnZXggd2l0aCBleGNlcHRpb25zIGRpc2FibGVkIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQiKQorZW5kaWYoKQorY3h4X2ZlYXR1cmVfY2hlY2soU1RFQURZX0NMT0NLKQorIyBFbnN1cmUgd2UgaGF2ZSBwdGhyZWFkcworZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCisKKyMgU2V0IHVwIGRpcmVjdG9yaWVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFJPSkVDVF9TT1VSQ0VfRElSfS9pbmNsdWRlKQorCisjIEJ1aWxkIHRoZSB0YXJnZXRzCithZGRfc3ViZGlyZWN0b3J5KHNyYykKKworaWYgKEJFTkNITUFSS19FTkFCTEVfVEVTVElORykKKyAgZW5hYmxlX3Rlc3RpbmcoKQorICBpZiAoQkVOQ0hNQVJLX0VOQUJMRV9HVEVTVF9URVNUUykKKyAgICBpbmNsdWRlKEhhbmRsZUdUZXN0KQorICBlbmRpZigpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvQ09OVFJJQlVUT1JTIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9DT05UUklCVVRPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvQ09OVFJJQlVUT1JTCkBAIC0wLDAgKzEsNjIgQEAKKyMgUGVvcGxlIHdobyBoYXZlIGFncmVlZCB0byBvbmUgb2YgdGhlIENMQXMgYW5kIGNhbiBjb250cmlidXRlIHBhdGNoZXMuCisjIFRoZSBBVVRIT1JTIGZpbGUgbGlzdHMgdGhlIGNvcHlyaWdodCBob2xkZXJzOyB0aGlzIGZpbGUKKyMgbGlzdHMgcGVvcGxlLiAgRm9yIGV4YW1wbGUsIEdvb2dsZSBlbXBsb3llZXMgYXJlIGxpc3RlZCBoZXJlCisjIGJ1dCBub3QgaW4gQVVUSE9SUywgYmVjYXVzZSBHb29nbGUgaG9sZHMgdGhlIGNvcHlyaWdodC4KKyMKKyMgTmFtZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgZmlsZSBvbmx5IGFmdGVyIHZlcmlmeWluZyB0aGF0CisjIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBpbmRpdmlkdWFsJ3Mgb3JnYW5pemF0aW9uIGhhcyBhZ3JlZWQgdG8KKyMgdGhlIGFwcHJvcHJpYXRlIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50LCBmb3VuZCBoZXJlOgorIworIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9vcGVuLXNvdXJjZS9jbGEvaW5kaXZpZHVhbAorIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9vcGVuLXNvdXJjZS9jbGEvY29ycG9yYXRlCisjCisjIFRoZSBhZ3JlZW1lbnQgZm9yIGluZGl2aWR1YWxzIGNhbiBiZSBmaWxsZWQgb3V0IG9uIHRoZSB3ZWIuCisjCisjIFdoZW4gYWRkaW5nIEogUmFuZG9tIENvbnRyaWJ1dG9yJ3MgbmFtZSB0byB0aGlzIGZpbGUsCisjIGVpdGhlciBKJ3MgbmFtZSBvciBKJ3Mgb3JnYW5pemF0aW9uJ3MgbmFtZSBzaG91bGQgYmUKKyMgYWRkZWQgdG8gdGhlIEFVVEhPUlMgZmlsZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlCisjIGluZGl2aWR1YWwgb3IgY29ycG9yYXRlIENMQSB3YXMgdXNlZC4KKyMKKyMgTmFtZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoaXMgZmlsZSBhczoKKyMgICAgIE5hbWUgPGVtYWlsIGFkZHJlc3M+CisjCisjIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZC4KKworQWxiZXJ0IFByZXRvcml1cyA8cHJldG9hbGJAZ21haWwuY29tPgorQXJuZSBCZWVyIDxhcm5lQHR3b2JlZXIuZGU+CitCaWxseSBSb2JlcnQgTydOZWFsIElJSSA8YmlsbHkub25lYWxAZ21haWwuY29tPiA8YmlvbkBtaWNyb3NvZnQuY29tPgorQ2hyaXMgS2VubmVsbHkgPGNrZW5uZWxseUBnb29nbGUuY29tPiA8Y2tlbm5lbGx5QGNrZW5uZWxseS5jb20+CitDaHJpc3RvcGhlciBTZXltb3VyIDxjaHJpcy5qLnNleW1vdXJAaG90bWFpbC5jb20+CitEYXZpZCBDb2V1cmpvbGx5IDxkYXZpZC5jb2V1cmpvbGx5QGxpcmlzLmNucnMuZnI+CitEb21pbmljIEhhbW9uIDxkbWFAc3RyaXB5c29jay5jb20+IDxkb21pbmljQGdvb2dsZS5jb20+CitEb21pbmlrIEN6YXJub3RhIDxkb21pbmlrLmIuY3phcm5vdGFAZ21haWwuY29tPgorRXJpYyBGaXNlbGllciA8ZXJpY0BlZmNzLmNhPgorRXVnZW5lIFpodWsgPGV1Z2VuZS56aHVrQGdtYWlsLmNvbT4KK0V2Z2VueSBTYWZyb25vdiA8ZGl2aXNpb240OTRAZ21haWwuY29tPgorRmVsaXggSG9tYW5uIDxsaW51eGF1ZGlvQHNob3dsYWJvci5kZT4KK0lzbWFlbCBKaW1lbmV6IE1hcnRpbmV6IDxpc21hZWwuamltZW5lei5tYXJ0aW5lekBnbWFpbC5jb20+CitKZXJuLUt1YW4gTGVvbmcgPGplcm5rdWFuQGdtYWlsLmNvbT4KK0ppYW5YaW9uZyBaaG91IDx6aG91amlhbnhpb25nMkBnbWFpbC5jb20+CitKb2FvIFBhdWxvIE1hZ2FsaGFlcyA8am9hb3BwbWFnYWxoYWVzQGdtYWlsLmNvbT4KK0p1c3NpIEtudXV0dGlsYSA8anVzc2kua251dXR0aWxhQGdtYWlsLmNvbT4KK0thaSBXb2xmIDxrYWkud29sZkBnbWFpbC5jb20+CitLaXNoYW4gS3VtYXIgPGt1bWFyLmtpc2hhbkBvdXRsb29rLmNvbT4KK0thaXRvIFVkYWdhd2EgPHVtaXJlb25AZ21haWwuY29tPgorTGVpIFh1IDxlZGR5eHVAZ21haWwuY29tPgorTWF0dCBDbGFya3NvbiA8bWF0dHljbGFya3NvbkBnbWFpbC5jb20+CitNYXhpbSBWYWZpbiA8bWF4dmFmaW5AZ21haWwuY29tPgorTmljayBIdXRjaGluc29uIDxuc2h1dGNoaW5zb25AZ21haWwuY29tPgorT2xla3NhbmRyIFNvY2hrYSA8c2FzaGEuc29jaGthQGdtYWlsLmNvbT4KK1Bhc2NhbCBMZXJveSA8cGhsQGdvb2dsZS5jb20+CitQYXVsIFJlZG1vbmQgPHBhdWwucmVkbW9uZEBnbWFpbC5jb20+CitQaWVycmUgUGhhbmV1ZiA8cHBoYW5ldWZAZ29vZ2xlLmNvbT4KK1JhZG9zbGF2IFlvdmNoZXYgPHJhZG9zbGF2LnRtQGdtYWlsLmNvbT4KK1JhdWwgTWFyaW4gPHJtcm9kcmlndWV6QGNhcnRvZGIuY29tPgorUmF5IEdsb3ZlciA8cmF5Lmdsb3ZlckB1ay5pYm0uY29tPgorUm9tYW4gTGViZWRldiA8bGViZWRldi5yaUBnbWFpbC5jb20+CitTaHVvIENoZW4gPGNoZW5zaHVvQGNoZW5zaHVvLmNvbT4KK1RvYmlhcyBVbHZnw6VyZCA8dG9iaWFzLnVsdmdhcmRAZGlyYWMuc2U+CitUb20gTWFkYW1zIDx0b20uZWoubWFkYW1zQGdtYWlsLmNvbT4gPHRtYWRhbXNAZ29vZ2xlLmNvbT4KK1lpeHVhbiBRaXUgPHlpeHVhbnFAZ21haWwuY29tPgorWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgorWmJpZ25pZXcgU2tvd3JvbiA8emJ5Y2hzQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvTElDRU5TRSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9MSUNFTlNFCkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9SRUFETUUubWQgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ4MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9SRUFETUUubWQKQEAgLTAsMCArMSw5MzUgQEAKKyMgYmVuY2htYXJrCitbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9nb29nbGUvYmVuY2htYXJrLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9iZW5jaG1hcmspCitbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvdTBxc3lwN3QxdGs3Y3B4cy9icmFuY2gvbWFzdGVyP3N2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9nb29nbGUvYmVuY2htYXJrL2JyYW5jaC9tYXN0ZXIpCitbIVtDb3ZlcmFnZSBTdGF0dXNdKGh0dHBzOi8vY292ZXJhbGxzLmlvL3JlcG9zL2dvb2dsZS9iZW5jaG1hcmsvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vci9nb29nbGUvYmVuY2htYXJrKQorWyFbc2xhY2tpbl0oaHR0cHM6Ly9zbGFja2luLWlxdGZxbnB6eGQubm93LnNoL2JhZGdlLnN2ZyldKGh0dHBzOi8vc2xhY2tpbi1pcXRmcW5wenhkLm5vdy5zaC8pCisKK0EgbGlicmFyeSB0byBzdXBwb3J0IHRoZSBiZW5jaG1hcmtpbmcgb2YgZnVuY3Rpb25zLCBzaW1pbGFyIHRvIHVuaXQtdGVzdHMuCisKK0Rpc2N1c3Npb24gZ3JvdXA6IGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZC9mb3J1bS9iZW5jaG1hcmstZGlzY3VzcworCitJUkMgY2hhbm5lbDogaHR0cHM6Ly9mcmVlbm9kZS5uZXQgI2dvb2dsZWJlbmNobWFyaworCitbS25vd24gaXNzdWVzIGFuZCBjb21tb24gcHJvYmxlbXNdKCNrbm93bi1pc3N1ZXMpCisKK1tBZGRpdGlvbmFsIFRvb2xpbmcgRG9jdW1lbnRhdGlvbl0oZG9jcy90b29scy5tZCkKKworCisjIyBCdWlsZGluZworCitUaGUgYmFzaWMgc3RlcHMgZm9yIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyB0aGUgbGlicmFyeSBsb29rIGxpa2UgdGhpczoKKworYGBgYmFzaAorJCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsuZ2l0CisjIEJlbmNobWFyayByZXF1aXJlcyBHVGVzdCBhcyBhIGRlcGVuZGVuY3kuIEFkZCB0aGUgc291cmNlIHRyZWUgYXMgYSBzdWJkaXJlY3RvcnkuCiskIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dvb2dsZXRlc3QuZ2l0IGJlbmNobWFyay9nb29nbGV0ZXN0CiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIC1HIDxnZW5lcmF0b3I+IFtvcHRpb25zXSAuLi9iZW5jaG1hcmsKKyMgQXNzdW1pbmcgYSBtYWtlZmlsZSBnZW5lcmF0b3Igd2FzIHVzZWQKKyQgbWFrZQorYGBgCisKK05vdGUgdGhhdCBHb29nbGUgQmVuY2htYXJrIHJlcXVpcmVzIEdUZXN0IHRvIGJ1aWxkIGFuZCBydW4gdGhlIHRlc3RzLiBUaGlzCitkZXBlbmRlbmN5IGNhbiBiZSBwcm92aWRlZCB0aHJlZSB3YXlzOgorCisqIENoZWNrb3V0IHRoZSBHVGVzdCBzb3VyY2VzIGludG8gYGJlbmNobWFyay9nb29nbGV0ZXN0YC4KKyogT3RoZXJ3aXNlLCBpZiBgLURCRU5DSE1BUktfRE9XTkxPQURfREVQRU5ERU5DSUVTPU9OYCBpcyBzcGVjaWZpZWQgZHVyaW5nCisgIGNvbmZpZ3VyYXRpb24sIHRoZSBsaWJyYXJ5IHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgYnVpbGQgYW55IHJlcXVpcmVkCisgIGRlcGVuZGVuY2llcy4KKyogT3RoZXJ3aXNlLCBpZiBub3RoaW5nIGlzIGRvbmUsIENNYWtlIHdpbGwgdXNlIGBmaW5kX3BhY2thZ2UoR1Rlc3QgUkVRVUlSRUQpYAorICB0byByZXNvbHZlIHRoZSByZXF1aXJlZCBHVGVzdCBkZXBlbmRlbmN5LgorCitJZiB5b3UgZG8gbm90IHdpc2ggdG8gYnVpbGQgYW5kIHJ1biB0aGUgdGVzdHMsIGFkZCBgLURCRU5DSE1BUktfRU5BQkxFX0dURVNUX1RFU1RTPU9GRmAKK3RvIGBDTUFLRV9BUkdTYC4KKworCisjIyBJbnN0YWxsYXRpb24gR3VpZGUKKworRm9yIFVidW50dSBhbmQgRGViaWFuIEJhc2VkIFN5c3RlbQorCitGaXJzdCBtYWtlIHN1cmUgeW91IGhhdmUgZ2l0IGFuZCBjbWFrZSBpbnN0YWxsZWQgKElmIG5vdCBwbGVhc2UgaW5zdGFsbCBpdCkKKworYGBgCitzdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXQKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIGNtYWtlCitgYGAKKworTm93LCBsZXQncyBjbG9uZSB0aGUgcmVwb3NpdG9yeSBhbmQgYnVpbGQgaXQKKworYGBgCitnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsuZ2l0CitjZCBiZW5jaG1hcmsKK21rZGlyIGJ1aWxkCitjZCBidWlsZAorY21ha2UgLi4gLURDTUFLRV9CVUlMRF9UWVBFPVJFTEVBU0UKK21ha2UKK2BgYAorCitXZSBuZWVkIHRvIGluc3RhbGwgdGhlIGxpYnJhcnkgZ2xvYmFsbHkgbm93CisKK2BgYAorc3VkbyBtYWtlIGluc3RhbGwKK2BgYAorCitOb3cgeW91IGhhdmUgZ29vZ2xlL2JlbmNobWFyayBpbnN0YWxsZWQgaW4geW91ciBtYWNoaW5lIAorTm90ZTogRG9uJ3QgZm9yZ2V0IHRvIGxpbmsgdG8gcHRocmVhZCBsaWJyYXJ5IHdoaWxlIGJ1aWxkaW5nCisKKyMjIFN0YWJsZSBhbmQgRXhwZXJpbWVudGFsIExpYnJhcnkgVmVyc2lvbnMKKworVGhlIG1haW4gYnJhbmNoIGNvbnRhaW5zIHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgdGhlIGJlbmNobWFya2luZyBsaWJyYXJ5OwordGhlIEFQSSBvZiB3aGljaCBjYW4gYmUgY29uc2lkZXJlZCBsYXJnZWx5IHN0YWJsZSwgd2l0aCBzb3VyY2UgYnJlYWtpbmcgY2hhbmdlcworYmVpbmcgbWFkZSBvbmx5IHVwb24gdGhlIHJlbGVhc2Ugb2YgYSBuZXcgbWFqb3IgdmVyc2lvbi4KKworTmV3ZXIsIGV4cGVyaW1lbnRhbCwgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgb24gdGhlCitbYHYyYCBicmFuY2hdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrL3RyZWUvdjIpLiBVc2VycyB3aG8gd2lzaAordG8gdXNlLCB0ZXN0LCBhbmQgcHJvdmlkZSBmZWVkYmFjayBvbiB0aGUgbmV3IGZlYXR1cmVzIGFyZSBlbmNvdXJhZ2VkIHRvIHRyeQordGhpcyBicmFuY2guIEhvd2V2ZXIsIHRoaXMgYnJhbmNoIHByb3ZpZGVzIG5vIHN0YWJpbGl0eSBndWFyYW50ZWVzIGFuZCByZXNlcnZlcwordGhlIHJpZ2h0IHRvIGNoYW5nZSBhbmQgYnJlYWsgdGhlIEFQSSBhdCBhbnkgdGltZS4KKworCisjIyBFeGFtcGxlIHVzYWdlCisjIyMgQmFzaWMgdXNhZ2UKK0RlZmluZSBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGNvZGUgdG8gYmUgbWVhc3VyZWQuCisKK2BgYGMrKworI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKworc3RhdGljIHZvaWQgQk1fU3RyaW5nQ3JlYXRpb24oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkKKyAgICBzdGQ6OnN0cmluZyBlbXB0eV9zdHJpbmc7Cit9CisvLyBSZWdpc3RlciB0aGUgZnVuY3Rpb24gYXMgYSBiZW5jaG1hcmsKK0JFTkNITUFSSyhCTV9TdHJpbmdDcmVhdGlvbik7CisKKy8vIERlZmluZSBhbm90aGVyIGJlbmNobWFyaworc3RhdGljIHZvaWQgQk1fU3RyaW5nQ29weShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBzdGQ6OnN0cmluZyB4ID0gImhlbGxvIjsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkKKyAgICBzdGQ6OnN0cmluZyBjb3B5KHgpOworfQorQkVOQ0hNQVJLKEJNX1N0cmluZ0NvcHkpOworCitCRU5DSE1BUktfTUFJTigpOworYGBgCisKK0Rvbid0IGZvcmdldCB0byBpbmZvcm0geW91ciBsaW5rZXIgdG8gYWRkIGJlbmNobWFyayBsaWJyYXJ5IGUuZy4gdGhyb3VnaCBgLWxiZW5jaG1hcmtgIGNvbXBpbGF0aW9uIGZsYWcuCisKK1RoZSBiZW5jaG1hcmsgbGlicmFyeSB3aWxsIHJlcG9ydGluZyB0aGUgdGltaW5nIGZvciB0aGUgY29kZSB3aXRoaW4gdGhlIGBmb3IoLi4uKWAgbG9vcC4KKworIyMjIFBhc3NpbmcgYXJndW1lbnRzCitTb21ldGltZXMgYSBmYW1pbHkgb2YgYmVuY2htYXJrcyBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aCBqdXN0IG9uZSByb3V0aW5lIHRoYXQKK3Rha2VzIGFuIGV4dHJhIGFyZ3VtZW50IHRvIHNwZWNpZnkgd2hpY2ggb25lIG9mIHRoZSBmYW1pbHkgb2YgYmVuY2htYXJrcyB0bworcnVuLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgYmVuY2htYXJrcyBmb3IKK21lYXN1cmluZyB0aGUgc3BlZWQgb2YgYG1lbWNweSgpYCBjYWxscyBvZiBkaWZmZXJlbnQgbGVuZ3RoczoKKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9tZW1jcHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgY2hhciogc3JjID0gbmV3IGNoYXJbc3RhdGUucmFuZ2UoMCldOworICBjaGFyKiBkc3QgPSBuZXcgY2hhcltzdGF0ZS5yYW5nZSgwKV07CisgIG1lbXNldChzcmMsICd4Jywgc3RhdGUucmFuZ2UoMCkpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKQorICAgIG1lbWNweShkc3QsIHNyYywgc3RhdGUucmFuZ2UoMCkpOworICBzdGF0ZS5TZXRCeXRlc1Byb2Nlc3NlZChpbnQ2NF90KHN0YXRlLml0ZXJhdGlvbnMoKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KHN0YXRlLnJhbmdlKDApKSk7CisgIGRlbGV0ZVtdIHNyYzsKKyAgZGVsZXRlW10gZHN0OworfQorQkVOQ0hNQVJLKEJNX21lbWNweSktPkFyZyg4KS0+QXJnKDY0KS0+QXJnKDUxMiktPkFyZygxPDwxMCktPkFyZyg4PDwxMCk7CitgYGAKKworVGhlIHByZWNlZGluZyBjb2RlIGlzIHF1aXRlIHJlcGV0aXRpdmUsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGUgZm9sbG93aW5nCitzaG9ydC1oYW5kLiBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gd2lsbCBwaWNrIGEgZmV3IGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBpbgordGhlIHNwZWNpZmllZCByYW5nZSBhbmQgd2lsbCBnZW5lcmF0ZSBhIGJlbmNobWFyayBmb3IgZWFjaCBzdWNoIGFyZ3VtZW50LgorCitgYGBjKysKK0JFTkNITUFSSyhCTV9tZW1jcHkpLT5SYW5nZSg4LCA4PDwxMCk7CitgYGAKKworQnkgZGVmYXVsdCB0aGUgYXJndW1lbnRzIGluIHRoZSByYW5nZSBhcmUgZ2VuZXJhdGVkIGluIG11bHRpcGxlcyBvZiBlaWdodCBhbmQKK3RoZSBjb21tYW5kIGFib3ZlIHNlbGVjdHMgWyA4LCA2NCwgNTEyLCA0aywgOGsgXS4gSW4gdGhlIGZvbGxvd2luZyBjb2RlIHRoZQorcmFuZ2UgbXVsdGlwbGllciBpcyBjaGFuZ2VkIHRvIG11bHRpcGxlcyBvZiB0d28uCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX21lbWNweSktPlJhbmdlTXVsdGlwbGllcigyKS0+UmFuZ2UoOCwgODw8MTApOworYGBgCitOb3cgYXJndW1lbnRzIGdlbmVyYXRlZCBhcmUgWyA4LCAxNiwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyaywgNGssIDhrIF0uCisKK1lvdSBtaWdodCBoYXZlIGEgYmVuY2htYXJrIHRoYXQgZGVwZW5kcyBvbiB0d28gb3IgbW9yZSBpbnB1dHMuIEZvciBleGFtcGxlLCB0aGUKK2ZvbGxvd2luZyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgYmVuY2htYXJrcyBmb3IgbWVhc3VyaW5nIHRoZSBzcGVlZCBvZiBzZXQKK2luc2VydGlvbi4KKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9TZXRJbnNlcnQoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzZXQ8aW50PiBkYXRhOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgc3RhdGUuUGF1c2VUaW1pbmcoKTsKKyAgICBkYXRhID0gQ29uc3RydWN0UmFuZG9tU2V0KHN0YXRlLnJhbmdlKDApKTsKKyAgICBzdGF0ZS5SZXN1bWVUaW1pbmcoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlLnJhbmdlKDEpOyArK2opCisgICAgICBkYXRhLmluc2VydChSYW5kb21OdW1iZXIoKSk7CisgIH0KK30KK0JFTkNITUFSSyhCTV9TZXRJbnNlcnQpCisgICAgLT5BcmdzKHsxPDwxMCwgMTI4fSkKKyAgICAtPkFyZ3MoezI8PDEwLCAxMjh9KQorICAgIC0+QXJncyh7NDw8MTAsIDEyOH0pCisgICAgLT5BcmdzKHs4PDwxMCwgMTI4fSkKKyAgICAtPkFyZ3MoezE8PDEwLCA1MTJ9KQorICAgIC0+QXJncyh7Mjw8MTAsIDUxMn0pCisgICAgLT5BcmdzKHs0PDwxMCwgNTEyfSkKKyAgICAtPkFyZ3Moezg8PDEwLCA1MTJ9KTsKK2BgYAorCitUaGUgcHJlY2VkaW5nIGNvZGUgaXMgcXVpdGUgcmVwZXRpdGl2ZSwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZSBmb2xsb3dpbmcKK3Nob3J0LWhhbmQuIFRoZSBmb2xsb3dpbmcgbWFjcm8gd2lsbCBwaWNrIGEgZmV3IGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBpbiB0aGUKK3Byb2R1Y3Qgb2YgdGhlIHR3byBzcGVjaWZpZWQgcmFuZ2VzIGFuZCB3aWxsIGdlbmVyYXRlIGEgYmVuY2htYXJrIGZvciBlYWNoIHN1Y2gKK3BhaXIuCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX1NldEluc2VydCktPlJhbmdlcyh7ezE8PDEwLCA4PDwxMH0sIHsxMjgsIDUxMn19KTsKK2BgYAorCitGb3IgbW9yZSBjb21wbGV4IHBhdHRlcm5zIG9mIGlucHV0cywgcGFzc2luZyBhIGN1c3RvbSBmdW5jdGlvbiB0byBgQXBwbHlgIGFsbG93cworcHJvZ3JhbW1hdGljIHNwZWNpZmljYXRpb24gb2YgYW4gYXJiaXRyYXJ5IHNldCBvZiBhcmd1bWVudHMgb24gd2hpY2ggdG8gcnVuIHRoZQorYmVuY2htYXJrLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZW51bWVyYXRlcyBhIGRlbnNlIHJhbmdlIG9uIG9uZSBwYXJhbWV0ZXIsCithbmQgYSBzcGFyc2UgcmFuZ2Ugb24gdGhlIHNlY29uZC4KKworYGBgYysrCitzdGF0aWMgdm9pZCBDdXN0b21Bcmd1bWVudHMoYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBiKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDEwOyArK2kpCisgICAgZm9yIChpbnQgaiA9IDMyOyBqIDw9IDEwMjQqMTAyNDsgaiAqPSA4KQorICAgICAgYi0+QXJncyh7aSwgan0pOworfQorQkVOQ0hNQVJLKEJNX1NldEluc2VydCktPkFwcGx5KEN1c3RvbUFyZ3VtZW50cyk7CitgYGAKKworIyMjIENhbGN1bGF0ZSBhc3ltcHRvdGljIGNvbXBsZXhpdHkgKEJpZyBPKQorQXN5bXB0b3RpYyBjb21wbGV4aXR5IG1pZ2h0IGJlIGNhbGN1bGF0ZWQgZm9yIGEgZmFtaWx5IG9mIGJlbmNobWFya3MuIFRoZQorZm9sbG93aW5nIGNvZGUgd2lsbCBjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50IGZvciB0aGUgaGlnaC1vcmRlciB0ZXJtIGluIHRoZQorcnVubmluZyB0aW1lIGFuZCB0aGUgbm9ybWFsaXplZCByb290LW1lYW4gc3F1YXJlIGVycm9yIG9mIHN0cmluZyBjb21wYXJpc29uLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvbXBhcmUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzdHJpbmcgczEoc3RhdGUucmFuZ2UoMCksICctJyk7CisgIHN0ZDo6c3RyaW5nIHMyKHN0YXRlLnJhbmdlKDApLCAnLScpOworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKHMxLmNvbXBhcmUoczIpKTsKKyAgfQorICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7Cit9CitCRU5DSE1BUksoQk1fU3RyaW5nQ29tcGFyZSkKKyAgICAtPlJhbmdlTXVsdGlwbGllcigyKS0+UmFuZ2UoMTw8MTAsIDE8PDE4KS0+Q29tcGxleGl0eShiZW5jaG1hcms6Om9OKTsKK2BgYAorCitBcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGludm9jYXRpb24sIGFzeW1wdG90aWMgY29tcGxleGl0eSBtaWdodCBhbHNvIGJlCitjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX1N0cmluZ0NvbXBhcmUpCisgICAgLT5SYW5nZU11bHRpcGxpZXIoMiktPlJhbmdlKDE8PDEwLCAxPDwxOCktPkNvbXBsZXhpdHkoKTsKK2BgYAorCitUaGUgZm9sbG93aW5nIGNvZGUgd2lsbCBzcGVjaWZ5IGFzeW1wdG90aWMgY29tcGxleGl0eSB3aXRoIGEgbGFtYmRhIGZ1bmN0aW9uLAordGhhdCBtaWdodCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBoaWdoLW9yZGVyIHRlcm0gY2FsY3VsYXRpb24uCisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX1N0cmluZ0NvbXBhcmUpLT5SYW5nZU11bHRpcGxpZXIoMikKKyAgICAtPlJhbmdlKDE8PDEwLCAxPDwxOCktPkNvbXBsZXhpdHkoW10oaW50IG4pLT5kb3VibGV7cmV0dXJuIG47IH0pOworYGBgCisKKyMjIyBUZW1wbGF0ZWQgYmVuY2htYXJrcworVGVtcGxhdGVkIGJlbmNobWFya3Mgd29yayB0aGUgc2FtZSB3YXk6IFRoaXMgZXhhbXBsZSBwcm9kdWNlcyBhbmQgY29uc3VtZXMKK21lc3NhZ2VzIG9mIHNpemUgYHNpemVvZih2KWAgYHJhbmdlX3hgIHRpbWVzLiBJdCBhbHNvIG91dHB1dHMgdGhyb3VnaHB1dCBpbiB0aGUKK2Fic2VuY2Ugb2YgbXVsdGlwcm9ncmFtbWluZy4KKworYGBgYysrCit0ZW1wbGF0ZSA8Y2xhc3MgUT4gaW50IEJNX1NlcXVlbnRpYWwoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgUSBxOworICB0eXBlbmFtZSBROjp2YWx1ZV90eXBlIHY7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCBpID0gc3RhdGUucmFuZ2UoMCk7IGktLTsgKQorICAgICAgcS5wdXNoKHYpOworICAgIGZvciAoaW50IGUgPSBzdGF0ZS5yYW5nZSgwKTsgZS0tOyApCisgICAgICBxLldhaXQoJnYpOworICB9CisgIC8vIGFjdHVhbGx5IG1lc3NhZ2VzLCBub3QgYnl0ZXM6CisgIHN0YXRlLlNldEJ5dGVzUHJvY2Vzc2VkKAorICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGUuaXRlcmF0aW9ucygpKSpzdGF0ZS5yYW5nZSgwKSk7Cit9CitCRU5DSE1BUktfVEVNUExBVEUoQk1fU2VxdWVudGlhbCwgV2FpdFF1ZXVlPGludD4pLT5SYW5nZSgxPDwwLCAxPDwxMCk7CitgYGAKKworVGhyZWUgbWFjcm9zIGFyZSBwcm92aWRlZCBmb3IgYWRkaW5nIGJlbmNobWFyayB0ZW1wbGF0ZXMuCisKK2BgYGMrKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKGZ1bmMsIC4uLikgLy8gVGFrZXMgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzLgorI2Vsc2UgLy8gQysrIDwgQysrMTEKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKGZ1bmMsIGFyZzEpCisjZW5kaWYKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMShmdW5jLCBhcmcxKQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyKGZ1bmMsIGFyZzEsIGFyZzIpCitgYGAKKworIyMjIEEgRmFzdGVyIEtlZXBSdW5uaW5nIGxvb3AKKworSW4gQysrMTEgbW9kZSwgYSByYW5nZWQtYmFzZWQgZm9yIGxvb3Agc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0bwordGhlIGBLZWVwUnVubmluZ2AgbG9vcCBmb3IgcnVubmluZyB0aGUgYmVuY2htYXJrcy4gRm9yIGV4YW1wbGU6CisKK2BgYGMrKworc3RhdGljIHZvaWQgQk1fRmFzdChiZW5jaG1hcms6OlN0YXRlICZzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgRmFzdE9wZXJhdGlvbigpOworICB9Cit9CitCRU5DSE1BUksoQk1fRmFzdCk7CitgYGAKKworVGhlIHJlYXNvbiB0aGUgcmFuZ2VkLWZvciBsb29wIGlzIGZhc3RlciB0aGFuIHVzaW5nIGBLZWVwUnVubmluZ2AsIGlzCitiZWNhdXNlIGBLZWVwUnVubmluZ2AgcmVxdWlyZXMgYSBtZW1vcnkgbG9hZCBhbmQgc3RvcmUgb2YgdGhlIGl0ZXJhdGlvbiBjb3VudAorZXZlciBpdGVyYXRpb24sIHdoZXJlYXMgdGhlIHJhbmdlZC1mb3IgdmFyaWFudCBpcyBhYmxlIHRvIGtlZXAgdGhlIGl0ZXJhdGlvbiBjb3VudAoraW4gYSByZWdpc3Rlci4KKworRm9yIGV4YW1wbGUsIGFuIGVtcHR5IGlubmVyIGxvb3Agb2YgdXNpbmcgdGhlIHJhbmdlZC1iYXNlZCBmb3IgbWV0aG9kIGxvb2tzIGxpa2U6CisKK2BgYGFzbQorIyBMb29wIEluaXQKKyAgbW92IHJieCwgcXdvcmQgcHRyIFtyMTQgKyAxMDRdCisgIGNhbGwgYmVuY2htYXJrOjpTdGF0ZTo6U3RhcnRLZWVwUnVubmluZygpCisgIHRlc3QgcmJ4LCByYngKKyAgamUgLkxvb3BFbmQKKy5Mb29wSGVhZGVyOiAjID0+VGhpcyBJbm5lciBMb29wIEhlYWRlcjogRGVwdGg9MQorICBhZGQgcmJ4LCAtMQorICBqbmUgLkxvb3BIZWFkZXIKKy5Mb29wRW5kOgorYGBgCisKK0NvbXBhcmVkIHRvIGFuIGVtcHR5IGBLZWVwUnVubmluZ2AgbG9vcCwgd2hpY2ggbG9va3MgbGlrZToKKworYGBgYXNtCisuTG9vcEhlYWRlcjogIyBpbiBMb29wOiBIZWFkZXI9QkIwXzMgRGVwdGg9MQorICBjbXAgYnl0ZSBwdHIgW3JieF0sIDEKKyAgam5lIC5Mb29wSW5pdAorLkxvb3BCb2R5OiAjID0+VGhpcyBJbm5lciBMb29wIEhlYWRlcjogRGVwdGg9MQorICBtb3YgcmF4LCBxd29yZCBwdHIgW3JieCArIDhdCisgIGxlYSByY3gsIFtyYXggKyAxXQorICBtb3YgcXdvcmQgcHRyIFtyYnggKyA4XSwgcmN4CisgIGNtcCByYXgsIHF3b3JkIHB0ciBbcmJ4ICsgMTA0XQorICBqYiAuTG9vcEhlYWRlcgorICBqbXAgLkxvb3BFbmQKKy5Mb29wSW5pdDoKKyAgbW92IHJkaSwgcmJ4CisgIGNhbGwgYmVuY2htYXJrOjpTdGF0ZTo6U3RhcnRLZWVwUnVubmluZygpCisgIGptcCAuTG9vcEJvZHkKKy5Mb29wRW5kOgorYGBgCisKK1VubGVzcyBDKyswMyBjb21wYXRpYmlsaXR5IGlzIHJlcXVpcmVkLCB0aGUgcmFuZ2VkLWZvciB2YXJpYW50IG9mIHdyaXRpbmcKK3RoZSBiZW5jaG1hcmsgbG9vcCBzaG91bGQgYmUgcHJlZmVycmVkLiAgCisKKyMjIFBhc3NpbmcgYXJiaXRyYXJ5IGFyZ3VtZW50cyB0byBhIGJlbmNobWFyaworSW4gQysrMTEgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGEgYmVuY2htYXJrIHRoYXQgdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlcgorb2YgZXh0cmEgYXJndW1lbnRzLiBUaGUgYEJFTkNITUFSS19DQVBUVVJFKGZ1bmMsIHRlc3RfY2FzZV9uYW1lLCAuLi5hcmdzKWAKK21hY3JvIGNyZWF0ZXMgYSBiZW5jaG1hcmsgdGhhdCBpbnZva2VzIGBmdW5jYCAgd2l0aCB0aGUgYGJlbmNobWFyazo6U3RhdGVgIGFzCit0aGUgZmlyc3QgYXJndW1lbnQgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBgYXJncy4uLmAuCitUaGUgYHRlc3RfY2FzZV9uYW1lYCBpcyBhcHBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgYmVuY2htYXJrIGFuZAorc2hvdWxkIGRlc2NyaWJlIHRoZSB2YWx1ZXMgcGFzc2VkLgorCitgYGBjKysKK3RlbXBsYXRlIDxjbGFzcyAuLi5FeHRyYUFyZ3M+Cit2b2lkIEJNX3Rha2VzX2FyZ3MoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUsIEV4dHJhQXJncyYmLi4uIGV4dHJhX2FyZ3MpIHsKKyAgWy4uLl0KK30KKy8vIFJlZ2lzdGVycyBhIGJlbmNobWFyayBuYW1lZCAiQk1fdGFrZXNfYXJncy9pbnRfc3RyaW5nX3Rlc3QiIHRoYXQgcGFzc2VzCisvLyB0aGUgc3BlY2lmaWVkIHZhbHVlcyB0byBgZXh0cmFfYXJnc2AuCitCRU5DSE1BUktfQ0FQVFVSRShCTV90YWtlc19hcmdzLCBpbnRfc3RyaW5nX3Rlc3QsIDQyLCBzdGQ6OnN0cmluZygiYWJjIikpOworYGBgCitOb3RlIHRoYXQgZWxlbWVudHMgb2YgYC4uLmFyZ3NgIG1heSByZWZlciB0byBnbG9iYWwgdmFyaWFibGVzLiBVc2VycyBzaG91bGQKK2F2b2lkIG1vZGlmeWluZyBnbG9iYWwgc3RhdGUgaW5zaWRlIG9mIGEgYmVuY2htYXJrLgorCisjIyBVc2luZyBSZWdpc3RlckJlbmNobWFyayhuYW1lLCBmbiwgYXJncy4uLikKKworVGhlIGBSZWdpc3RlckJlbmNobWFyayhuYW1lLCBmdW5jLCBhcmdzLi4uKWAgZnVuY3Rpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUKK3dheSB0byBjcmVhdGUgYW5kIHJlZ2lzdGVyIGJlbmNobWFya3MuCitgUmVnaXN0ZXJCZW5jaG1hcmsobmFtZSwgZnVuYywgYXJncy4uLilgIGNyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIHJldHVybnMgYQorcG9pbnRlciB0byBhIG5ldyBiZW5jaG1hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGBuYW1lYCB0aGF0IGludm9rZXMKK2BmdW5jKHN0LCBhcmdzLi4uKWAgd2hlcmUgYHN0YCBpcyBhIGBiZW5jaG1hcms6OlN0YXRlYCBvYmplY3QuCisKK1VubGlrZSB0aGUgYEJFTkNITUFSS2AgcmVnaXN0cmF0aW9uIG1hY3Jvcywgd2hpY2ggY2FuIG9ubHkgYmUgdXNlZCBhdCB0aGUgZ2xvYmFsCitzY29wZSwgdGhlIGBSZWdpc3RlckJlbmNobWFya2AgY2FuIGJlIGNhbGxlZCBhbnl3aGVyZS4gVGhpcyBhbGxvd3MgZm9yCitiZW5jaG1hcmsgdGVzdHMgdG8gYmUgcmVnaXN0ZXJlZCBwcm9ncmFtbWF0aWNhbGx5LgorCitBZGRpdGlvbmFsbHkgYFJlZ2lzdGVyQmVuY2htYXJrYCBhbGxvd3MgYW55IGNhbGxhYmxlIG9iamVjdCB0byBiZSByZWdpc3RlcmVkCithcyBhIGJlbmNobWFyay4gSW5jbHVkaW5nIGNhcHR1cmluZyBsYW1iZGFzIGFuZCBmdW5jdGlvbiBvYmplY3RzLgorCitGb3IgRXhhbXBsZToKK2BgYGMrKworYXV0byBCTV90ZXN0ID0gW10oYmVuY2htYXJrOjpTdGF0ZSYgc3QsIGF1dG8gSW5wdXRzKSB7IC8qIC4uLiAqLyB9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgZm9yIChhdXRvJiB0ZXN0X2lucHV0IDogeyAvKiAuLi4gKi8gfSkKKyAgICAgIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsodGVzdF9pbnB1dC5uYW1lKCksIEJNX3Rlc3QsIHRlc3RfaW5wdXQpOworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKK30KK2BgYAorCisjIyMgTXVsdGl0aHJlYWRlZCBiZW5jaG1hcmtzCitJbiBhIG11bHRpdGhyZWFkZWQgdGVzdCAoYmVuY2htYXJrIGludm9rZWQgYnkgbXVsdGlwbGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseSksCitpdCBpcyBndWFyYW50ZWVkIHRoYXQgbm9uZSBvZiB0aGUgdGhyZWFkcyB3aWxsIHN0YXJ0IHVudGlsIGFsbCBoYXZlIHJlYWNoZWQKK3RoZSBzdGFydCBvZiB0aGUgYmVuY2htYXJrIGxvb3AsIGFuZCBhbGwgd2lsbCBoYXZlIGZpbmlzaGVkIGJlZm9yZSBhbnkgdGhyZWFkCitleGl0cyB0aGUgYmVuY2htYXJrIGxvb3AuIChUaGlzIGJlaGF2aW9yIGlzIGFsc28gcHJvdmlkZWQgYnkgdGhlIGBLZWVwUnVubmluZygpYAorQVBJKSBBcyBzdWNoLCBhbnkgZ2xvYmFsIHNldHVwIG9yIHRlYXJkb3duIGNhbiBiZSB3cmFwcGVkIGluIGEgY2hlY2sgYWdhaW5zdCB0aGUgdGhyZWFkCitpbmRleDoKKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9NdWx0aVRocmVhZGVkKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGlmIChzdGF0ZS50aHJlYWRfaW5kZXggPT0gMCkgeworICAgIC8vIFNldHVwIGNvZGUgaGVyZS4KKyAgfQorICBmb3IgKGF1dG8gXyA6IHN0YXRlKSB7CisgICAgLy8gUnVuIHRoZSB0ZXN0IGFzIG5vcm1hbC4KKyAgfQorICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAvLyBUZWFyZG93biBjb2RlIGhlcmUuCisgIH0KK30KK0JFTkNITUFSSyhCTV9NdWx0aVRocmVhZGVkKS0+VGhyZWFkcygyKTsKK2BgYAorCitJZiB0aGUgYmVuY2htYXJrZWQgY29kZSBpdHNlbGYgdXNlcyB0aHJlYWRzIGFuZCB5b3Ugd2FudCB0byBjb21wYXJlIGl0IHRvCitzaW5nbGUtdGhyZWFkZWQgY29kZSwgeW91IG1heSB3YW50IHRvIHVzZSByZWFsLXRpbWUgKCJ3YWxsY2xvY2siKSBtZWFzdXJlbWVudHMKK2ZvciBsYXRlbmN5IGNvbXBhcmlzb25zOgorCitgYGBjKysKK0JFTkNITUFSSyhCTV90ZXN0KS0+UmFuZ2UoOCwgODw8MTApLT5Vc2VSZWFsVGltZSgpOworYGBgCisKK1dpdGhvdXQgYFVzZVJlYWxUaW1lYCwgQ1BVIHRpbWUgaXMgdXNlZCBieSBkZWZhdWx0LgorCisKKyMjIE1hbnVhbCB0aW1pbmcKK0ZvciBiZW5jaG1hcmtpbmcgc29tZXRoaW5nIGZvciB3aGljaCBuZWl0aGVyIENQVSB0aW1lIG5vciByZWFsLXRpbWUgYXJlCitjb3JyZWN0IG9yIGFjY3VyYXRlIGVub3VnaCwgY29tcGxldGVseSBtYW51YWwgdGltaW5nIGlzIHN1cHBvcnRlZCB1c2luZwordGhlIGBVc2VNYW51YWxUaW1lYCBmdW5jdGlvbi4KKworV2hlbiBgVXNlTWFudWFsVGltZWAgaXMgdXNlZCwgdGhlIGJlbmNobWFya2VkIGNvZGUgbXVzdCBjYWxsCitgU2V0SXRlcmF0aW9uVGltZWAgb25jZSBwZXIgaXRlcmF0aW9uIG9mIHRoZSBiZW5jaG1hcmsgbG9vcCB0bworcmVwb3J0IHRoZSBtYW51YWxseSBtZWFzdXJlZCB0aW1lLgorCitBbiBleGFtcGxlIHVzZSBjYXNlIGZvciB0aGlzIGlzIGJlbmNobWFya2luZyBHUFUgZXhlY3V0aW9uIChlLmcuIE9wZW5DTAorb3IgQ1VEQSBrZXJuZWxzLCBPcGVuR0wgb3IgVnVsa2FuIG9yIERpcmVjdDNEIGRyYXcgY2FsbHMpLCB3aGljaCBjYW5ub3QKK2JlIGFjY3VyYXRlbHkgbWVhc3VyZWQgdXNpbmcgQ1BVIHRpbWUgb3IgcmVhbC10aW1lLiBJbnN0ZWFkLCB0aGV5IGNhbiBiZQorbWVhc3VyZWQgYWNjdXJhdGVseSB1c2luZyBhIGRlZGljYXRlZCBBUEksIGFuZCB0aGVzZSBtZWFzdXJlbWVudCByZXN1bHRzCitjYW4gYmUgcmVwb3J0ZWQgYmFjayB3aXRoIGBTZXRJdGVyYXRpb25UaW1lYC4KKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV9NYW51YWxUaW1pbmcoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgaW50IG1pY3Jvc2Vjb25kcyA9IHN0YXRlLnJhbmdlKDApOworICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pY3JvPiBzbGVlcF9kdXJhdGlvbiB7CisgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtaWNyb3NlY29uZHMpCisgIH07CisKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAvLyBTaW11bGF0ZSBzb21lIHVzZWZ1bCB3b3JrbG9hZCB3aXRoIGEgc2xlZXAKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc2xlZXBfZHVyYXRpb24pOworICAgIGF1dG8gZW5kICAgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKworICAgIGF1dG8gZWxhcHNlZF9zZWNvbmRzID0KKyAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+PigKKyAgICAgICAgZW5kIC0gc3RhcnQpOworCisgICAgc3RhdGUuU2V0SXRlcmF0aW9uVGltZShlbGFwc2VkX3NlY29uZHMuY291bnQoKSk7CisgIH0KK30KK0JFTkNITUFSSyhCTV9NYW51YWxUaW1pbmcpLT5SYW5nZSgxLCAxPDwxNyktPlVzZU1hbnVhbFRpbWUoKTsKK2BgYAorCisjIyMgUHJldmVudGluZyBvcHRpbWlzYXRpb24KK1RvIHByZXZlbnQgYSB2YWx1ZSBvciBleHByZXNzaW9uIGZyb20gYmVpbmcgb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyCit0aGUgYGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSguLi4pYCBhbmQgYGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpYAorZnVuY3Rpb25zIGNhbiBiZSB1c2VkLgorCitgYGBjKysKK3N0YXRpYyB2b2lkIEJNX3Rlc3QoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgaW50IHggPSAwOworICAgICAgZm9yIChpbnQgaT0wOyBpIDwgNjQ7ICsraSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoeCArPSBpKTsKKyAgICAgIH0KKyAgfQorfQorYGBgCisKK2BEb05vdE9wdGltaXplKDxleHByPilgIGZvcmNlcyB0aGUgICpyZXN1bHQqIG9mIGA8ZXhwcj5gIHRvIGJlIHN0b3JlZCBpbiBlaXRoZXIKK21lbW9yeSBvciBhIHJlZ2lzdGVyLiBGb3IgR05VIGJhc2VkIGNvbXBpbGVycyBpdCBhY3RzIGFzIHJlYWQvd3JpdGUgYmFycmllcgorZm9yIGdsb2JhbCBtZW1vcnkuIE1vcmUgc3BlY2lmaWNhbGx5IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZmx1c2ggcGVuZGluZword3JpdGVzIHRvIG1lbW9yeSBhbmQgcmVsb2FkIGFueSBvdGhlciB2YWx1ZXMgYXMgbmVjZXNzYXJ5LgorCitOb3RlIHRoYXQgYERvTm90T3B0aW1pemUoPGV4cHI+KWAgZG9lcyBub3QgcHJldmVudCBvcHRpbWl6YXRpb25zIG9uIGA8ZXhwcj5gCitpbiBhbnkgd2F5LiBgPGV4cHI+YCBtYXkgZXZlbiBiZSByZW1vdmVkIGVudGlyZWx5IHdoZW4gdGhlIHJlc3VsdCBpcyBhbHJlYWR5Citrbm93bi4gRm9yIGV4YW1wbGU6CisKK2BgYGMrKworICAvKiBFeGFtcGxlIDE6IGA8ZXhwcj5gIGlzIHJlbW92ZWQgZW50aXJlbHkuICovCisgIGludCBmb28oaW50IHgpIHsgcmV0dXJuIHggKyA0MjsgfQorICB3aGlsZSAoLi4uKSBEb05vdE9wdGltaXplKGZvbygwKSk7IC8vIE9wdGltaXplZCB0byBEb05vdE9wdGltaXplKDQyKTsKKworICAvKiAgRXhhbXBsZSAyOiBSZXN1bHQgb2YgJzxleHByPicgaXMgb25seSByZXVzZWQgKi8KKyAgaW50IGJhcihpbnQpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7CisgIHdoaWxlICguLi4pIERvTm90T3B0aW1pemUoYmFyKDApKTsgLy8gT3B0aW1pemVkIHRvOgorICAvLyBpbnQgX19yZXN1bHRfXyA9IGJhcigwKTsKKyAgLy8gd2hpbGUgKC4uLikgRG9Ob3RPcHRpbWl6ZShfX3Jlc3VsdF9fKTsKK2BgYAorCitUaGUgc2Vjb25kIHRvb2wgZm9yIHByZXZlbnRpbmcgb3B0aW1pemF0aW9ucyBpcyBgQ2xvYmJlck1lbW9yeSgpYC4gSW4gZXNzZW5jZQorYENsb2JiZXJNZW1vcnkoKWAgZm9yY2VzIHRoZSBjb21waWxlciB0byBwZXJmb3JtIGFsbCBwZW5kaW5nIHdyaXRlcyB0byBnbG9iYWwKK21lbW9yeS4gTWVtb3J5IG1hbmFnZWQgYnkgYmxvY2sgc2NvcGUgb2JqZWN0cyBtdXN0IGJlICJlc2NhcGVkIiB1c2luZworYERvTm90T3B0aW1pemUoLi4uKWAgYmVmb3JlIGl0IGNhbiBiZSBjbG9iYmVyZWQuIEluIHRoZSBiZWxvdyBleGFtcGxlCitgQ2xvYmJlck1lbW9yeSgpYCBwcmV2ZW50cyB0aGUgY2FsbCB0byBgdi5wdXNoX2JhY2soNDIpYCBmcm9tIGJlaW5nIG9wdGltaXplZAorYXdheS4KKworYGBgYysrCitzdGF0aWMgdm9pZCBCTV92ZWN0b3JfcHVzaF9iYWNrKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgICAgdi5yZXNlcnZlKDEpOworICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh2LmRhdGEoKSk7IC8vIEFsbG93IHYuZGF0YSgpIHRvIGJlIGNsb2JiZXJlZC4KKyAgICB2LnB1c2hfYmFjayg0Mik7CisgICAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7IC8vIEZvcmNlIDQyIHRvIGJlIHdyaXR0ZW4gdG8gbWVtb3J5LgorICB9Cit9CitgYGAKKworTm90ZSB0aGF0IGBDbG9iYmVyTWVtb3J5KClgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBHTlUgb3IgTVNWQyBiYXNlZCBjb21waWxlcnMuCisKKyMjIyBTZXQgdGltZSB1bml0IG1hbnVhbGx5CitJZiBhIGJlbmNobWFyayBydW5zIGEgZmV3IG1pbGxpc2Vjb25kcyBpdCBtYXkgYmUgaGFyZCB0byB2aXN1YWxseSBjb21wYXJlIHRoZQorbWVhc3VyZWQgdGltZXMsIHNpbmNlIHRoZSBvdXRwdXQgZGF0YSBpcyBnaXZlbiBpbiBuYW5vc2Vjb25kcyBwZXIgZGVmYXVsdC4gSW4KK29yZGVyIHRvIG1hbnVhbGx5IHNldCB0aGUgdGltZSB1bml0LCB5b3UgY2FuIHNwZWNpZnkgaXQgbWFudWFsbHk6CisKK2BgYGMrKworQkVOQ0hNQVJLKEJNX3Rlc3QpLT5Vbml0KGJlbmNobWFyazo6a01pbGxpc2Vjb25kKTsKK2BgYAorCisjIyBDb250cm9sbGluZyBudW1iZXIgb2YgaXRlcmF0aW9ucworSW4gYWxsIGNhc2VzLCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIHdoaWNoIHRoZSBiZW5jaG1hcmsgaXMgcnVuIGlzCitnb3Zlcm5lZCBieSB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJlbmNobWFyayB0YWtlcy4gQ29uY3JldGVseSwgdGhlIG51bWJlciBvZgoraXRlcmF0aW9ucyBpcyBhdCBsZWFzdCBvbmUsIG5vdCBtb3JlIHRoYW4gMWU5LCB1bnRpbCBDUFUgdGltZSBpcyBncmVhdGVyIHRoYW4KK3RoZSBtaW5pbXVtIHRpbWUsIG9yIHRoZSB3YWxsY2xvY2sgdGltZSBpcyA1eCBtaW5pbXVtIHRpbWUuIFRoZSBtaW5pbXVtIHRpbWUgaXMKK3NldCBhcyBhIGZsYWcgYC0tYmVuY2htYXJrX21pbl90aW1lYCBvciBwZXIgYmVuY2htYXJrIGJ5IGNhbGxpbmcgYE1pblRpbWVgIG9uCit0aGUgcmVnaXN0ZXJlZCBiZW5jaG1hcmsgb2JqZWN0LgorCisjIyBSZXBvcnRpbmcgdGhlIG1lYW4sIG1lZGlhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGJ5IHJlcGVhdGVkIGJlbmNobWFya3MKK0J5IGRlZmF1bHQgZWFjaCBiZW5jaG1hcmsgaXMgcnVuIG9uY2UgYW5kIHRoYXQgc2luZ2xlIHJlc3VsdCBpcyByZXBvcnRlZC4KK0hvd2V2ZXIgYmVuY2htYXJrcyBhcmUgb2Z0ZW4gbm9pc3kgYW5kIGEgc2luZ2xlIHJlc3VsdCBtYXkgbm90IGJlIHJlcHJlc2VudGF0aXZlCitvZiB0aGUgb3ZlcmFsbCBiZWhhdmlvci4gRm9yIHRoaXMgcmVhc29uIGl0J3MgcG9zc2libGUgdG8gcmVwZWF0ZWRseSByZXJ1biB0aGUKK2JlbmNobWFyay4KKworVGhlIG51bWJlciBvZiBydW5zIG9mIGVhY2ggYmVuY2htYXJrIGlzIHNwZWNpZmllZCBnbG9iYWxseSBieSB0aGUKK2AtLWJlbmNobWFya19yZXBldGl0aW9uc2AgZmxhZyBvciBvbiBhIHBlciBiZW5jaG1hcmsgYmFzaXMgYnkgY2FsbGluZworYFJlcGV0aXRpb25zYCBvbiB0aGUgcmVnaXN0ZXJlZCBiZW5jaG1hcmsgb2JqZWN0LiBXaGVuIGEgYmVuY2htYXJrIGlzIHJ1biBtb3JlCit0aGFuIG9uY2UgdGhlIG1lYW4sIG1lZGlhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBydW5zIHdpbGwgYmUgcmVwb3J0ZWQuCisKK0FkZGl0aW9uYWxseSB0aGUgYC0tYmVuY2htYXJrX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHk9e3RydWV8ZmFsc2V9YCBmbGFnIG9yCitgUmVwb3J0QWdncmVnYXRlc09ubHkoYm9vbClgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBob3cgcmVwZWF0ZWQgdGVzdHMKK2FyZSByZXBvcnRlZC4gQnkgZGVmYXVsdCB0aGUgcmVzdWx0IG9mIGVhY2ggcmVwZWF0ZWQgcnVuIGlzIHJlcG9ydGVkLiBXaGVuIHRoaXMKK29wdGlvbiBpcyBgdHJ1ZWAgb25seSB0aGUgbWVhbiwgbWVkaWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJ1bnMgaXMgcmVwb3J0ZWQuCitDYWxsaW5nIGBSZXBvcnRBZ2dyZWdhdGVzT25seShib29sKWAgb24gYSByZWdpc3RlcmVkIGJlbmNobWFyayBvYmplY3Qgb3ZlcnJpZGVzCit0aGUgdmFsdWUgb2YgdGhlIGZsYWcgZm9yIHRoYXQgYmVuY2htYXJrLgorCisjIyBVc2VyLWRlZmluZWQgc3RhdGlzdGljcyBmb3IgcmVwZWF0ZWQgYmVuY2htYXJrcworV2hpbGUgaGF2aW5nIG1lYW4sIG1lZGlhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIG5pY2UsIHRoaXMgbWF5IG5vdCBiZQorZW5vdWdoIGZvciBldmVyeW9uZS4gRm9yIGV4YW1wbGUgeW91IG1heSB3YW50IHRvIGtub3cgd2hhdCBpcyB0aGUgbGFyZ2VzdAorb2JzZXJ2YXRpb24sIGUuZy4gYmVjYXVzZSB5b3UgaGF2ZSBzb21lIHJlYWwtdGltZSBjb25zdHJhaW50cy4gVGhpcyBpcyBlYXN5LgorVGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgc3BlY2lmeSBhIGN1c3RvbSBzdGF0aXN0aWMgdG8gYmUgY2FsY3VsYXRlZCwgZGVmaW5lZAorYnkgYSBsYW1iZGEgZnVuY3Rpb24uCisKK2BgYGMrKwordm9pZCBCTV9zcGluX2VtcHR5KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHN0YXRlLnJhbmdlKDApOyArK3gpIHsKKyAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZSh4KTsKKyAgICB9CisgIH0KK30KKworQkVOQ0hNQVJLKEJNX3NwaW5fZW1wdHkpCisgIC0+Q29tcHV0ZVN0YXRpc3RpY3MoIm1heCIsIFtdKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpIC0+IGRvdWJsZSB7CisgICAgcmV0dXJuICooc3RkOjptYXhfZWxlbWVudChzdGQ6OmJlZ2luKHYpLCBzdGQ6OmVuZCh2KSkpOworICB9KQorICAtPkFyZyg1MTIpOworYGBgCisKKyMjIEZpeHR1cmVzCitGaXh0dXJlIHRlc3RzIGFyZSBjcmVhdGVkIGJ5CitmaXJzdCBkZWZpbmluZyBhIHR5cGUgdGhhdCBkZXJpdmVzIGZyb20gYDo6YmVuY2htYXJrOjpGaXh0dXJlYCBhbmQgdGhlbgorY3JlYXRpbmcvcmVnaXN0ZXJpbmcgdGhlIHRlc3RzIHVzaW5nIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCisqIGBCRU5DSE1BUktfRihDbGFzc05hbWUsIE1ldGhvZClgCisqIGBCRU5DSE1BUktfREVGSU5FX0YoQ2xhc3NOYW1lLCBNZXRob2QpYAorKiBgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQ2xhc3NOYW1lLCBNZXRob2QpYAorCitGb3IgRXhhbXBsZToKKworYGBgYysrCitjbGFzcyBNeUZpeHR1cmUgOiBwdWJsaWMgYmVuY2htYXJrOjpGaXh0dXJlIHt9OworCitCRU5DSE1BUktfRihNeUZpeHR1cmUsIEZvb1Rlc3QpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgICBmb3IgKGF1dG8gXyA6IHN0KSB7CisgICAgIC4uLgorICB9Cit9CisKK0JFTkNITUFSS19ERUZJTkVfRihNeUZpeHR1cmUsIEJhclRlc3QpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgICBmb3IgKGF1dG8gXyA6IHN0KSB7CisgICAgIC4uLgorICB9Cit9CisvKiBCYXJUZXN0IGlzIE5PVCByZWdpc3RlcmVkICovCitCRU5DSE1BUktfUkVHSVNURVJfRihNeUZpeHR1cmUsIEJhclRlc3QpLT5UaHJlYWRzKDIpOworLyogQmFyVGVzdCBpcyBub3cgcmVnaXN0ZXJlZCAqLworYGBgCisKKyMjIyBUZW1wbGF0ZWQgZml4dHVyZXMKK0Fsc28geW91IGNhbiBjcmVhdGUgdGVtcGxhdGVkIGZpeHR1cmUgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKKyogYEJFTkNITUFSS19URU1QTEFURV9GKENsYXNzTmFtZSwgTWV0aG9kLCAuLi4pYAorKiBgQkVOQ0hNQVJLX1RFTVBMQVRFX0RFRklORV9GKENsYXNzTmFtZSwgTWV0aG9kLCAuLi4pYAorCitGb3IgZXhhbXBsZToKK2BgYGMrKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIE15Rml4dHVyZSA6IHB1YmxpYyBiZW5jaG1hcms6OkZpeHR1cmUge307CisKK0JFTkNITUFSS19URU1QTEFURV9GKE15Rml4dHVyZSwgSW50VGVzdCwgaW50KShiZW5jaG1hcms6OlN0YXRlJiBzdCkgeworICAgZm9yIChhdXRvIF8gOiBzdCkgeworICAgICAuLi4KKyAgfQorfQorCitCRU5DSE1BUktfVEVNUExBVEVfREVGSU5FX0YoTXlGaXh0dXJlLCBEb3VibGVUZXN0LCBkb3VibGUpKGJlbmNobWFyazo6U3RhdGUmIHN0KSB7CisgICBmb3IgKGF1dG8gXyA6IHN0KSB7CisgICAgIC4uLgorICB9Cit9CisKK0JFTkNITUFSS19SRUdJU1RFUl9GKE15Rml4dHVyZSwgRG91YmxlVGVzdCktPlRocmVhZHMoMik7CitgYGAKKworIyMgVXNlci1kZWZpbmVkIGNvdW50ZXJzCisKK1lvdSBjYW4gYWRkIHlvdXIgb3duIGNvdW50ZXJzIHdpdGggdXNlci1kZWZpbmVkIG5hbWVzLiBUaGUgZXhhbXBsZSBiZWxvdword2lsbCBhZGQgY29sdW1ucyAiRm9vIiwgIkJhciIgYW5kICJCYXoiIGluIGl0cyBvdXRwdXQ6CisKK2BgYGMrKworc3RhdGljIHZvaWQgVXNlckNvdW50ZXJzRXhhbXBsZTEoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgZG91YmxlIG51bUZvb3MgPSAwLCBudW1CYXJzID0gMCwgbnVtQmF6cyA9IDA7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAvLyAuLi4gY291bnQgRm9vLEJhcixCYXogZXZlbnRzCisgIH0KKyAgc3RhdGUuY291bnRlcnNbIkZvbyJdID0gbnVtRm9vczsKKyAgc3RhdGUuY291bnRlcnNbIkJhciJdID0gbnVtQmFyczsKKyAgc3RhdGUuY291bnRlcnNbIkJheiJdID0gbnVtQmF6czsKK30KK2BgYAorCitUaGUgYHN0YXRlLmNvdW50ZXJzYCBvYmplY3QgaXMgYSBgc3RkOjptYXBgIHdpdGggYHN0ZDo6c3RyaW5nYCBrZXlzCithbmQgYENvdW50ZXJgIHZhbHVlcy4gVGhlIGxhdHRlciBpcyBhIGBkb3VibGVgLWxpa2UgY2xhc3MsIHZpYSBhbiBpbXBsaWNpdAorY29udmVyc2lvbiB0byBgZG91YmxlJmAuIFRodXMgeW91IGNhbiB1c2UgYWxsIG9mIHRoZSBzdGFuZGFyZCBhcml0aG1ldGljCithc3NpZ25tZW50IG9wZXJhdG9ycyAoYD0sKz0sLT0sKj0sLz1gKSB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGVhY2ggY291bnRlci4KKworSW4gbXVsdGl0aHJlYWRlZCBiZW5jaG1hcmtzLCBlYWNoIGNvdW50ZXIgaXMgc2V0IG9uIHRoZSBjYWxsaW5nIHRocmVhZCBvbmx5LgorV2hlbiB0aGUgYmVuY2htYXJrIGZpbmlzaGVzLCB0aGUgY291bnRlcnMgZnJvbSBlYWNoIHRocmVhZCB3aWxsIGJlIHN1bW1lZDsKK3RoZSByZXN1bHRpbmcgc3VtIGlzIHRoZSB2YWx1ZSB3aGljaCB3aWxsIGJlIHNob3duIGZvciB0aGUgYmVuY2htYXJrLgorCitUaGUgYENvdW50ZXJgIGNvbnN0cnVjdG9yIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnM6IHRoZSB2YWx1ZSBhcyBhIGBkb3VibGVgCithbmQgYSBiaXQgZmxhZyB3aGljaCBhbGxvd3MgeW91IHRvIHNob3cgY291bnRlcnMgYXMgcmF0ZXMgYW5kL29yIGFzCitwZXItdGhyZWFkIGF2ZXJhZ2VzOgorCitgYGBjKysKKyAgLy8gc2V0cyBhIHNpbXBsZSBjb3VudGVyCisgIHN0YXRlLmNvdW50ZXJzWyJGb28iXSA9IG51bUZvb3M7CisKKyAgLy8gU2V0IHRoZSBjb3VudGVyIGFzIGEgcmF0ZS4gSXQgd2lsbCBiZSBwcmVzZW50ZWQgZGl2aWRlZAorICAvLyBieSB0aGUgZHVyYXRpb24gb2YgdGhlIGJlbmNobWFyay4KKyAgc3RhdGUuY291bnRlcnNbIkZvb1JhdGUiXSA9IENvdW50ZXIobnVtRm9vcywgYmVuY2htYXJrOjpDb3VudGVyOjprSXNSYXRlKTsKKworICAvLyBTZXQgdGhlIGNvdW50ZXIgYXMgYSB0aHJlYWQtYXZlcmFnZSBxdWFudGl0eS4gSXQgd2lsbAorICAvLyBiZSBwcmVzZW50ZWQgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIHRocmVhZHMuCisgIHN0YXRlLmNvdW50ZXJzWyJGb29BdmciXSA9IENvdW50ZXIobnVtRm9vcywgYmVuY2htYXJrOjpDb3VudGVyOjprQXZnVGhyZWFkcyk7CisKKyAgLy8gVGhlcmUncyBhbHNvIGEgY29tYmluZWQgZmxhZzoKKyAgc3RhdGUuY291bnRlcnNbIkZvb0F2Z1JhdGUiXSA9IENvdW50ZXIobnVtRm9vcyxiZW5jaG1hcms6OkNvdW50ZXI6OmtBdmdUaHJlYWRzUmF0ZSk7CitgYGAKKworV2hlbiB5b3UncmUgY29tcGlsaW5nIGluIEMrKzExIG1vZGUgb3IgbGF0ZXIgeW91IGNhbiB1c2UgYGluc2VydCgpYCB3aXRoCitgc3RkOjppbml0aWFsaXplcl9saXN0YDoKKworYGBgYysrCisgIC8vIFdpdGggQysrMTEsIHRoaXMgY2FuIGJlIGRvbmU6CisgIHN0YXRlLmNvdW50ZXJzLmluc2VydCh7eyJGb28iLCBudW1Gb29zfSwgeyJCYXIiLCBudW1CYXJzfSwgeyJCYXoiLCBudW1CYXpzfX0pOworICAvLyAuLi4gaW5zdGVhZCBvZjoKKyAgc3RhdGUuY291bnRlcnNbIkZvbyJdID0gbnVtRm9vczsKKyAgc3RhdGUuY291bnRlcnNbIkJhciJdID0gbnVtQmFyczsKKyAgc3RhdGUuY291bnRlcnNbIkJheiJdID0gbnVtQmF6czsKK2BgYAorCisjIyMgQ291bnRlciByZXBvcnRpbmcKKworV2hlbiB1c2luZyB0aGUgY29uc29sZSByZXBvcnRlciwgYnkgZGVmYXVsdCwgdXNlciBjb3VudGVycyBhcmUgYXJlIHByaW50ZWQgYXQKK3RoZSBlbmQgYWZ0ZXIgdGhlIHRhYmxlLCB0aGUgc2FtZSB3YXkgYXMgYGBieXRlc19wcm9jZXNzZWRgYCBhbmQKK2BgaXRlbXNfcHJvY2Vzc2VkYGAuIFRoaXMgaXMgYmVzdCBmb3IgY2FzZXMgaW4gd2hpY2ggdGhlcmUgYXJlIGZldyBjb3VudGVycywKK29yIHdoZXJlIHRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGxpbmVzIHBlciBiZW5jaG1hcmsuIEhlcmUncyBhbiBleGFtcGxlIG9mCit0aGUgZGVmYXVsdCBvdXRwdXQ6CisKK2BgYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICBDUFUgSXRlcmF0aW9ucyBVc2VyQ291bnRlcnMuLi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczo4ICAgICAgMjI0OCBucyAgICAgIDEwMjc3IG5zICAgICAgNjg4MDggQmFyPTE2IEJhdD00MCBCYXo9MjQgRm9vPTgKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6MSAgICAgIDk3OTcgbnMgICAgICAgOTc4OCBucyAgICAgIDcxNTIzIEJhcj0yIEJhdD01IEJhej0zIEZvbz0xMDI0bQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoyICAgICAgNDkyNCBucyAgICAgICA5ODQyIG5zICAgICAgNzEwMzYgQmFyPTQgQmF0PTEwIEJhej02IEZvbz0yCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNTg5IG5zICAgICAgMTAyODQgbnMgICAgICA2ODAxMiBCYXI9OCBCYXQ9MjAgQmF6PTEyIEZvbz00CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjggICAgICAyMjEyIG5zICAgICAgMTAyODcgbnMgICAgICA2ODA0MCBCYXI9MTYgQmF0PTQwIEJhej0yNCBGb289OAorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoxNiAgICAgMTc4MiBucyAgICAgIDEwMjc4IG5zICAgICAgNjgxNDQgQmFyPTMyIEJhdD04MCBCYXo9NDggRm9vPTE2CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjMyICAgICAxMjkxIG5zICAgICAgMTAyOTYgbnMgICAgICA2ODI1NiBCYXI9NjQgQmF0PTE2MCBCYXo9OTYgRm9vPTMyCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNjE1IG5zICAgICAgMTAzMDcgbnMgICAgICA2ODA0MCBCYXI9OCBCYXQ9MjAgQmF6PTEyIEZvbz00CitCTV9GYWN0b3JpYWwgICAgICAgICAgICAgICAgICAgIDI2IG5zICAgICAgICAgMjYgbnMgICAyNjYwODk3OSA0MDMyMAorQk1fRmFjdG9yaWFsL3JlYWxfdGltZSAgICAgICAgICAyNiBucyAgICAgICAgIDI2IG5zICAgMjY1ODc5MzYgNDAzMjAKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvMSAgICAgICAgICAgMTYgbnMgICAgICAgICAxNiBucyAgIDQ1NzA0MjU1IDAKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvOCAgICAgICAgICAgNzMgbnMgICAgICAgICA3MyBucyAgICA5NTIwOTI3IDMuMjgzNzQKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvNjQgICAgICAgICA2MDkgbnMgICAgICAgIDYwOSBucyAgICAxMTQwNjQ3IDMuMTU3NDYKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvNTEyICAgICAgIDQ5MDAgbnMgICAgICAgNDkwMSBucyAgICAgMTQyNjk2IDMuMTQzNTUKK2BgYAorCitJZiB0aGlzIGRvZXNuJ3Qgc3VpdCB5b3UsIHlvdSBjYW4gcHJpbnQgZWFjaCBjb3VudGVyIGFzIGEgdGFibGUgY29sdW1uIGJ5CitwYXNzaW5nIHRoZSBmbGFnIGAtLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXRydWVgIHRvIHRoZSBiZW5jaG1hcmsKK2FwcGxpY2F0aW9uLiBUaGlzIGlzIGJlc3QgZm9yIGNhc2VzIGluIHdoaWNoIHRoZXJlIGFyZSBhIGxvdCBvZiBjb3VudGVycywgb3IKK2EgbG90IG9mIGxpbmVzIHBlciBpbmRpdmlkdWFsIGJlbmNobWFyay4gTm90ZSB0aGF0IHRoaXMgd2lsbCB0cmlnZ2VyIGEKK3JlcHJpbnRpbmcgb2YgdGhlIHRhYmxlIGhlYWRlciBhbnkgdGltZSB0aGUgY291bnRlciBzZXQgY2hhbmdlcyBiZXR3ZWVuCitpbmRpdmlkdWFsIGJlbmNobWFya3MuIEhlcmUncyBhbiBleGFtcGxlIG9mIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHdoZW4KK2AtLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXRydWVgIGlzIHBhc3NlZDoKKworYGBgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zICAgIEJhciAgIEJhdCAgIEJheiAgIEZvbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjggICAgICAyMTk4IG5zICAgICAgIDk5NTMgbnMgICAgICA3MDY4OCAgICAgMTYgICAgNDAgICAgMjQgICAgIDgKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6MSAgICAgIDk1MDQgbnMgICAgICAgOTUwNCBucyAgICAgIDczNzg3ICAgICAgMiAgICAgNSAgICAgMyAgICAgMQorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoyICAgICAgNDc3NSBucyAgICAgICA5NTUwIG5zICAgICAgNzI2MDYgICAgICA0ICAgIDEwICAgICA2ICAgICAyCitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjQgICAgICAyNTA4IG5zICAgICAgIDk5NTEgbnMgICAgICA3MDMzMiAgICAgIDggICAgMjAgICAgMTIgICAgIDQKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6OCAgICAgIDIwNTUgbnMgICAgICAgOTkzMyBucyAgICAgIDcwMzQ0ICAgICAxNiAgICA0MCAgICAyNCAgICAgOAorQk1fVXNlckNvdW50ZXIvdGhyZWFkczoxNiAgICAgMTYxMCBucyAgICAgICA5OTQ2IG5zICAgICAgNzA3MjAgICAgIDMyICAgIDgwICAgIDQ4ICAgIDE2CitCTV9Vc2VyQ291bnRlci90aHJlYWRzOjMyICAgICAxMTkyIG5zICAgICAgIDk5NDggbnMgICAgICA3MDQ5NiAgICAgNjQgICAxNjAgICAgOTYgICAgMzIKK0JNX1VzZXJDb3VudGVyL3RocmVhZHM6NCAgICAgIDI1MDYgbnMgICAgICAgOTk0OSBucyAgICAgIDcwMzMyICAgICAgOCAgICAyMCAgICAxMiAgICAgNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICAgIENQVSBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQk1fRmFjdG9yaWFsICAgICAgICAgICAgICAgICAgICAyNiBucyAgICAgICAgIDI2IG5zICAgMjYzOTIyNDUgNDAzMjAKK0JNX0ZhY3RvcmlhbC9yZWFsX3RpbWUgICAgICAgICAgMjYgbnMgICAgICAgICAyNiBucyAgIDI2NDk0MTA3IDQwMzIwCitCTV9DYWxjdWxhdGVQaVJhbmdlLzEgICAgICAgICAgIDE1IG5zICAgICAgICAgMTUgbnMgICA0NTU3MTU5NyAwCitCTV9DYWxjdWxhdGVQaVJhbmdlLzggICAgICAgICAgIDc0IG5zICAgICAgICAgNzQgbnMgICAgOTQ1MDIxMiAzLjI4Mzc0CitCTV9DYWxjdWxhdGVQaVJhbmdlLzY0ICAgICAgICAgNTk1IG5zICAgICAgICA1OTUgbnMgICAgMTE3MzkwMSAzLjE1NzQ2CitCTV9DYWxjdWxhdGVQaVJhbmdlLzUxMiAgICAgICA0NzUyIG5zICAgICAgIDQ3NTIgbnMgICAgIDE0NzM4MCAzLjE0MzU1CitCTV9DYWxjdWxhdGVQaVJhbmdlLzRrICAgICAgIDM3OTcwIG5zICAgICAgMzc5NzIgbnMgICAgICAxODQ1MyAzLjE0MTg0CitCTV9DYWxjdWxhdGVQaVJhbmdlLzMyayAgICAgMzAzNzMzIG5zICAgICAzMDM3NDQgbnMgICAgICAgMjMwNSAzLjE0MTYyCitCTV9DYWxjdWxhdGVQaVJhbmdlLzI1NmsgICAyNDM0MDk1IG5zICAgIDI0MzQxODYgbnMgICAgICAgIDI4OCAzLjE0MTYKK0JNX0NhbGN1bGF0ZVBpUmFuZ2UvMTAyNGsgIDk3MjExNDAgbnMgICAgOTcyMTQxMyBucyAgICAgICAgIDcxIDMuMTQxNTkKK0JNX0NhbGN1bGF0ZVBpL3RocmVhZHM6OCAgICAgIDIyNTUgbnMgICAgICAgOTk0MyBucyAgICAgIDcwOTM2CitgYGAKK05vdGUgYWJvdmUgdGhlIGFkZGl0aW9uYWwgaGVhZGVyIHByaW50ZWQgd2hlbiB0aGUgYmVuY2htYXJrIGNoYW5nZXMgZnJvbQorYGBCTV9Vc2VyQ291bnRlcmBgIHRvIGBgQk1fRmFjdG9yaWFsYGAuIFRoaXMgaXMgYmVjYXVzZSBgYEJNX0ZhY3RvcmlhbGBgIGRvZXMKK25vdCBoYXZlIHRoZSBzYW1lIGNvdW50ZXIgc2V0IGFzIGBgQk1fVXNlckNvdW50ZXJgYC4KKworIyMgRXhpdGluZyBCZW5jaG1hcmtzIGluIEVycm9yCisKK1doZW4gZXJyb3JzIGNhdXNlZCBieSBleHRlcm5hbCBpbmZsdWVuY2VzLCBzdWNoIGFzIGZpbGUgSS9PIGFuZCBuZXR3b3JrCitjb21tdW5pY2F0aW9uLCBvY2N1ciB3aXRoaW4gYSBiZW5jaG1hcmsgdGhlCitgU3RhdGU6OlNraXBXaXRoRXJyb3IoY29uc3QgY2hhciogbXNnKWAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGF0IHJ1bgorb2YgYmVuY2htYXJrIGFuZCByZXBvcnQgdGhlIGVycm9yLiBOb3RlIHRoYXQgb25seSBmdXR1cmUgaXRlcmF0aW9ucyBvZiB0aGUKK2BLZWVwUnVubmluZygpYCBhcmUgc2tpcHBlZC4gRm9yIHRoZSByYW5nZWQtZm9yIHZlcnNpb24gb2YgdGhlIGJlbmNobWFyayBsb29wCitVc2VycyBtdXN0IGV4cGxpY2l0bHkgZXhpdCB0aGUgbG9vcCwgb3RoZXJ3aXNlIGFsbCBpdGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkLgorVXNlcnMgbWF5IGV4cGxpY2l0bHkgcmV0dXJuIHRvIGV4aXQgdGhlIGJlbmNobWFyayBpbW1lZGlhdGVseS4KKworVGhlIGBTa2lwV2l0aEVycm9yKC4uLilgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIGF0IGFueSBwb2ludCB3aXRoaW4gdGhlIGJlbmNobWFyaywKK2luY2x1ZGluZyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBiZW5jaG1hcmsgbG9vcC4KKworRm9yIGV4YW1wbGU6CisKK2BgYGMrKworc3RhdGljIHZvaWQgQk1fdGVzdChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBhdXRvIHJlc291cmNlID0gR2V0UmVzb3VyY2UoKTsKKyAgaWYgKCFyZXNvdXJjZS5nb29kKCkpIHsKKyAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlJlc291cmNlIGlzIG5vdCBnb29kISIpOworICAgICAgLy8gS2VlcFJ1bm5pbmcoKSBsb29wIHdpbGwgbm90IGJlIGVudGVyZWQuCisgIH0KKyAgZm9yIChzdGF0ZS5LZWVwUnVubmluZygpKSB7CisgICAgICBhdXRvIGRhdGEgPSByZXNvdXJjZS5yZWFkX2RhdGEoKTsKKyAgICAgIGlmICghcmVzb3VyY2UuZ29vZCgpKSB7CisgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIkZhaWxlZCB0byByZWFkIGRhdGEhIik7CisgICAgICAgIGJyZWFrOyAvLyBOZWVkZWQgdG8gc2tpcCB0aGUgcmVzdCBvZiB0aGUgaXRlcmF0aW9uLgorICAgICB9CisgICAgIGRvX3N0dWZmKGRhdGEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEJNX3Rlc3RfcmFuZ2VkX2ZvKGJlbmNobWFyazo6U3RhdGUgJiBzdGF0ZSkgeworICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJ0ZXN0IHdpbGwgbm90IGJlIGVudGVyZWQiKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIkZhaWxlZCEiKTsKKyAgICBicmVhazsgLy8gUkVRVUlSRUQgdG8gcHJldmVudCBhbGwgZnVydGhlciBpdGVyYXRpb25zLgorICB9Cit9CitgYGAKKworIyMgUnVubmluZyBhIHN1YnNldCBvZiB0aGUgYmVuY2htYXJrcworCitUaGUgYC0tYmVuY2htYXJrX2ZpbHRlcj08cmVnZXg+YCBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb25seSBydW4gdGhlIGJlbmNobWFya3MKK3doaWNoIG1hdGNoIHRoZSBzcGVjaWZpZWQgYDxyZWdleD5gLiBGb3IgZXhhbXBsZToKKworYGBgYmFzaAorJCAuL3J1bl9iZW5jaG1hcmtzLnggLS1iZW5jaG1hcmtfZmlsdGVyPUJNX21lbWNweS8zMgorUnVuIG9uICgxIFggMjMwMCBNSHogQ1BVICkKKzIwMTYtMDYtMjUgMTk6MzQ6MjQKK0JlbmNobWFyayAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgQ1BVIEl0ZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JNX21lbWNweS8zMiAgICAgICAgICAxMSBucyAgICAgICAgIDExIG5zICAgNzk1NDU0NTUKK0JNX21lbWNweS8zMmsgICAgICAgMjE4MSBucyAgICAgICAyMTg1IG5zICAgICAzMjQwNzQKK0JNX21lbWNweS8zMiAgICAgICAgICAxMiBucyAgICAgICAgIDEyIG5zICAgNTQ2ODc1MDAKK0JNX21lbWNweS8zMmsgICAgICAgMTgzNCBucyAgICAgICAxODM3IG5zICAgICAzNTcxNDMKK2BgYAorCisKKyMjIE91dHB1dCBGb3JtYXRzCitUaGUgbGlicmFyeSBzdXBwb3J0cyBtdWx0aXBsZSBvdXRwdXQgZm9ybWF0cy4gVXNlIHRoZQorYC0tYmVuY2htYXJrX2Zvcm1hdD08Y29uc29sZXxqc29ufGNzdj5gIGZsYWcgdG8gc2V0IHRoZSBmb3JtYXQgdHlwZS4gYGNvbnNvbGVgCitpcyB0aGUgZGVmYXVsdCBmb3JtYXQuCisKK1RoZSBDb25zb2xlIGZvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBhIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4gQnkgZGVmYXVsdAordGhlIGZvcm1hdCBnZW5lcmF0ZXMgY29sb3Igb3V0cHV0LiBDb250ZXh0IGlzIG91dHB1dCBvbiBzdGRlcnIgYW5kIHRoZQordGFidWxhciBkYXRhIG9uIHN0ZG91dC4gRXhhbXBsZSB0YWJ1bGFyIG91dHB1dCBsb29rcyBsaWtlOgorYGBgCitCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZShucykgICAgQ1BVKG5zKSBJdGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCTV9TZXRJbnNlcnQvMTAyNC8xICAgICAgICAgICAgICAgICAgICAgICAgMjg5MjggICAgICAyOTM0OSAgICAgIDIzODUzICAxMzMuMDk3a0IvcyAgIDMzLjI3NDJrIGl0ZW1zL3MKK0JNX1NldEluc2VydC8xMDI0LzggICAgICAgICAgICAgICAgICAgICAgICAzMjA2NSAgICAgIDMyOTEzICAgICAgMjEzNzUgIDk0OS40ODdrQi9zICAgMjM3LjM3MmsgaXRlbXMvcworQk1fU2V0SW5zZXJ0LzEwMjQvMTAgICAgICAgICAgICAgICAgICAgICAgIDMzMTU3ICAgICAgMzM2NDggICAgICAyMTQzMSAgMS4xMzM2OU1CL3MgICAyOTAuMjI1ayBpdGVtcy9zCitgYGAKKworVGhlIEpTT04gZm9ybWF0IG91dHB1dHMgaHVtYW4gcmVhZGFibGUganNvbiBzcGxpdCBpbnRvIHR3byB0b3AgbGV2ZWwgYXR0cmlidXRlcy4KK1RoZSBgY29udGV4dGAgYXR0cmlidXRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gaW4gZ2VuZXJhbCwgaW5jbHVkaW5nCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgQ1BVIGFuZCB0aGUgZGF0ZS4KK1RoZSBgYmVuY2htYXJrc2AgYXR0cmlidXRlIGNvbnRhaW5zIGEgbGlzdCBvZiBldmVyIGJlbmNobWFyayBydW4uIEV4YW1wbGUganNvbgorb3V0cHV0IGxvb2tzIGxpa2U6CitgYGBqc29uCit7CisgICJjb250ZXh0IjogeworICAgICJkYXRlIjogIjIwMTUvMDMvMTctMTg6NDA6MjUiLAorICAgICJudW1fY3B1cyI6IDQwLAorICAgICJtaHpfcGVyX2NwdSI6IDI4MDEsCisgICAgImNwdV9zY2FsaW5nX2VuYWJsZWQiOiBmYWxzZSwKKyAgICAiYnVpbGRfdHlwZSI6ICJkZWJ1ZyIKKyAgfSwKKyAgImJlbmNobWFya3MiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fU2V0SW5zZXJ0LzEwMjQvMSIsCisgICAgICAiaXRlcmF0aW9ucyI6IDk0ODc3LAorICAgICAgInJlYWxfdGltZSI6IDI5Mjc1LAorICAgICAgImNwdV90aW1lIjogMjk4MzYsCisgICAgICAiYnl0ZXNfcGVyX3NlY29uZCI6IDEzNDA2NiwKKyAgICAgICJpdGVtc19wZXJfc2Vjb25kIjogMzM1MTYKKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIkJNX1NldEluc2VydC8xMDI0LzgiLAorICAgICAgIml0ZXJhdGlvbnMiOiAyMTYwOSwKKyAgICAgICJyZWFsX3RpbWUiOiAzMjMxNywKKyAgICAgICJjcHVfdGltZSI6IDMyNDI5LAorICAgICAgImJ5dGVzX3Blcl9zZWNvbmQiOiA5ODY3NzAsCisgICAgICAiaXRlbXNfcGVyX3NlY29uZCI6IDI0NjY5MworICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQk1fU2V0SW5zZXJ0LzEwMjQvMTAiLAorICAgICAgIml0ZXJhdGlvbnMiOiAyMTM5MywKKyAgICAgICJyZWFsX3RpbWUiOiAzMjcyNCwKKyAgICAgICJjcHVfdGltZSI6IDMzMzU1LAorICAgICAgImJ5dGVzX3Blcl9zZWNvbmQiOiAxMTk5MjI2LAorICAgICAgIml0ZW1zX3Blcl9zZWNvbmQiOiAyOTk4MDcKKyAgICB9CisgIF0KK30KK2BgYAorCitUaGUgQ1NWIGZvcm1hdCBvdXRwdXRzIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMuIFRoZSBgY29udGV4dGAgaXMgb3V0cHV0IG9uIHN0ZGVycgorYW5kIHRoZSBDU1YgaXRzZWxmIG9uIHN0ZG91dC4gRXhhbXBsZSBDU1Ygb3V0cHV0IGxvb2tzIGxpa2U6CitgYGAKK25hbWUsaXRlcmF0aW9ucyxyZWFsX3RpbWUsY3B1X3RpbWUsYnl0ZXNfcGVyX3NlY29uZCxpdGVtc19wZXJfc2Vjb25kLGxhYmVsCisiQk1fU2V0SW5zZXJ0LzEwMjQvMSIsNjU0NjUsMTc4OTAuNyw4NDA3LjQ1LDQ3NTc2OCwxMTg5NDIsCisiQk1fU2V0SW5zZXJ0LzEwMjQvOCIsMTE2NjA2LDE4ODEwLjEsOTc2Ni42NCwzLjI3NjQ2ZSswNiw4MTkxMTUsCisiQk1fU2V0SW5zZXJ0LzEwMjQvMTAiLDEwNjM2NSwxNzIzOC40LDg0MjEuNTMsNC43NDk3M2UrMDYsMS4xODc0M2UrMDYsCitgYGAKKworIyMgT3V0cHV0IEZpbGVzCitUaGUgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRoZSBvdXRwdXQgb2YgdGhlIGJlbmNobWFyayB0byBhIGZpbGUgc3BlY2lmaWVkCitieSBgLS1iZW5jaG1hcmtfb3V0PTxmaWxlbmFtZT5gLiBUaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgY2FuIGJlIHNwZWNpZmllZAordXNpbmcgYC0tYmVuY2htYXJrX291dF9mb3JtYXQ9e2pzb258Y29uc29sZXxjc3Z9YC4gU3BlY2lmeWluZworYC0tYmVuY2htYXJrX291dGAgZG9lcyBub3Qgc3VwcHJlc3MgdGhlIGNvbnNvbGUgb3V0cHV0LgorCisjIyBEZWJ1ZyB2cyBSZWxlYXNlCitCeSBkZWZhdWx0LCBiZW5jaG1hcmsgYnVpbGRzIGFzIGEgZGVidWcgbGlicmFyeS4gWW91IHdpbGwgc2VlIGEgd2FybmluZyBpbiB0aGUgb3V0cHV0IHdoZW4gdGhpcyBpcyB0aGUgY2FzZS4gVG8gYnVpbGQgaXQgYXMgYSByZWxlYXNlIGxpYnJhcnkgaW5zdGVhZCwgdXNlOgorCitgYGAKK2NtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCitgYGAKKworVG8gZW5hYmxlIGxpbmstdGltZSBvcHRpbWlzYXRpb24sIHVzZQorCitgYGAKK2NtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC1EQkVOQ0hNQVJLX0VOQUJMRV9MVE89dHJ1ZQorYGBgCisKK0lmIHlvdSBhcmUgdXNpbmcgZ2NjLCB5b3UgbWlnaHQgbmVlZCB0byBzZXQgYEdDQ19BUmAgYW5kIGBHQ0NfUkFOTElCYCBjbWFrZSBjYWNoZSB2YXJpYWJsZXMsIGlmIGF1dG9kZXRlY3Rpb24gZmFpbHMuCitJZiB5b3UgYXJlIHVzaW5nIGNsYW5nLCB5b3UgbWF5IG5lZWQgdG8gc2V0IGBMTFZNQVJfRVhFQ1VUQUJMRWAsIGBMTFZNTk1fRVhFQ1VUQUJMRWAgYW5kIGBMTFZNUkFOTElCX0VYRUNVVEFCTEVgIGNtYWtlIGNhY2hlIHZhcmlhYmxlcy4KKworIyMgTGlua2luZyBhZ2FpbnN0IHRoZSBsaWJyYXJ5CitXaGVuIHVzaW5nIGdjYywgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgYWdhaW5zdCBwdGhyZWFkIHRvIGF2b2lkIHJ1bnRpbWUgZXhjZXB0aW9ucy4KK1RoaXMgaXMgZHVlIHRvIGhvdyBnY2MgaW1wbGVtZW50cyBzdGQ6OnRocmVhZC4KK1NlZSBbaXNzdWUgIzY3XShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2JlbmNobWFyay9pc3N1ZXMvNjcpIGZvciBtb3JlIGRldGFpbHMuCisKKyMjIENvbXBpbGVyIFN1cHBvcnQKKworR29vZ2xlIEJlbmNobWFyayB1c2VzIEMrKzExIHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuIEFzIHN1Y2ggd2UgcmVxdWlyZQorYSBtb2Rlcm4gQysrIHRvb2xjaGFpbiwgYm90aCBjb21waWxlciBhbmQgc3RhbmRhcmQgbGlicmFyeS4KKworVGhlIGZvbGxvd2luZyBtaW5pbXVtIHZlcnNpb25zIGFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCBidWlsZCB0aGUgbGlicmFyeToKKworKiBHQ0MgNC44CisqIENsYW5nIDMuNAorKiBWaXN1YWwgU3R1ZGlvIDIwMTMKKyogSW50ZWwgMjAxNSBVcGRhdGUgMQorCitBbnl0aGluZyBvbGRlciAqbWF5KiB3b3JrLgorCitOb3RlOiBVc2luZyB0aGUgbGlicmFyeSBhbmQgaXRzIGhlYWRlcnMgaW4gQysrMDMgaXMgc3VwcG9ydGVkLiBDKysxMSBpcyBvbmx5CityZXF1aXJlZCB0byBidWlsZCB0aGUgbGlicmFyeS4KKworIyMgRGlzYWJsZSBDUFUgZnJlcXVlbmN5IHNjYWxpbmcKK0lmIHlvdSBzZWUgdGhpcyBlcnJvcjoKK2BgYAorKioqV0FSTklORyoqKiBDUFUgc2NhbGluZyBpcyBlbmFibGVkLCB0aGUgYmVuY2htYXJrIHJlYWwgdGltZSBtZWFzdXJlbWVudHMgbWF5IGJlIG5vaXN5IGFuZCB3aWxsIGluY3VyIGV4dHJhIG92ZXJoZWFkLgorYGBgCit5b3UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgd2hpbGUgcnVubmluZyB0aGUgYmVuY2htYXJrOgorYGBgYmFzaAorc3VkbyBjcHVwb3dlciBmcmVxdWVuY3ktc2V0IC0tZ292ZXJub3IgcGVyZm9ybWFuY2UKKy4vbXliZW5jaAorc3VkbyBjcHVwb3dlciBmcmVxdWVuY3ktc2V0IC0tZ292ZXJub3IgcG93ZXJzYXZlCitgYGAKKworIyBLbm93biBJc3N1ZXMKKworIyMjIFdpbmRvd3MKKworKiBVc2VycyBtdXN0IG1hbnVhbGx5IGxpbmsgYHNobHdhcGkubGliYC4gRmFpbHVyZSB0byBkbyBzbyBtYXkgcmVzdWx0CitpbiB1bnJlc29sdmVkIHN5bWJvbHMuCisKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvQWRkQ1hYQ29tcGlsZXJGbGFnLmNtYWtlIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9BZGRDWFhDb21waWxlckZsYWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNWYzZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvQWRkQ1hYQ29tcGlsZXJGbGFnLmNtYWtlCkBAIC0wLDAgKzEsNjQgQEAKKyMgLSBBZGRzIGEgY29tcGlsZXIgZmxhZyBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyCisjCisjIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhlIHN1cHBsaWVkIGNvbXBpbGVyIGZsYWcgaXMgc3VwcG9ydGVkIGFuZCB0aGVuCisjIGFkZHMgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsZXIgZmxhZ3MKKyMKKyMgIGFkZF9jeHhfY29tcGlsZXJfZmxhZyg8RkxBRz4gWzxWQVJJQU5UPl0pCisjCisjIC0gRXhhbXBsZQorIworIyBpbmNsdWRlKEFkZENYWENvbXBpbGVyRmxhZykKKyMgYWRkX2N4eF9jb21waWxlcl9mbGFnKC1XYWxsKQorIyBhZGRfY3h4X2NvbXBpbGVyX2ZsYWcoLW5vLXN0cmljdC1hbGlhc2luZyBSRUxFQVNFKQorIyBSZXF1aXJlcyBDTWFrZSAyLjYrCisKK2lmKF9fYWRkX2N4eF9jb21waWxlcl9mbGFnKQorICByZXR1cm4oKQorZW5kaWYoKQorc2V0KF9fYWRkX2N4eF9jb21waWxlcl9mbGFnIElOQ0xVREVEKQorCitpbmNsdWRlKENoZWNrQ1hYQ29tcGlsZXJGbGFnKQorCitmdW5jdGlvbihtYW5nbGVfY29tcGlsZXJfZmxhZyBGTEFHIE9VVFBVVCkKKyAgc3RyaW5nKFRPVVBQRVIgIkhBVkVfQ1hYX0ZMQUdfJHtGTEFHfSIgU0FOSVRJWkVEX0ZMQUcpCisgIHN0cmluZyhSRVBMQUNFICIrIiAiWCIgU0FOSVRJWkVEX0ZMQUcgJHtTQU5JVElaRURfRkxBR30pCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJbXkEtWmEtel8wLTldIiAiXyIgU0FOSVRJWkVEX0ZMQUcgJHtTQU5JVElaRURfRkxBR30pCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJfKyIgIl8iIFNBTklUSVpFRF9GTEFHICR7U0FOSVRJWkVEX0ZMQUd9KQorICBzZXQoJHtPVVRQVVR9ICIke1NBTklUSVpFRF9GTEFHfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24obWFuZ2xlX2NvbXBpbGVyX2ZsYWcpCisKK2Z1bmN0aW9uKGFkZF9jeHhfY29tcGlsZXJfZmxhZyBGTEFHKQorICBtYW5nbGVfY29tcGlsZXJfZmxhZygiJHtGTEFHfSIgTUFOR0xFRF9GTEFHKQorICBzZXQoT0xEX0NNQUtFX1JFUVVJUkVEX0ZMQUdTICIke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtDTUFLRV9SRVFVSVJFRF9GTEFHU30gJHtGTEFHfSIpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCIke0ZMQUd9IiAke01BTkdMRURfRkxBR30pCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtPTERfQ01BS0VfUkVRVUlSRURfRkxBR1N9IikKKyAgaWYoJHtNQU5HTEVEX0ZMQUd9KQorICAgIHNldChWQVJJQU5UICR7QVJHVjF9KQorICAgIGlmKEFSR1YxKQorICAgICAgc3RyaW5nKFRPVVBQRVIgIl8ke1ZBUklBTlR9IiBWQVJJQU5UKQorICAgIGVuZGlmKCkKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTJHtWQVJJQU5UfSAiJHtDTUFLRV9DWFhfRkxBR1Mke1ZBUklBTlR9fSAke0JFTkNITUFSS19DWFhfRkxBR1Mke1ZBUklBTlR9fSAke0ZMQUd9IiBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworZnVuY3Rpb24oYWRkX3JlcXVpcmVkX2N4eF9jb21waWxlcl9mbGFnIEZMQUcpCisgIG1hbmdsZV9jb21waWxlcl9mbGFnKCIke0ZMQUd9IiBNQU5HTEVEX0ZMQUcpCisgIHNldChPTERfQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7Q01BS0VfUkVRVUlSRURfRkxBR1N9IikKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSAke0ZMQUd9IikKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIiR7RkxBR30iICR7TUFOR0xFRF9GTEFHfSkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke09MRF9DTUFLRV9SRVFVSVJFRF9GTEFHU30iKQorICBpZigke01BTkdMRURfRkxBR30pCisgICAgc2V0KFZBUklBTlQgJHtBUkdWMX0pCisgICAgaWYoQVJHVjEpCisgICAgICBzdHJpbmcoVE9VUFBFUiAiXyR7VkFSSUFOVH0iIFZBUklBTlQpCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1Mke1ZBUklBTlR9ICIke0NNQUtFX0NYWF9GTEFHUyR7VkFSSUFOVH19ICR7RkxBR30iIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAke0ZMQUd9IiBQQVJFTlRfU0NPUEUpCisgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30gJHtGTEFHfSIgUEFSRU5UX1NDT1BFKQorICAgIHNldChDTUFLRV9NT0RVTEVfTElOS0VSX0ZMQUdTICIke0NNQUtFX01PRFVMRV9MSU5LRVJfRkxBR1N9ICR7RkxBR30iIFBBUkVOVF9TQ09QRSkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIiR7Q01BS0VfUkVRVUlSRURfRkxBR1N9ICR7RkxBR30iIFBBUkVOVF9TQ09QRSkKKyAgZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiUmVxdWlyZWQgZmxhZyAnJHtGTEFHfScgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIiKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0NYWEZlYXR1cmVDaGVjay5jbWFrZSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvQ1hYRmVhdHVyZUNoZWNrLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYTgyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0NYWEZlYXR1cmVDaGVjay5jbWFrZQpAQCAtMCwwICsxLDYyIEBACisjIC0gQ29tcGlsZSBhbmQgcnVuIGNvZGUgdG8gY2hlY2sgZm9yIEMrKyBmZWF0dXJlcworIworIyBUaGlzIGZ1bmN0aW9ucyBjb21waWxlcyBhIHNvdXJjZSBmaWxlIHVuZGVyIHRoZSBgY21ha2VgIGZvbGRlcgorIyBhbmQgYWRkcyB0aGUgY29ycmVzcG9uZGluZyBgSEFWRV9bRklMRU5BTUVdYCBmbGFnIHRvIHRoZSBDTWFrZQorIyBlbnZpcm9ubWVudAorIworIyAgY3h4X2ZlYXR1cmVfY2hlY2soPEZMQUc+IFs8VkFSSUFOVD5dKQorIworIyAtIEV4YW1wbGUKKyMKKyMgaW5jbHVkZShDWFhGZWF0dXJlQ2hlY2spCisjIGN4eF9mZWF0dXJlX2NoZWNrKFNURF9SRUdFWCkKKyMgUmVxdWlyZXMgQ01ha2UgMi44LjEyKworCitpZihfX2N4eF9mZWF0dXJlX2NoZWNrKQorICByZXR1cm4oKQorZW5kaWYoKQorc2V0KF9fY3h4X2ZlYXR1cmVfY2hlY2sgSU5DTFVERUQpCisKK2Z1bmN0aW9uKGN4eF9mZWF0dXJlX2NoZWNrIEZJTEUpCisgIHN0cmluZyhUT0xPV0VSICR7RklMRX0gRklMRSkKKyAgc3RyaW5nKFRPVVBQRVIgJHtGSUxFfSBWQVIpCisgIHN0cmluZyhUT1VQUEVSICJIQVZFXyR7VkFSfSIgRkVBVFVSRSkKKyAgaWYgKERFRklORUQgSEFWRV8ke1ZBUn0pCisgICAgc2V0KEhBVkVfJHtWQVJ9IDEgUEFSRU5UX1NDT1BFKQorICAgIGFkZF9kZWZpbml0aW9ucygtREhBVkVfJHtWQVJ9KQorICAgIHJldHVybigpCisgIGVuZGlmKCkKKworICBtZXNzYWdlKCItLSBQZXJmb3JtaW5nIFRlc3QgJHtGRUFUVVJFfSIpCisgIGlmKENNQUtFX0NST1NTQ09NUElMSU5HKQorICAgIHRyeV9jb21waWxlKENPTVBJTEVfJHtGRUFUVVJFfQorICAgICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvJHtGSUxFfS5jcHAKKyAgICAgICAgICAgIENNQUtFX0ZMQUdTICR7QkVOQ0hNQVJLX0NYWF9MSU5LRVJfRkxBR1N9CisgICAgICAgICAgICBMSU5LX0xJQlJBUklFUyAke0JFTkNITUFSS19DWFhfTElCUkFSSUVTfSkKKyAgICBpZihDT01QSUxFXyR7RkVBVFVSRX0pCisgICAgICBtZXNzYWdlKFdBUk5JTkcKKyAgICAgICAgICAgICJJZiB5b3Ugc2VlIGJ1aWxkIGZhaWx1cmVzIGR1ZSB0byBjcm9zcyBjb21waWxhdGlvbiwgdHJ5IHNldHRpbmcgSEFWRV8ke1ZBUn0gdG8gMCIpCisgICAgICBzZXQoUlVOXyR7RkVBVFVSRX0gMCkKKyAgICBlbHNlKCkKKyAgICAgIHNldChSVU5fJHtGRUFUVVJFfSAxKQorICAgIGVuZGlmKCkKKyAgZWxzZSgpCisgICAgbWVzc2FnZSgiLS0gUGVyZm9ybWluZyBUZXN0ICR7RkVBVFVSRX0iKQorICAgIHRyeV9ydW4oUlVOXyR7RkVBVFVSRX0gQ09NUElMRV8ke0ZFQVRVUkV9CisgICAgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS8ke0ZJTEV9LmNwcAorICAgICAgICAgICAgQ01BS0VfRkxBR1MgJHtCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHU30KKyAgICAgICAgICAgIExJTktfTElCUkFSSUVTICR7QkVOQ0hNQVJLX0NYWF9MSUJSQVJJRVN9KQorICBlbmRpZigpCisKKyAgaWYoUlVOXyR7RkVBVFVSRX0gRVFVQUwgMCkKKyAgICBtZXNzYWdlKCItLSBQZXJmb3JtaW5nIFRlc3QgJHtGRUFUVVJFfSAtLSBzdWNjZXNzIikKKyAgICBzZXQoSEFWRV8ke1ZBUn0gMSBQQVJFTlRfU0NPUEUpCisgICAgYWRkX2RlZmluaXRpb25zKC1ESEFWRV8ke1ZBUn0pCisgIGVsc2UoKQorICAgIGlmKE5PVCBDT01QSUxFXyR7RkVBVFVSRX0pCisgICAgICBtZXNzYWdlKCItLSBQZXJmb3JtaW5nIFRlc3QgJHtGRUFUVVJFfSAtLSBmYWlsZWQgdG8gY29tcGlsZSIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKCItLSBQZXJmb3JtaW5nIFRlc3QgJHtGRUFUVVJFfSAtLSBjb21waWxlZCBidXQgZmFpbGVkIHRvIHJ1biIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0NvbmZpZy5jbWFrZS5pbiBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvQ29uZmlnLmNtYWtlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTI1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0NvbmZpZy5jbWFrZS5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlKCIke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L0B0YXJnZXRzX2V4cG9ydF9uYW1lQC5jbWFrZSIpCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0dldEdpdFZlcnNpb24uY21ha2UgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0dldEdpdFZlcnNpb24uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkOTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvR2V0R2l0VmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDUxIEBACisjIC0gUmV0dXJucyBhIHZlcnNpb24gc3RyaW5nIGZyb20gR2l0IHRhZ3MKKyMKKyMgVGhpcyBmdW5jdGlvbiBpbnNwZWN0cyB0aGUgYW5ub3RhdGVkIGdpdCB0YWdzIGZvciB0aGUgcHJvamVjdCBhbmQgcmV0dXJucyBhIHN0cmluZworIyBpbnRvIGEgQ01ha2UgdmFyaWFibGUKKyMKKyMgIGdldF9naXRfdmVyc2lvbig8dmFyPikKKyMKKyMgLSBFeGFtcGxlCisjCisjIGluY2x1ZGUoR2V0R2l0VmVyc2lvbikKKyMgZ2V0X2dpdF92ZXJzaW9uKEdJVF9WRVJTSU9OKQorIworIyBSZXF1aXJlcyBDTWFrZSAyLjguMTErCitmaW5kX3BhY2thZ2UoR2l0KQorCitpZihfX2dldF9naXRfdmVyc2lvbikKKyAgcmV0dXJuKCkKK2VuZGlmKCkKK3NldChfX2dldF9naXRfdmVyc2lvbiBJTkNMVURFRCkKKworZnVuY3Rpb24oZ2V0X2dpdF92ZXJzaW9uIHZhcikKKyAgaWYoR0lUX0VYRUNVVEFCTEUpCisgICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0dJVF9FWEVDVVRBQkxFfSBkZXNjcmliZSAtLW1hdGNoICJ2WzAtOV0qLlswLTldKi5bMC05XSoiIC0tYWJicmV2PTgKKyAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgc3RhdHVzCisgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdJVF9WRVJTSU9OCisgICAgICAgICAgRVJST1JfUVVJRVQpCisgICAgICBpZigke3N0YXR1c30pCisgICAgICAgICAgc2V0KEdJVF9WRVJTSU9OICJ2MC4wLjAiKQorICAgICAgZWxzZSgpCisgICAgICAgICAgc3RyaW5nKFNUUklQICR7R0lUX1ZFUlNJT059IEdJVF9WRVJTSU9OKQorICAgICAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICItWzAtOV0rLWciICItIiBHSVRfVkVSU0lPTiAke0dJVF9WRVJTSU9OfSkKKyAgICAgIGVuZGlmKCkKKworICAgICAgIyBXb3JrIG91dCBpZiB0aGUgcmVwb3NpdG9yeSBpcyBkaXJ0eQorICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtHSVRfRVhFQ1VUQUJMRX0gdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorICAgICAgICAgIE9VVFBVVF9RVUlFVAorICAgICAgICAgIEVSUk9SX1FVSUVUKQorICAgICAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtHSVRfRVhFQ1VUQUJMRX0gZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEIC0tCisgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdJVF9ESUZGX0lOREVYCisgICAgICAgICAgRVJST1JfUVVJRVQpCisgICAgICBzdHJpbmcoQ09NUEFSRSBOT1RFUVVBTCAiJHtHSVRfRElGRl9JTkRFWH0iICIiIEdJVF9ESVJUWSkKKyAgICAgIGlmICgke0dJVF9ESVJUWX0pCisgICAgICAgICAgc2V0KEdJVF9WRVJTSU9OICIke0dJVF9WRVJTSU9OfS1kaXJ0eSIpCisgICAgICBlbmRpZigpCisgIGVsc2UoKQorICAgICAgc2V0KEdJVF9WRVJTSU9OICJ2MC4wLjAiKQorICBlbmRpZigpCisKKyAgbWVzc2FnZSgiLS0gZ2l0IFZlcnNpb246ICR7R0lUX1ZFUlNJT059IikKKyAgc2V0KCR7dmFyfSAke0dJVF9WRVJTSU9OfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL0hhbmRsZUdUZXN0LmNtYWtlIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9IYW5kbGVHVGVzdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ZmYzRjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9IYW5kbGVHVGVzdC5jbWFrZQpAQCAtMCwwICsxLDc5IEBACisKK21hY3JvKHNwbGl0X2xpc3QgbGlzdG5hbWUpCisgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgJHtsaXN0bmFtZX0gIiR7JHtsaXN0bmFtZX19IikKK2VuZG1hY3JvKCkKKworbWFjcm8oYnVpbGRfZXh0ZXJuYWxfZ3Rlc3QpCisgIGluY2x1ZGUoRXh0ZXJuYWxQcm9qZWN0KQorICBzZXQoR1RFU1RfRkxBR1MgIiIpCisgIGlmIChCRU5DSE1BUktfVVNFX0xJQkNYWCkKKyAgICBpZiAoIiR7Q01BS0VfQ1hYX0NPTVBJTEVSX0lEfSIgU1RSRVFVQUwgIkNsYW5nIikKKyAgICAgIGxpc3QoQVBQRU5EIEdURVNUX0ZMQUdTIC1zdGRsaWI9bGliYysrKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShXQVJOSU5HICJVbnN1cHBvcnRlZCBjb21waWxlciAoJHtDTUFLRV9DWFhfQ09NUElMRVJ9KSB3aGVuIHVzaW5nIGxpYmMrKyIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIGlmIChCRU5DSE1BUktfQlVJTERfMzJfQklUUykKKyAgICBsaXN0KEFQUEVORCBHVEVTVF9GTEFHUyAtbTMyKQorICBlbmRpZigpCisgIGlmIChOT1QgIiR7Q01BS0VfQ1hYX0ZMQUdTfSIgU1RSRVFVQUwgIiIpCisgICAgbGlzdChBUFBFTkQgR1RFU1RfRkxBR1MgJHtDTUFLRV9DWFhfRkxBR1N9KQorICBlbmRpZigpCisgIHN0cmluZyhUT1VQUEVSICIke0NNQUtFX0JVSUxEX1RZUEV9IiBHVEVTVF9CVUlMRF9UWVBFKQorICBpZiAoIiR7R1RFU1RfQlVJTERfVFlQRX0iIFNUUkVRVUFMICJDT1ZFUkFHRSIpCisgICAgc2V0KEdURVNUX0JVSUxEX1RZUEUgIkRFQlVHIikKKyAgZW5kaWYoKQorICBzcGxpdF9saXN0KEdURVNUX0ZMQUdTKQorICBFeHRlcm5hbFByb2plY3RfQWRkKGdvb2dsZXRlc3QKKyAgICAgIEVYQ0xVREVfRlJPTV9BTEwgT04KKyAgICAgIEdJVF9SRVBPU0lUT1JZIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xldGVzdC5naXQKKyAgICAgIEdJVF9UQUcgbWFzdGVyCisgICAgICBQUkVGSVggIiR7Q01BS0VfQklOQVJZX0RJUn0vZ29vZ2xldGVzdCIKKyAgICAgIElOU1RBTExfRElSICIke0NNQUtFX0JJTkFSWV9ESVJ9L2dvb2dsZXRlc3QiCisgICAgICBDTUFLRV9DQUNIRV9BUkdTCisgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRTpTVFJJTkc9JHtHVEVTVF9CVUlMRF9UWVBFfQorICAgICAgICAtRENNQUtFX0NfQ09NUElMRVI6U1RSSU5HPSR7Q01BS0VfQ19DT01QSUxFUn0KKyAgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI6U1RSSU5HPSR7Q01BS0VfQ1hYX0NPTVBJTEVSfQorICAgICAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYOlBBVEg9PElOU1RBTExfRElSPgorICAgICAgICAtRENNQUtFX0NYWF9GTEFHUzpTVFJJTkc9JHtHVEVTVF9GTEFHU30KKyAgICAgICAgLURndGVzdF9mb3JjZV9zaGFyZWRfY3J0OkJPT0w9T04KKyAgICAgICkKKworICBFeHRlcm5hbFByb2plY3RfR2V0X1Byb3BlcnR5KGdvb2dsZXRlc3QgaW5zdGFsbF9kaXIpCisKKyAgYWRkX2xpYnJhcnkoZ3Rlc3QgVU5LTk9XTiBJTVBPUlRFRCkKKyAgYWRkX2xpYnJhcnkoZ3Rlc3RfbWFpbiBVTktOT1dOIElNUE9SVEVEKQorCisgIHNldChMSUJfU1VGRklYICIke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0iKQorICBzZXQoTElCX1BSRUZJWCAiJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9QUkVGSVh9IikKKworICBpZigiJHtHVEVTVF9CVUlMRF9UWVBFfSIgU1RSRVFVQUwgIkRFQlVHIikKKyAgICBzZXQoTElCX1NVRkZJWCAiZCR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSIpCisgIGVuZGlmKCkKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2luc3RhbGxfZGlyfS9pbmNsdWRlKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZ3Rlc3QgUFJPUEVSVElFUworICAgIElNUE9SVEVEX0xPQ0FUSU9OICR7aW5zdGFsbF9kaXJ9L2xpYi8ke0xJQl9QUkVGSVh9Z3Rlc3Qke0xJQl9TVUZGSVh9CisgICAgSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVMgJHtpbnN0YWxsX2Rpcn0vaW5jbHVkZQorICApCisgIHNldF90YXJnZXRfcHJvcGVydGllcyhndGVzdF9tYWluIFBST1BFUlRJRVMKKyAgICBJTVBPUlRFRF9MT0NBVElPTiAke2luc3RhbGxfZGlyfS9saWIvJHtMSUJfUFJFRklYfWd0ZXN0X21haW4ke0xJQl9TVUZGSVh9CisgICAgSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVMgJHtpbnN0YWxsX2Rpcn0vaW5jbHVkZQorICApCisgIGFkZF9kZXBlbmRlbmNpZXMoZ3Rlc3QgZ29vZ2xldGVzdCkKKyAgYWRkX2RlcGVuZGVuY2llcyhndGVzdF9tYWluIGdvb2dsZXRlc3QpCisgIHNldChHVEVTVF9CT1RIX0xJQlJBUklFUyBndGVzdCBndGVzdF9tYWluKQorICAjc2V0KEdURVNUX0lOQ0xVREVfRElSUyAke2luc3RhbGxfZGlyfS9pbmNsdWRlKQorZW5kbWFjcm8oYnVpbGRfZXh0ZXJuYWxfZ3Rlc3QpCisKK2lmIChCRU5DSE1BUktfRU5BQkxFX0dURVNUX1RFU1RTKQorICBpZiAoSVNfRElSRUNUT1JZICR7Q01BS0VfU09VUkNFX0RJUn0vZ29vZ2xldGVzdCkKKyAgICBzZXQoSU5TVEFMTF9HVEVTVCBPRkYgQ0FDSEUgSU5URVJOQUwgIiIpCisgICAgc2V0KElOU1RBTExfR01PQ0sgT0ZGIENBQ0hFIElOVEVSTkFMICIiKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9TT1VSQ0VfRElSfS9nb29nbGV0ZXN0KQorICAgIHNldChHVEVTVF9CT1RIX0xJQlJBUklFUyBndGVzdCBndGVzdF9tYWluKQorICBlbHNlaWYoQkVOQ0hNQVJLX0RPV05MT0FEX0RFUEVOREVOQ0lFUykKKyAgICBidWlsZF9leHRlcm5hbF9ndGVzdCgpCisgIGVsc2UoKQorICAgIGZpbmRfcGFja2FnZShHVGVzdCBSRVFVSVJFRCkKKyAgZW5kaWYoKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9Nb2R1bGVzL0ZpbmRMTFZNQXIuY21ha2UgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL01vZHVsZXMvRmluZExMVk1Bci5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ2OTgxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9Nb2R1bGVzL0ZpbmRMTFZNQXIuY21ha2UKQEAgLTAsMCArMSwxNiBAQAoraW5jbHVkZShGZWF0dXJlU3VtbWFyeSkKKworZmluZF9wcm9ncmFtKExMVk1BUl9FWEVDVVRBQkxFCisgIE5BTUVTIGxsdm0tYXIKKyAgRE9DICJUaGUgbGx2bS1hciBleGVjdXRhYmxlIgorICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoTExWTUFyCisgIERFRkFVTFRfTVNHCisgIExMVk1BUl9FWEVDVVRBQkxFKQorCitTRVRfUEFDS0FHRV9QUk9QRVJUSUVTKExMVk1BciBQUk9QRVJUSUVTCisgIFVSTCBodHRwczovL2xsdm0ub3JnL2RvY3MvQ29tbWFuZEd1aWRlL2xsdm0tYXIuaHRtbAorICBERVNDUklQVElPTiAiY3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMiCispCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL01vZHVsZXMvRmluZExMVk1ObS5jbWFrZSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTU5tLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjQzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL01vZHVsZXMvRmluZExMVk1ObS5jbWFrZQpAQCAtMCwwICsxLDE2IEBACitpbmNsdWRlKEZlYXR1cmVTdW1tYXJ5KQorCitmaW5kX3Byb2dyYW0oTExWTU5NX0VYRUNVVEFCTEUKKyAgTkFNRVMgbGx2bS1ubQorICBET0MgIlRoZSBsbHZtLW5tIGV4ZWN1dGFibGUiCisgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhMTFZNTm0KKyAgREVGQVVMVF9NU0cKKyAgTExWTU5NX0VYRUNVVEFCTEUpCisKK1NFVF9QQUNLQUdFX1BST1BFUlRJRVMoTExWTU5tIFBST1BFUlRJRVMKKyAgVVJMIGh0dHBzOi8vbGx2bS5vcmcvZG9jcy9Db21tYW5kR3VpZGUvbGx2bS1ubS5odG1sCisgIERFU0NSSVBUSU9OICJsaXN0IExMVk0gYml0Y29kZSBhbmQgb2JqZWN0IGZpbGXigJlzIHN5bWJvbCB0YWJsZSIKKykKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTVJhbkxpYi5jbWFrZSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvTW9kdWxlcy9GaW5kTExWTVJhbkxpYi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUzZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9Nb2R1bGVzL0ZpbmRMTFZNUmFuTGliLmNtYWtlCkBAIC0wLDAgKzEsMTUgQEAKK2luY2x1ZGUoRmVhdHVyZVN1bW1hcnkpCisKK2ZpbmRfcHJvZ3JhbShMTFZNUkFOTElCX0VYRUNVVEFCTEUKKyAgTkFNRVMgbGx2bS1yYW5saWIKKyAgRE9DICJUaGUgbGx2bS1yYW5saWIgZXhlY3V0YWJsZSIKKyAgKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKExMVk1SYW5MaWIKKyAgREVGQVVMVF9NU0cKKyAgTExWTVJBTkxJQl9FWEVDVVRBQkxFKQorCitTRVRfUEFDS0FHRV9QUk9QRVJUSUVTKExMVk1SYW5MaWIgUFJPUEVSVElFUworICBERVNDUklQVElPTiAiZ2VuZXJhdGUgaW5kZXggZm9yIExMVk0gYXJjaGl2ZSIKKykKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvYmVuY2htYXJrLnBjLmluIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9iZW5jaG1hcmsucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4NGJmZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvYmVuY2htYXJrLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AQ01BS0VfSU5TVEFMTF9QUkVGSVhACitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IEBQUk9KRUNUX05BTUVACitEZXNjcmlwdGlvbjogR29vZ2xlIG1pY3JvYmVuY2htYXJrIGZyYW1ld29yaworVmVyc2lvbjogQFZFUlNJT05ACisKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sYmVuY2htYXJrCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9nbnVfcG9zaXhfcmVnZXguY3BwIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9nbnVfcG9zaXhfcmVnZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjkxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL2dudV9wb3NpeF9yZWdleC5jcHAKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPGdudXJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgoraW50IG1haW4oKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9ICJ0ZXN0MDE1OSI7CisgIHJlZ2V4X3QgcmU7CisgIGludCBlYyA9IHJlZ2NvbXAoJnJlLCAiXlthLXpdK1swLTldKyQiLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOworICBpZiAoZWMgIT0gMCkgeworICAgIHJldHVybiBlYzsKKyAgfQorICByZXR1cm4gcmVnZXhlYygmcmUsIHN0ci5jX3N0cigpLCAwLCBudWxscHRyLCAwKSA/IC0xIDogMDsKK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9sbHZtLXRvb2xjaGFpbi5jbWFrZSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvbGx2bS10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxMTllNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvbGx2bS10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSw4IEBACitmaW5kX3BhY2thZ2UoTExWTUFyIFJFUVVJUkVEKQorc2V0KENNQUtFX0FSICIke0xMVk1BUl9FWEVDVVRBQkxFfSIgQ0FDSEUgRklMRVBBVEggIiIgRk9SQ0UpCisKK2ZpbmRfcGFja2FnZShMTFZNTm0gUkVRVUlSRUQpCitzZXQoQ01BS0VfTk0gIiR7TExWTU5NX0VYRUNVVEFCTEV9IiBDQUNIRSBGSUxFUEFUSCAiIiBGT1JDRSkKKworZmluZF9wYWNrYWdlKExMVk1SYW5MaWIgUkVRVUlSRUQpCitzZXQoQ01BS0VfUkFOTElCICIke0xMVk1SQU5MSUJfRVhFQ1VUQUJMRX0iIENBQ0hFIEZJTEVQQVRIICIiIEZPUkNFKQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9wb3NpeF9yZWdleC5jcHAgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL3Bvc2l4X3JlZ2V4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZkYzYyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9wb3NpeF9yZWdleC5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgoraW50IG1haW4oKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9ICJ0ZXN0MDE1OSI7CisgIHJlZ2V4X3QgcmU7CisgIGludCBlYyA9IHJlZ2NvbXAoJnJlLCAiXlthLXpdK1swLTldKyQiLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOworICBpZiAoZWMgIT0gMCkgeworICAgIHJldHVybiBlYzsKKyAgfQorICBpbnQgcmV0ID0gcmVnZXhlYygmcmUsIHN0ci5jX3N0cigpLCAwLCBudWxscHRyLCAwKSA/IC0xIDogMDsKKyAgcmVnZnJlZSgmcmUpOworICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL3N0ZF9yZWdleC5jcHAgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL3N0ZF9yZWdleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2ZjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2Uvc3RkX3JlZ2V4LmNwcApAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8cmVnZXg+CisjaW5jbHVkZSA8c3RyaW5nPgoraW50IG1haW4oKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0ciA9ICJ0ZXN0MDE1OSI7CisgIHN0ZDo6cmVnZXggcmU7CisgIHJlID0gc3RkOjpyZWdleCgiXlthLXpdK1swLTldKyQiLAorICAgICAgIHN0ZDo6cmVnZXhfY29uc3RhbnRzOjpleHRlbmRlZCB8IHN0ZDo6cmVnZXhfY29uc3RhbnRzOjpub3N1YnMpOworICByZXR1cm4gc3RkOjpyZWdleF9zZWFyY2goc3RyLCByZSkgPyAwIDogLTE7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2Uvc3RlYWR5X2Nsb2NrLmNwcCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2Uvc3RlYWR5X2Nsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ1MGQxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9jbWFrZS9zdGVhZHlfY2xvY2suY3BwCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPGNocm9ubz4KKworaW50IG1haW4oKSB7CisgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrIENsb2NrOworICAgIENsb2NrOjp0aW1lX3BvaW50IHRwID0gQ2xvY2s6Om5vdygpOworICAgICgodm9pZCl0cCk7Cit9CmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL3RocmVhZF9zYWZldHlfYXR0cmlidXRlcy5jcHAgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL2NtYWtlL3RocmVhZF9zYWZldHlfYXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNjFiYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvY21ha2UvdGhyZWFkX3NhZmV0eV9hdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDQgQEAKKyNkZWZpbmUgSEFWRV9USFJFQURfU0FGRVRZX0FUVFJJQlVURVMKKyNpbmNsdWRlICIuLi9zcmMvbXV0ZXguaCIKKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9pbmNsdWRlL2JlbmNobWFyay9iZW5jaG1hcmsuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwY2JjMQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvaW5jbHVkZS9iZW5jaG1hcmsvYmVuY2htYXJrLmgKQEAgLTAsMCArMSwxMzg5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBTdXBwb3J0IGZvciByZWdpc3RlcmluZyBiZW5jaG1hcmtzIGZvciBmdW5jdGlvbnMuCisKKy8qIEV4YW1wbGUgdXNhZ2U6CisvLyBEZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBjb2RlIHRvIGJlIG1lYXN1cmVkIGEKKy8vIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXM6CitzdGF0aWMgdm9pZCBCTV9TdHJpbmdDcmVhdGlvbihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBmb3IgKGF1dG8gXyA6IHN0YXRlKQorICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZzsKK30KKworLy8gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGFzIGEgYmVuY2htYXJrCitCRU5DSE1BUksoQk1fU3RyaW5nQ3JlYXRpb24pOworCisvLyBEZWZpbmUgYW5vdGhlciBiZW5jaG1hcmsKK3N0YXRpYyB2b2lkIEJNX1N0cmluZ0NvcHkoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgc3RkOjpzdHJpbmcgeCA9ICJoZWxsbyI7CisgIGZvciAoYXV0byBfIDogc3RhdGUpCisgICAgc3RkOjpzdHJpbmcgY29weSh4KTsKK30KK0JFTkNITUFSSyhCTV9TdHJpbmdDb3B5KTsKKworLy8gQXVnbWVudCB0aGUgbWFpbigpIHByb2dyYW0gdG8gaW52b2tlIGJlbmNobWFya3MgaWYgc3BlY2lmaWVkCisvLyB2aWEgdGhlIC0tYmVuY2htYXJrcyBjb21tYW5kIGxpbmUgZmxhZy4gIEUuZy4sCisvLyAgICAgICBteV91bml0dGVzdCAtLWJlbmNobWFya19maWx0ZXI9YWxsCisvLyAgICAgICBteV91bml0dGVzdCAtLWJlbmNobWFya19maWx0ZXI9Qk1fU3RyaW5nQ3JlYXRpb24KKy8vICAgICAgIG15X3VuaXR0ZXN0IC0tYmVuY2htYXJrX2ZpbHRlcj1TdHJpbmcKKy8vICAgICAgIG15X3VuaXR0ZXN0IC0tYmVuY2htYXJrX2ZpbHRlcj0nQ29weXxDcmVhdGlvbicKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBiZW5jaG1hcms6OkluaXRpYWxpemUoJmFyZ2MsIGFyZ3YpOworICBiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNvbWV0aW1lcyBhIGZhbWlseSBvZiBtaWNyb2JlbmNobWFya3MgY2FuIGJlIGltcGxlbWVudGVkIHdpdGgKKy8vIGp1c3Qgb25lIHJvdXRpbmUgdGhhdCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCB0byBzcGVjaWZ5IHdoaWNoCisvLyBvbmUgb2YgdGhlIGZhbWlseSBvZiBiZW5jaG1hcmtzIHRvIHJ1bi4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCisvLyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgbWljcm9iZW5jaG1hcmtzIGZvciBtZWFzdXJpbmcgdGhlIHNwZWVkCisvLyBvZiBtZW1jcHkoKSBjYWxscyBvZiBkaWZmZXJlbnQgbGVuZ3RoczoKKworc3RhdGljIHZvaWQgQk1fbWVtY3B5KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIGNoYXIqIHNyYyA9IG5ldyBjaGFyW3N0YXRlLnJhbmdlKDApXTsgY2hhciogZHN0ID0gbmV3IGNoYXJbc3RhdGUucmFuZ2UoMCldOworICBtZW1zZXQoc3JjLCAneCcsIHN0YXRlLnJhbmdlKDApKTsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHN0YXRlLnJhbmdlKDApKTsKKyAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoaW50NjRfdChzdGF0ZS5pdGVyYXRpb25zKCkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdChzdGF0ZS5yYW5nZSgwKSkpOworICBkZWxldGVbXSBzcmM7IGRlbGV0ZVtdIGRzdDsKK30KK0JFTkNITUFSSyhCTV9tZW1jcHkpLT5BcmcoOCktPkFyZyg2NCktPkFyZyg1MTIpLT5BcmcoMTw8MTApLT5BcmcoODw8MTApOworCisvLyBUaGUgcHJlY2VkaW5nIGNvZGUgaXMgcXVpdGUgcmVwZXRpdGl2ZSwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZQorLy8gZm9sbG93aW5nIHNob3J0LWhhbmQuICBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gd2lsbCBwaWNrIGEgZmV3CisvLyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBhbmQgd2lsbCBnZW5lcmF0ZSBhCisvLyBtaWNyb2JlbmNobWFyayBmb3IgZWFjaCBzdWNoIGFyZ3VtZW50LgorQkVOQ0hNQVJLKEJNX21lbWNweSktPlJhbmdlKDgsIDg8PDEwKTsKKworLy8gWW91IG1pZ2h0IGhhdmUgYSBtaWNyb2JlbmNobWFyayB0aGF0IGRlcGVuZHMgb24gdHdvIGlucHV0cy4gIEZvcgorLy8gZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgYSBmYW1pbHkgb2YgbWljcm9iZW5jaG1hcmtzIGZvcgorLy8gbWVhc3VyaW5nIHRoZSBzcGVlZCBvZiBzZXQgaW5zZXJ0aW9uLgorc3RhdGljIHZvaWQgQk1fU2V0SW5zZXJ0KGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgIHNldDxpbnQ+IGRhdGE7CisgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICBzdGF0ZS5QYXVzZVRpbWluZygpOworICAgIGRhdGEgPSBDb25zdHJ1Y3RSYW5kb21TZXQoc3RhdGUucmFuZ2UoMCkpOworICAgIHN0YXRlLlJlc3VtZVRpbWluZygpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3RhdGUucmFuZ2UoMSk7ICsraikKKyAgICAgIGRhdGEuaW5zZXJ0KFJhbmRvbU51bWJlcigpKTsKKyAgfQorfQorQkVOQ0hNQVJLKEJNX1NldEluc2VydCkKKyAgIC0+QXJncyh7MTw8MTAsIDEyOH0pCisgICAtPkFyZ3MoezI8PDEwLCAxMjh9KQorICAgLT5BcmdzKHs0PDwxMCwgMTI4fSkKKyAgIC0+QXJncyh7ODw8MTAsIDEyOH0pCisgICAtPkFyZ3MoezE8PDEwLCA1MTJ9KQorICAgLT5BcmdzKHsyPDwxMCwgNTEyfSkKKyAgIC0+QXJncyh7NDw8MTAsIDUxMn0pCisgICAtPkFyZ3Moezg8PDEwLCA1MTJ9KTsKKworLy8gVGhlIHByZWNlZGluZyBjb2RlIGlzIHF1aXRlIHJlcGV0aXRpdmUsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorLy8gdGhlIGZvbGxvd2luZyBzaG9ydC1oYW5kLiAgVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIHBpY2sgYSBmZXcKKy8vIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBpbiB0aGUgcHJvZHVjdCBvZiB0aGUgdHdvIHNwZWNpZmllZCByYW5nZXMKKy8vIGFuZCB3aWxsIGdlbmVyYXRlIGEgbWljcm9iZW5jaG1hcmsgZm9yIGVhY2ggc3VjaCBwYWlyLgorQkVOQ0hNQVJLKEJNX1NldEluc2VydCktPlJhbmdlcyh7ezE8PDEwLCA4PDwxMH0sIHsxMjgsIDUxMn19KTsKKworLy8gRm9yIG1vcmUgY29tcGxleCBwYXR0ZXJucyBvZiBpbnB1dHMsIHBhc3NpbmcgYSBjdXN0b20gZnVuY3Rpb24KKy8vIHRvIEFwcGx5IGFsbG93cyBwcm9ncmFtbWF0aWMgc3BlY2lmaWNhdGlvbiBvZiBhbgorLy8gYXJiaXRyYXJ5IHNldCBvZiBhcmd1bWVudHMgdG8gcnVuIHRoZSBtaWNyb2JlbmNobWFyayBvbi4KKy8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBlbnVtZXJhdGVzIGEgZGVuc2UgcmFuZ2Ugb24KKy8vIG9uZSBwYXJhbWV0ZXIsIGFuZCBhIHNwYXJzZSByYW5nZSBvbiB0aGUgc2Vjb25kLgorc3RhdGljIHZvaWQgQ3VzdG9tQXJndW1lbnRzKGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyayogYikgeworICBmb3IgKGludCBpID0gMDsgaSA8PSAxMDsgKytpKQorICAgIGZvciAoaW50IGogPSAzMjsgaiA8PSAxMDI0KjEwMjQ7IGogKj0gOCkKKyAgICAgIGItPkFyZ3Moe2ksIGp9KTsKK30KK0JFTkNITUFSSyhCTV9TZXRJbnNlcnQpLT5BcHBseShDdXN0b21Bcmd1bWVudHMpOworCisvLyBUZW1wbGF0ZWQgbWljcm9iZW5jaG1hcmtzIHdvcmsgdGhlIHNhbWUgd2F5OgorLy8gUHJvZHVjZSB0aGVuIGNvbnN1bWUgJ3NpemUnIG1lc3NhZ2VzICdpdGVycycgdGltZXMKKy8vIE1lYXN1cmVzIHRocm91Z2hwdXQgaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwcm9ncmFtbWluZy4KK3RlbXBsYXRlIDxjbGFzcyBRPiBpbnQgQk1fU2VxdWVudGlhbChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBRIHE7CisgIHR5cGVuYW1lIFE6OnZhbHVlX3R5cGUgdjsKKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIGZvciAoaW50IGkgPSBzdGF0ZS5yYW5nZSgwKTsgaS0tOyApCisgICAgICBxLnB1c2godik7CisgICAgZm9yIChpbnQgZSA9IHN0YXRlLnJhbmdlKDApOyBlLS07ICkKKyAgICAgIHEuV2FpdCgmdik7CisgIH0KKyAgLy8gYWN0dWFsbHkgbWVzc2FnZXMsIG5vdCBieXRlczoKKyAgc3RhdGUuU2V0Qnl0ZXNQcm9jZXNzZWQoCisgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0ZS5pdGVyYXRpb25zKCkpKnN0YXRlLnJhbmdlKDApKTsKK30KK0JFTkNITUFSS19URU1QTEFURShCTV9TZXF1ZW50aWFsLCBXYWl0UXVldWU8aW50PiktPlJhbmdlKDE8PDAsIDE8PDEwKTsKKworVXNlIGBCZW5jaG1hcms6Ok1pblRpbWUoZG91YmxlIHQpYCB0byBzZXQgdGhlIG1pbmltdW0gdGltZSB1c2VkIHRvIHJ1biB0aGUKK2JlbmNobWFyay4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBgYmVuY2htYXJrX21pbl90aW1lYCBmbGFnLgorCit2b2lkIEJNX3Rlc3QoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAuLi4gYm9keSAuLi4KK30KK0JFTkNITUFSSyhCTV90ZXN0KS0+TWluVGltZSgyLjApOyAvLyBSdW4gZm9yIGF0IGxlYXN0IDIgc2Vjb25kcy4KKworSW4gYSBtdWx0aXRocmVhZGVkIHRlc3QsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBub25lIG9mIHRoZSB0aHJlYWRzIHdpbGwgc3RhcnQKK3VudGlsIGFsbCBoYXZlIHJlYWNoZWQgdGhlIGxvb3Agc3RhcnQsIGFuZCBhbGwgd2lsbCBoYXZlIGZpbmlzaGVkIGJlZm9yZSBhbnkKK3RocmVhZCBleGl0cyB0aGUgbG9vcCBib2R5LiBBcyBzdWNoLCBhbnkgZ2xvYmFsIHNldHVwIG9yIHRlYXJkb3duIHlvdSB3YW50IHRvCitkbyBjYW4gYmUgd3JhcHBlZCBpbiBhIGNoZWNrIGFnYWluc3QgdGhlIHRocmVhZCBpbmRleDoKKworc3RhdGljIHZvaWQgQk1fTXVsdGlUaHJlYWRlZChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAvLyBTZXR1cCBjb2RlIGhlcmUuCisgIH0KKyAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgIC8vIFJ1biB0aGUgdGVzdCBhcyBub3JtYWwuCisgIH0KKyAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgLy8gVGVhcmRvd24gY29kZSBoZXJlLgorICB9Cit9CitCRU5DSE1BUksoQk1fTXVsdGlUaHJlYWRlZCktPlRocmVhZHMoNCk7CisKKworSWYgYSBiZW5jaG1hcmsgcnVucyBhIGZldyBtaWxsaXNlY29uZHMgaXQgbWF5IGJlIGhhcmQgdG8gdmlzdWFsbHkgY29tcGFyZSB0aGUKK21lYXN1cmVkIHRpbWVzLCBzaW5jZSB0aGUgb3V0cHV0IGRhdGEgaXMgZ2l2ZW4gaW4gbmFub3NlY29uZHMgcGVyIGRlZmF1bHQuIEluCitvcmRlciB0byBtYW51YWxseSBzZXQgdGhlIHRpbWUgdW5pdCwgeW91IGNhbiBzcGVjaWZ5IGl0IG1hbnVhbGx5OgorCitCRU5DSE1BUksoQk1fdGVzdCktPlVuaXQoYmVuY2htYXJrOjprTWlsbGlzZWNvbmQpOworKi8KKworI2lmbmRlZiBCRU5DSE1BUktfQkVOQ0hNQVJLX0hfCisjZGVmaW5lIEJFTkNITUFSS19CRU5DSE1BUktfSF8KKworCisvLyBUaGUgX01TVkNfTEFORyBjaGVjayBzaG91bGQgZGV0ZWN0IFZpc3VhbCBTdHVkaW8gMjAxNSBVcGRhdGUgMyBhbmQgbmV3ZXIuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCB8fCAoZGVmaW5lZChfTVNWQ19MQU5HKSAmJiBfTVNWQ19MQU5HID49IDIwMTEwM0wpCisjZGVmaW5lIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX0hBU19DWFgxMSkKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSA8aW50cmluLmg+IC8vIGZvciBfUmVhZFdyaXRlQmFycmllcgorI2VuZGlmCisKKyNpZm5kZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorI2RlZmluZSBCRU5DSE1BUktfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFR5cGVOYW1lKSBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZU5hbWUmIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFR5cGVOYW1lKSBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgICAgICAgICAgIFwKKyAgVHlwZU5hbWUmIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEJFTkNITUFSS19VTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNkZWZpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVCBub2V4Y2VwdAorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFRfT1AoeCkgbm9leGNlcHQoeCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgQkVOQ0hNQVJLX1VOVVNFRAorI2RlZmluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBfX2ZvcmNlaW5saW5lCisjaWYgX01TQ19WRVIgPj0gMTkwMAorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFQgbm9leGNlcHQKKyNkZWZpbmUgQkVOQ0hNQVJLX05PRVhDRVBUX09QKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFQKKyNkZWZpbmUgQkVOQ0hNQVJLX05PRVhDRVBUX09QKHgpCisjZW5kaWYKKyNkZWZpbmUgX19mdW5jX18gX19GVU5DVElPTl9fCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfVU5VU0VECisjZGVmaW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisjZGVmaW5lIEJFTkNITUFSS19OT0VYQ0VQVAorI2RlZmluZSBCRU5DSE1BUktfTk9FWENFUFRfT1AoeCkKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19JTlRFUk5BTF9UT1NUUklORzIoeCkgI3gKKyNkZWZpbmUgQkVOQ0hNQVJLX0lOVEVSTkFMX1RPU1RSSU5HKHgpIEJFTkNITUFSS19JTlRFUk5BTF9UT1NUUklORzIoeCkKKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEJFTkNITUFSS19CVUlMVElOX0VYUEVDVCh4LCB5KSBfX2J1aWx0aW5fZXhwZWN0KHgsIHkpCisjZGVmaW5lIEJFTkNITUFSS19ERVBSRUNBVEVEX01TRyhtc2cpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQobXNnKSkpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfQlVJTFRJTl9FWFBFQ1QoeCwgeSkgeAorI2RlZmluZSBCRU5DSE1BUktfREVQUkVDQVRFRF9NU0cobXNnKQorI2RlZmluZSBCRU5DSE1BUktfV0FSTklOR19NU0cobXNnKSBfX3ByYWdtYShtZXNzYWdlKF9fRklMRV9fICIoIiBCRU5DSE1BUktfSU5URVJOQUxfVE9TVFJJTkcoX19MSU5FX18pICIpIDogd2FybmluZyBub3RlOiAiIG1zZykpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgQkVOQ0hNQVJLX0dDQ19WRVJTSU9OIChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKQorI2VuZGlmCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworY2xhc3MgQmVuY2htYXJrUmVwb3J0ZXI7CisKK3ZvaWQgSW5pdGlhbGl6ZShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gUmVwb3J0IHRvIHN0ZG91dCBhbGwgYXJndW1lbnRzIGluICdhcmd2JyBhcyB1bnJlY29nbml6ZWQgZXhjZXB0IHRoZSBmaXJzdC4KKy8vIFJldHVybnMgdHJ1ZSB0aGVyZSBpcyBhdCBsZWFzdCBvbiB1bnJlY29nbml6ZWQgYXJndW1lbnQgKGkuZS4gJ2FyZ2MnID4gMSkuCitib29sIFJlcG9ydFVucmVjb2duaXplZEFyZ3VtZW50cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworCisvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgYmVuY2htYXJrcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIC0tYmVuY2htYXJrX2ZpbHRlciBmbGFnCisvLyBhbmQgaWYgLS1iZW5jaG1hcmtfbGlzdF90ZXN0cyBpcyBzcGVjaWZpZWQgcmV0dXJuIGFmdGVyIHByaW50aW5nIHRoZSBuYW1lCisvLyBvZiBlYWNoIG1hdGNoaW5nIGJlbmNobWFyay4gT3RoZXJ3aXNlIHJ1biBlYWNoIG1hdGNoaW5nIGJlbmNobWFyayBhbmQKKy8vIHJlcG9ydCB0aGUgcmVzdWx0cy4KKy8vCisvLyBUaGUgc2Vjb25kIGFuZCB0aGlyZCBvdmVybG9hZCB1c2UgdGhlIHNwZWNpZmllZCAnY29uc29sZV9yZXBvcnRlcicgYW5kCisvLyAgJ2ZpbGVfcmVwb3J0ZXInIHJlc3BlY3RpdmVseS4gJ2ZpbGVfcmVwb3J0ZXInIHdpbGwgd3JpdGUgdG8gdGhlIGZpbGUKKy8vICBzcGVjaWZpZWQKKy8vICAgYnkgJy0tYmVuY2htYXJrX291dHB1dCcuIElmICctLWJlbmNobWFya19vdXRwdXQnIGlzIG5vdCBnaXZlbiB0aGUKKy8vICAnZmlsZV9yZXBvcnRlcicgaXMgaWdub3JlZC4KKy8vCisvLyBSRVRVUk5TOiBUaGUgbnVtYmVyIG9mIG1hdGNoaW5nIGJlbmNobWFya3MuCitzaXplX3QgUnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGNvbnNvbGVfcmVwb3J0ZXIpOworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGNvbnNvbGVfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZmlsZV9yZXBvcnRlcik7CisKKy8vIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQsIHBlYWsgbWVtb3J5IGFsbG9jYXRpb24gcGFzdCB0aGlzIHBvaW50IGluIHRoZQorLy8gYmVuY2htYXJrIGlzIHJlcG9ydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJlbmNobWFyayByZXBvcnQgbGluZS4gKEl0IGlzCisvLyBjb21wdXRlZCBieSBydW5uaW5nIHRoZSBiZW5jaG1hcmsgb25jZSB3aXRoIGEgc2luZ2xlIGl0ZXJhdGlvbiBhbmQgYSBtZW1vcnkKKy8vIHRyYWNlci4pCisvLyBUT0RPKGRvbWluaWMpCisvLyB2b2lkIE1lbW9yeVVzYWdlKCk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBCZW5jaG1hcms7CitjbGFzcyBCZW5jaG1hcmtJbXA7CitjbGFzcyBCZW5jaG1hcmtGYW1pbGllczsKKwordm9pZCBVc2VDaGFyUG9pbnRlcihjaGFyIGNvbnN0IHZvbGF0aWxlKik7CisKKy8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIGFuZCByZWdpc3RlciB0aGUgYmVuY2htYXJrLiBSZXR1cm4gdGhlCisvLyByZWdpc3RlcmVkIGJlbmNobWFyay4KK0JlbmNobWFyayogUmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbChCZW5jaG1hcmsqKTsKKworLy8gRW5zdXJlIHRoYXQgdGhlIHN0YW5kYXJkIHN0cmVhbXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGluIGV2ZXJ5IFRVLgoraW50IEluaXRpYWxpemVTdHJlYW1zKCk7CitCRU5DSE1BUktfVU5VU0VEIHN0YXRpYyBpbnQgc3RyZWFtX2luaXRfYW5jaG9yID0gSW5pdGlhbGl6ZVN0cmVhbXMoKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKworI2lmICghZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19jbGFuZ19fKSkgfHwgZGVmaW5lZChfX3BuYWNsX18pIHx8IFwKKyAgICBkZWZpbmVkKEVNU0NSSVBUTikKKyMgZGVmaW5lIEJFTkNITUFSS19IQVNfTk9fSU5MSU5FX0FTU0VNQkxZCisjZW5kaWYKKworCisvLyBUaGUgRG9Ob3RPcHRpbWl6ZSguLi4pIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgYSB2YWx1ZSBvcgorLy8gZXhwcmVzc2lvbiBmcm9tIGJlaW5nIG9wdGltaXplZCBhd2F5IGJ5IHRoZSBjb21waWxlci4gVGhpcyBmdW5jdGlvbiBpcworLy8gaW50ZW5kZWQgdG8gYWRkIGxpdHRsZSB0byBubyBvdmVyaGVhZC4KKy8vIFNlZTogaHR0cHM6Ly95b3V0dS5iZS9uWGF4azI3endsaz90PTI0NDEKKyNpZm5kZWYgQkVOQ0hNQVJLX0hBU19OT19JTkxJTkVfQVNTRU1CTFkKK3RlbXBsYXRlIDxjbGFzcyBUcD4KK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSB2b2lkIERvTm90T3B0aW1pemUoVHAgY29uc3QmIHZhbHVlKSB7CisgIC8vIENsYW5nIGRvZXNuJ3QgbGlrZSB0aGUgJ1gnIGNvbnN0cmFpbnQgb24gYHZhbHVlYCBhbmQgY2VydGFpbiBHQ0MgdmVyc2lvbnMKKyAgLy8gZG9uJ3QgbGlrZSB0aGUgJ2cnIGNvbnN0cmFpbnQuIEF0dGVtcHQgdG8gcGxhY2F0ZSB0aGVtIGJvdGguCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisgIGFzbSB2b2xhdGlsZSgiIiA6IDogImciKHZhbHVlKSA6ICJtZW1vcnkiKTsKKyNlbHNlCisgIGFzbSB2b2xhdGlsZSgiIiA6IDogImkscixtIih2YWx1ZSkgOiAibWVtb3J5Iik7CisjZW5kaWYKK30KKy8vIEZvcmNlIHRoZSBjb21waWxlciB0byBmbHVzaCBwZW5kaW5nIHdyaXRlcyB0byBnbG9iYWwgbWVtb3J5LiBBY3RzIGFzIGFuCisvLyBlZmZlY3RpdmUgcmVhZC93cml0ZSBiYXJyaWVyCitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgdm9pZCBDbG9iYmVyTWVtb3J5KCkgeworICBhc20gdm9sYXRpbGUoIiIgOiA6IDogIm1lbW9yeSIpOworfQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK3RlbXBsYXRlIDxjbGFzcyBUcD4KK2lubGluZSBCRU5DSE1BUktfQUxXQVlTX0lOTElORSB2b2lkIERvTm90T3B0aW1pemUoVHAgY29uc3QmIHZhbHVlKSB7CisgIGludGVybmFsOjpVc2VDaGFyUG9pbnRlcigmcmVpbnRlcnByZXRfY2FzdDxjaGFyIGNvbnN0IHZvbGF0aWxlJj4odmFsdWUpKTsKKyAgX1JlYWRXcml0ZUJhcnJpZXIoKTsKK30KKworaW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIHZvaWQgQ2xvYmJlck1lbW9yeSgpIHsKKyAgX1JlYWRXcml0ZUJhcnJpZXIoKTsKK30KKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgVHA+CitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgdm9pZCBEb05vdE9wdGltaXplKFRwIGNvbnN0JiB2YWx1ZSkgeworICBpbnRlcm5hbDo6VXNlQ2hhclBvaW50ZXIoJnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25zdCB2b2xhdGlsZSY+KHZhbHVlKSk7Cit9CisvLyBGSVhNRSBBZGQgQ2xvYmJlck1lbW9yeSgpIGZvciBub24tZ251IGFuZCBub24tbXN2YyBjb21waWxlcnMKKyNlbmRpZgorCisKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGZvciB1c2VyLWRlZmluZWQgY291bnRlcnMuCitjbGFzcyBDb3VudGVyIHsKK3B1YmxpYzoKKworICBlbnVtIEZsYWdzIHsKKyAgICBrRGVmYXVsdHMgICA9IDAsCisgICAgLy8gTWFyayB0aGUgY291bnRlciBhcyBhIHJhdGUuIEl0IHdpbGwgYmUgcHJlc2VudGVkIGRpdmlkZWQKKyAgICAvLyBieSB0aGUgZHVyYXRpb24gb2YgdGhlIGJlbmNobWFyay4KKyAgICBrSXNSYXRlICAgICA9IDEsCisgICAgLy8gTWFyayB0aGUgY291bnRlciBhcyBhIHRocmVhZC1hdmVyYWdlIHF1YW50aXR5LiBJdCB3aWxsIGJlCisgICAgLy8gcHJlc2VudGVkIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiB0aHJlYWRzLgorICAgIGtBdmdUaHJlYWRzID0gMiwKKyAgICAvLyBNYXJrIHRoZSBjb3VudGVyIGFzIGEgdGhyZWFkLWF2ZXJhZ2UgcmF0ZS4gU2VlIGFib3ZlLgorICAgIGtBdmdUaHJlYWRzUmF0ZSA9IGtJc1JhdGV8a0F2Z1RocmVhZHMKKyAgfTsKKworICBkb3VibGUgdmFsdWU7CisgIEZsYWdzICBmbGFnczsKKworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICBDb3VudGVyKGRvdWJsZSB2ID0gMC4sIEZsYWdzIGYgPSBrRGVmYXVsdHMpIDogdmFsdWUodiksIGZsYWdzKGYpIHt9CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgb3BlcmF0b3IgZG91YmxlIGNvbnN0JiAoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorICBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBvcGVyYXRvciBkb3VibGUgICAgICAmICgpICAgICAgIHsgcmV0dXJuIHZhbHVlOyB9CisKK307CisKKy8vIFRoaXMgaXMgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHVzZXItZGVmaW5lZCBjb3VudGVycy4KK3R5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENvdW50ZXI+IFVzZXJDb3VudGVyczsKKworCisvLyBUaW1lVW5pdCBpcyBwYXNzZWQgdG8gYSBiZW5jaG1hcmsgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgb3JkZXIgb2YgbWFnbml0dWRlCisvLyBmb3IgdGhlIG1lYXN1cmVkIHRpbWUuCitlbnVtIFRpbWVVbml0IHsga05hbm9zZWNvbmQsIGtNaWNyb3NlY29uZCwga01pbGxpc2Vjb25kIH07CisKKy8vIEJpZ08gaXMgcGFzc2VkIHRvIGEgYmVuY2htYXJrIGluIG9yZGVyIHRvIHNwZWNpZnkgdGhlIGFzeW1wdG90aWMKKy8vIGNvbXB1dGF0aW9uYWwKKy8vIGNvbXBsZXhpdHkgZm9yIHRoZSBiZW5jaG1hcmsuIEluIGNhc2Ugb0F1dG8gaXMgc2VsZWN0ZWQsIGNvbXBsZXhpdHkgd2lsbCBiZQorLy8gY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBiZXN0IGZpdC4KK2VudW0gQmlnTyB7IG9Ob25lLCBvMSwgb04sIG9OU3F1YXJlZCwgb05DdWJlZCwgb0xvZ04sIG9OTG9nTiwgb0F1dG8sIG9MYW1iZGEgfTsKKworLy8gQmlnT0Z1bmMgaXMgcGFzc2VkIHRvIGEgYmVuY2htYXJrIGluIG9yZGVyIHRvIHNwZWNpZnkgdGhlIGFzeW1wdG90aWMKKy8vIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSBmb3IgdGhlIGJlbmNobWFyay4KK3R5cGVkZWYgZG91YmxlKEJpZ09GdW5jKShpbnQpOworCisvLyBTdGF0aXN0aWNzRnVuYyBpcyBwYXNzZWQgdG8gYSBiZW5jaG1hcmsgaW4gb3JkZXIgdG8gY29tcHV0ZSBzb21lIGRlc2NyaXB0aXZlCisvLyBzdGF0aXN0aWNzIG92ZXIgYWxsIHRoZSBtZWFzdXJlbWVudHMgb2Ygc29tZSB0eXBlCit0eXBlZGVmIGRvdWJsZShTdGF0aXN0aWNzRnVuYykoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYpOworCitzdHJ1Y3QgU3RhdGlzdGljcyB7CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBTdGF0aXN0aWNzRnVuYyogY29tcHV0ZV87CisKKyAgU3RhdGlzdGljcyhzdGQ6OnN0cmluZyBuYW1lLCBTdGF0aXN0aWNzRnVuYyogY29tcHV0ZSkKKyAgICA6IG5hbWVfKG5hbWUpLCBjb21wdXRlXyhjb21wdXRlKSB7fQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIFRocmVhZFRpbWVyOworY2xhc3MgVGhyZWFkTWFuYWdlcjsKKworZW51bSBSZXBvcnRNb2RlCisjaWYgZGVmaW5lZChCRU5DSE1BUktfSEFTX0NYWDExKQorICA6IHVuc2lnbmVkCisjZWxzZQorI2VuZGlmCisgIHsKKyAgUk1fVW5zcGVjaWZpZWQsICAvLyBUaGUgbW9kZSBoYXMgbm90IGJlZW4gbWFudWFsbHkgc3BlY2lmaWVkCisgIFJNX0RlZmF1bHQsICAgICAgLy8gVGhlIG1vZGUgaXMgdXNlci1zcGVjaWZpZWQgYXMgZGVmYXVsdC4KKyAgUk1fUmVwb3J0QWdncmVnYXRlc09ubHkKK307Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gU3RhdGUgaXMgcGFzc2VkIHRvIGEgcnVubmluZyBCZW5jaG1hcmsgYW5kIGNvbnRhaW5zIHN0YXRlIGZvciB0aGUKKy8vIGJlbmNobWFyayB0byB1c2UuCitjbGFzcyBTdGF0ZSB7CisgcHVibGljOgorICBzdHJ1Y3QgU3RhdGVJdGVyYXRvcjsKKyAgZnJpZW5kIHN0cnVjdCBTdGF0ZUl0ZXJhdG9yOworCisgIC8vIFJldHVybnMgaXRlcmF0b3JzIHVzZWQgdG8gcnVuIGVhY2ggaXRlcmF0aW9uIG9mIGEgYmVuY2htYXJrIHVzaW5nIGEKKyAgLy8gQysrMTEgcmFuZ2VkLWJhc2VkIGZvciBsb29wLiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCisgIC8vCisgIC8vIFJFUVVJUkVTOiBUaGUgYmVuY2htYXJrIGhhcyBub3Qgc3RhcnRlZCBydW5uaW5nIHlldC4gTmVpdGhlciBiZWdpbiBub3IgZW5kCisgIC8vIGhhdmUgYmVlbiBjYWxsZWQgcHJldmlvdXNseS4KKyAgLy8KKyAgLy8gTk9URTogS2VlcFJ1bm5pbmcgbWF5IG5vdCBiZSB1c2VkIGFmdGVyIGNhbGxpbmcgZWl0aGVyIG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgU3RhdGVJdGVyYXRvciBiZWdpbigpOworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORSBTdGF0ZUl0ZXJhdG9yIGVuZCgpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmVuY2htYXJrIHNob3VsZCBjb250aW51ZSB0aHJvdWdoIGFub3RoZXIgaXRlcmF0aW9uLgorICAvLyBOT1RFOiBBIGJlbmNobWFyayBtYXkgbm90IHJldHVybiBmcm9tIHRoZSB0ZXN0IHVudGlsIEtlZXBSdW5uaW5nKCkgaGFzCisgIC8vIHJldHVybmVkIGZhbHNlLgorICBib29sIEtlZXBSdW5uaW5nKCkgeworICAgIGlmIChCRU5DSE1BUktfQlVJTFRJTl9FWFBFQ1QoIXN0YXJ0ZWRfLCBmYWxzZSkpIHsKKyAgICAgIFN0YXJ0S2VlcFJ1bm5pbmcoKTsKKyAgICB9CisgICAgYm9vbCBjb25zdCByZXMgPSAoLS10b3RhbF9pdGVyYXRpb25zXyAhPSAwKTsKKyAgICBpZiAoQkVOQ0hNQVJLX0JVSUxUSU5fRVhQRUNUKCFyZXMsIGZhbHNlKSkgeworICAgICAgRmluaXNoS2VlcFJ1bm5pbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8vIFJFUVVJUkVTOiB0aW1lciBpcyBydW5uaW5nIGFuZCAnU2tpcFdpdGhFcnJvciguLi4pJyBoYXMgbm90IGJlZW4gY2FsbGVkCisgIC8vICAgICAgICAgICBieSB0aGUgY3VycmVudCB0aHJlYWQuCisgIC8vIFN0b3AgdGhlIGJlbmNobWFyayB0aW1lci4gIElmIG5vdCBjYWxsZWQsIHRoZSB0aW1lciB3aWxsIGJlCisgIC8vIGF1dG9tYXRpY2FsbHkgc3RvcHBlZCBhZnRlciB0aGUgbGFzdCBpdGVyYXRpb24gb2YgdGhlIGJlbmNobWFyayBsb29wLgorICAvLworICAvLyBGb3IgdGhyZWFkZWQgYmVuY2htYXJrcyB0aGUgUGF1c2VUaW1pbmcoKSBmdW5jdGlvbiBvbmx5IHBhdXNlcyB0aGUgdGltaW5nCisgIC8vIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIC8vCisgIC8vIE5PVEU6IFRoZSAicmVhbCB0aW1lIiBtZWFzdXJlbWVudCBpcyBwZXItdGhyZWFkLiBJZiBkaWZmZXJlbnQgdGhyZWFkcworICAvLyByZXBvcnQgZGlmZmVyZW50IG1lYXN1cmVtZW50cyB0aGUgbGFyZ2VzdCBvbmUgaXMgcmVwb3J0ZWQuCisgIC8vCisgIC8vIE5PVEU6IFBhdXNlVGltaW5nKCkvUmVzdW1lVGltaW5nKCkgYXJlIHJlbGF0aXZlbHkKKyAgLy8gaGVhdnl3ZWlnaHQsIGFuZCBzbyB0aGVpciB1c2Ugc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkCisgIC8vIHdpdGhpbiBlYWNoIGJlbmNobWFyayBpdGVyYXRpb24sIGlmIHBvc3NpYmxlLgorICB2b2lkIFBhdXNlVGltaW5nKCk7CisKKyAgLy8gUkVRVUlSRVM6IHRpbWVyIGlzIG5vdCBydW5uaW5nIGFuZCAnU2tpcFdpdGhFcnJvciguLi4pJyBoYXMgbm90IGJlZW4gY2FsbGVkCisgIC8vICAgICAgICAgICBieSB0aGUgY3VycmVudCB0aHJlYWQuCisgIC8vIFN0YXJ0IHRoZSBiZW5jaG1hcmsgdGltZXIuICBUaGUgdGltZXIgaXMgTk9UIHJ1bm5pbmcgb24gZW50cmFuY2UgdG8gdGhlCisgIC8vIGJlbmNobWFyayBmdW5jdGlvbi4gSXQgYmVnaW5zIHJ1bm5pbmcgYWZ0ZXIgY29udHJvbCBmbG93IGVudGVycyB0aGUKKyAgLy8gYmVuY2htYXJrIGxvb3AuCisgIC8vCisgIC8vIE5PVEU6IFBhdXNlVGltaW5nKCkvUmVzdW1lVGltaW5nKCkgYXJlIHJlbGF0aXZlbHkKKyAgLy8gaGVhdnl3ZWlnaHQsIGFuZCBzbyB0aGVpciB1c2Ugc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkCisgIC8vIHdpdGhpbiBlYWNoIGJlbmNobWFyayBpdGVyYXRpb24sIGlmIHBvc3NpYmxlLgorICB2b2lkIFJlc3VtZVRpbWluZygpOworCisgIC8vIFJFUVVJUkVTOiAnU2tpcFdpdGhFcnJvciguLi4pJyBoYXMgbm90IGJlZW4gY2FsbGVkIHByZXZpb3VzbHkgYnkgdGhlCisgIC8vICAgICAgICAgICAgY3VycmVudCB0aHJlYWQuCisgIC8vIFJlcG9ydCB0aGUgYmVuY2htYXJrIGFzIHJlc3VsdGluZyBpbiBhbiBlcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgJ21zZycuCisgIC8vIEFmdGVyIHRoaXMgY2FsbCB0aGUgdXNlciBtYXkgZXhwbGljaXRseSAncmV0dXJuJyBmcm9tIHRoZSBiZW5jaG1hcmsuCisgIC8vCisgIC8vIElmIHRoZSByYW5nZWQtZm9yIHN0eWxlIG9mIGJlbmNobWFyayBsb29wIGlzIHVzZWQsIHRoZSB1c2VyIG11c3QgZXhwbGljaXRseQorICAvLyBicmVhayBmcm9tIHRoZSBsb29wLCBvdGhlcndpc2UgYWxsIGZ1dHVyZSBpdGVyYXRpb25zIHdpbGwgYmUgcnVuLgorICAvLyBJZiB0aGUgJ0tlZXBSdW5uaW5nKCknIGxvb3AgaXMgdXNlZCB0aGUgY3VycmVudCB0aHJlYWQgd2lsbCBhdXRvbWF0aWNhbGx5CisgIC8vIGV4aXQgdGhlIGxvb3AgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24uCisgIC8vCisgIC8vIEZvciB0aHJlYWRlZCBiZW5jaG1hcmtzIG9ubHkgdGhlIGN1cnJlbnQgdGhyZWFkIHN0b3BzIGV4ZWN1dGluZyBhbmQgZnV0dXJlCisgIC8vIGNhbGxzIHRvIGBLZWVwUnVubmluZygpYCB3aWxsIGJsb2NrIHVudGlsIGFsbCB0aHJlYWRzIGhhdmUgY29tcGxldGVkCisgIC8vIHRoZSBgS2VlcFJ1bm5pbmcoKWAgbG9vcC4gSWYgbXVsdGlwbGUgdGhyZWFkcyByZXBvcnQgYW4gZXJyb3Igb25seSB0aGUKKyAgLy8gZmlyc3QgZXJyb3IgbWVzc2FnZSBpcyB1c2VkLgorICAvLworICAvLyBOT1RFOiBDYWxsaW5nICdTa2lwV2l0aEVycm9yKC4uLiknIGRvZXMgbm90IGNhdXNlIHRoZSBiZW5jaG1hcmsgdG8gZXhpdAorICAvLyB0aGUgY3VycmVudCBzY29wZSBpbW1lZGlhdGVseS4gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbgorICAvLyB0aGUgJ0tlZXBSdW5uaW5nKCknIGxvb3AgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIHdpbGwgZmluaXNoLiBJdCBpcyB0aGUgdXNlcnMKKyAgLy8gcmVzcG9uc2liaWxpdHkgdG8gZXhpdCB0aGUgc2NvcGUgYXMgbmVlZGVkLgorICB2b2lkIFNraXBXaXRoRXJyb3IoY29uc3QgY2hhciogbXNnKTsKKworICAvLyBSRVFVSVJFUzogY2FsbGVkIGV4YWN0bHkgb25jZSBwZXIgaXRlcmF0aW9uIG9mIHRoZSBiZW5jaG1hcmtpbmcgbG9vcC4KKyAgLy8gU2V0IHRoZSBtYW51YWxseSBtZWFzdXJlZCB0aW1lIGZvciB0aGlzIGJlbmNobWFyayBpdGVyYXRpb24sIHdoaWNoCisgIC8vIGlzIHVzZWQgaW5zdGVhZCBvZiBhdXRvbWF0aWNhbGx5IG1lYXN1cmVkIHRpbWUgaWYgVXNlTWFudWFsVGltZSgpIHdhcworICAvLyBzcGVjaWZpZWQuCisgIC8vCisgIC8vIEZvciB0aHJlYWRlZCBiZW5jaG1hcmtzIHRoZSBmaW5hbCB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgbGFyZ2VzdAorICAvLyByZXBvcnRlZCB2YWx1ZXMuCisgIHZvaWQgU2V0SXRlcmF0aW9uVGltZShkb3VibGUgc2Vjb25kcyk7CisKKyAgLy8gU2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkIGJ5IHRoZSBjdXJyZW50IGJlbmNobWFyaworICAvLyBleGVjdXRpb24uICBUaGlzIHJvdXRpbmUgaXMgdHlwaWNhbGx5IGNhbGxlZCBvbmNlIGF0IHRoZSBlbmQgb2YgYQorICAvLyB0aHJvdWdocHV0IG9yaWVudGVkIGJlbmNobWFyay4gIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBhCisgIC8vIHZhbHVlID4gMCwgdGhlIHJlcG9ydCBpcyBwcmludGVkIGluIE1CL3NlYyBpbnN0ZWFkIG9mIG5hbm9zZWNvbmRzCisgIC8vIHBlciBpdGVyYXRpb24uCisgIC8vCisgIC8vIFJFUVVJUkVTOiBhIGJlbmNobWFyayBoYXMgZXhpdGVkIGl0cyBiZW5jaG1hcmtpbmcgbG9vcC4KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBTZXRCeXRlc1Byb2Nlc3NlZChzaXplX3QgYnl0ZXMpIHsgYnl0ZXNfcHJvY2Vzc2VkXyA9IGJ5dGVzOyB9CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgc2l6ZV90IGJ5dGVzX3Byb2Nlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIGJ5dGVzX3Byb2Nlc3NlZF87IH0KKworICAvLyBJZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggY29tcGxleGl0eV9uID4gMCBhbmQgY29tcGxleGl0eSByZXBvcnQgaXMKKyAgLy8gcmVxdWVzdGVkIGZvciB0aGUKKyAgLy8gZmFtaWx5IGJlbmNobWFyaywgdGhlbiBjdXJyZW50IGJlbmNobWFyayB3aWxsIGJlIHBhcnQgb2YgdGhlIGNvbXB1dGF0aW9uCisgIC8vIGFuZCBjb21wbGV4aXR5X24gd2lsbAorICAvLyByZXByZXNlbnQgdGhlIGxlbmd0aCBvZiBOLgorICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICB2b2lkIFNldENvbXBsZXhpdHlOKGludCBjb21wbGV4aXR5X24pIHsgY29tcGxleGl0eV9uXyA9IGNvbXBsZXhpdHlfbjsgfQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIGludCBjb21wbGV4aXR5X2xlbmd0aF9uKCkgeyByZXR1cm4gY29tcGxleGl0eV9uXzsgfQorCisgIC8vIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBpdGVtcyA+IDAsIHRoZW4gYW4gaXRlbXMvcworICAvLyBsYWJlbCBpcyBwcmludGVkIG9uIHRoZSBiZW5jaG1hcmsgcmVwb3J0IGxpbmUgZm9yIHRoZSBjdXJyZW50bHkKKyAgLy8gZXhlY3V0aW5nIGJlbmNobWFyay4gSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgcHJvY2Vzc2luZworICAvLyBiZW5jaG1hcmsgd2hlcmUgYSBwcm9jZXNzaW5nIGl0ZW1zL3NlY29uZCBvdXRwdXQgaXMgZGVzaXJlZC4KKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGEgYmVuY2htYXJrIGhhcyBleGl0ZWQgaXRzIGJlbmNobWFya2luZyBsb29wLgorICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICB2b2lkIFNldEl0ZW1zUHJvY2Vzc2VkKHNpemVfdCBpdGVtcykgeyBpdGVtc19wcm9jZXNzZWRfID0gaXRlbXM7IH0KKworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICBzaXplX3QgaXRlbXNfcHJvY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4gaXRlbXNfcHJvY2Vzc2VkXzsgfQorCisgIC8vIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQsIHRoZSBzcGVjaWZpZWQgbGFiZWwgaXMgcHJpbnRlZCBhdCB0aGUKKyAgLy8gZW5kIG9mIHRoZSBiZW5jaG1hcmsgcmVwb3J0IGxpbmUgZm9yIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCisgIC8vIGJlbmNobWFyay4gIEV4YW1wbGU6CisgIC8vICBzdGF0aWMgdm9pZCBCTV9Db21wcmVzcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAvLyAgICAuLi4KKyAgLy8gICAgZG91YmxlIGNvbXByZXNzID0gaW5wdXRfc2l6ZSAvIG91dHB1dF9zaXplOworICAvLyAgICBzdGF0ZS5TZXRMYWJlbChTdHJpbmdQcmludGYoImNvbXByZXNzOiUuMWYlJSIsIDEwMC4wKmNvbXByZXNzaW9uKSk7CisgIC8vICB9CisgIC8vIFByb2R1Y2VzIG91dHB1dCB0aGF0IGxvb2tzIGxpa2U6CisgIC8vICBCTV9Db21wcmVzcyAgIDUwICAgICAgICAgNTAgICAxNDExNTAzOCAgY29tcHJlc3M6MjcuMyUKKyAgLy8KKyAgLy8gUkVRVUlSRVM6IGEgYmVuY2htYXJrIGhhcyBleGl0ZWQgaXRzIGJlbmNobWFya2luZyBsb29wLgorICB2b2lkIFNldExhYmVsKGNvbnN0IGNoYXIqIGxhYmVsKTsKKworICB2b2lkIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIFNldExhYmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICB0aGlzLT5TZXRMYWJlbChzdHIuY19zdHIoKSk7CisgIH0KKworICAvLyBSYW5nZSBhcmd1bWVudHMgZm9yIHRoaXMgcnVuLiBDSEVDS3MgaWYgdGhlIGFyZ3VtZW50IGhhcyBiZWVuIHNldC4KKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgaW50IHJhbmdlKHN0ZDo6c2l6ZV90IHBvcyA9IDApIGNvbnN0IHsKKyAgICBhc3NlcnQocmFuZ2VfLnNpemUoKSA+IHBvcyk7CisgICAgcmV0dXJuIHJhbmdlX1twb3NdOworICB9CisKKyAgQkVOQ0hNQVJLX0RFUFJFQ0FURURfTVNHKCJ1c2UgJ3JhbmdlKDApJyBpbnN0ZWFkIikKKyAgaW50IHJhbmdlX3goKSBjb25zdCB7IHJldHVybiByYW5nZSgwKTsgfQorCisgIEJFTkNITUFSS19ERVBSRUNBVEVEX01TRygidXNlICdyYW5nZSgxKScgaW5zdGVhZCIpCisgIGludCByYW5nZV95KCkgY29uc3QgeyByZXR1cm4gcmFuZ2UoMSk7IH0KKworICBCRU5DSE1BUktfQUxXQVlTX0lOTElORQorICBzaXplX3QgaXRlcmF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIChtYXhfaXRlcmF0aW9ucyAtIHRvdGFsX2l0ZXJhdGlvbnNfKSArIDE7IH0KKworIHByaXZhdGU6CisgIGJvb2wgc3RhcnRlZF87CisgIGJvb2wgZmluaXNoZWRfOworICBzaXplX3QgdG90YWxfaXRlcmF0aW9uc187CisKKyAgc3RkOjp2ZWN0b3I8aW50PiByYW5nZV87CisKKyAgc2l6ZV90IGJ5dGVzX3Byb2Nlc3NlZF87CisgIHNpemVfdCBpdGVtc19wcm9jZXNzZWRfOworCisgIGludCBjb21wbGV4aXR5X25fOworCisgIGJvb2wgZXJyb3Jfb2NjdXJyZWRfOworCisgcHVibGljOgorICAvLyBDb250YWluZXIgZm9yIHVzZXItZGVmaW5lZCBjb3VudGVycy4KKyAgVXNlckNvdW50ZXJzIGNvdW50ZXJzOworICAvLyBJbmRleCBvZiB0aGUgZXhlY3V0aW5nIHRocmVhZC4gVmFsdWVzIGZyb20gWzAsIHRocmVhZHMpLgorICBjb25zdCBpbnQgdGhyZWFkX2luZGV4OworICAvLyBOdW1iZXIgb2YgdGhyZWFkcyBjb25jdXJyZW50bHkgZXhlY3V0aW5nIHRoZSBiZW5jaG1hcmsuCisgIGNvbnN0IGludCB0aHJlYWRzOworICBjb25zdCBzaXplX3QgbWF4X2l0ZXJhdGlvbnM7CisKKyAgLy8gVE9ETyhFcmljV0YpIG1ha2UgbWUgcHJpdmF0ZQorICBTdGF0ZShzaXplX3QgbWF4X2l0ZXJzLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiByYW5nZXMsIGludCB0aHJlYWRfaSwKKyAgICAgICAgaW50IG5fdGhyZWFkcywgaW50ZXJuYWw6OlRocmVhZFRpbWVyKiB0aW1lciwKKyAgICAgICAgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIqIG1hbmFnZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTdGFydEtlZXBSdW5uaW5nKCk7CisgIHZvaWQgRmluaXNoS2VlcFJ1bm5pbmcoKTsKKyAgaW50ZXJuYWw6OlRocmVhZFRpbWVyKiB0aW1lcl87CisgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyKiBtYW5hZ2VyXzsKKyAgQkVOQ0hNQVJLX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdGF0ZSk7Cit9OworCitzdHJ1Y3QgU3RhdGU6OlN0YXRlSXRlcmF0b3IgeworICBzdHJ1Y3QgQkVOQ0hNQVJLX1VOVVNFRCBWYWx1ZSB7fTsKKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIFZhbHVlIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgVmFsdWUgcmVmZXJlbmNlOworICB0eXBlZGVmIFZhbHVlIHBvaW50ZXI7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU3RhdGU7CisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIFN0YXRlSXRlcmF0b3IoKSA6IGNhY2hlZF8oMCksIHBhcmVudF8oKSB7fQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIGV4cGxpY2l0IFN0YXRlSXRlcmF0b3IoU3RhdGUqIHN0KQorICAgICAgOiBjYWNoZWRfKHN0LT5lcnJvcl9vY2N1cnJlZF8gPyAwIDogc3QtPm1heF9pdGVyYXRpb25zKSwgcGFyZW50XyhzdCkge30KKworIHB1YmxpYzoKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgVmFsdWUgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVmFsdWUoKTsgfQorCisgIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FCisgIFN0YXRlSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGNhY2hlZF8gPiAwKTsKKyAgICAtLWNhY2hlZF87CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUKKyAgYm9vbCBvcGVyYXRvciE9KFN0YXRlSXRlcmF0b3IgY29uc3QmKSBjb25zdCB7CisgICAgaWYgKEJFTkNITUFSS19CVUlMVElOX0VYUEVDVChjYWNoZWRfICE9IDAsIHRydWUpKSByZXR1cm4gdHJ1ZTsKKyAgICBwYXJlbnRfLT5GaW5pc2hLZWVwUnVubmluZygpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc2l6ZV90IGNhY2hlZF87CisgIFN0YXRlKiBjb25zdCBwYXJlbnRfOworfTsKKworaW5saW5lIEJFTkNITUFSS19BTFdBWVNfSU5MSU5FIFN0YXRlOjpTdGF0ZUl0ZXJhdG9yIFN0YXRlOjpiZWdpbigpIHsKKyAgcmV0dXJuIFN0YXRlSXRlcmF0b3IodGhpcyk7Cit9CitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgU3RhdGU6OlN0YXRlSXRlcmF0b3IgU3RhdGU6OmVuZCgpIHsKKyAgU3RhcnRLZWVwUnVubmluZygpOworICByZXR1cm4gU3RhdGVJdGVyYXRvcigpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIHZvaWQoRnVuY3Rpb24pKFN0YXRlJik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmVuY2htYXJrIHJlZ2lzdHJhdGlvbiBvYmplY3QuICBUaGUgQkVOQ0hNQVJLKCkgbWFjcm8gZXhwYW5kcworLy8gaW50byBhbiBpbnRlcm5hbDo6QmVuY2htYXJrKiBvYmplY3QuICBWYXJpb3VzIG1ldGhvZHMgY2FuCisvLyBiZSBjYWxsZWQgb24gdGhpcyBvYmplY3QgdG8gY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBiZW5jaG1hcmsuCisvLyBFYWNoIG1ldGhvZCByZXR1cm5zICJ0aGlzIiBzbyB0aGF0IG11bHRpcGxlIG1ldGhvZCBjYWxscyBjYW4KKy8vIGNoYWluZWQgaW50byBvbmUgZXhwcmVzc2lvbi4KK2NsYXNzIEJlbmNobWFyayB7CisgcHVibGljOgorICB2aXJ0dWFsIH5CZW5jaG1hcmsoKTsKKworICAvLyBOb3RlOiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYWxsIHJldHVybiAidGhpcyIgc28gdGhhdCBtdWx0aXBsZQorICAvLyBtZXRob2QgY2FsbHMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXIgaW4gb25lIGV4cHJlc3Npb24uCisKKyAgLy8gUnVuIHRoaXMgYmVuY2htYXJrIG9uY2Ugd2l0aCAieCIgYXMgdGhlIGV4dHJhIGFyZ3VtZW50IHBhc3NlZAorICAvLyB0byB0aGUgZnVuY3Rpb24uCisgIC8vIFJFUVVJUkVTOiBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBtdXN0IGFjY2VwdCBhbiBhcmcxLgorICBCZW5jaG1hcmsqIEFyZyhpbnQgeCk7CisKKyAgLy8gUnVuIHRoaXMgYmVuY2htYXJrIHdpdGggdGhlIGdpdmVuIHRpbWUgdW5pdCBmb3IgdGhlIGdlbmVyYXRlZCBvdXRwdXQgcmVwb3J0CisgIEJlbmNobWFyayogVW5pdChUaW1lVW5pdCB1bml0KTsKKworICAvLyBSdW4gdGhpcyBiZW5jaG1hcmsgb25jZSBmb3IgYSBudW1iZXIgb2YgdmFsdWVzIHBpY2tlZCBmcm9tIHRoZQorICAvLyByYW5nZSBbc3RhcnQuLmxpbWl0XS4gIChzdGFydCBhbmQgbGltaXQgYXJlIGFsd2F5cyBwaWNrZWQuKQorICAvLyBSRVFVSVJFUzogVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgbXVzdCBhY2NlcHQgYW4gYXJnMS4KKyAgQmVuY2htYXJrKiBSYW5nZShpbnQgc3RhcnQsIGludCBsaW1pdCk7CisKKyAgLy8gUnVuIHRoaXMgYmVuY2htYXJrIG9uY2UgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtzdGFydC4ubGltaXRdIHdpdGgKKyAgLy8gc3BlY2lmaWMgc3RlcAorICAvLyBSRVFVSVJFUzogVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgbXVzdCBhY2NlcHQgYW4gYXJnMS4KKyAgQmVuY2htYXJrKiBEZW5zZVJhbmdlKGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgc3RlcCA9IDEpOworCisgIC8vIFJ1biB0aGlzIGJlbmNobWFyayBvbmNlIHdpdGggImFyZ3MiIGFzIHRoZSBleHRyYSBhcmd1bWVudHMgcGFzc2VkCisgIC8vIHRvIHRoZSBmdW5jdGlvbi4KKyAgLy8gUkVRVUlSRVM6IFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG11c3QgYWNjZXB0IGFyZzEsIGFyZzIgLi4uCisgIEJlbmNobWFyayogQXJncyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhcmdzKTsKKworICAvLyBFcXVpdmFsZW50IHRvIEFyZ3Moe3gsIHl9KQorICAvLyBOT1RFOiBUaGlzIGlzIGEgbGVnYWN5IEMrKzAzIGludGVyZmFjZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LgorICAvLyAgIE5ldyBjb2RlIHNob3VsZCB1c2UgJ0FyZ3MnLgorICBCZW5jaG1hcmsqIEFyZ1BhaXIoaW50IHgsIGludCB5KSB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBhcmdzOworICAgIGFyZ3MucHVzaF9iYWNrKHgpOworICAgIGFyZ3MucHVzaF9iYWNrKHkpOworICAgIHJldHVybiBBcmdzKGFyZ3MpOworICB9CisKKyAgLy8gUnVuIHRoaXMgYmVuY2htYXJrIG9uY2UgZm9yIGEgbnVtYmVyIG9mIHZhbHVlcyBwaWNrZWQgZnJvbSB0aGUKKyAgLy8gcmFuZ2VzIFtzdGFydC4ubGltaXRdLiAgKHN0YXJ0cyBhbmQgbGltaXRzIGFyZSBhbHdheXMgcGlja2VkLikKKyAgLy8gUkVRVUlSRVM6IFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG11c3QgYWNjZXB0IGFyZzEsIGFyZzIgLi4uCisgIEJlbmNobWFyayogUmFuZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4gPiYgcmFuZ2VzKTsKKworICAvLyBFcXVpdmFsZW50IHRvIEFyZ05hbWVzKHtuYW1lfSkKKyAgQmVuY2htYXJrKiBBcmdOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICAvLyBTZXQgdGhlIGFyZ3VtZW50IG5hbWVzIHRvIGRpc3BsYXkgaW4gdGhlIGJlbmNobWFyayBuYW1lLiBJZiBub3QgY2FsbGVkLAorICAvLyBvbmx5IGFyZ3VtZW50IHZhbHVlcyB3aWxsIGJlIHNob3duLgorICBCZW5jaG1hcmsqIEFyZ05hbWVzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbmFtZXMpOworCisgIC8vIEVxdWl2YWxlbnQgdG8gUmFuZ2VzKHt7bG8xLCBoaTF9LCB7bG8yLCBoaTJ9fSkuCisgIC8vIE5PVEU6IFRoaXMgaXMgYSBsZWdhY3kgQysrMDMgaW50ZXJmYWNlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IG9ubHkuCisgIC8vICAgTmV3IGNvZGUgc2hvdWxkIHVzZSAnUmFuZ2VzJy4KKyAgQmVuY2htYXJrKiBSYW5nZVBhaXIoaW50IGxvMSwgaW50IGhpMSwgaW50IGxvMiwgaW50IGhpMikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4gPiByYW5nZXM7CisgICAgcmFuZ2VzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihsbzEsIGhpMSkpOworICAgIHJhbmdlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobG8yLCBoaTIpKTsKKyAgICByZXR1cm4gUmFuZ2VzKHJhbmdlcyk7CisgIH0KKworICAvLyBQYXNzIHRoaXMgYmVuY2htYXJrIG9iamVjdCB0byAqZnVuYywgd2hpY2ggY2FuIGN1c3RvbWl6ZQorICAvLyB0aGUgYmVuY2htYXJrIGJ5IGNhbGxpbmcgdmFyaW91cyBtZXRob2RzIGxpa2UgQXJnLCBBcmdzLAorICAvLyBUaHJlYWRzLCBldGMuCisgIEJlbmNobWFyayogQXBwbHkodm9pZCAoKmZ1bmMpKEJlbmNobWFyayogYmVuY2htYXJrKSk7CisKKyAgLy8gU2V0IHRoZSByYW5nZSBtdWx0aXBsaWVyIGZvciBub24tZGVuc2UgcmFuZ2UuIElmIG5vdCBjYWxsZWQsIHRoZSByYW5nZQorICAvLyBtdWx0aXBsaWVyIGtSYW5nZU11bHRpcGxpZXIgd2lsbCBiZSB1c2VkLgorICBCZW5jaG1hcmsqIFJhbmdlTXVsdGlwbGllcihpbnQgbXVsdGlwbGllcik7CisKKyAgLy8gU2V0IHRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGhpcyBiZW5jaG1hcmsuIFRoaXMKKyAgLy8gb3B0aW9uIG92ZXJyaWRlcyB0aGUgYGJlbmNobWFya19taW5fdGltZWAgZmxhZy4KKyAgLy8gUkVRVUlSRVM6IGB0ID4gMGAgYW5kIGBJdGVyYXRpb25zYCBoYXMgbm90IGJlZW4gY2FsbGVkIG9uIHRoaXMgYmVuY2htYXJrLgorICBCZW5jaG1hcmsqIE1pblRpbWUoZG91YmxlIHQpOworCisgIC8vIFNwZWNpZnkgdGhlIGFtb3VudCBvZiBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIHJ1biBieSB0aGlzIGJlbmNobWFyay4KKyAgLy8gUkVRVUlSRVM6ICduID4gMCcgYW5kIGBNaW5UaW1lYCBoYXMgbm90IGJlZW4gY2FsbGVkIG9uIHRoaXMgYmVuY2htYXJrLgorICAvLworICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiAqZXhhY3QqIGl0ZXJhdGlvbiBjb250cm9sIGlzCisgIC8vICAgbmVlZGVkIGFuZCBuZXZlciB0byBjb250cm9sIG9yIGxpbWl0IGhvdyBsb25nIGEgYmVuY2htYXJrIHJ1bnMsIHdoZXJlCisgIC8vIGAtLWJlbmNobWFya19taW5fdGltZT1OYCBvciBgTWluVGltZSguLi4pYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICBCZW5jaG1hcmsqIEl0ZXJhdGlvbnMoc2l6ZV90IG4pOworCisgIC8vIFNwZWNpZnkgdGhlIGFtb3VudCBvZiB0aW1lcyB0byByZXBlYXQgdGhpcyBiZW5jaG1hcmsuIFRoaXMgb3B0aW9uIG92ZXJyaWRlcworICAvLyB0aGUgYGJlbmNobWFya19yZXBldGl0aW9uc2AgZmxhZy4KKyAgLy8gUkVRVUlSRVM6IGBuID4gMGAKKyAgQmVuY2htYXJrKiBSZXBldGl0aW9ucyhpbnQgbik7CisKKyAgLy8gU3BlY2lmeSBpZiBlYWNoIHJlcGV0aXRpb24gb2YgdGhlIGJlbmNobWFyayBzaG91bGQgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseQorICAvLyBvciBpZiBvbmx5IHRoZSBmaW5hbCBzdGF0aXN0aWNzIHNob3VsZCBiZSByZXBvcnRlZC4gSWYgdGhlIGJlbmNobWFyaworICAvLyBpcyBub3QgcmVwZWF0ZWQgdGhlbiB0aGUgc2luZ2xlIHJlc3VsdCBpcyBhbHdheXMgcmVwb3J0ZWQuCisgIEJlbmNobWFyayogUmVwb3J0QWdncmVnYXRlc09ubHkoYm9vbCB2YWx1ZSA9IHRydWUpOworCisgIC8vIElmIGEgcGFydGljdWxhciBiZW5jaG1hcmsgaXMgSS9PIGJvdW5kLCBydW5zIG11bHRpcGxlIHRocmVhZHMgaW50ZXJuYWxseSBvcgorICAvLyBpZiBmb3Igc29tZSByZWFzb24gQ1BVIHRpbWluZ3MgYXJlIG5vdCByZXByZXNlbnRhdGl2ZSwgY2FsbCB0aGlzIG1ldGhvZC4gSWYKKyAgLy8gY2FsbGVkLCB0aGUgZWxhcHNlZCB0aW1lIHdpbGwgYmUgdXNlZCB0byBjb250cm9sIGhvdyBtYW55IGl0ZXJhdGlvbnMgYXJlCisgIC8vIHJ1biwgYW5kIGluIHRoZSBwcmludGluZyBvZiBpdGVtcy9zZWNvbmQgb3IgTUIvc2Vjb25kcyB2YWx1ZXMuICBJZiBub3QKKyAgLy8gY2FsbGVkLCB0aGUgY3B1IHRpbWUgdXNlZCBieSB0aGUgYmVuY2htYXJrIHdpbGwgYmUgdXNlZC4KKyAgQmVuY2htYXJrKiBVc2VSZWFsVGltZSgpOworCisgIC8vIElmIGEgYmVuY2htYXJrIG11c3QgbWVhc3VyZSB0aW1lIG1hbnVhbGx5IChlLmcuIGlmIEdQVSBleGVjdXRpb24gdGltZSBpcworICAvLyBiZWluZworICAvLyBtZWFzdXJlZCksIGNhbGwgdGhpcyBtZXRob2QuIElmIGNhbGxlZCwgZWFjaCBiZW5jaG1hcmsgaXRlcmF0aW9uIHNob3VsZAorICAvLyBjYWxsCisgIC8vIFNldEl0ZXJhdGlvblRpbWUoc2Vjb25kcykgdG8gcmVwb3J0IHRoZSBtZWFzdXJlZCB0aW1lLCB3aGljaCB3aWxsIGJlIHVzZWQKKyAgLy8gdG8gY29udHJvbCBob3cgbWFueSBpdGVyYXRpb25zIGFyZSBydW4sIGFuZCBpbiB0aGUgcHJpbnRpbmcgb2YgaXRlbXMvc2Vjb25kCisgIC8vIG9yIE1CL3NlY29uZCB2YWx1ZXMuCisgIEJlbmNobWFyayogVXNlTWFudWFsVGltZSgpOworCisgIC8vIFNldCB0aGUgYXN5bXB0b3RpYyBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgZm9yIHRoZSBiZW5jaG1hcmsuIElmIGNhbGxlZAorICAvLyB0aGUgYXN5bXB0b3RpYyBjb21wdXRhdGlvbmFsIGNvbXBsZXhpdHkgd2lsbCBiZSBzaG93biBvbiB0aGUgb3V0cHV0LgorICBCZW5jaG1hcmsqIENvbXBsZXhpdHkoQmlnTyBjb21wbGV4aXR5ID0gYmVuY2htYXJrOjpvQXV0byk7CisKKyAgLy8gU2V0IHRoZSBhc3ltcHRvdGljIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSBmb3IgdGhlIGJlbmNobWFyay4gSWYgY2FsbGVkCisgIC8vIHRoZSBhc3ltcHRvdGljIGNvbXB1dGF0aW9uYWwgY29tcGxleGl0eSB3aWxsIGJlIHNob3duIG9uIHRoZSBvdXRwdXQuCisgIEJlbmNobWFyayogQ29tcGxleGl0eShCaWdPRnVuYyogY29tcGxleGl0eSk7CisKKyAgLy8gQWRkIHRoaXMgc3RhdGlzdGljcyB0byBiZSBjb21wdXRlZCBvdmVyIGFsbCB0aGUgdmFsdWVzIG9mIGJlbmNobWFyayBydW4KKyAgQmVuY2htYXJrKiBDb21wdXRlU3RhdGlzdGljcyhzdGQ6OnN0cmluZyBuYW1lLCBTdGF0aXN0aWNzRnVuYyogc3RhdGlzdGljcyk7CisKKyAgLy8gU3VwcG9ydCBmb3IgcnVubmluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHNhbWUgYmVuY2htYXJrIGNvbmN1cnJlbnRseQorICAvLyBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gbWVhc3VyaW5nIHRoZSBzY2FsaW5nCisgIC8vIG9mIHNvbWUgcGllY2Ugb2YgY29kZS4KKworICAvLyBSdW4gb25lIGluc3RhbmNlIG9mIHRoaXMgYmVuY2htYXJrIGNvbmN1cnJlbnRseSBpbiB0IHRocmVhZHMuCisgIEJlbmNobWFyayogVGhyZWFkcyhpbnQgdCk7CisKKyAgLy8gUGljayBhIHNldCBvZiB2YWx1ZXMgVCBmcm9tIFttaW5fdGhyZWFkcyxtYXhfdGhyZWFkc10uCisgIC8vIG1pbl90aHJlYWRzIGFuZCBtYXhfdGhyZWFkcyBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIFQuICBSdW4gdGhpcworICAvLyBiZW5jaG1hcmsgb25jZSBmb3IgZWFjaCB2YWx1ZSBpbiBULiAgVGhlIGJlbmNobWFyayBydW4gZm9yIGEKKyAgLy8gcGFydGljdWxhciB2YWx1ZSB0IGNvbnNpc3RzIG9mIHQgdGhyZWFkcyBydW5uaW5nIHRoZSBiZW5jaG1hcmsKKyAgLy8gZnVuY3Rpb24gY29uY3VycmVudGx5LiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyOgorICAvLyAgICBCRU5DSE1BUksoRm9vKS0+VGhyZWFkUmFuZ2UoMSwxNik7CisgIC8vIFRoaXMgd2lsbCBydW4gdGhlIGZvbGxvd2luZyBiZW5jaG1hcmtzOgorICAvLyAgICBGb28gaW4gMSB0aHJlYWQKKyAgLy8gICAgRm9vIGluIDIgdGhyZWFkcworICAvLyAgICBGb28gaW4gNCB0aHJlYWRzCisgIC8vICAgIEZvbyBpbiA4IHRocmVhZHMKKyAgLy8gICAgRm9vIGluIDE2IHRocmVhZHMKKyAgQmVuY2htYXJrKiBUaHJlYWRSYW5nZShpbnQgbWluX3RocmVhZHMsIGludCBtYXhfdGhyZWFkcyk7CisKKyAgLy8gRm9yIGVhY2ggdmFsdWUgbiBpbiB0aGUgcmFuZ2UsIHJ1biB0aGlzIGJlbmNobWFyayBvbmNlIHVzaW5nIG4gdGhyZWFkcy4KKyAgLy8gbWluX3RocmVhZHMgYW5kIG1heF90aHJlYWRzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgorICAvLyBzdHJpZGUgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQuIEUuZy4gRGVuc2VUaHJlYWRSYW5nZSgxLCA4LCAzKSBzdGFydHMKKyAgLy8gYSBiZW5jaG1hcmsgd2l0aCAxLCA0LCA3IGFuZCA4IHRocmVhZHMuCisgIEJlbmNobWFyayogRGVuc2VUaHJlYWRSYW5nZShpbnQgbWluX3RocmVhZHMsIGludCBtYXhfdGhyZWFkcywgaW50IHN0cmlkZSA9IDEpOworCisgIC8vIEVxdWl2YWxlbnQgdG8gVGhyZWFkUmFuZ2UoTnVtQ1BVcygpLCBOdW1DUFVzKCkpCisgIEJlbmNobWFyayogVGhyZWFkUGVyQ3B1KCk7CisKKyAgdmlydHVhbCB2b2lkIFJ1bihTdGF0ZSYgc3RhdGUpID0gMDsKKworICAvLyBVc2VkIGluc2lkZSB0aGUgYmVuY2htYXJrIGltcGxlbWVudGF0aW9uCisgIHN0cnVjdCBJbnN0YW5jZTsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUpOworICBCZW5jaG1hcmsoQmVuY2htYXJrIGNvbnN0Jik7CisgIHZvaWQgU2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKKworICBpbnQgQXJnc0NudCgpIGNvbnN0OworCisgIHN0YXRpYyB2b2lkIEFkZFJhbmdlKHN0ZDo6dmVjdG9yPGludD4qIGRzdCwgaW50IGxvLCBpbnQgaGksIGludCBtdWx0KTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBCZW5jaG1hcmtGYW1pbGllczsKKworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgUmVwb3J0TW9kZSByZXBvcnRfbW9kZV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdfbmFtZXNfOyAgIC8vIEFyZ3MgZm9yIGFsbCBiZW5jaG1hcmsgcnVucworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gYXJnc187ICAvLyBBcmdzIGZvciBhbGwgYmVuY2htYXJrIHJ1bnMKKyAgVGltZVVuaXQgdGltZV91bml0XzsKKyAgaW50IHJhbmdlX211bHRpcGxpZXJfOworICBkb3VibGUgbWluX3RpbWVfOworICBzaXplX3QgaXRlcmF0aW9uc187CisgIGludCByZXBldGl0aW9uc187CisgIGJvb2wgdXNlX3JlYWxfdGltZV87CisgIGJvb2wgdXNlX21hbnVhbF90aW1lXzsKKyAgQmlnTyBjb21wbGV4aXR5XzsKKyAgQmlnT0Z1bmMqIGNvbXBsZXhpdHlfbGFtYmRhXzsKKyAgc3RkOjp2ZWN0b3I8U3RhdGlzdGljcz4gc3RhdGlzdGljc187CisgIHN0ZDo6dmVjdG9yPGludD4gdGhyZWFkX2NvdW50c187CisKKyAgQmVuY2htYXJrJiBvcGVyYXRvcj0oQmVuY2htYXJrIGNvbnN0Jik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhIGJlbmNobWFyayB3aXRoIHRoZSBzcGVjaWZpZWQgJ25hbWUnIHRoYXQgaW52b2tlcworLy8gdGhlIHNwZWNpZmllZCBmdW5jdG9yICdmbicuCisvLworLy8gUkVUVVJOUzogQSBwb2ludGVyIHRvIHRoZSByZWdpc3RlcmVkIGJlbmNobWFyay4KK2ludGVybmFsOjpCZW5jaG1hcmsqIFJlZ2lzdGVyQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6RnVuY3Rpb24qIGZuKTsKKworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX0hBU19DWFgxMSkKK3RlbXBsYXRlIDxjbGFzcyBMYW1iZGE+CitpbnRlcm5hbDo6QmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCBMYW1iZGEmJiBmbik7CisjZW5kaWYKKworLy8gUmVtb3ZlIGFsbCByZWdpc3RlcmVkIGJlbmNobWFya3MuIEFsbCBwb2ludGVycyB0byBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKKy8vIGJlbmNobWFya3MgYXJlIGludmFsaWRhdGVkLgordm9pZCBDbGVhclJlZ2lzdGVyZWRCZW5jaG1hcmtzKCk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBUaGUgY2xhc3MgdXNlZCB0byBob2xkIGFsbCBCZW5jaG1hcmtzIGNyZWF0ZWQgZnJvbSBzdGF0aWMgZnVuY3Rpb24uCisvLyAoaWUgdGhvc2UgY3JlYXRlZCB1c2luZyB0aGUgQkVOQ0hNQVJLKC4uLikgbWFjcm9zLgorY2xhc3MgRnVuY3Rpb25CZW5jaG1hcmsgOiBwdWJsaWMgQmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIEZ1bmN0aW9uQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIEZ1bmN0aW9uKiBmdW5jKQorICAgICAgOiBCZW5jaG1hcmsobmFtZSksIGZ1bmNfKGZ1bmMpIHt9CisKKyAgdmlydHVhbCB2b2lkIFJ1bihTdGF0ZSYgc3QpOworCisgcHJpdmF0ZToKKyAgRnVuY3Rpb24qIGZ1bmNfOworfTsKKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKK3RlbXBsYXRlIDxjbGFzcyBMYW1iZGE+CitjbGFzcyBMYW1iZGFCZW5jaG1hcmsgOiBwdWJsaWMgQmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSdW4oU3RhdGUmIHN0KSB7IGxhbWJkYV8oc3QpOyB9CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgT0xhbWJkYT4KKyAgTGFtYmRhQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIE9MYW1iZGEmJiBsYW0pCisgICAgICA6IEJlbmNobWFyayhuYW1lKSwgbGFtYmRhXyhzdGQ6OmZvcndhcmQ8T0xhbWJkYT4obGFtKSkge30KKworICBMYW1iZGFCZW5jaG1hcmsoTGFtYmRhQmVuY2htYXJrIGNvbnN0JikgPSBkZWxldGU7CisKKyBwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgTGFtPgorICBmcmllbmQgQmVuY2htYXJrKiA6OmJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoY29uc3QgY2hhciosIExhbSYmKTsKKworICBMYW1iZGEgbGFtYmRhXzsKK307CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK2lubGluZSBpbnRlcm5hbDo6QmVuY2htYXJrKiBSZWdpc3RlckJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpGdW5jdGlvbiogZm4pIHsKKyAgcmV0dXJuIGludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKAorICAgICAgOjpuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKG5hbWUsIGZuKSk7Cit9CisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCit0ZW1wbGF0ZSA8Y2xhc3MgTGFtYmRhPgoraW50ZXJuYWw6OkJlbmNobWFyayogUmVnaXN0ZXJCZW5jaG1hcmsoY29uc3QgY2hhciogbmFtZSwgTGFtYmRhJiYgZm4pIHsKKyAgdXNpbmcgQmVuY2hUeXBlID0KKyAgICAgIGludGVybmFsOjpMYW1iZGFCZW5jaG1hcms8dHlwZW5hbWUgc3RkOjpkZWNheTxMYW1iZGE+Ojp0eXBlPjsKKyAgcmV0dXJuIGludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKAorICAgICAgOjpuZXcgQmVuY2hUeXBlKG5hbWUsIHN0ZDo6Zm9yd2FyZDxMYW1iZGE+KGZuKSkpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19IQVNfQ1hYMTEpICYmIFwKKyAgICAoIWRlZmluZWQoQkVOQ0hNQVJLX0dDQ19WRVJTSU9OKSB8fCBCRU5DSE1BUktfR0NDX1ZFUlNJT04gPj0gNDA5KQordGVtcGxhdGUgPGNsYXNzIExhbWJkYSwgY2xhc3MuLi4gQXJncz4KK2ludGVybmFsOjpCZW5jaG1hcmsqIFJlZ2lzdGVyQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIExhbWJkYSYmIGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIGJlbmNobWFyazo6UmVnaXN0ZXJCZW5jaG1hcmsoCisgICAgICBuYW1lLCBbPV0oYmVuY2htYXJrOjpTdGF0ZSYgc3QpIHsgZm4oc3QsIGFyZ3MuLi4pOyB9KTsKK30KKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19IQVNfTk9fVkFSSUFESUNfUkVHSVNURVJfQkVOQ0hNQVJLCisjZW5kaWYKKworLy8gVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBmaXh0dXJlIHRlc3RzLgorY2xhc3MgRml4dHVyZSA6IHB1YmxpYyBpbnRlcm5hbDo6QmVuY2htYXJrIHsKKyBwdWJsaWM6CisgIEZpeHR1cmUoKSA6IGludGVybmFsOjpCZW5jaG1hcmsoIiIpIHt9CisKKyAgdmlydHVhbCB2b2lkIFJ1bihTdGF0ZSYgc3QpIHsKKyAgICB0aGlzLT5TZXRVcChzdCk7CisgICAgdGhpcy0+QmVuY2htYXJrQ2FzZShzdCk7CisgICAgdGhpcy0+VGVhckRvd24oc3QpOworICB9CisKKyAgLy8gVGhlc2Ugd2lsbCBiZSBkZXByZWNhdGVkIC4uLgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoY29uc3QgU3RhdGUmKSB7fQorICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oY29uc3QgU3RhdGUmKSB7fQorICAvLyAuLi4gSW4gZmF2b3Igb2YgdGhlc2UuCisgIHZpcnR1YWwgdm9pZCBTZXRVcChTdGF0ZSYgc3QpIHsgU2V0VXAoY29uc3RfY2FzdDxjb25zdCBTdGF0ZSY+KHN0KSk7IH0KKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKFN0YXRlJiBzdCkgeyBUZWFyRG93bihjb25zdF9jYXN0PGNvbnN0IFN0YXRlJj4oc3QpKTsgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgQmVuY2htYXJrQ2FzZShTdGF0ZSYpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNybyB0byByZWdpc3RlciBiZW5jaG1hcmtzCisKKy8vIENoZWNrIHRoYXQgX19DT1VOVEVSX18gaXMgZGVmaW5lZCBhbmQgdGhhdCBfX0NPVU5URVJfXyBpbmNyZWFzZXMgYnkgMQorLy8gZXZlcnkgdGltZSBpdCBpcyBleHBhbmRlZC4gWCArIDEgPT0gWCArIDAgaXMgdXNlZCBpbiBjYXNlIFggaXMgZGVmaW5lZCB0byBiZQorLy8gZW1wdHkuIElmIFggaXMgZW1wdHkgdGhlIGV4cHJlc3Npb24gYmVjb21lcyAoKzEgPT0gKzApLgorI2lmIGRlZmluZWQoX19DT1VOVEVSX18pICYmIChfX0NPVU5URVJfXyArIDEgPT0gX19DT1VOVEVSX18gKyAwKQorI2RlZmluZSBCRU5DSE1BUktfUFJJVkFURV9VTklRVUVfSUQgX19DT1VOVEVSX18KKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX1VOSVFVRV9JRCBfX0xJTkVfXworI2VuZGlmCisKKy8vIEhlbHBlcnMgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX05BTUUobikgXAorICBCRU5DSE1BUktfUFJJVkFURV9DT05DQVQoX2JlbmNobWFya18sIEJFTkNITUFSS19QUklWQVRFX1VOSVFVRV9JRCwgbikKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfQ09OQ0FUKGEsIGIsIGMpIEJFTkNITUFSS19QUklWQVRFX0NPTkNBVDIoYSwgYiwgYykKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfQ09OQ0FUMihhLCBiLCBjKSBhIyNiIyNjCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfREVDTEFSRShuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIDo6YmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBCRU5DSE1BUktfUFJJVkFURV9OQU1FKG4pIFwKKyAgICAgIEJFTkNITUFSS19VTlVTRUQKKworI2RlZmluZSBCRU5DSE1BUksobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFKG4pID0gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggXAorICAgICAgICAgIG5ldyA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKCNuLCBuKSkpCisKKy8vIE9sZC1zdHlsZSBtYWNyb3MKKyNkZWZpbmUgQkVOQ0hNQVJLX1dJVEhfQVJHKG4sIGEpIEJFTkNITUFSSyhuKS0+QXJnKChhKSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1dJVEhfQVJHMihuLCBhMSwgYTIpIEJFTkNITUFSSyhuKS0+QXJncyh7KGExKSwgKGEyKX0pCisjZGVmaW5lIEJFTkNITUFSS19XSVRIX1VOSVQobiwgdCkgQkVOQ0hNQVJLKG4pLT5Vbml0KCh0KSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1JBTkdFKG4sIGxvLCBoaSkgQkVOQ0hNQVJLKG4pLT5SYW5nZSgobG8pLCAoaGkpKQorI2RlZmluZSBCRU5DSE1BUktfUkFOR0UyKG4sIGwxLCBoMSwgbDIsIGgyKSBcCisgIEJFTkNITUFSSyhuKS0+UmFuZ2VQYWlyKHt7KGwxKSwgKGgxKX0sIHsobDIpLCAoaDIpfX0pCisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisKKy8vIFJlZ2lzdGVyIGEgYmVuY2htYXJrIHdoaWNoIGludm9rZXMgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSBgZnVuY2AKKy8vIHdpdGggdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmllZCBieSBgLi4uYC4KKy8vCisvLyBGb3IgZXhhbXBsZToKKy8vCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgLi4uRXh0cmFBcmdzPmAKKy8vIHZvaWQgQk1fdGFrZXNfYXJncyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgRXh0cmFBcmdzJiYuLi4gZXh0cmFfYXJncykgeworLy8gIFsuLi5dCisvL30KKy8vIC8qIFJlZ2lzdGVycyBhIGJlbmNobWFyayBuYW1lZCAiQk1fdGFrZXNfYXJncy9pbnRfc3RyaW5nX3Rlc3RgICovCisvLyBCRU5DSE1BUktfQ0FQVFVSRShCTV90YWtlc19hcmdzLCBpbnRfc3RyaW5nX3Rlc3QsIDQyLCBzdGQ6OnN0cmluZygiYWJjIikpOworI2RlZmluZSBCRU5DSE1BUktfQ0FQVFVSRShmdW5jLCB0ZXN0X2Nhc2VfbmFtZSwgLi4uKSAgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFKGZ1bmMpID0gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggXAorICAgICAgICAgIG5ldyA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkZ1bmN0aW9uQmVuY2htYXJrKCAgXAorICAgICAgICAgICAgICAjZnVuYyAiLyIgI3Rlc3RfY2FzZV9uYW1lLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBbXSg6OmJlbmNobWFyazo6U3RhdGUmIHN0KSB7IGZ1bmMoc3QsIF9fVkFfQVJHU19fKTsgfSkpKQorCisjZW5kaWYgIC8vIEJFTkNITUFSS19IQVNfQ1hYMTEKKworLy8gVGhpcyB3aWxsIHJlZ2lzdGVyIGEgYmVuY2htYXJrIGZvciBhIHRlbXBsYXRpemVkIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisvLworLy8gdGVtcGxhdGU8aW50IGFyZz4KKy8vIHZvaWQgQk1fRm9vKGludCBpdGVycyk7CisvLworLy8gQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX0ZvbywgMSk7CisvLworLy8gd2lsbCByZWdpc3RlciBCTV9Gb288MT4gYXMgYSBiZW5jaG1hcmsuCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTEobiwgYSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkUobikgPSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKCBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoI24gIjwiICNhICI+IiwgbjxhPikpKQorCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTIobiwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQkVOQ0hNQVJLX1BSSVZBVEVfREVDTEFSRShuKSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKDo6YmVuY2htYXJrOjppbnRlcm5hbDo6UmVnaXN0ZXJCZW5jaG1hcmtJbnRlcm5hbCggICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoI24gIjwiICNhICIsIiAjYiAiPiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuPGEsIGI+KSkpCisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURShuLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkUobikgPSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKCBcCisgICAgICAgICAgbmV3IDo6YmVuY2htYXJrOjppbnRlcm5hbDo6RnVuY3Rpb25CZW5jaG1hcmsoICBcCisgICAgICAgICAgICAgICNuICI8IiAjX19WQV9BUkdTX18gIj4iLCBuPF9fVkFfQVJHU19fPikpKQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFKG4sIGEpIEJFTkNITUFSS19URU1QTEFURTEobiwgYSkKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCkgICAgICAgIFwKKyAgY2xhc3MgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcmsgOiBwdWJsaWMgQmFzZUNsYXNzIHsgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcmsoKSA6IEJhc2VDbGFzcygpIHsgICAgICAgIFwKKyAgICAgIHRoaXMtPlNldE5hbWUoI0Jhc2VDbGFzcyAiLyIgI01ldGhvZCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZpcnR1YWwgdm9pZCBCZW5jaG1hcmtDYXNlKDo6YmVuY2htYXJrOjpTdGF0ZSYpOyAgICAgICAgICBcCisgIH07CisKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgXAorICBjbGFzcyBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyayA6IHB1YmxpYyBCYXNlQ2xhc3M8YT4geyAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyaygpIDogQmFzZUNsYXNzPGE+KCkgeyAgICAgICAgICAgXAorICAgICAgdGhpcy0+U2V0TmFtZSgjQmFzZUNsYXNzIjwiICNhICI+LyIgI01ldGhvZCk7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmlydHVhbCB2b2lkIEJlbmNobWFya0Nhc2UoOjpiZW5jaG1hcms6OlN0YXRlJik7ICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyX1BSSVZBVEVfREVDTEFSRV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSBcCisgIGNsYXNzIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrIDogcHVibGljIEJhc2VDbGFzczxhLCBiPiB7ICAgIFwKKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrKCkgOiBCYXNlQ2xhc3M8YSwgYj4oKSB7ICAgICAgICAgICBcCisgICAgICB0aGlzLT5TZXROYW1lKCNCYXNlQ2xhc3MiPCIgI2EgIiwiICNiICI+LyIgI01ldGhvZCk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgQmVuY2htYXJrQ2FzZSg6OmJlbmNobWFyazo6U3RhdGUmKTsgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjaWZkZWYgQkVOQ0hNQVJLX0hBU19DWFgxMQorI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEVfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIC4uLikgICAgICAgXAorICBjbGFzcyBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyayA6IHB1YmxpYyBCYXNlQ2xhc3M8X19WQV9BUkdTX18+IHsgXAorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrKCkgOiBCYXNlQ2xhc3M8X19WQV9BUkdTX18+KCkgeyAgICAgICAgXAorICAgICAgdGhpcy0+U2V0TmFtZSgjQmFzZUNsYXNzIjwiICNfX1ZBX0FSR1NfXyAiPi8iICNNZXRob2QpOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZpcnR1YWwgdm9pZCBCZW5jaG1hcmtDYXNlKDo6YmVuY2htYXJrOjpTdGF0ZSYpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFX1BSSVZBVEVfREVDTEFSRV9GKG4sIGEpIEJFTkNITUFSS19URU1QTEFURTFfUFJJVkFURV9ERUNMQVJFX0YobiwgYSkKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19ERUZJTkVfRihCYXNlQ2xhc3MsIE1ldGhvZCkgICAgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QpIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTFfREVGSU5FX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpICAgIFwKKyAgQkVOQ0hNQVJLX1RFTVBMQVRFMV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgXAorICB2b2lkIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrOjpCZW5jaG1hcmtDYXNlCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFMl9ERUZJTkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSwgYikgICAgXAorICBCRU5DSE1BUktfVEVNUExBVEUyX1BSSVZBVEVfREVDTEFSRV9GKEJhc2VDbGFzcywgTWV0aG9kLCBhLCBiKSBcCisgIHZvaWQgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcms6OkJlbmNobWFya0Nhc2UKKworI2lmZGVmIEJFTkNITUFSS19IQVNfQ1hYMTEKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFX0RFRklORV9GKEJhc2VDbGFzcywgTWV0aG9kLCAuLi4pICAgICAgICAgICAgXAorICBCRU5DSE1BUktfVEVNUExBVEVfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIF9fVkFfQVJHU19fKSBcCisgIHZvaWQgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcms6OkJlbmNobWFya0Nhc2UKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURV9ERUZJTkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgQkVOQ0hNQVJLX1RFTVBMQVRFMV9ERUZJTkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19SRUdJU1RFUl9GKEJhc2VDbGFzcywgTWV0aG9kKSBcCisgIEJFTkNITUFSS19QUklWQVRFX1JFR0lTVEVSX0YoQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcmspCisKKyNkZWZpbmUgQkVOQ0hNQVJLX1BSSVZBVEVfUkVHSVNURVJfRihUZXN0TmFtZSkgXAorICBCRU5DSE1BUktfUFJJVkFURV9ERUNMQVJFKFRlc3ROYW1lKSA9ICAgICAgICBcCisgICAgICAoOjpiZW5jaG1hcms6OmludGVybmFsOjpSZWdpc3RlckJlbmNobWFya0ludGVybmFsKG5ldyBUZXN0TmFtZSgpKSkKKworLy8gVGhpcyBtYWNybyB3aWxsIGRlZmluZSBhbmQgcmVnaXN0ZXIgYSBiZW5jaG1hcmsgd2l0aGluIGEgZml4dHVyZSBjbGFzcy4KKyNkZWZpbmUgQkVOQ0hNQVJLX0YoQmFzZUNsYXNzLCBNZXRob2QpICAgICAgICAgICBcCisgIEJFTkNITUFSS19QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCkgXAorICBCRU5DSE1BUktfUkVHSVNURVJfRihCYXNlQ2xhc3MsIE1ldGhvZCk7ICAgICAgIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURTFfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgICAgICAgICAgIFwKKyAgQkVOQ0hNQVJLX1RFTVBMQVRFMV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkgXAorICBCRU5DSE1BUktfUkVHSVNURVJfRihCYXNlQ2xhc3MsIE1ldGhvZCk7ICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgQmFzZUNsYXNzIyNfIyNNZXRob2QjI19CZW5jaG1hcms6OkJlbmNobWFya0Nhc2UKKworI2RlZmluZSBCRU5DSE1BUktfVEVNUExBVEUyX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEsIGIpICAgICAgICAgICBcCisgIEJFTkNITUFSS19URU1QTEFURTJfUFJJVkFURV9ERUNMQVJFX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEsIGIpIFwKKyAgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQmFzZUNsYXNzLCBNZXRob2QpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEJhc2VDbGFzcyMjXyMjTWV0aG9kIyNfQmVuY2htYXJrOjpCZW5jaG1hcmtDYXNlCisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX0NYWDExCisjZGVmaW5lIEJFTkNITUFSS19URU1QTEFURV9GKEJhc2VDbGFzcywgTWV0aG9kLCAuLi4pICAgICAgICAgICBcCisgIEJFTkNITUFSS19URU1QTEFURV9QUklWQVRFX0RFQ0xBUkVfRihCYXNlQ2xhc3MsIE1ldGhvZCwgX19WQV9BUkdTX18pIFwKKyAgQkVOQ0hNQVJLX1JFR0lTVEVSX0YoQmFzZUNsYXNzLCBNZXRob2QpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBCYXNlQ2xhc3MjI18jI01ldGhvZCMjX0JlbmNobWFyazo6QmVuY2htYXJrQ2FzZQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX1RFTVBMQVRFX0YoQmFzZUNsYXNzLCBNZXRob2QsIGEpIEJFTkNITUFSS19URU1QTEFURTFfRihCYXNlQ2xhc3MsIE1ldGhvZCwgYSkKKyNlbmRpZgorCisvLyBIZWxwZXIgbWFjcm8gdG8gY3JlYXRlIGEgbWFpbiByb3V0aW5lIGluIGEgdGVzdCB0aGF0IHJ1bnMgdGhlIGJlbmNobWFya3MKKyNkZWZpbmUgQkVOQ0hNQVJLX01BSU4oKSAgICAgICAgICAgICAgICAgICBcCisgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeyAgICAgICAgXAorICAgIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsgIFwKKyAgICBpZiAoOjpiZW5jaG1hcms6OlJlcG9ydFVucmVjb2duaXplZEFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgcmV0dXJuIDE7IFwKKyAgICA6OmJlbmNobWFyazo6UnVuU3BlY2lmaWVkQmVuY2htYXJrcygpOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbWFpbihpbnQsIGNoYXIqKikKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlbmNobWFyayBSZXBvcnRlcnMKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK3N0cnVjdCBDUFVJbmZvIHsKKyAgc3RydWN0IENhY2hlSW5mbyB7CisgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IHNpemU7CisgICAgaW50IG51bV9zaGFyaW5nOworICB9OworCisgIGludCBudW1fY3B1czsKKyAgZG91YmxlIGN5Y2xlc19wZXJfc2Vjb25kOworICBzdGQ6OnZlY3RvcjxDYWNoZUluZm8+IGNhY2hlczsKKyAgYm9vbCBzY2FsaW5nX2VuYWJsZWQ7CisKKyAgc3RhdGljIGNvbnN0IENQVUluZm8mIEdldCgpOworCisgcHJpdmF0ZToKKyAgQ1BVSW5mbygpOworICBCRU5DSE1BUktfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENQVUluZm8pOworfTsKKworLy8gSW50ZXJmYWNlIGZvciBjdXN0b20gYmVuY2htYXJrIHJlc3VsdCBwcmludGVycy4KKy8vIEJ5IGRlZmF1bHQsIGJlbmNobWFyayByZXBvcnRzIGFyZSBwcmludGVkIHRvIHN0ZG91dC4gSG93ZXZlciBhbiBhcHBsaWNhdGlvbgorLy8gY2FuIGNvbnRyb2wgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXBvcnRzIGJ5IGNhbGxpbmcKKy8vIFJ1blNwZWNpZmllZEJlbmNobWFya3MgYW5kIHBhc3NpbmcgaXQgYSBjdXN0b20gcmVwb3J0ZXIgb2JqZWN0LgorLy8gVGhlIHJlcG9ydGVyIG9iamVjdCBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGludGVyZmFjZS4KK2NsYXNzIEJlbmNobWFya1JlcG9ydGVyIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBDb250ZXh0IHsKKyAgICBDUFVJbmZvIGNvbnN0JiBjcHVfaW5mbzsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBsb25nZXN0IGJlbmNobWFyayBuYW1lLgorICAgIHNpemVfdCBuYW1lX2ZpZWxkX3dpZHRoOworCisgICAgQ29udGV4dCgpOworICB9OworCisgIHN0cnVjdCBSdW4geworICAgIFJ1bigpCisgICAgICAgIDogZXJyb3Jfb2NjdXJyZWQoZmFsc2UpLAorICAgICAgICAgIGl0ZXJhdGlvbnMoMSksCisgICAgICAgICAgdGltZV91bml0KGtOYW5vc2Vjb25kKSwKKyAgICAgICAgICByZWFsX2FjY3VtdWxhdGVkX3RpbWUoMCksCisgICAgICAgICAgY3B1X2FjY3VtdWxhdGVkX3RpbWUoMCksCisgICAgICAgICAgYnl0ZXNfcGVyX3NlY29uZCgwKSwKKyAgICAgICAgICBpdGVtc19wZXJfc2Vjb25kKDApLAorICAgICAgICAgIG1heF9oZWFwYnl0ZXNfdXNlZCgwKSwKKyAgICAgICAgICBjb21wbGV4aXR5KG9Ob25lKSwKKyAgICAgICAgICBjb21wbGV4aXR5X2xhbWJkYSgpLAorICAgICAgICAgIGNvbXBsZXhpdHlfbigwKSwKKyAgICAgICAgICByZXBvcnRfYmlnX28oZmFsc2UpLAorICAgICAgICAgIHJlcG9ydF9ybXMoZmFsc2UpLAorICAgICAgICAgIGNvdW50ZXJzKCkge30KKworICAgIHN0ZDo6c3RyaW5nIGJlbmNobWFya19uYW1lOworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydF9sYWJlbDsgIC8vIEVtcHR5IGlmIG5vdCBzZXQgYnkgYmVuY2htYXJrLgorICAgIGJvb2wgZXJyb3Jfb2NjdXJyZWQ7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfbWVzc2FnZTsKKworICAgIGludDY0X3QgaXRlcmF0aW9uczsKKyAgICBUaW1lVW5pdCB0aW1lX3VuaXQ7CisgICAgZG91YmxlIHJlYWxfYWNjdW11bGF0ZWRfdGltZTsKKyAgICBkb3VibGUgY3B1X2FjY3VtdWxhdGVkX3RpbWU7CisKKyAgICAvLyBSZXR1cm4gYSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlYWwgdGltZSBwZXIgaXRlcmF0aW9uIGluIHRoZSB1bml0CisgICAgLy8gc3BlY2lmaWVkIGJ5ICd0aW1lX3VuaXQnLgorICAgIC8vIE5PVEU6IElmICdpdGVyYXRpb25zJyBpcyB6ZXJvIHRoZSByZXR1cm5lZCB2YWx1ZSByZXByZXNlbnRzIHRoZQorICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUuCisgICAgZG91YmxlIEdldEFkanVzdGVkUmVhbFRpbWUoKSBjb25zdDsKKworICAgIC8vIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3B1IHRpbWUgcGVyIGl0ZXJhdGlvbiBpbiB0aGUgdW5pdAorICAgIC8vIHNwZWNpZmllZCBieSAndGltZV91bml0Jy4KKyAgICAvLyBOT1RFOiBJZiAnaXRlcmF0aW9ucycgaXMgemVybyB0aGUgcmV0dXJuZWQgdmFsdWUgcmVwcmVzZW50cyB0aGUKKyAgICAvLyBhY2N1bXVsYXRlZCB0aW1lLgorICAgIGRvdWJsZSBHZXRBZGp1c3RlZENQVVRpbWUoKSBjb25zdDsKKworICAgIC8vIFplcm8gaWYgbm90IHNldCBieSBiZW5jaG1hcmsuCisgICAgZG91YmxlIGJ5dGVzX3Blcl9zZWNvbmQ7CisgICAgZG91YmxlIGl0ZW1zX3Blcl9zZWNvbmQ7CisKKyAgICAvLyBUaGlzIGlzIHNldCB0byAwLjAgaWYgbWVtb3J5IHRyYWNpbmcgaXMgbm90IGVuYWJsZWQuCisgICAgZG91YmxlIG1heF9oZWFwYnl0ZXNfdXNlZDsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgYXJndW1lbnRzIHRvIGNvbXB1dGUgYXN5bXB0b3RpYyBjb21wbGV4aXR5CisgICAgQmlnTyBjb21wbGV4aXR5OworICAgIEJpZ09GdW5jKiBjb21wbGV4aXR5X2xhbWJkYTsKKyAgICBpbnQgY29tcGxleGl0eV9uOworCisgICAgLy8gd2hhdCBzdGF0aXN0aWNzIHRvIGNvbXB1dGUgZnJvbSB0aGUgbWVhc3VyZW1lbnRzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3RhdGlzdGljcz4qIHN0YXRpc3RpY3M7CisKKyAgICAvLyBJbmZvcm0gcHJpbnQgZnVuY3Rpb24gd2hldGhlciB0aGUgY3VycmVudCBydW4gaXMgYSBjb21wbGV4aXR5IHJlcG9ydAorICAgIGJvb2wgcmVwb3J0X2JpZ19vOworICAgIGJvb2wgcmVwb3J0X3JtczsKKworICAgIFVzZXJDb3VudGVycyBjb3VudGVyczsKKyAgfTsKKworICAvLyBDb25zdHJ1Y3QgYSBCZW5jaG1hcmtSZXBvcnRlciB3aXRoIHRoZSBvdXRwdXQgc3RyZWFtIHNldCB0byAnc3RkOjpjb3V0JworICAvLyBhbmQgdGhlIGVycm9yIHN0cmVhbSBzZXQgdG8gJ3N0ZDo6Y2VycicKKyAgQmVuY2htYXJrUmVwb3J0ZXIoKTsKKworICAvLyBDYWxsZWQgb25jZSBmb3IgZXZlcnkgc3VpdGUgb2YgYmVuY2htYXJrcyBydW4uCisgIC8vIFRoZSBwYXJhbWV0ZXIgImNvbnRleHQiIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgdGhlCisgIC8vIHJlcG9ydGVyIG1heSB3aXNoIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgaXRzIHJlcG9ydCwgZm9yIGV4YW1wbGUgdGhlCisgIC8vIHBsYXRmb3JtIHVuZGVyIHdoaWNoIHRoZSBiZW5jaG1hcmtzIGFyZSBydW5uaW5nLiBUaGUgYmVuY2htYXJrIHJ1biBpcworICAvLyBuZXZlciBzdGFydGVkIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgYWxsb3dpbmcgdGhlIHJlcG9ydGVyCisgIC8vIHRvIHNraXAgcnVucyBiYXNlZCBvbiB0aGUgY29udGV4dCBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBib29sIFJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCkgPSAwOworCisgIC8vIENhbGxlZCBvbmNlIGZvciBlYWNoIGdyb3VwIG9mIGJlbmNobWFyayBydW5zLCBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dAorICAvLyBjcHUtdGltZSBhbmQgaGVhcCBtZW1vcnkgdXNhZ2UgZHVyaW5nIHRoZSBiZW5jaG1hcmsgcnVuLiBJZiB0aGUgZ3JvdXAKKyAgLy8gb2YgcnVucyBjb250YWluZWQgbW9yZSB0aGFuIHR3byBlbnRyaWVzIHRoZW4gJ3JlcG9ydCcgY29udGFpbnMgYWRkaXRpb25hbAorICAvLyBlbGVtZW50cyByZXByZXNlbnRpbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aG9zZSBydW5zLgorICAvLyBBZGRpdGlvbmFsbHkgaWYgdGhpcyBncm91cCBvZiBydW5zIHdhcyB0aGUgbGFzdCBpbiBhIGZhbWlseSBvZiBiZW5jaG1hcmtzCisgIC8vICdyZXBvcnRzJyBjb250YWlucyBhZGRpdGlvbmFsIGVudHJpZXMgcmVwcmVzZW50aW5nIHRoZSBhc3ltcHRvdGljCisgIC8vIGNvbXBsZXhpdHkgYW5kIFJNUyBvZiB0aGF0IGJlbmNobWFyayBmYW1pbHkuCisgIHZpcnR1YWwgdm9pZCBSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4mIHJlcG9ydCkgPSAwOworCisgIC8vIENhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgYWZ0ZXIgZXZlciBncm91cCBvZiBiZW5jaG1hcmtzIGlzIHJ1biBhbmQKKyAgLy8gcmVwb3J0ZWQuCisgIHZpcnR1YWwgdm9pZCBGaW5hbGl6ZSgpIHt9CisKKyAgLy8gUkVRVUlSRVM6IFRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSAnb3V0JyBpcyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lCisgIC8vIG9mIHRoZSByZXBvcnRlci4KKyAgdm9pZCBTZXRPdXRwdXRTdHJlYW0oc3RkOjpvc3RyZWFtKiBvdXQpIHsKKyAgICBhc3NlcnQob3V0KTsKKyAgICBvdXRwdXRfc3RyZWFtXyA9IG91dDsKKyAgfQorCisgIC8vIFJFUVVJUkVTOiBUaGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgJ2VycicgaXMgdmFsaWQgZm9yIHRoZSBsaWZldGltZQorICAvLyBvZiB0aGUgcmVwb3J0ZXIuCisgIHZvaWQgU2V0RXJyb3JTdHJlYW0oc3RkOjpvc3RyZWFtKiBlcnIpIHsKKyAgICBhc3NlcnQoZXJyKTsKKyAgICBlcnJvcl9zdHJlYW1fID0gZXJyOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBHZXRPdXRwdXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiAqb3V0cHV0X3N0cmVhbV87IH0KKworICBzdGQ6Om9zdHJlYW0mIEdldEVycm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gKmVycm9yX3N0cmVhbV87IH0KKworICB2aXJ0dWFsIH5CZW5jaG1hcmtSZXBvcnRlcigpOworCisgIC8vIFdyaXRlIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHRvICdvdXQnIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCisgIC8vICdjb250ZXh0Jy4KKyAgLy8gUkVRVUlSRVM6ICdvdXQnIGlzIG5vbi1udWxsLgorICBzdGF0aWMgdm9pZCBQcmludEJhc2ljQ29udGV4dChzdGQ6Om9zdHJlYW0qIG91dCwgQ29udGV4dCBjb25zdCYgY29udGV4dCk7CisKKyBwcml2YXRlOgorICBzdGQ6Om9zdHJlYW0qIG91dHB1dF9zdHJlYW1fOworICBzdGQ6Om9zdHJlYW0qIGVycm9yX3N0cmVhbV87Cit9OworCisvLyBTaW1wbGUgcmVwb3J0ZXIgdGhhdCBvdXRwdXRzIGJlbmNobWFyayBkYXRhIHRvIHRoZSBjb25zb2xlLiBUaGlzIGlzIHRoZQorLy8gZGVmYXVsdCByZXBvcnRlciB1c2VkIGJ5IFJ1blNwZWNpZmllZEJlbmNobWFya3MoKS4KK2NsYXNzIENvbnNvbGVSZXBvcnRlciA6IHB1YmxpYyBCZW5jaG1hcmtSZXBvcnRlciB7CitwdWJsaWM6CisgIGVudW0gT3V0cHV0T3B0aW9ucyB7CisgICAgT09fTm9uZSA9IDAsCisgICAgT09fQ29sb3IgPSAxLAorICAgIE9PX1RhYnVsYXIgPSAyLAorICAgIE9PX0NvbG9yVGFidWxhciA9IE9PX0NvbG9yfE9PX1RhYnVsYXIsCisgICAgT09fRGVmYXVsdHMgPSBPT19Db2xvclRhYnVsYXIKKyAgfTsKKyAgZXhwbGljaXQgQ29uc29sZVJlcG9ydGVyKE91dHB1dE9wdGlvbnMgb3B0c18gPSBPT19EZWZhdWx0cykKKyAgICAgIDogb3V0cHV0X29wdGlvbnNfKG9wdHNfKSwgbmFtZV9maWVsZF93aWR0aF8oMCksCisgICAgICAgIHByZXZfY291bnRlcnNfKCksIHByaW50ZWRfaGVhZGVyXyhmYWxzZSkge30KKworICB2aXJ0dWFsIGJvb2wgUmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KTsKKyAgdmlydHVhbCB2b2lkIFJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0cyk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBQcmludFJ1bkRhdGEoY29uc3QgUnVuJiByZXBvcnQpOworICB2aXJ0dWFsIHZvaWQgUHJpbnRIZWFkZXIoY29uc3QgUnVuJiByZXBvcnQpOworCisgIE91dHB1dE9wdGlvbnMgb3V0cHV0X29wdGlvbnNfOworICBzaXplX3QgbmFtZV9maWVsZF93aWR0aF87CisgIFVzZXJDb3VudGVycyBwcmV2X2NvdW50ZXJzXzsKKyAgYm9vbCBwcmludGVkX2hlYWRlcl87Cit9OworCitjbGFzcyBKU09OUmVwb3J0ZXIgOiBwdWJsaWMgQmVuY2htYXJrUmVwb3J0ZXIgeworIHB1YmxpYzoKKyAgSlNPTlJlcG9ydGVyKCkgOiBmaXJzdF9yZXBvcnRfKHRydWUpIHt9CisgIHZpcnR1YWwgYm9vbCBSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQpOworICB2aXJ0dWFsIHZvaWQgUmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnRzKTsKKyAgdmlydHVhbCB2b2lkIEZpbmFsaXplKCk7CisKKyBwcml2YXRlOgorICB2b2lkIFByaW50UnVuRGF0YShjb25zdCBSdW4mIHJlcG9ydCk7CisKKyAgYm9vbCBmaXJzdF9yZXBvcnRfOworfTsKKworY2xhc3MgQ1NWUmVwb3J0ZXIgOiBwdWJsaWMgQmVuY2htYXJrUmVwb3J0ZXIgeworIHB1YmxpYzoKKyAgQ1NWUmVwb3J0ZXIoKSA6IHByaW50ZWRfaGVhZGVyXyhmYWxzZSkge30KKyAgdmlydHVhbCBib29sIFJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCk7CisgIHZpcnR1YWwgdm9pZCBSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4mIHJlcG9ydHMpOworCisgcHJpdmF0ZToKKyAgdm9pZCBQcmludFJ1bkRhdGEoY29uc3QgUnVuJiByZXBvcnQpOworCisgIGJvb2wgcHJpbnRlZF9oZWFkZXJfOworICBzdGQ6OnNldDwgc3RkOjpzdHJpbmcgPiB1c2VyX2NvdW50ZXJfbmFtZXNfOworfTsKKworaW5saW5lIGNvbnN0IGNoYXIqIEdldFRpbWVVbml0U3RyaW5nKFRpbWVVbml0IHVuaXQpIHsKKyAgc3dpdGNoICh1bml0KSB7CisgICAgY2FzZSBrTWlsbGlzZWNvbmQ6CisgICAgICByZXR1cm4gIm1zIjsKKyAgICBjYXNlIGtNaWNyb3NlY29uZDoKKyAgICAgIHJldHVybiAidXMiOworICAgIGNhc2Uga05hbm9zZWNvbmQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAibnMiOworICB9Cit9CisKK2lubGluZSBkb3VibGUgR2V0VGltZVVuaXRNdWx0aXBsaWVyKFRpbWVVbml0IHVuaXQpIHsKKyAgc3dpdGNoICh1bml0KSB7CisgICAgY2FzZSBrTWlsbGlzZWNvbmQ6CisgICAgICByZXR1cm4gMWUzOworICAgIGNhc2Uga01pY3Jvc2Vjb25kOgorICAgICAgcmV0dXJuIDFlNjsKKyAgICBjYXNlIGtOYW5vc2Vjb25kOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMWU5OworICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19CRU5DSE1BUktfSF8KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL0NNYWtlTGlzdHMudHh0IGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyNjIwYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsODcgQEAKKyMgQWxsb3cgdGhlIHNvdXJjZSBmaWxlcyB0byBmaW5kIGhlYWRlcnMgaW4gc3JjLworaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjKQorCitpZiAoREVGSU5FRCBCRU5DSE1BUktfQ1hYX0xJTktFUl9GTEFHUykKKyAgbGlzdChBUFBFTkQgQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyAke0JFTkNITUFSS19DWFhfTElOS0VSX0ZMQUdTfSkKKyAgbGlzdChBUFBFTkQgQ01BS0VfTU9EVUxFX0xJTktFUl9GTEFHUyAke0JFTkNITUFSS19DWFhfTElOS0VSX0ZMQUdTfSkKK2VuZGlmKCkKKworZmlsZShHTE9CCisgIFNPVVJDRV9GSUxFUworICAgICouY2MKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS9iZW5jaG1hcmsvKi5oCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyouaCkKKworYWRkX2xpYnJhcnkoYmVuY2htYXJrICR7U09VUkNFX0ZJTEVTfSkKK3NldF90YXJnZXRfcHJvcGVydGllcyhiZW5jaG1hcmsgUFJPUEVSVElFUworICBPVVRQVVRfTkFNRSAiYmVuY2htYXJrIgorICBWRVJTSU9OICR7R0VORVJJQ19MSUJfVkVSU0lPTn0KKyAgU09WRVJTSU9OICR7R0VORVJJQ19MSUJfU09WRVJTSU9OfQorKQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoYmVuY2htYXJrIFBVQkxJQworICAgICQ8QlVJTERfSU5URVJGQUNFOiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi9pbmNsdWRlPgorICAgICkKKworIyBMaW5rIHRocmVhZHMuCit0YXJnZXRfbGlua19saWJyYXJpZXMoYmVuY2htYXJrICAke0JFTkNITUFSS19DWFhfTElCUkFSSUVTfSAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorZmluZF9saWJyYXJ5KExJQlJUIHJ0KQoraWYoTElCUlQpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhiZW5jaG1hcmsgJHtMSUJSVH0pCitlbmRpZigpCisKKyMgV2UgbmVlZCBleHRyYSBsaWJyYXJpZXMgb24gV2luZG93cworaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiV2luZG93cyIpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhiZW5jaG1hcmsgU2hsd2FwaSkKK2VuZGlmKCkKKworc2V0KGluY2x1ZGVfaW5zdGFsbF9kaXIgImluY2x1ZGUiKQorc2V0KGxpYl9pbnN0YWxsX2RpciAibGliLyIpCitzZXQoYmluX2luc3RhbGxfZGlyICJiaW4vIikKK3NldChjb25maWdfaW5zdGFsbF9kaXIgImxpYi9jbWFrZS8ke1BST0pFQ1RfTkFNRX0iKQorc2V0KHBrZ2NvbmZpZ19pbnN0YWxsX2RpciAibGliL3BrZ2NvbmZpZyIpCisKK3NldChnZW5lcmF0ZWRfZGlyICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuZXJhdGVkIikKKworc2V0KHZlcnNpb25fY29uZmlnICIke2dlbmVyYXRlZF9kaXJ9LyR7UFJPSkVDVF9OQU1FfUNvbmZpZ1ZlcnNpb24uY21ha2UiKQorc2V0KHByb2plY3RfY29uZmlnICIke2dlbmVyYXRlZF9kaXJ9LyR7UFJPSkVDVF9OQU1FfUNvbmZpZy5jbWFrZSIpCitzZXQocGtnX2NvbmZpZyAiJHtnZW5lcmF0ZWRfZGlyfS8ke1BST0pFQ1RfTkFNRX0ucGMiKQorc2V0KHRhcmdldHNfZXhwb3J0X25hbWUgIiR7UFJPSkVDVF9OQU1FfVRhcmdldHMiKQorCitzZXQobmFtZXNwYWNlICIke1BST0pFQ1RfTkFNRX06OiIpCisKK2luY2x1ZGUoQ01ha2VQYWNrYWdlQ29uZmlnSGVscGVycykKK3dyaXRlX2Jhc2ljX3BhY2thZ2VfdmVyc2lvbl9maWxlKAorICAgICIke3ZlcnNpb25fY29uZmlnfSIgVkVSU0lPTiAke0dJVF9WRVJTSU9OfSBDT01QQVRJQklMSVRZIFNhbWVNYWpvclZlcnNpb24KKykKKworY29uZmlndXJlX2ZpbGUoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZS9Db25maWcuY21ha2UuaW4iICIke3Byb2plY3RfY29uZmlnfSIgQE9OTFkpCitjb25maWd1cmVfZmlsZSgiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2NtYWtlL2JlbmNobWFyay5wYy5pbiIgIiR7cGtnX2NvbmZpZ30iIEBPTkxZKQorCitpZiAoQkVOQ0hNQVJLX0VOQUJMRV9JTlNUQUxMKQorICAjIEluc3RhbGwgdGFyZ2V0ICh3aWxsIGluc3RhbGwgdGhlIGxpYnJhcnkgdG8gc3BlY2lmaWVkIENNQUtFX0lOU1RBTExfUFJFRklYIHZhcmlhYmxlKQorICBpbnN0YWxsKAorICAgIFRBUkdFVFMgYmVuY2htYXJrCisgICAgRVhQT1JUICR7dGFyZ2V0c19leHBvcnRfbmFtZX0KKyAgICBBUkNISVZFIERFU1RJTkFUSU9OICR7bGliX2luc3RhbGxfZGlyfQorICAgIExJQlJBUlkgREVTVElOQVRJT04gJHtsaWJfaW5zdGFsbF9kaXJ9CisgICAgUlVOVElNRSBERVNUSU5BVElPTiAke2Jpbl9pbnN0YWxsX2Rpcn0KKyAgICBJTkNMVURFUyBERVNUSU5BVElPTiAke2luY2x1ZGVfaW5zdGFsbF9kaXJ9KQorCisgIGluc3RhbGwoCisgICAgRElSRUNUT1JZICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZS9iZW5jaG1hcmsiCisgICAgREVTVElOQVRJT04gJHtpbmNsdWRlX2luc3RhbGxfZGlyfQorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouKmgiKQorCisgIGluc3RhbGwoCisgICAgICBGSUxFUyAiJHtwcm9qZWN0X2NvbmZpZ30iICIke3ZlcnNpb25fY29uZmlnfSIKKyAgICAgIERFU1RJTkFUSU9OICIke2NvbmZpZ19pbnN0YWxsX2Rpcn0iKQorCisgIGluc3RhbGwoCisgICAgICBGSUxFUyAiJHtwa2dfY29uZmlnfSIKKyAgICAgIERFU1RJTkFUSU9OICIke3BrZ2NvbmZpZ19pbnN0YWxsX2Rpcn0iKQorCisgIGluc3RhbGwoCisgICAgICBFWFBPUlQgIiR7dGFyZ2V0c19leHBvcnRfbmFtZX0iCisgICAgICBOQU1FU1BBQ0UgIiR7bmFtZXNwYWNlfSIKKyAgICAgIERFU1RJTkFUSU9OICIke2NvbmZpZ19pbnN0YWxsX2Rpcn0iKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvYXJyYXlzaXplLmggYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9hcnJheXNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE1MGYyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvYXJyYXlzaXplLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBCRU5DSE1BUktfQVJSQVlTSVpFX0hfCisjZGVmaW5lIEJFTkNITUFSS19BUlJBWVNJWkVfSF8KKworI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBUaGUgYXJyYXlzaXplKGFycikgbWFjcm8gcmV0dXJucyB0aGUgIyBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBhcnIuCisvLyBUaGUgZXhwcmVzc2lvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgYW5kIHRoZXJlZm9yZSBjYW4gYmUKKy8vIHVzZWQgaW4gZGVmaW5pbmcgbmV3IGFycmF5cywgZm9yIGV4YW1wbGUuICBJZiB5b3UgdXNlIGFycmF5c2l6ZSBvbgorLy8gYSBwb2ludGVyIGJ5IG1pc3Rha2UsIHlvdSB3aWxsIGdldCBhIGNvbXBpbGUtdGltZSBlcnJvci4KKy8vCisKKy8vIFRoaXMgdGVtcGxhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaXMgdXNlZCBpbiBkZWZpbmluZyBhcnJheXNpemUuCisvLyBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgbmVlZCBhbiBpbXBsZW1lbnRhdGlvbiwgYXMgd2Ugb25seQorLy8gdXNlIGl0cyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY2hhciAoJkFycmF5U2l6ZUhlbHBlcihUICgmYXJyYXkpW05dKSlbTl07CisKKy8vIFRoYXQgZ2NjIHdhbnRzIGJvdGggb2YgdGhlc2UgcHJvdG90eXBlcyBzZWVtcyBteXN0ZXJpb3VzLiBWQywgZm9yCisvLyBpdHMgcGFydCwgY2FuJ3QgZGVjaWRlIHdoaWNoIHRvIHVzZSAoYW5vdGhlciBteXN0ZXJ5KS4gTWF0Y2hpbmcgb2YKKy8vIHRlbXBsYXRlIG92ZXJsb2FkczogdGhlIGZpbmFsIGZyb250aWVyLgorI2lmbmRlZiBDT01QSUxFUl9NU1ZDCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CitjaGFyICgmQXJyYXlTaXplSGVscGVyKGNvbnN0IFQgKCZhcnJheSlbTl0pKVtOXTsKKyNlbmRpZgorCisjZGVmaW5lIGFycmF5c2l6ZShhcnJheSkgKHNpemVvZig6OmJlbmNobWFyazo6aW50ZXJuYWw6OkFycmF5U2l6ZUhlbHBlcihhcnJheSkpKQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19BUlJBWVNJWkVfSF8KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2JlbmNobWFyay5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2JlbmNobWFyay5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTdkMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvYmVuY2htYXJrLmNjCkBAIC0wLDAgKzEsNzE0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImJlbmNobWFya19hcGlfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworI2lmbmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisjaW5jbHVkZSAiY29tbWFuZGxpbmVmbGFncy5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKyNpbmNsdWRlICJjb3VudGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibXV0ZXguaCIKKyNpbmNsdWRlICJyZS5oIgorI2luY2x1ZGUgInN0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInRpbWVycy5oIgorCitERUZJTkVfYm9vbChiZW5jaG1hcmtfbGlzdF90ZXN0cywgZmFsc2UsCisgICAgICAgICAgICAiUHJpbnQgYSBsaXN0IG9mIGJlbmNobWFya3MuIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyBhbGwgb3RoZXIgIgorICAgICAgICAgICAgIm9wdGlvbnMuIik7CisKK0RFRklORV9zdHJpbmcoYmVuY2htYXJrX2ZpbHRlciwgIi4iLAorICAgICAgICAgICAgICAiQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBiZW5jaG1hcmtzICIKKyAgICAgICAgICAgICAgInRvIGV4ZWN1dGUuICBJZiB0aGlzIGZsYWcgaXMgZW1wdHksIG5vIGJlbmNobWFya3MgYXJlIHJ1bi4gICIKKyAgICAgICAgICAgICAgIklmIHRoaXMgZmxhZyBpcyB0aGUgc3RyaW5nIFwiYWxsXCIsIGFsbCBiZW5jaG1hcmtzIGxpbmtlZCAiCisgICAgICAgICAgICAgICJpbnRvIHRoZSBwcm9jZXNzIGFyZSBydW4uIik7CisKK0RFRklORV9kb3VibGUoYmVuY2htYXJrX21pbl90aW1lLCAwLjUsCisgICAgICAgICAgICAgICJNaW5pbXVtIG51bWJlciBvZiBzZWNvbmRzIHdlIHNob3VsZCBydW4gYmVuY2htYXJrIGJlZm9yZSAiCisgICAgICAgICAgICAgICJyZXN1bHRzIGFyZSBjb25zaWRlcmVkIHNpZ25pZmljYW50LiAgRm9yIGNwdS10aW1lIGJhc2VkICIKKyAgICAgICAgICAgICAgInRlc3RzLCB0aGlzIGlzIHRoZSBsb3dlciBib3VuZCBvbiB0aGUgdG90YWwgY3B1IHRpbWUgIgorICAgICAgICAgICAgICAidXNlZCBieSBhbGwgdGhyZWFkcyB0aGF0IG1ha2UgdXAgdGhlIHRlc3QuICBGb3IgcmVhbC10aW1lICIKKyAgICAgICAgICAgICAgImJhc2VkIHRlc3RzLCB0aGlzIGlzIHRoZSBsb3dlciBib3VuZCBvbiB0aGUgZWxhcHNlZCB0aW1lICIKKyAgICAgICAgICAgICAgIm9mIHRoZSBiZW5jaG1hcmsgZXhlY3V0aW9uLCByZWdhcmRsZXNzIG9mIG51bWJlciBvZiAiCisgICAgICAgICAgICAgICJ0aHJlYWRzLiIpOworCitERUZJTkVfaW50MzIoYmVuY2htYXJrX3JlcGV0aXRpb25zLCAxLAorICAgICAgICAgICAgICJUaGUgbnVtYmVyIG9mIHJ1bnMgb2YgZWFjaCBiZW5jaG1hcmsuIElmIGdyZWF0ZXIgdGhhbiAxLCB0aGUgIgorICAgICAgICAgICAgICJtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJ1bnMgd2lsbCBiZSByZXBvcnRlZC4iKTsKKworREVGSU5FX2Jvb2woYmVuY2htYXJrX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHksIGZhbHNlLAorICAgICAgICAgICAgIlJlcG9ydCB0aGUgcmVzdWx0IG9mIGVhY2ggYmVuY2htYXJrIHJlcGV0aXRpb25zLiBXaGVuICd0cnVlJyBpcyAiCisgICAgICAgICAgICAic3BlY2lmaWVkIG9ubHkgdGhlIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIG90aGVyIHN0YXRpc3RpY3MgIgorICAgICAgICAgICAgImFyZSByZXBvcnRlZCBmb3IgcmVwZWF0ZWQgYmVuY2htYXJrcy4iKTsKKworREVGSU5FX3N0cmluZyhiZW5jaG1hcmtfZm9ybWF0LCAiY29uc29sZSIsCisgICAgICAgICAgICAgICJUaGUgZm9ybWF0IHRvIHVzZSBmb3IgY29uc29sZSBvdXRwdXQuIFZhbGlkIHZhbHVlcyBhcmUgIgorICAgICAgICAgICAgICAiJ2NvbnNvbGUnLCAnanNvbicsIG9yICdjc3YnLiIpOworCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19vdXRfZm9ybWF0LCAianNvbiIsCisgICAgICAgICAgICAgICJUaGUgZm9ybWF0IHRvIHVzZSBmb3IgZmlsZSBvdXRwdXQuIFZhbGlkIHZhbHVlcyBhcmUgIgorICAgICAgICAgICAgICAiJ2NvbnNvbGUnLCAnanNvbicsIG9yICdjc3YnLiIpOworCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19vdXQsICIiLCAiVGhlIGZpbGUgdG8gd3JpdGUgYWRkaXRvbmFsIG91dHB1dCB0byIpOworCitERUZJTkVfc3RyaW5nKGJlbmNobWFya19jb2xvciwgImF1dG8iLAorICAgICAgICAgICAgICAiV2hldGhlciB0byB1c2UgY29sb3JzIGluIHRoZSBvdXRwdXQuICBWYWxpZCB2YWx1ZXM6ICIKKyAgICAgICAgICAgICAgIid0cnVlJy8neWVzJy8xLCAnZmFsc2UnLydubycvMCwgYW5kICdhdXRvJy4gJ2F1dG8nIG1lYW5zIHRvIHVzZSAiCisgICAgICAgICAgICAgICJjb2xvcnMgaWYgdGhlIG91dHB1dCBpcyBiZWluZyBzZW50IHRvIGEgdGVybWluYWwgYW5kIHRoZSBURVJNICIKKyAgICAgICAgICAgICAgImVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byBhIHRlcm1pbmFsIHR5cGUgdGhhdCBzdXBwb3J0cyAiCisgICAgICAgICAgICAgICJjb2xvcnMuIik7CisKK0RFRklORV9ib29sKGJlbmNobWFya19jb3VudGVyc190YWJ1bGFyLCBmYWxzZSwKKyAgICAgICAgICAgICJXaGV0aGVyIHRvIHVzZSB0YWJ1bGFyIGZvcm1hdCB3aGVuIHByaW50aW5nIHVzZXIgY291bnRlcnMgdG8gIgorICAgICAgICAgICAgInRoZSBjb25zb2xlLiAgVmFsaWQgdmFsdWVzOiAndHJ1ZScvJ3llcycvMSwgJ2ZhbHNlJy8nbm8nLzAuIgorICAgICAgICAgICAgIkRlZmF1bHRzIHRvIGZhbHNlLiIpOworCitERUZJTkVfaW50MzIodiwgMCwgIlRoZSBsZXZlbCBvZiB2ZXJib3NlIGxvZ2dpbmcgdG8gb3V0cHV0Iik7CisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCituYW1lc3BhY2Ugeworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4SXRlcmF0aW9ucyA9IDEwMDAwMDAwMDA7Cit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgVXNlQ2hhclBvaW50ZXIoY2hhciBjb25zdCB2b2xhdGlsZSopIHt9CisKK2NsYXNzIFRocmVhZE1hbmFnZXIgeworIHB1YmxpYzoKKyAgVGhyZWFkTWFuYWdlcihpbnQgbnVtX3RocmVhZHMpCisgICAgICA6IGFsaXZlX3RocmVhZHNfKG51bV90aHJlYWRzKSwgc3RhcnRfc3RvcF9iYXJyaWVyXyhudW1fdGhyZWFkcykge30KKworICBNdXRleCYgR2V0QmVuY2htYXJrTXV0ZXgoKSBjb25zdCBSRVRVUk5fQ0FQQUJJTElUWShiZW5jaG1hcmtfbXV0ZXhfKSB7CisgICAgcmV0dXJuIGJlbmNobWFya19tdXRleF87CisgIH0KKworICBib29sIFN0YXJ0U3RvcEJhcnJpZXIoKSBFWENMVURFUyhlbmRfY29uZF9tdXRleF8pIHsKKyAgICByZXR1cm4gc3RhcnRfc3RvcF9iYXJyaWVyXy53YWl0KCk7CisgIH0KKworICB2b2lkIE5vdGlmeVRocmVhZENvbXBsZXRlKCkgRVhDTFVERVMoZW5kX2NvbmRfbXV0ZXhfKSB7CisgICAgc3RhcnRfc3RvcF9iYXJyaWVyXy5yZW1vdmVUaHJlYWQoKTsKKyAgICBpZiAoLS1hbGl2ZV90aHJlYWRzXyA9PSAwKSB7CisgICAgICBNdXRleExvY2sgbG9jayhlbmRfY29uZF9tdXRleF8pOworICAgICAgZW5kX2NvbmRpdGlvbl8ubm90aWZ5X2FsbCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgV2FpdEZvckFsbFRocmVhZHMoKSBFWENMVURFUyhlbmRfY29uZF9tdXRleF8pIHsKKyAgICBNdXRleExvY2sgbG9jayhlbmRfY29uZF9tdXRleF8pOworICAgIGVuZF9jb25kaXRpb25fLndhaXQobG9jay5uYXRpdmVfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBhbGl2ZV90aHJlYWRzXyA9PSAwOyB9KTsKKyAgfQorCisgcHVibGljOgorICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICBkb3VibGUgcmVhbF90aW1lX3VzZWQgPSAwOworICAgIGRvdWJsZSBjcHVfdGltZV91c2VkID0gMDsKKyAgICBkb3VibGUgbWFudWFsX3RpbWVfdXNlZCA9IDA7CisgICAgaW50NjRfdCBieXRlc19wcm9jZXNzZWQgPSAwOworICAgIGludDY0X3QgaXRlbXNfcHJvY2Vzc2VkID0gMDsKKyAgICBpbnQgY29tcGxleGl0eV9uID0gMDsKKyAgICBzdGQ6OnN0cmluZyByZXBvcnRfbGFiZWxfOworICAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2VfOworICAgIGJvb2wgaGFzX2Vycm9yXyA9IGZhbHNlOworICAgIFVzZXJDb3VudGVycyBjb3VudGVyczsKKyAgfTsKKyAgR1VBUkRFRF9CWShHZXRCZW5jaG1hcmtNdXRleCgpKSBSZXN1bHQgcmVzdWx0czsKKworIHByaXZhdGU6CisgIG11dGFibGUgTXV0ZXggYmVuY2htYXJrX211dGV4XzsKKyAgc3RkOjphdG9taWM8aW50PiBhbGl2ZV90aHJlYWRzXzsKKyAgQmFycmllciBzdGFydF9zdG9wX2JhcnJpZXJfOworICBNdXRleCBlbmRfY29uZF9tdXRleF87CisgIENvbmRpdGlvbiBlbmRfY29uZGl0aW9uXzsKK307CisKKy8vIFRpbWVyIG1hbmFnZW1lbnQgY2xhc3MKK2NsYXNzIFRocmVhZFRpbWVyIHsKKyBwdWJsaWM6CisgIFRocmVhZFRpbWVyKCkgPSBkZWZhdWx0OworCisgIC8vIENhbGxlZCBieSBlYWNoIHRocmVhZAorICB2b2lkIFN0YXJ0VGltZXIoKSB7CisgICAgcnVubmluZ18gPSB0cnVlOworICAgIHN0YXJ0X3JlYWxfdGltZV8gPSBDaHJvbm9DbG9ja05vdygpOworICAgIHN0YXJ0X2NwdV90aW1lXyA9IFRocmVhZENQVVVzYWdlKCk7CisgIH0KKworICAvLyBDYWxsZWQgYnkgZWFjaCB0aHJlYWQKKyAgdm9pZCBTdG9wVGltZXIoKSB7CisgICAgQ0hFQ0socnVubmluZ18pOworICAgIHJ1bm5pbmdfID0gZmFsc2U7CisgICAgcmVhbF90aW1lX3VzZWRfICs9IENocm9ub0Nsb2NrTm93KCkgLSBzdGFydF9yZWFsX3RpbWVfOworICAgIC8vIEZsb2F0aW5nIHBvaW50IGVycm9yIGNhbiByZXN1bHQgaW4gdGhlIHN1YnRyYWN0aW9uIHByb2R1Y2luZyBhIG5lZ2F0aXZlCisgICAgLy8gdGltZS4gR3VhcmQgYWdhaW5zdCB0aGF0LgorICAgIGNwdV90aW1lX3VzZWRfICs9IHN0ZDo6bWF4PGRvdWJsZT4oVGhyZWFkQ1BVVXNhZ2UoKSAtIHN0YXJ0X2NwdV90aW1lXywgMCk7CisgIH0KKworICAvLyBDYWxsZWQgYnkgZWFjaCB0aHJlYWQKKyAgdm9pZCBTZXRJdGVyYXRpb25UaW1lKGRvdWJsZSBzZWNvbmRzKSB7IG1hbnVhbF90aW1lX3VzZWRfICs9IHNlY29uZHM7IH0KKworICBib29sIHJ1bm5pbmcoKSBjb25zdCB7IHJldHVybiBydW5uaW5nXzsgfQorCisgIC8vIFJFUVVJUkVTOiB0aW1lciBpcyBub3QgcnVubmluZworICBkb3VibGUgcmVhbF90aW1lX3VzZWQoKSB7CisgICAgQ0hFQ0soIXJ1bm5pbmdfKTsKKyAgICByZXR1cm4gcmVhbF90aW1lX3VzZWRfOworICB9CisKKyAgLy8gUkVRVUlSRVM6IHRpbWVyIGlzIG5vdCBydW5uaW5nCisgIGRvdWJsZSBjcHVfdGltZV91c2VkKCkgeworICAgIENIRUNLKCFydW5uaW5nXyk7CisgICAgcmV0dXJuIGNwdV90aW1lX3VzZWRfOworICB9CisKKyAgLy8gUkVRVUlSRVM6IHRpbWVyIGlzIG5vdCBydW5uaW5nCisgIGRvdWJsZSBtYW51YWxfdGltZV91c2VkKCkgeworICAgIENIRUNLKCFydW5uaW5nXyk7CisgICAgcmV0dXJuIG1hbnVhbF90aW1lX3VzZWRfOworICB9CisKKyBwcml2YXRlOgorICBib29sIHJ1bm5pbmdfID0gZmFsc2U7ICAgICAgICAvLyBJcyB0aGUgdGltZXIgcnVubmluZworICBkb3VibGUgc3RhcnRfcmVhbF90aW1lXyA9IDA7ICAvLyBJZiBydW5uaW5nXworICBkb3VibGUgc3RhcnRfY3B1X3RpbWVfID0gMDsgICAvLyBJZiBydW5uaW5nXworCisgIC8vIEFjY3VtdWxhdGVkIHRpbWUgc28gZmFyIChkb2VzIG5vdCBjb250YWluIGN1cnJlbnQgc2xpY2UgaWYgcnVubmluZ18pCisgIGRvdWJsZSByZWFsX3RpbWVfdXNlZF8gPSAwOworICBkb3VibGUgY3B1X3RpbWVfdXNlZF8gPSAwOworICAvLyBNYW51YWxseSBzZXQgaXRlcmF0aW9uIHRpbWUuIFVzZXIgc2V0cyB0aGlzIHdpdGggU2V0SXRlcmF0aW9uVGltZShzZWNvbmRzKS4KKyAgZG91YmxlIG1hbnVhbF90aW1lX3VzZWRfID0gMDsKK307CisKK25hbWVzcGFjZSB7CisKK0JlbmNobWFya1JlcG9ydGVyOjpSdW4gQ3JlYXRlUnVuUmVwb3J0KAorICAgIGNvbnN0IGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyazo6SW5zdGFuY2UmIGIsCisgICAgY29uc3QgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXI6OlJlc3VsdCYgcmVzdWx0cywgc2l6ZV90IGl0ZXJzLAorICAgIGRvdWJsZSBzZWNvbmRzKSB7CisgIC8vIENyZWF0ZSByZXBvcnQgYWJvdXQgdGhpcyBiZW5jaG1hcmsgcnVuLgorICBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIHJlcG9ydDsKKworICByZXBvcnQuYmVuY2htYXJrX25hbWUgPSBiLm5hbWU7CisgIHJlcG9ydC5lcnJvcl9vY2N1cnJlZCA9IHJlc3VsdHMuaGFzX2Vycm9yXzsKKyAgcmVwb3J0LmVycm9yX21lc3NhZ2UgPSByZXN1bHRzLmVycm9yX21lc3NhZ2VfOworICByZXBvcnQucmVwb3J0X2xhYmVsID0gcmVzdWx0cy5yZXBvcnRfbGFiZWxfOworICAvLyBSZXBvcnQgdGhlIHRvdGFsIGl0ZXJhdGlvbnMgYWNyb3NzIGFsbCB0aHJlYWRzLgorICByZXBvcnQuaXRlcmF0aW9ucyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGl0ZXJzKSAqIGIudGhyZWFkczsKKyAgcmVwb3J0LnRpbWVfdW5pdCA9IGIudGltZV91bml0OworCisgIGlmICghcmVwb3J0LmVycm9yX29jY3VycmVkKSB7CisgICAgZG91YmxlIGJ5dGVzX3Blcl9zZWNvbmQgPSAwOworICAgIGlmIChyZXN1bHRzLmJ5dGVzX3Byb2Nlc3NlZCA+IDAgJiYgc2Vjb25kcyA+IDAuMCkgeworICAgICAgYnl0ZXNfcGVyX3NlY29uZCA9IChyZXN1bHRzLmJ5dGVzX3Byb2Nlc3NlZCAvIHNlY29uZHMpOworICAgIH0KKyAgICBkb3VibGUgaXRlbXNfcGVyX3NlY29uZCA9IDA7CisgICAgaWYgKHJlc3VsdHMuaXRlbXNfcHJvY2Vzc2VkID4gMCAmJiBzZWNvbmRzID4gMC4wKSB7CisgICAgICBpdGVtc19wZXJfc2Vjb25kID0gKHJlc3VsdHMuaXRlbXNfcHJvY2Vzc2VkIC8gc2Vjb25kcyk7CisgICAgfQorCisgICAgaWYgKGIudXNlX21hbnVhbF90aW1lKSB7CisgICAgICByZXBvcnQucmVhbF9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0cy5tYW51YWxfdGltZV91c2VkOworICAgIH0gZWxzZSB7CisgICAgICByZXBvcnQucmVhbF9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0cy5yZWFsX3RpbWVfdXNlZDsKKyAgICB9CisgICAgcmVwb3J0LmNwdV9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0cy5jcHVfdGltZV91c2VkOworICAgIHJlcG9ydC5ieXRlc19wZXJfc2Vjb25kID0gYnl0ZXNfcGVyX3NlY29uZDsKKyAgICByZXBvcnQuaXRlbXNfcGVyX3NlY29uZCA9IGl0ZW1zX3Blcl9zZWNvbmQ7CisgICAgcmVwb3J0LmNvbXBsZXhpdHlfbiA9IHJlc3VsdHMuY29tcGxleGl0eV9uOworICAgIHJlcG9ydC5jb21wbGV4aXR5ID0gYi5jb21wbGV4aXR5OworICAgIHJlcG9ydC5jb21wbGV4aXR5X2xhbWJkYSA9IGIuY29tcGxleGl0eV9sYW1iZGE7CisgICAgcmVwb3J0LnN0YXRpc3RpY3MgPSBiLnN0YXRpc3RpY3M7CisgICAgcmVwb3J0LmNvdW50ZXJzID0gcmVzdWx0cy5jb3VudGVyczsKKyAgICBpbnRlcm5hbDo6RmluaXNoKCZyZXBvcnQuY291bnRlcnMsIHNlY29uZHMsIGIudGhyZWFkcyk7CisgIH0KKyAgcmV0dXJuIHJlcG9ydDsKK30KKworLy8gRXhlY3V0ZSBvbmUgdGhyZWFkIG9mIGJlbmNobWFyayBiIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVyYXRpb25zLgorLy8gQWRkcyB0aGUgc3RhdHMgY29sbGVjdGVkIGZvciB0aGUgdGhyZWFkIGludG8gKnRvdGFsLgordm9pZCBSdW5JblRocmVhZChjb25zdCBiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcms6Okluc3RhbmNlKiBiLAorICAgICAgICAgICAgICAgICBzaXplX3QgaXRlcnMsIGludCB0aHJlYWRfaWQsCisgICAgICAgICAgICAgICAgIGludGVybmFsOjpUaHJlYWRNYW5hZ2VyKiBtYW5hZ2VyKSB7CisgIGludGVybmFsOjpUaHJlYWRUaW1lciB0aW1lcjsKKyAgU3RhdGUgc3QoaXRlcnMsIGItPmFyZywgdGhyZWFkX2lkLCBiLT50aHJlYWRzLCAmdGltZXIsIG1hbmFnZXIpOworICBiLT5iZW5jaG1hcmstPlJ1bihzdCk7CisgIENIRUNLKHN0Lml0ZXJhdGlvbnMoKSA9PSBzdC5tYXhfaXRlcmF0aW9ucykKKyAgICAgIDw8ICJCZW5jaG1hcmsgcmV0dXJuZWQgYmVmb3JlIFN0YXRlOjpLZWVwUnVubmluZygpIHJldHVybmVkIGZhbHNlISI7CisgIHsKKyAgICBNdXRleExvY2sgbChtYW5hZ2VyLT5HZXRCZW5jaG1hcmtNdXRleCgpKTsKKyAgICBpbnRlcm5hbDo6VGhyZWFkTWFuYWdlcjo6UmVzdWx0JiByZXN1bHRzID0gbWFuYWdlci0+cmVzdWx0czsKKyAgICByZXN1bHRzLmNwdV90aW1lX3VzZWQgKz0gdGltZXIuY3B1X3RpbWVfdXNlZCgpOworICAgIHJlc3VsdHMucmVhbF90aW1lX3VzZWQgKz0gdGltZXIucmVhbF90aW1lX3VzZWQoKTsKKyAgICByZXN1bHRzLm1hbnVhbF90aW1lX3VzZWQgKz0gdGltZXIubWFudWFsX3RpbWVfdXNlZCgpOworICAgIHJlc3VsdHMuYnl0ZXNfcHJvY2Vzc2VkICs9IHN0LmJ5dGVzX3Byb2Nlc3NlZCgpOworICAgIHJlc3VsdHMuaXRlbXNfcHJvY2Vzc2VkICs9IHN0Lml0ZW1zX3Byb2Nlc3NlZCgpOworICAgIHJlc3VsdHMuY29tcGxleGl0eV9uICs9IHN0LmNvbXBsZXhpdHlfbGVuZ3RoX24oKTsKKyAgICBpbnRlcm5hbDo6SW5jcmVtZW50KCZyZXN1bHRzLmNvdW50ZXJzLCBzdC5jb3VudGVycyk7CisgIH0KKyAgbWFuYWdlci0+Tm90aWZ5VGhyZWFkQ29tcGxldGUoKTsKK30KKworc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gUnVuQmVuY2htYXJrKAorICAgIGNvbnN0IGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyazo6SW5zdGFuY2UmIGIsCisgICAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4qIGNvbXBsZXhpdHlfcmVwb3J0cykgeworICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiByZXBvcnRzOyAgLy8gcmV0dXJuIHZhbHVlCisKKyAgY29uc3QgYm9vbCBoYXNfZXhwbGljaXRfaXRlcmF0aW9uX2NvdW50ID0gYi5pdGVyYXRpb25zICE9IDA7CisgIHNpemVfdCBpdGVycyA9IGhhc19leHBsaWNpdF9pdGVyYXRpb25fY291bnQgPyBiLml0ZXJhdGlvbnMgOiAxOworICBzdGQ6OnVuaXF1ZV9wdHI8aW50ZXJuYWw6OlRocmVhZE1hbmFnZXI+IG1hbmFnZXI7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiBwb29sKGIudGhyZWFkcyAtIDEpOworICBjb25zdCBpbnQgcmVwZWF0cyA9CisgICAgICBiLnJlcGV0aXRpb25zICE9IDAgPyBiLnJlcGV0aXRpb25zIDogRkxBR1NfYmVuY2htYXJrX3JlcGV0aXRpb25zOworICBjb25zdCBib29sIHJlcG9ydF9hZ2dyZWdhdGVzX29ubHkgPQorICAgICAgcmVwZWF0cyAhPSAxICYmCisgICAgICAoYi5yZXBvcnRfbW9kZSA9PSBpbnRlcm5hbDo6Uk1fVW5zcGVjaWZpZWQKKyAgICAgICAgICAgPyBGTEFHU19iZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seQorICAgICAgICAgICA6IGIucmVwb3J0X21vZGUgPT0gaW50ZXJuYWw6OlJNX1JlcG9ydEFnZ3JlZ2F0ZXNPbmx5KTsKKyAgZm9yIChpbnQgcmVwZXRpdGlvbl9udW0gPSAwOyByZXBldGl0aW9uX251bSA8IHJlcGVhdHM7IHJlcGV0aXRpb25fbnVtKyspIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAvLyBUcnkgYmVuY2htYXJrCisgICAgICBWTE9HKDIpIDw8ICJSdW5uaW5nICIgPDwgYi5uYW1lIDw8ICIgZm9yICIgPDwgaXRlcnMgPDwgIlxuIjsKKworICAgICAgbWFuYWdlci5yZXNldChuZXcgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIoYi50aHJlYWRzKSk7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IHRpID0gMDsgdGkgPCBwb29sLnNpemUoKTsgKyt0aSkgeworICAgICAgICBwb29sW3RpXSA9IHN0ZDo6dGhyZWFkKCZSdW5JblRocmVhZCwgJmIsIGl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odGkgKyAxKSwgbWFuYWdlci5nZXQoKSk7CisgICAgICB9CisgICAgICBSdW5JblRocmVhZCgmYiwgaXRlcnMsIDAsIG1hbmFnZXIuZ2V0KCkpOworICAgICAgbWFuYWdlci0+V2FpdEZvckFsbFRocmVhZHMoKTsKKyAgICAgIGZvciAoc3RkOjp0aHJlYWQmIHRocmVhZCA6IHBvb2wpIHRocmVhZC5qb2luKCk7CisgICAgICBpbnRlcm5hbDo6VGhyZWFkTWFuYWdlcjo6UmVzdWx0IHJlc3VsdHM7CisgICAgICB7CisgICAgICAgIE11dGV4TG9jayBsKG1hbmFnZXItPkdldEJlbmNobWFya011dGV4KCkpOworICAgICAgICByZXN1bHRzID0gbWFuYWdlci0+cmVzdWx0czsKKyAgICAgIH0KKyAgICAgIG1hbmFnZXIucmVzZXQoKTsKKyAgICAgIC8vIEFkanVzdCByZWFsL21hbnVhbCB0aW1lIHN0YXRzIHNpbmNlIHRoZXkgd2VyZSByZXBvcnRlZCBwZXIgdGhyZWFkLgorICAgICAgcmVzdWx0cy5yZWFsX3RpbWVfdXNlZCAvPSBiLnRocmVhZHM7CisgICAgICByZXN1bHRzLm1hbnVhbF90aW1lX3VzZWQgLz0gYi50aHJlYWRzOworCisgICAgICBWTE9HKDIpIDw8ICJSYW4gaW4gIiA8PCByZXN1bHRzLmNwdV90aW1lX3VzZWQgPDwgIi8iCisgICAgICAgICAgICAgIDw8IHJlc3VsdHMucmVhbF90aW1lX3VzZWQgPDwgIlxuIjsKKworICAgICAgLy8gQmFzZSBkZWNpc2lvbnMgb2ZmIG9mIHJlYWwgdGltZSBpZiByZXF1ZXN0ZWQgYnkgdGhpcyBiZW5jaG1hcmsuCisgICAgICBkb3VibGUgc2Vjb25kcyA9IHJlc3VsdHMuY3B1X3RpbWVfdXNlZDsKKyAgICAgIGlmIChiLnVzZV9tYW51YWxfdGltZSkgeworICAgICAgICBzZWNvbmRzID0gcmVzdWx0cy5tYW51YWxfdGltZV91c2VkOworICAgICAgfSBlbHNlIGlmIChiLnVzZV9yZWFsX3RpbWUpIHsKKyAgICAgICAgc2Vjb25kcyA9IHJlc3VsdHMucmVhbF90aW1lX3VzZWQ7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGRvdWJsZSBtaW5fdGltZSA9CisgICAgICAgICAgIUlzWmVybyhiLm1pbl90aW1lKSA/IGIubWluX3RpbWUgOiBGTEFHU19iZW5jaG1hcmtfbWluX3RpbWU7CisKKyAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIHJ1biBzaG91bGQgYmUgcmVwb3J0ZWQ7IEVpdGhlciBpdCBoYXMKKyAgICAgIC8vIHJ1biBmb3IgYSBzdWZmaWNpZW50IGFtb3VudCBvZiB0aW1lIG9yIGJlY2F1c2UgYW4gZXJyb3Igd2FzIHJlcG9ydGVkLgorICAgICAgY29uc3QgYm9vbCBzaG91bGRfcmVwb3J0ID0gIHJlcGV0aXRpb25fbnVtID4gMAorICAgICAgICB8fCBoYXNfZXhwbGljaXRfaXRlcmF0aW9uX2NvdW50IC8vIEFuIGV4YWN0IGl0ZXJhdGlvbiBjb3VudCB3YXMgcmVxdWVzdGVkCisgICAgICAgIHx8IHJlc3VsdHMuaGFzX2Vycm9yXworICAgICAgICB8fCBpdGVycyA+PSBrTWF4SXRlcmF0aW9ucworICAgICAgICB8fCBzZWNvbmRzID49IG1pbl90aW1lIC8vIHRoZSBlbGFwc2VkIHRpbWUgaXMgbGFyZ2UgZW5vdWdoCisgICAgICAgIC8vIENQVSB0aW1lIGlzIHNwZWNpZmllZCBidXQgdGhlIGVsYXBzZWQgcmVhbCB0aW1lIGdyZWF0bHkgZXhjZWVkcyB0aGUKKyAgICAgICAgLy8gbWluaW11bSB0aW1lLiBOb3RlIHRoYXQgdXNlciBwcm92aWRlZCB0aW1lcnMgYXJlIGV4Y2VwdCBmcm9tIHRoaXMKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrLgorICAgICAgICB8fCAoKHJlc3VsdHMucmVhbF90aW1lX3VzZWQgPj0gNSAqIG1pbl90aW1lKSAmJiAhYi51c2VfbWFudWFsX3RpbWUpOworCisgICAgICBpZiAoc2hvdWxkX3JlcG9ydCkgeworICAgICAgICBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuIHJlcG9ydCA9CisgICAgICAgICAgICBDcmVhdGVSdW5SZXBvcnQoYiwgcmVzdWx0cywgaXRlcnMsIHNlY29uZHMpOworICAgICAgICBpZiAoIXJlcG9ydC5lcnJvcl9vY2N1cnJlZCAmJiBiLmNvbXBsZXhpdHkgIT0gb05vbmUpCisgICAgICAgICAgY29tcGxleGl0eV9yZXBvcnRzLT5wdXNoX2JhY2socmVwb3J0KTsKKyAgICAgICAgcmVwb3J0cy5wdXNoX2JhY2socmVwb3J0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIFNlZSBob3cgbXVjaCBpdGVyYXRpb25zIHNob3VsZCBiZSBpbmNyZWFzZWQgYnkKKyAgICAgIC8vIE5vdGU6IEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gd2l0aCBtYXgoc2Vjb25kcywgMW5zKS4KKyAgICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gbWluX3RpbWUgKiAxLjQgLyBzdGQ6Om1heChzZWNvbmRzLCAxZS05KTsKKyAgICAgIC8vIElmIG91ciBsYXN0IHJ1biB3YXMgYXQgbGVhc3QgMTAlIG9mIEZMQUdTX2JlbmNobWFya19taW5fdGltZSB0aGVuIHdlCisgICAgICAvLyB1c2UgdGhlIG11bHRpcGxpZXIgZGlyZWN0bHkuIE90aGVyd2lzZSB3ZSB1c2UgYXQgbW9zdCAxMCB0aW1lcworICAgICAgLy8gZXhwYW5zaW9uLgorICAgICAgLy8gTk9URTogV2hlbiB0aGUgbGFzdCBydW4gd2FzIGF0IGxlYXN0IDEwJSBvZiB0aGUgbWluIHRpbWUgdGhlIG1heAorICAgICAgLy8gZXhwYW5zaW9uIHNob3VsZCBiZSAxNHguCisgICAgICBib29sIGlzX3NpZ25pZmljYW50ID0gKHNlY29uZHMgLyBtaW5fdGltZSkgPiAwLjE7CisgICAgICBtdWx0aXBsaWVyID0gaXNfc2lnbmlmaWNhbnQgPyBtdWx0aXBsaWVyIDogc3RkOjptaW4oMTAuMCwgbXVsdGlwbGllcik7CisgICAgICBpZiAobXVsdGlwbGllciA8PSAxLjApIG11bHRpcGxpZXIgPSAyLjA7CisgICAgICBkb3VibGUgbmV4dF9pdGVycyA9IHN0ZDo6bWF4KG11bHRpcGxpZXIgKiBpdGVycywgaXRlcnMgKyAxLjApOworICAgICAgaWYgKG5leHRfaXRlcnMgPiBrTWF4SXRlcmF0aW9ucykgeworICAgICAgICBuZXh0X2l0ZXJzID0ga01heEl0ZXJhdGlvbnM7CisgICAgICB9CisgICAgICBWTE9HKDMpIDw8ICJOZXh0IGl0ZXJzOiAiIDw8IG5leHRfaXRlcnMgPDwgIiwgIiA8PCBtdWx0aXBsaWVyIDw8ICJcbiI7CisgICAgICBpdGVycyA9IHN0YXRpY19jYXN0PGludD4obmV4dF9pdGVycyArIDAuNSk7CisgICAgfQorICB9CisgIC8vIENhbGN1bGF0ZSBhZGRpdGlvbmFsIHN0YXRpc3RpY3MKKyAgYXV0byBzdGF0X3JlcG9ydHMgPSBDb21wdXRlU3RhdHMocmVwb3J0cyk7CisgIGlmICgoYi5jb21wbGV4aXR5ICE9IG9Ob25lKSAmJiBiLmxhc3RfYmVuY2htYXJrX2luc3RhbmNlKSB7CisgICAgYXV0byBhZGRpdGlvbmFsX3J1bl9zdGF0cyA9IENvbXB1dGVCaWdPKCpjb21wbGV4aXR5X3JlcG9ydHMpOworICAgIHN0YXRfcmVwb3J0cy5pbnNlcnQoc3RhdF9yZXBvcnRzLmVuZCgpLCBhZGRpdGlvbmFsX3J1bl9zdGF0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9ydW5fc3RhdHMuZW5kKCkpOworICAgIGNvbXBsZXhpdHlfcmVwb3J0cy0+Y2xlYXIoKTsKKyAgfQorCisgIGlmIChyZXBvcnRfYWdncmVnYXRlc19vbmx5KSByZXBvcnRzLmNsZWFyKCk7CisgIHJlcG9ydHMuaW5zZXJ0KHJlcG9ydHMuZW5kKCksIHN0YXRfcmVwb3J0cy5iZWdpbigpLCBzdGF0X3JlcG9ydHMuZW5kKCkpOworICByZXR1cm4gcmVwb3J0czsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworU3RhdGU6OlN0YXRlKHNpemVfdCBtYXhfaXRlcnMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHJhbmdlcywgaW50IHRocmVhZF9pLAorICAgICAgICAgICAgIGludCBuX3RocmVhZHMsIGludGVybmFsOjpUaHJlYWRUaW1lciogdGltZXIsCisgICAgICAgICAgICAgaW50ZXJuYWw6OlRocmVhZE1hbmFnZXIqIG1hbmFnZXIpCisgICAgOiBzdGFydGVkXyhmYWxzZSksCisgICAgICBmaW5pc2hlZF8oZmFsc2UpLAorICAgICAgdG90YWxfaXRlcmF0aW9uc18obWF4X2l0ZXJzICsgMSksCisgICAgICByYW5nZV8ocmFuZ2VzKSwKKyAgICAgIGJ5dGVzX3Byb2Nlc3NlZF8oMCksCisgICAgICBpdGVtc19wcm9jZXNzZWRfKDApLAorICAgICAgY29tcGxleGl0eV9uXygwKSwKKyAgICAgIGVycm9yX29jY3VycmVkXyhmYWxzZSksCisgICAgICBjb3VudGVycygpLAorICAgICAgdGhyZWFkX2luZGV4KHRocmVhZF9pKSwKKyAgICAgIHRocmVhZHMobl90aHJlYWRzKSwKKyAgICAgIG1heF9pdGVyYXRpb25zKG1heF9pdGVycyksCisgICAgICB0aW1lcl8odGltZXIpLAorICAgICAgbWFuYWdlcl8obWFuYWdlcikgeworICBDSEVDSyhtYXhfaXRlcmF0aW9ucyAhPSAwKSA8PCAiQXQgbGVhc3Qgb25lIGl0ZXJhdGlvbiBtdXN0IGJlIHJ1biI7CisgIENIRUNLKHRvdGFsX2l0ZXJhdGlvbnNfICE9IDApIDw8ICJtYXggaXRlcmF0aW9ucyB3cmFwcGVkIGFyb3VuZCI7CisgIENIRUNLX0xUKHRocmVhZF9pbmRleCwgdGhyZWFkcykgPDwgInRocmVhZF9pbmRleCBtdXN0IGJlIGxlc3MgdGhhbiB0aHJlYWRzIjsKK30KKwordm9pZCBTdGF0ZTo6UGF1c2VUaW1pbmcoKSB7CisgIC8vIEFkZCBpbiB0aW1lIGFjY3VtdWxhdGVkIHNvIGZhcgorICBDSEVDSyhzdGFydGVkXyAmJiAhZmluaXNoZWRfICYmICFlcnJvcl9vY2N1cnJlZF8pOworICB0aW1lcl8tPlN0b3BUaW1lcigpOworfQorCit2b2lkIFN0YXRlOjpSZXN1bWVUaW1pbmcoKSB7CisgIENIRUNLKHN0YXJ0ZWRfICYmICFmaW5pc2hlZF8gJiYgIWVycm9yX29jY3VycmVkXyk7CisgIHRpbWVyXy0+U3RhcnRUaW1lcigpOworfQorCit2b2lkIFN0YXRlOjpTa2lwV2l0aEVycm9yKGNvbnN0IGNoYXIqIG1zZykgeworICBDSEVDSyhtc2cpOworICBlcnJvcl9vY2N1cnJlZF8gPSB0cnVlOworICB7CisgICAgTXV0ZXhMb2NrIGwobWFuYWdlcl8tPkdldEJlbmNobWFya011dGV4KCkpOworICAgIGlmIChtYW5hZ2VyXy0+cmVzdWx0cy5oYXNfZXJyb3JfID09IGZhbHNlKSB7CisgICAgICBtYW5hZ2VyXy0+cmVzdWx0cy5lcnJvcl9tZXNzYWdlXyA9IG1zZzsKKyAgICAgIG1hbmFnZXJfLT5yZXN1bHRzLmhhc19lcnJvcl8gPSB0cnVlOworICAgIH0KKyAgfQorICB0b3RhbF9pdGVyYXRpb25zXyA9IDE7CisgIGlmICh0aW1lcl8tPnJ1bm5pbmcoKSkgdGltZXJfLT5TdG9wVGltZXIoKTsKK30KKwordm9pZCBTdGF0ZTo6U2V0SXRlcmF0aW9uVGltZShkb3VibGUgc2Vjb25kcykgeworICB0aW1lcl8tPlNldEl0ZXJhdGlvblRpbWUoc2Vjb25kcyk7Cit9CisKK3ZvaWQgU3RhdGU6OlNldExhYmVsKGNvbnN0IGNoYXIqIGxhYmVsKSB7CisgIE11dGV4TG9jayBsKG1hbmFnZXJfLT5HZXRCZW5jaG1hcmtNdXRleCgpKTsKKyAgbWFuYWdlcl8tPnJlc3VsdHMucmVwb3J0X2xhYmVsXyA9IGxhYmVsOworfQorCit2b2lkIFN0YXRlOjpTdGFydEtlZXBSdW5uaW5nKCkgeworICBDSEVDSyghc3RhcnRlZF8gJiYgIWZpbmlzaGVkXyk7CisgIHN0YXJ0ZWRfID0gdHJ1ZTsKKyAgbWFuYWdlcl8tPlN0YXJ0U3RvcEJhcnJpZXIoKTsKKyAgaWYgKCFlcnJvcl9vY2N1cnJlZF8pIFJlc3VtZVRpbWluZygpOworfQorCit2b2lkIFN0YXRlOjpGaW5pc2hLZWVwUnVubmluZygpIHsKKyAgQ0hFQ0soc3RhcnRlZF8gJiYgKCFmaW5pc2hlZF8gfHwgZXJyb3Jfb2NjdXJyZWRfKSk7CisgIGlmICghZXJyb3Jfb2NjdXJyZWRfKSB7CisgICAgUGF1c2VUaW1pbmcoKTsKKyAgfQorICAvLyBUb3RhbCBpdGVyYXRpb25zIGhhcyBub3cgd3JhcHBlZCBhcm91bmQgemVyby4gRml4IHRoaXMuCisgIHRvdGFsX2l0ZXJhdGlvbnNfID0gMTsKKyAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgbWFuYWdlcl8tPlN0YXJ0U3RvcEJhcnJpZXIoKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKK3ZvaWQgUnVuQmVuY2htYXJrcyhjb25zdCBzdGQ6OnZlY3RvcjxCZW5jaG1hcms6Okluc3RhbmNlPiYgYmVuY2htYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlbmNobWFya1JlcG9ydGVyKiBjb25zb2xlX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVuY2htYXJrUmVwb3J0ZXIqIGZpbGVfcmVwb3J0ZXIpIHsKKyAgLy8gTm90ZSB0aGUgZmlsZV9yZXBvcnRlciBjYW4gYmUgbnVsbC4KKyAgQ0hFQ0soY29uc29sZV9yZXBvcnRlciAhPSBudWxscHRyKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBuYW1lIGZpZWxkIHVzaW5nIGEgbWluaW11bSB3aWR0aCBvZiAxMC4KKyAgYm9vbCBoYXNfcmVwZXRpdGlvbnMgPSBGTEFHU19iZW5jaG1hcmtfcmVwZXRpdGlvbnMgPiAxOworICBzaXplX3QgbmFtZV9maWVsZF93aWR0aCA9IDEwOworICBzaXplX3Qgc3RhdF9maWVsZF93aWR0aCA9IDA7CisgIGZvciAoY29uc3QgQmVuY2htYXJrOjpJbnN0YW5jZSYgYmVuY2htYXJrIDogYmVuY2htYXJrcykgeworICAgIG5hbWVfZmllbGRfd2lkdGggPQorICAgICAgICBzdGQ6Om1heDxzaXplX3Q+KG5hbWVfZmllbGRfd2lkdGgsIGJlbmNobWFyay5uYW1lLnNpemUoKSk7CisgICAgaGFzX3JlcGV0aXRpb25zIHw9IGJlbmNobWFyay5yZXBldGl0aW9ucyA+IDE7CisKKyAgICBmb3IoY29uc3QgYXV0byYgU3RhdCA6ICpiZW5jaG1hcmsuc3RhdGlzdGljcykKKyAgICAgIHN0YXRfZmllbGRfd2lkdGggPSBzdGQ6Om1heDxzaXplX3Q+KHN0YXRfZmllbGRfd2lkdGgsIFN0YXQubmFtZV8uc2l6ZSgpKTsKKyAgfQorICBpZiAoaGFzX3JlcGV0aXRpb25zKSBuYW1lX2ZpZWxkX3dpZHRoICs9IDEgKyBzdGF0X2ZpZWxkX3dpZHRoOworCisgIC8vIFByaW50IGhlYWRlciBoZXJlCisgIEJlbmNobWFya1JlcG9ydGVyOjpDb250ZXh0IGNvbnRleHQ7CisgIGNvbnRleHQubmFtZV9maWVsZF93aWR0aCA9IG5hbWVfZmllbGRfd2lkdGg7CisKKyAgLy8gS2VlcCB0cmFjayBvZiBydW5pbmcgdGltZXMgb2YgYWxsIGluc3RhbmNlcyBvZiBjdXJyZW50IGJlbmNobWFyaworICBzdGQ6OnZlY3RvcjxCZW5jaG1hcmtSZXBvcnRlcjo6UnVuPiBjb21wbGV4aXR5X3JlcG9ydHM7CisKKyAgLy8gV2UgZmx1c2ggc3RyZWFtcyBhZnRlciBpbnZva2luZyByZXBvcnRlciBtZXRob2RzIHRoYXQgd3JpdGUgdG8gdGhlbS4gVGhpcworICAvLyBlbnN1cmVzIHVzZXJzIGdldCB0aW1lbHkgdXBkYXRlcyBldmVuIHdoZW4gc3RyZWFtcyBhcmUgbm90IGxpbmUtYnVmZmVyZWQuCisgIGF1dG8gZmx1c2hTdHJlYW1zID0gW10oQmVuY2htYXJrUmVwb3J0ZXIqIHJlcG9ydGVyKSB7CisgICAgaWYgKCFyZXBvcnRlcikgcmV0dXJuOworICAgIHN0ZDo6Zmx1c2gocmVwb3J0ZXItPkdldE91dHB1dFN0cmVhbSgpKTsKKyAgICBzdGQ6OmZsdXNoKHJlcG9ydGVyLT5HZXRFcnJvclN0cmVhbSgpKTsKKyAgfTsKKworICBpZiAoY29uc29sZV9yZXBvcnRlci0+UmVwb3J0Q29udGV4dChjb250ZXh0KSAmJgorICAgICAgKCFmaWxlX3JlcG9ydGVyIHx8IGZpbGVfcmVwb3J0ZXItPlJlcG9ydENvbnRleHQoY29udGV4dCkpKSB7CisgICAgZmx1c2hTdHJlYW1zKGNvbnNvbGVfcmVwb3J0ZXIpOworICAgIGZsdXNoU3RyZWFtcyhmaWxlX3JlcG9ydGVyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJlbmNobWFyayA6IGJlbmNobWFya3MpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+IHJlcG9ydHMgPQorICAgICAgICAgIFJ1bkJlbmNobWFyayhiZW5jaG1hcmssICZjb21wbGV4aXR5X3JlcG9ydHMpOworICAgICAgY29uc29sZV9yZXBvcnRlci0+UmVwb3J0UnVucyhyZXBvcnRzKTsKKyAgICAgIGlmIChmaWxlX3JlcG9ydGVyKSBmaWxlX3JlcG9ydGVyLT5SZXBvcnRSdW5zKHJlcG9ydHMpOworICAgICAgZmx1c2hTdHJlYW1zKGNvbnNvbGVfcmVwb3J0ZXIpOworICAgICAgZmx1c2hTdHJlYW1zKGZpbGVfcmVwb3J0ZXIpOworICAgIH0KKyAgfQorICBjb25zb2xlX3JlcG9ydGVyLT5GaW5hbGl6ZSgpOworICBpZiAoZmlsZV9yZXBvcnRlcikgZmlsZV9yZXBvcnRlci0+RmluYWxpemUoKTsKKyAgZmx1c2hTdHJlYW1zKGNvbnNvbGVfcmVwb3J0ZXIpOworICBmbHVzaFN0cmVhbXMoZmlsZV9yZXBvcnRlcik7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxCZW5jaG1hcmtSZXBvcnRlcj4gQ3JlYXRlUmVwb3J0ZXIoCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIENvbnNvbGVSZXBvcnRlcjo6T3V0cHV0T3B0aW9ucyBvdXRwdXRfb3B0cykgeworICB0eXBlZGVmIHN0ZDo6dW5pcXVlX3B0cjxCZW5jaG1hcmtSZXBvcnRlcj4gUHRyVHlwZTsKKyAgaWYgKG5hbWUgPT0gImNvbnNvbGUiKSB7CisgICAgcmV0dXJuIFB0clR5cGUobmV3IENvbnNvbGVSZXBvcnRlcihvdXRwdXRfb3B0cykpOworICB9IGVsc2UgaWYgKG5hbWUgPT0gImpzb24iKSB7CisgICAgcmV0dXJuIFB0clR5cGUobmV3IEpTT05SZXBvcnRlcik7CisgIH0gZWxzZSBpZiAobmFtZSA9PSAiY3N2IikgeworICAgIHJldHVybiBQdHJUeXBlKG5ldyBDU1ZSZXBvcnRlcik7CisgIH0gZWxzZSB7CisgICAgc3RkOjpjZXJyIDw8ICJVbmV4cGVjdGVkIGZvcm1hdDogJyIgPDwgbmFtZSA8PCAiJ1xuIjsKKyAgICBzdGQ6OmV4aXQoMSk7CisgIH0KK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCitib29sIElzWmVybyhkb3VibGUgbikgeworICByZXR1cm4gc3RkOjphYnMobikgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKK30KKworQ29uc29sZVJlcG9ydGVyOjpPdXRwdXRPcHRpb25zIEdldE91dHB1dE9wdGlvbnMoYm9vbCBmb3JjZV9ub19jb2xvcikgeworICBpbnQgb3V0cHV0X29wdHMgPSBDb25zb2xlUmVwb3J0ZXI6Ok9PX0RlZmF1bHRzOworICBpZiAoKEZMQUdTX2JlbmNobWFya19jb2xvciA9PSAiYXV0byIgJiYgSXNDb2xvclRlcm1pbmFsKCkpIHx8CisgICAgICBJc1RydXRoeUZsYWdWYWx1ZShGTEFHU19iZW5jaG1hcmtfY29sb3IpKSB7CisgICAgb3V0cHV0X29wdHMgfD0gQ29uc29sZVJlcG9ydGVyOjpPT19Db2xvcjsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfb3B0cyAmPSB+Q29uc29sZVJlcG9ydGVyOjpPT19Db2xvcjsKKyAgfQorICBpZihmb3JjZV9ub19jb2xvcikgeworICAgIG91dHB1dF9vcHRzICY9IH5Db25zb2xlUmVwb3J0ZXI6Ok9PX0NvbG9yOworICB9CisgIGlmKEZMQUdTX2JlbmNobWFya19jb3VudGVyc190YWJ1bGFyKSB7CisgICAgb3V0cHV0X29wdHMgfD0gQ29uc29sZVJlcG9ydGVyOjpPT19UYWJ1bGFyOworICB9IGVsc2UgeworICAgIG91dHB1dF9vcHRzICY9IH5Db25zb2xlUmVwb3J0ZXI6Ok9PX1RhYnVsYXI7CisgIH0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PCBDb25zb2xlUmVwb3J0ZXI6Ok91dHB1dE9wdGlvbnMgPihvdXRwdXRfb3B0cyk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoKSB7CisgIHJldHVybiBSdW5TcGVjaWZpZWRCZW5jaG1hcmtzKG51bGxwdHIsIG51bGxwdHIpOworfQorCitzaXplX3QgUnVuU3BlY2lmaWVkQmVuY2htYXJrcyhCZW5jaG1hcmtSZXBvcnRlciogY29uc29sZV9yZXBvcnRlcikgeworICByZXR1cm4gUnVuU3BlY2lmaWVkQmVuY2htYXJrcyhjb25zb2xlX3JlcG9ydGVyLCBudWxscHRyKTsKK30KKworc2l6ZV90IFJ1blNwZWNpZmllZEJlbmNobWFya3MoQmVuY2htYXJrUmVwb3J0ZXIqIGNvbnNvbGVfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtSZXBvcnRlciogZmlsZV9yZXBvcnRlcikgeworICBzdGQ6OnN0cmluZyBzcGVjID0gRkxBR1NfYmVuY2htYXJrX2ZpbHRlcjsKKyAgaWYgKHNwZWMuZW1wdHkoKSB8fCBzcGVjID09ICJhbGwiKQorICAgIHNwZWMgPSAiLiI7ICAvLyBSZWdleHAgdGhhdCBtYXRjaGVzIGFsbCBiZW5jaG1hcmtzCisKKyAgLy8gU2V0dXAgdGhlIHJlcG9ydGVycworICBzdGQ6Om9mc3RyZWFtIG91dHB1dF9maWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrUmVwb3J0ZXI+IGRlZmF1bHRfY29uc29sZV9yZXBvcnRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFya1JlcG9ydGVyPiBkZWZhdWx0X2ZpbGVfcmVwb3J0ZXI7CisgIGlmICghY29uc29sZV9yZXBvcnRlcikgeworICAgIGRlZmF1bHRfY29uc29sZV9yZXBvcnRlciA9IGludGVybmFsOjpDcmVhdGVSZXBvcnRlcigKKyAgICAgICAgICBGTEFHU19iZW5jaG1hcmtfZm9ybWF0LCBpbnRlcm5hbDo6R2V0T3V0cHV0T3B0aW9ucygpKTsKKyAgICBjb25zb2xlX3JlcG9ydGVyID0gZGVmYXVsdF9jb25zb2xlX3JlcG9ydGVyLmdldCgpOworICB9CisgIGF1dG8mIE91dCA9IGNvbnNvbGVfcmVwb3J0ZXItPkdldE91dHB1dFN0cmVhbSgpOworICBhdXRvJiBFcnIgPSBjb25zb2xlX3JlcG9ydGVyLT5HZXRFcnJvclN0cmVhbSgpOworCisgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmbmFtZSA9IEZMQUdTX2JlbmNobWFya19vdXQ7CisgIGlmIChmbmFtZS5lbXB0eSgpICYmIGZpbGVfcmVwb3J0ZXIpIHsKKyAgICBFcnIgPDwgIkEgY3VzdG9tIGZpbGUgcmVwb3J0ZXIgd2FzIHByb3ZpZGVkIGJ1dCAiCisgICAgICAgICAgICItLWJlbmNobWFya19vdXQ9PGZpbGU+IHdhcyBub3Qgc3BlY2lmaWVkLiIKKyAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6ZXhpdCgxKTsKKyAgfQorICBpZiAoIWZuYW1lLmVtcHR5KCkpIHsKKyAgICBvdXRwdXRfZmlsZS5vcGVuKGZuYW1lKTsKKyAgICBpZiAoIW91dHB1dF9maWxlLmlzX29wZW4oKSkgeworICAgICAgRXJyIDw8ICJpbnZhbGlkIGZpbGUgbmFtZTogJyIgPDwgZm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpleGl0KDEpOworICAgIH0KKyAgICBpZiAoIWZpbGVfcmVwb3J0ZXIpIHsKKyAgICAgIGRlZmF1bHRfZmlsZV9yZXBvcnRlciA9IGludGVybmFsOjpDcmVhdGVSZXBvcnRlcigKKyAgICAgICAgICBGTEFHU19iZW5jaG1hcmtfb3V0X2Zvcm1hdCwgQ29uc29sZVJlcG9ydGVyOjpPT19Ob25lKTsKKyAgICAgIGZpbGVfcmVwb3J0ZXIgPSBkZWZhdWx0X2ZpbGVfcmVwb3J0ZXIuZ2V0KCk7CisgICAgfQorICAgIGZpbGVfcmVwb3J0ZXItPlNldE91dHB1dFN0cmVhbSgmb3V0cHV0X2ZpbGUpOworICAgIGZpbGVfcmVwb3J0ZXItPlNldEVycm9yU3RyZWFtKCZvdXRwdXRfZmlsZSk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6QmVuY2htYXJrOjpJbnN0YW5jZT4gYmVuY2htYXJrczsKKyAgaWYgKCFGaW5kQmVuY2htYXJrc0ludGVybmFsKHNwZWMsICZiZW5jaG1hcmtzLCAmRXJyKSkgcmV0dXJuIDA7CisKKyAgaWYgKGJlbmNobWFya3MuZW1wdHkoKSkgeworICAgIEVyciA8PCAiRmFpbGVkIHRvIG1hdGNoIGFueSBiZW5jaG1hcmtzIGFnYWluc3QgcmVnZXg6ICIgPDwgc3BlYyA8PCAiXG4iOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKEZMQUdTX2JlbmNobWFya19saXN0X3Rlc3RzKSB7CisgICAgZm9yIChhdXRvIGNvbnN0JiBiZW5jaG1hcmsgOiBiZW5jaG1hcmtzKSBPdXQgPDwgYmVuY2htYXJrLm5hbWUgPDwgIlxuIjsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm5hbDo6UnVuQmVuY2htYXJrcyhiZW5jaG1hcmtzLCBjb25zb2xlX3JlcG9ydGVyLCBmaWxlX3JlcG9ydGVyKTsKKyAgfQorCisgIHJldHVybiBiZW5jaG1hcmtzLnNpemUoKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBQcmludFVzYWdlQW5kRXhpdCgpIHsKKyAgZnByaW50ZihzdGRvdXQsCisgICAgICAgICAgImJlbmNobWFyayIKKyAgICAgICAgICAiIFstLWJlbmNobWFya19saXN0X3Rlc3RzPXt0cnVlfGZhbHNlfV1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19maWx0ZXI9PHJlZ2V4Pl1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19taW5fdGltZT08bWluX3RpbWU+XVxuIgorICAgICAgICAgICIgICAgICAgICAgWy0tYmVuY2htYXJrX3JlcGV0aXRpb25zPTxudW1fcmVwZXRpdGlvbnM+XVxuIgorICAgICAgICAgICIgICAgICAgICAgWy0tYmVuY2htYXJrX3JlcG9ydF9hZ2dyZWdhdGVzX29ubHk9e3RydWV8ZmFsc2V9XG4iCisgICAgICAgICAgIiAgICAgICAgICBbLS1iZW5jaG1hcmtfZm9ybWF0PTxjb25zb2xlfGpzb258Y3N2Pl1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19vdXQ9PGZpbGVuYW1lPl1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19vdXRfZm9ybWF0PTxqc29ufGNvbnNvbGV8Y3N2Pl1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19jb2xvcj17YXV0b3x0cnVlfGZhbHNlfV1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLWJlbmNobWFya19jb3VudGVyc190YWJ1bGFyPXt0cnVlfGZhbHNlfV1cbiIKKyAgICAgICAgICAiICAgICAgICAgIFstLXY9PHZlcmJvc2l0eT5dXG4iKTsKKyAgZXhpdCgwKTsKK30KKwordm9pZCBQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoaW50KiBhcmdjLCBjaGFyKiogYXJndikgeworICB1c2luZyBuYW1lc3BhY2UgYmVuY2htYXJrOworICBmb3IgKGludCBpID0gMTsgaSA8ICphcmdjOyArK2kpIHsKKyAgICBpZiAoUGFyc2VCb29sRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX2xpc3RfdGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICZGTEFHU19iZW5jaG1hcmtfbGlzdF90ZXN0cykgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfZmlsdGVyIiwgJkZMQUdTX2JlbmNobWFya19maWx0ZXIpIHx8CisgICAgICAgIFBhcnNlRG91YmxlRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX21pbl90aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZGTEFHU19iZW5jaG1hcmtfbWluX3RpbWUpIHx8CisgICAgICAgIFBhcnNlSW50MzJGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfcmVwZXRpdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAmRkxBR1NfYmVuY2htYXJrX3JlcGV0aXRpb25zKSB8fAorICAgICAgICBQYXJzZUJvb2xGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfcmVwb3J0X2FnZ3JlZ2F0ZXNfb25seSIsCisgICAgICAgICAgICAgICAgICAgICAgJkZMQUdTX2JlbmNobWFya19yZXBvcnRfYWdncmVnYXRlc19vbmx5KSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJndltpXSwgImJlbmNobWFya19mb3JtYXQiLCAmRkxBR1NfYmVuY2htYXJrX2Zvcm1hdCkgfHwKKyAgICAgICAgUGFyc2VTdHJpbmdGbGFnKGFyZ3ZbaV0sICJiZW5jaG1hcmtfb3V0IiwgJkZMQUdTX2JlbmNobWFya19vdXQpIHx8CisgICAgICAgIFBhcnNlU3RyaW5nRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX291dF9mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgJkZMQUdTX2JlbmNobWFya19vdXRfZm9ybWF0KSB8fAorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJndltpXSwgImJlbmNobWFya19jb2xvciIsICZGTEFHU19iZW5jaG1hcmtfY29sb3IpIHx8CisgICAgICAgIC8vICJjb2xvcl9wcmludCIgaXMgdGhlIGRlcHJlY2F0ZWQgbmFtZSBmb3IgImJlbmNobWFya19jb2xvciIuCisgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzLgorICAgICAgICBQYXJzZVN0cmluZ0ZsYWcoYXJndltpXSwgImNvbG9yX3ByaW50IiwgJkZMQUdTX2JlbmNobWFya19jb2xvcikgfHwKKyAgICAgICAgUGFyc2VCb29sRmxhZyhhcmd2W2ldLCAiYmVuY2htYXJrX2NvdW50ZXJzX3RhYnVsYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgJkZMQUdTX2JlbmNobWFya19jb3VudGVyc190YWJ1bGFyKSB8fAorICAgICAgICBQYXJzZUludDMyRmxhZyhhcmd2W2ldLCAidiIsICZGTEFHU192KSkgeworICAgICAgZm9yIChpbnQgaiA9IGk7IGogIT0gKmFyZ2MgLSAxOyArK2opIGFyZ3Zbal0gPSBhcmd2W2ogKyAxXTsKKworICAgICAgLS0oKmFyZ2MpOworICAgICAgLS1pOworICAgIH0gZWxzZSBpZiAoSXNGbGFnKGFyZ3ZbaV0sICJoZWxwIikpIHsKKyAgICAgIFByaW50VXNhZ2VBbmRFeGl0KCk7CisgICAgfQorICB9CisgIGZvciAoYXV0byBjb25zdCogZmxhZyA6CisgICAgICAgeyZGTEFHU19iZW5jaG1hcmtfZm9ybWF0LCAmRkxBR1NfYmVuY2htYXJrX291dF9mb3JtYXR9KQorICAgIGlmICgqZmxhZyAhPSAiY29uc29sZSIgJiYgKmZsYWcgIT0gImpzb24iICYmICpmbGFnICE9ICJjc3YiKSB7CisgICAgICBQcmludFVzYWdlQW5kRXhpdCgpOworICAgIH0KKyAgaWYgKEZMQUdTX2JlbmNobWFya19jb2xvci5lbXB0eSgpKSB7CisgICAgUHJpbnRVc2FnZUFuZEV4aXQoKTsKKyAgfQorfQorCitpbnQgSW5pdGlhbGl6ZVN0cmVhbXMoKSB7CisgIHN0YXRpYyBzdGQ6Omlvc19iYXNlOjpJbml0IGluaXQ7CisgIHJldHVybiAwOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3ZvaWQgSW5pdGlhbGl6ZShpbnQqIGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludGVybmFsOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoYXJnYywgYXJndik7CisgIGludGVybmFsOjpMb2dMZXZlbCgpID0gRkxBR1NfdjsKK30KKworYm9vbCBSZXBvcnRVbnJlY29nbml6ZWRBcmd1bWVudHMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3I6IHVucmVjb2duaXplZCBjb21tYW5kLWxpbmUgZmxhZzogJXNcbiIsIGFyZ3ZbMF0sIGFyZ3ZbaV0pOworICB9CisgIHJldHVybiBhcmdjID4gMTsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19hcGlfaW50ZXJuYWwuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19hcGlfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDgxZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvYmVuY2htYXJrX2FwaV9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgQkVOQ0hNQVJLX0FQSV9JTlRFUk5BTF9ICisjZGVmaW5lIEJFTkNITUFSS19BUElfSU5URVJOQUxfSAorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEluZm9ybWF0aW9uIGtlcHQgcGVyIGJlbmNobWFyayB3ZSBtYXkgd2FudCB0byBydW4KK3N0cnVjdCBCZW5jaG1hcms6Okluc3RhbmNlIHsKKyAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgQmVuY2htYXJrKiBiZW5jaG1hcms7CisgIFJlcG9ydE1vZGUgcmVwb3J0X21vZGU7CisgIHN0ZDo6dmVjdG9yPGludD4gYXJnOworICBUaW1lVW5pdCB0aW1lX3VuaXQ7CisgIGludCByYW5nZV9tdWx0aXBsaWVyOworICBib29sIHVzZV9yZWFsX3RpbWU7CisgIGJvb2wgdXNlX21hbnVhbF90aW1lOworICBCaWdPIGNvbXBsZXhpdHk7CisgIEJpZ09GdW5jKiBjb21wbGV4aXR5X2xhbWJkYTsKKyAgVXNlckNvdW50ZXJzIGNvdW50ZXJzOworICBjb25zdCBzdGQ6OnZlY3RvcjxTdGF0aXN0aWNzPiogc3RhdGlzdGljczsKKyAgYm9vbCBsYXN0X2JlbmNobWFya19pbnN0YW5jZTsKKyAgaW50IHJlcGV0aXRpb25zOworICBkb3VibGUgbWluX3RpbWU7CisgIHNpemVfdCBpdGVyYXRpb25zOworICBpbnQgdGhyZWFkczsgIC8vIE51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgdG8gdXMKK307CisKK2Jvb2wgRmluZEJlbmNobWFya3NJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrOjpJbnN0YW5jZT4qIGJlbmNobWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBFcnIpOworCitib29sIElzWmVybyhkb3VibGUgbik7CisKK0NvbnNvbGVSZXBvcnRlcjo6T3V0cHV0T3B0aW9ucyBHZXRPdXRwdXRPcHRpb25zKGJvb2wgZm9yY2Vfbm9fY29sb3IgPSBmYWxzZSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX0FQSV9JTlRFUk5BTF9ICmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcmVnaXN0ZXIuY2MgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9iZW5jaG1hcmtfcmVnaXN0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3NDZhMwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2JlbmNobWFya19yZWdpc3Rlci5jYwpAQCAtMCwwICsxLDQ3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKyNpbmNsdWRlICJiZW5jaG1hcmtfYXBpX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJjb21tYW5kbGluZWZsYWdzLmgiCisjaW5jbHVkZSAiY29tcGxleGl0eS5oIgorI2luY2x1ZGUgInN0YXRpc3RpY3MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJtdXRleC5oIgorI2luY2x1ZGUgInJlLmgiCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK25hbWVzcGFjZSB7CisvLyBGb3Igbm9uLWRlbnNlIFJhbmdlLCBpbnRlcm1lZGlhdGUgdmFsdWVzIGFyZSBwb3dlcnMgb2Yga1JhbmdlTXVsdGlwbGllci4KK3N0YXRpYyBjb25zdCBpbnQga1JhbmdlTXVsdGlwbGllciA9IDg7CisvLyBUaGUgc2l6ZSBvZiBhIGJlbmNobWFyayBmYW1pbHkgZGV0ZXJtaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGlucHV0cyB0byByZXBlYXQKKy8vIHRoZSBiZW5jaG1hcmsgb24uIElmIHRoaXMgaXMgImxhcmdlIiB0aGVuIHdhcm4gdGhlIHVzZXIgZHVyaW5nIGNvbmZpZ3VyYXRpb24uCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGYW1pbHlTaXplID0gMTAwOworfSAgLy8gZW5kIG5hbWVzcGFjZQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIEJlbmNobWFya0ZhbWlsaWVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gQ2xhc3MgZm9yIG1hbmFnaW5nIHJlZ2lzdGVyZWQgYmVuY2htYXJrcy4gIE5vdGUgdGhhdCBlYWNoIHJlZ2lzdGVyZWQKKy8vIGJlbmNobWFyayBpZGVudGlmaWVzIGEgZmFtaWx5IG9mIHJlbGF0ZWQgYmVuY2htYXJrcyB0byBydW4uCitjbGFzcyBCZW5jaG1hcmtGYW1pbGllcyB7CisgcHVibGljOgorICBzdGF0aWMgQmVuY2htYXJrRmFtaWxpZXMqIEdldEluc3RhbmNlKCk7CisKKyAgLy8gUmVnaXN0ZXJzIGEgYmVuY2htYXJrIGZhbWlseSBhbmQgcmV0dXJucyB0aGUgaW5kZXggYXNzaWduZWQgdG8gaXQuCisgIHNpemVfdCBBZGRCZW5jaG1hcmsoc3RkOjp1bmlxdWVfcHRyPEJlbmNobWFyaz4gZmFtaWx5KTsKKworICAvLyBDbGVhciBhbGwgcmVnaXN0ZXJlZCBiZW5jaG1hcmsgZmFtaWxpZXMuCisgIHZvaWQgQ2xlYXJCZW5jaG1hcmtzKCk7CisKKyAgLy8gRXh0cmFjdCB0aGUgbGlzdCBvZiBiZW5jaG1hcmsgaW5zdGFuY2VzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZAorICAvLyByZWd1bGFyIGV4cHJlc3Npb24uCisgIGJvb2wgRmluZEJlbmNobWFya3MoY29uc3Qgc3RkOjpzdHJpbmcmIHJlLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJlbmNobWFyazo6SW5zdGFuY2U+KiBiZW5jaG1hcmtzLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSogRXJyKTsKKworIHByaXZhdGU6CisgIEJlbmNobWFya0ZhbWlsaWVzKCkge30KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrPj4gZmFtaWxpZXNfOworICBNdXRleCBtdXRleF87Cit9OworCitCZW5jaG1hcmtGYW1pbGllcyogQmVuY2htYXJrRmFtaWxpZXM6OkdldEluc3RhbmNlKCkgeworICBzdGF0aWMgQmVuY2htYXJrRmFtaWxpZXMgaW5zdGFuY2U7CisgIHJldHVybiAmaW5zdGFuY2U7Cit9CisKK3NpemVfdCBCZW5jaG1hcmtGYW1pbGllczo6QWRkQmVuY2htYXJrKHN0ZDo6dW5pcXVlX3B0cjxCZW5jaG1hcms+IGZhbWlseSkgeworICBNdXRleExvY2sgbChtdXRleF8pOworICBzaXplX3QgaW5kZXggPSBmYW1pbGllc18uc2l6ZSgpOworICBmYW1pbGllc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShmYW1pbHkpKTsKKyAgcmV0dXJuIGluZGV4OworfQorCit2b2lkIEJlbmNobWFya0ZhbWlsaWVzOjpDbGVhckJlbmNobWFya3MoKSB7CisgIE11dGV4TG9jayBsKG11dGV4Xyk7CisgIGZhbWlsaWVzXy5jbGVhcigpOworICBmYW1pbGllc18uc2hyaW5rX3RvX2ZpdCgpOworfQorCitib29sIEJlbmNobWFya0ZhbWlsaWVzOjpGaW5kQmVuY2htYXJrcygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3BlYywgc3RkOjp2ZWN0b3I8QmVuY2htYXJrOjpJbnN0YW5jZT4qIGJlbmNobWFya3MsCisgICAgc3RkOjpvc3RyZWFtKiBFcnJTdHJlYW0pIHsKKyAgQ0hFQ0soRXJyU3RyZWFtKTsKKyAgYXV0byYgRXJyID0gKkVyclN0cmVhbTsKKyAgLy8gTWFrZSByZWd1bGFyIGV4cHJlc3Npb24gb3V0IG9mIGNvbW1hbmQtbGluZSBmbGFnCisgIHN0ZDo6c3RyaW5nIGVycm9yX21zZzsKKyAgUmVnZXggcmU7CisgIGlmICghcmUuSW5pdChzcGVjLCAmZXJyb3JfbXNnKSkgeworICAgIEVyciA8PCAiQ291bGQgbm90IGNvbXBpbGUgYmVuY2htYXJrIHJlOiAiIDw8IGVycm9yX21zZyA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gU3BlY2lhbCBsaXN0IG9mIHRocmVhZCBjb3VudHMgdG8gdXNlIHdoZW4gbm9uZSBhcmUgc3BlY2lmaWVkCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gb25lX3RocmVhZCA9IHsxfTsKKworICBNdXRleExvY2sgbChtdXRleF8pOworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxCZW5jaG1hcms+JiBmYW1pbHkgOiBmYW1pbGllc18pIHsKKyAgICAvLyBGYW1pbHkgd2FzIGRlbGV0ZWQgb3IgYmVuY2htYXJrIGRvZXNuJ3QgbWF0Y2gKKyAgICBpZiAoIWZhbWlseSkgY29udGludWU7CisKKyAgICBpZiAoZmFtaWx5LT5BcmdzQ250KCkgPT0gLTEpIHsKKyAgICAgIGZhbWlseS0+QXJncyh7fSk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4qIHRocmVhZF9jb3VudHMgPQorICAgICAgICAoZmFtaWx5LT50aHJlYWRfY291bnRzXy5lbXB0eSgpCisgICAgICAgICAgICAgPyAmb25lX3RocmVhZAorICAgICAgICAgICAgIDogJnN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mPihmYW1pbHktPnRocmVhZF9jb3VudHNfKSk7CisgICAgY29uc3Qgc2l6ZV90IGZhbWlseV9zaXplID0gZmFtaWx5LT5hcmdzXy5zaXplKCkgKiB0aHJlYWRfY291bnRzLT5zaXplKCk7CisgICAgLy8gVGhlIGJlbmNobWFyayB3aWxsIGJlIHJ1biBhdCBsZWFzdCAnZmFtaWx5X3NpemUnIGRpZmZlcmVudCBpbnB1dHMuCisgICAgLy8gSWYgJ2ZhbWlseV9zaXplJyBpcyB2ZXJ5IGxhcmdlIHdhcm4gdGhlIHVzZXIuCisgICAgaWYgKGZhbWlseV9zaXplID4ga01heEZhbWlseVNpemUpIHsKKyAgICAgIEVyciA8PCAiVGhlIG51bWJlciBvZiBpbnB1dHMgaXMgdmVyeSBsYXJnZS4gIiA8PCBmYW1pbHktPm5hbWVfCisgICAgICAgICAgPDwgIiB3aWxsIGJlIHJlcGVhdGVkIGF0IGxlYXN0ICIgPDwgZmFtaWx5X3NpemUgPDwgIiB0aW1lcy5cbiI7CisgICAgfQorICAgIC8vIHJlc2VydmUgaW4gdGhlIHNwZWNpYWwgY2FzZSB0aGUgcmVnZXggIi4iLCBzaW5jZSB3ZSBrbm93IHRoZSBmaW5hbAorICAgIC8vIGZhbWlseSBzaXplLgorICAgIGlmIChzcGVjID09ICIuIikgYmVuY2htYXJrcy0+cmVzZXJ2ZShmYW1pbHlfc2l6ZSk7CisKKyAgICBmb3IgKGF1dG8gY29uc3QmIGFyZ3MgOiBmYW1pbHktPmFyZ3NfKSB7CisgICAgICBmb3IgKGludCBudW1fdGhyZWFkcyA6ICp0aHJlYWRfY291bnRzKSB7CisgICAgICAgIEJlbmNobWFyazo6SW5zdGFuY2UgaW5zdGFuY2U7CisgICAgICAgIGluc3RhbmNlLm5hbWUgPSBmYW1pbHktPm5hbWVfOworICAgICAgICBpbnN0YW5jZS5iZW5jaG1hcmsgPSBmYW1pbHkuZ2V0KCk7CisgICAgICAgIGluc3RhbmNlLnJlcG9ydF9tb2RlID0gZmFtaWx5LT5yZXBvcnRfbW9kZV87CisgICAgICAgIGluc3RhbmNlLmFyZyA9IGFyZ3M7CisgICAgICAgIGluc3RhbmNlLnRpbWVfdW5pdCA9IGZhbWlseS0+dGltZV91bml0XzsKKyAgICAgICAgaW5zdGFuY2UucmFuZ2VfbXVsdGlwbGllciA9IGZhbWlseS0+cmFuZ2VfbXVsdGlwbGllcl87CisgICAgICAgIGluc3RhbmNlLm1pbl90aW1lID0gZmFtaWx5LT5taW5fdGltZV87CisgICAgICAgIGluc3RhbmNlLml0ZXJhdGlvbnMgPSBmYW1pbHktPml0ZXJhdGlvbnNfOworICAgICAgICBpbnN0YW5jZS5yZXBldGl0aW9ucyA9IGZhbWlseS0+cmVwZXRpdGlvbnNfOworICAgICAgICBpbnN0YW5jZS51c2VfcmVhbF90aW1lID0gZmFtaWx5LT51c2VfcmVhbF90aW1lXzsKKyAgICAgICAgaW5zdGFuY2UudXNlX21hbnVhbF90aW1lID0gZmFtaWx5LT51c2VfbWFudWFsX3RpbWVfOworICAgICAgICBpbnN0YW5jZS5jb21wbGV4aXR5ID0gZmFtaWx5LT5jb21wbGV4aXR5XzsKKyAgICAgICAgaW5zdGFuY2UuY29tcGxleGl0eV9sYW1iZGEgPSBmYW1pbHktPmNvbXBsZXhpdHlfbGFtYmRhXzsKKyAgICAgICAgaW5zdGFuY2Uuc3RhdGlzdGljcyA9ICZmYW1pbHktPnN0YXRpc3RpY3NfOworICAgICAgICBpbnN0YW5jZS50aHJlYWRzID0gbnVtX3RocmVhZHM7CisKKyAgICAgICAgLy8gQWRkIGFyZ3VtZW50cyB0byBpbnN0YW5jZSBuYW1lCisgICAgICAgIHNpemVfdCBhcmdfaSA9IDA7CisgICAgICAgIGZvciAoYXV0byBjb25zdCYgYXJnIDogYXJncykgeworICAgICAgICAgIGluc3RhbmNlLm5hbWUgKz0gIi8iOworCisgICAgICAgICAgaWYgKGFyZ19pIDwgZmFtaWx5LT5hcmdfbmFtZXNfLnNpemUoKSkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgYXJnX25hbWUgPSBmYW1pbHktPmFyZ19uYW1lc19bYXJnX2ldOworICAgICAgICAgICAgaWYgKCFhcmdfbmFtZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgIGluc3RhbmNlLm5hbWUgKz0KKyAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50RigiJXM6IiwgZmFtaWx5LT5hcmdfbmFtZXNfW2FyZ19pXS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgaW5zdGFuY2UubmFtZSArPSBTdHJpbmdQcmludEYoIiVkIiwgYXJnKTsKKyAgICAgICAgICArK2FyZ19pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc1plcm8oZmFtaWx5LT5taW5fdGltZV8pKQorICAgICAgICAgIGluc3RhbmNlLm5hbWUgKz0gU3RyaW5nUHJpbnRGKCIvbWluX3RpbWU6JTAuM2YiLCBmYW1pbHktPm1pbl90aW1lXyk7CisgICAgICAgIGlmIChmYW1pbHktPml0ZXJhdGlvbnNfICE9IDApCisgICAgICAgICAgaW5zdGFuY2UubmFtZSArPSBTdHJpbmdQcmludEYoIi9pdGVyYXRpb25zOiVkIiwgZmFtaWx5LT5pdGVyYXRpb25zXyk7CisgICAgICAgIGlmIChmYW1pbHktPnJlcGV0aXRpb25zXyAhPSAwKQorICAgICAgICAgIGluc3RhbmNlLm5hbWUgKz0gU3RyaW5nUHJpbnRGKCIvcmVwZWF0czolZCIsIGZhbWlseS0+cmVwZXRpdGlvbnNfKTsKKworICAgICAgICBpZiAoZmFtaWx5LT51c2VfbWFudWFsX3RpbWVfKSB7CisgICAgICAgICAgaW5zdGFuY2UubmFtZSArPSAiL21hbnVhbF90aW1lIjsKKyAgICAgICAgfSBlbHNlIGlmIChmYW1pbHktPnVzZV9yZWFsX3RpbWVfKSB7CisgICAgICAgICAgaW5zdGFuY2UubmFtZSArPSAiL3JlYWxfdGltZSI7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgdG8gdGhlIG5hbWUKKyAgICAgICAgaWYgKCFmYW1pbHktPnRocmVhZF9jb3VudHNfLmVtcHR5KCkpIHsKKyAgICAgICAgICBpbnN0YW5jZS5uYW1lICs9IFN0cmluZ1ByaW50RigiL3RocmVhZHM6JWQiLCBpbnN0YW5jZS50aHJlYWRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZS5NYXRjaChpbnN0YW5jZS5uYW1lKSkgeworICAgICAgICAgIGluc3RhbmNlLmxhc3RfYmVuY2htYXJrX2luc3RhbmNlID0gKCZhcmdzID09ICZmYW1pbHktPmFyZ3NfLmJhY2soKSk7CisgICAgICAgICAgYmVuY2htYXJrcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShpbnN0YW5jZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitCZW5jaG1hcmsqIFJlZ2lzdGVyQmVuY2htYXJrSW50ZXJuYWwoQmVuY2htYXJrKiBiZW5jaCkgeworICBzdGQ6OnVuaXF1ZV9wdHI8QmVuY2htYXJrPiBiZW5jaF9wdHIoYmVuY2gpOworICBCZW5jaG1hcmtGYW1pbGllcyogZmFtaWxpZXMgPSBCZW5jaG1hcmtGYW1pbGllczo6R2V0SW5zdGFuY2UoKTsKKyAgZmFtaWxpZXMtPkFkZEJlbmNobWFyayhzdGQ6Om1vdmUoYmVuY2hfcHRyKSk7CisgIHJldHVybiBiZW5jaDsKK30KKworLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgYSBoYWNrIHNvIHRoYXQgYmVuY2htYXJrLmNjIGNhbiBhY2Nlc3MKKy8vIGBCZW5jaG1hcmtGYW1pbGllc2AKK2Jvb2wgRmluZEJlbmNobWFya3NJbnRlcm5hbChjb25zdCBzdGQ6OnN0cmluZyYgcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmVuY2htYXJrOjpJbnN0YW5jZT4qIGJlbmNobWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBFcnIpIHsKKyAgcmV0dXJuIEJlbmNobWFya0ZhbWlsaWVzOjpHZXRJbnN0YW5jZSgpLT5GaW5kQmVuY2htYXJrcyhyZSwgYmVuY2htYXJrcywgRXJyKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCitCZW5jaG1hcms6OkJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lKQorICAgIDogbmFtZV8obmFtZSksCisgICAgICByZXBvcnRfbW9kZV8oUk1fVW5zcGVjaWZpZWQpLAorICAgICAgdGltZV91bml0XyhrTmFub3NlY29uZCksCisgICAgICByYW5nZV9tdWx0aXBsaWVyXyhrUmFuZ2VNdWx0aXBsaWVyKSwKKyAgICAgIG1pbl90aW1lXygwKSwKKyAgICAgIGl0ZXJhdGlvbnNfKDApLAorICAgICAgcmVwZXRpdGlvbnNfKDApLAorICAgICAgdXNlX3JlYWxfdGltZV8oZmFsc2UpLAorICAgICAgdXNlX21hbnVhbF90aW1lXyhmYWxzZSksCisgICAgICBjb21wbGV4aXR5XyhvTm9uZSksCisgICAgICBjb21wbGV4aXR5X2xhbWJkYV8obnVsbHB0cikgeworICBDb21wdXRlU3RhdGlzdGljcygibWVhbiIsIFN0YXRpc3RpY3NNZWFuKTsKKyAgQ29tcHV0ZVN0YXRpc3RpY3MoIm1lZGlhbiIsIFN0YXRpc3RpY3NNZWRpYW4pOworICBDb21wdXRlU3RhdGlzdGljcygic3RkZGV2IiwgU3RhdGlzdGljc1N0ZERldik7Cit9CisKK0JlbmNobWFyazo6fkJlbmNobWFyaygpIHt9CisKK3ZvaWQgQmVuY2htYXJrOjpBZGRSYW5nZShzdGQ6OnZlY3RvcjxpbnQ+KiBkc3QsIGludCBsbywgaW50IGhpLCBpbnQgbXVsdCkgeworICBDSEVDS19HRShsbywgMCk7CisgIENIRUNLX0dFKGhpLCBsbyk7CisgIENIRUNLX0dFKG11bHQsIDIpOworCisgIC8vIEFkZCAibG8iCisgIGRzdC0+cHVzaF9iYWNrKGxvKTsKKworICBzdGF0aWMgY29uc3QgaW50IGtpbnQzMm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworCisgIC8vIE5vdyBzcGFjZSBvdXQgdGhlIGJlbmNobWFya3MgaW4gbXVsdGlwbGVzIG9mICJtdWx0IgorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBraW50MzJtYXggLyBtdWx0OyBpICo9IG11bHQpIHsKKyAgICBpZiAoaSA+PSBoaSkgYnJlYWs7CisgICAgaWYgKGkgPiBsbykgeworICAgICAgZHN0LT5wdXNoX2JhY2soaSk7CisgICAgfQorICB9CisgIC8vIEFkZCAiaGkiIChpZiBkaWZmZXJlbnQgZnJvbSAibG8iKQorICBpZiAoaGkgIT0gbG8pIHsKKyAgICBkc3QtPnB1c2hfYmFjayhoaSk7CisgIH0KK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZyhpbnQgeCkgeworICBDSEVDSyhBcmdzQ250KCkgPT0gLTEgfHwgQXJnc0NudCgpID09IDEpOworICBhcmdzXy5wdXNoX2JhY2soe3h9KTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpVbml0KFRpbWVVbml0IHVuaXQpIHsKKyAgdGltZV91bml0XyA9IHVuaXQ7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBhcmdsaXN0OworICBBZGRSYW5nZSgmYXJnbGlzdCwgc3RhcnQsIGxpbWl0LCByYW5nZV9tdWx0aXBsaWVyXyk7CisKKyAgZm9yIChpbnQgaSA6IGFyZ2xpc3QpIHsKKyAgICBhcmdzXy5wdXNoX2JhY2soe2l9KTsKKyAgfQorICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJhbmdlcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCBpbnQ+PiYgcmFuZ2VzKSB7CisgIENIRUNLKEFyZ3NDbnQoKSA9PSAtMSB8fCBBcmdzQ250KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihyYW5nZXMuc2l6ZSgpKSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IGFyZ2xpc3RzKHJhbmdlcy5zaXplKCkpOworICBzdGQ6OnNpemVfdCB0b3RhbCA9IDE7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCByYW5nZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBBZGRSYW5nZSgmYXJnbGlzdHNbaV0sIHJhbmdlc1tpXS5maXJzdCwgcmFuZ2VzW2ldLnNlY29uZCwKKyAgICAgICAgICAgICByYW5nZV9tdWx0aXBsaWVyXyk7CisgICAgdG90YWwgKj0gYXJnbGlzdHNbaV0uc2l6ZSgpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGN0cihhcmdsaXN0cy5zaXplKCksIDApOworCisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiB0bXA7CisgICAgdG1wLnJlc2VydmUoYXJnbGlzdHMuc2l6ZSgpKTsKKworICAgIGZvciAoc3RkOjpzaXplX3QgaiA9IDA7IGogPCBhcmdsaXN0cy5zaXplKCk7IGorKykgeworICAgICAgdG1wLnB1c2hfYmFjayhhcmdsaXN0c1tqXS5hdChjdHJbal0pKTsKKyAgICB9CisKKyAgICBhcmdzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHRtcCkpOworCisgICAgZm9yIChzdGQ6OnNpemVfdCBqID0gMDsgaiA8IGFyZ2xpc3RzLnNpemUoKTsgaisrKSB7CisgICAgICBpZiAoY3RyW2pdICsgMSA8IGFyZ2xpc3RzW2pdLnNpemUoKSkgeworICAgICAgICArK2N0cltqXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjdHJbal0gPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkFyZ05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgQ0hFQ0soQXJnc0NudCgpID09IC0xIHx8IEFyZ3NDbnQoKSA9PSAxKTsKKyAgYXJnX25hbWVzXyA9IHtuYW1lfTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpBcmdOYW1lcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG5hbWVzKSB7CisgIENIRUNLKEFyZ3NDbnQoKSA9PSAtMSB8fCBBcmdzQ250KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihuYW1lcy5zaXplKCkpKTsKKyAgYXJnX25hbWVzXyA9IG5hbWVzOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OkRlbnNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBzdGVwKSB7CisgIENIRUNLKEFyZ3NDbnQoKSA9PSAtMSB8fCBBcmdzQ250KCkgPT0gMSk7CisgIENIRUNLX0dFKHN0YXJ0LCAwKTsKKyAgQ0hFQ0tfTEUoc3RhcnQsIGxpbWl0KTsKKyAgZm9yIChpbnQgYXJnID0gc3RhcnQ7IGFyZyA8PSBsaW1pdDsgYXJnICs9IHN0ZXApIHsKKyAgICBhcmdzXy5wdXNoX2JhY2soe2FyZ30pOworICB9CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6QXJncyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhcmdzKSB7CisgIENIRUNLKEFyZ3NDbnQoKSA9PSAtMSB8fCBBcmdzQ250KCkgPT0gc3RhdGljX2Nhc3Q8aW50PihhcmdzLnNpemUoKSkpOworICBhcmdzXy5wdXNoX2JhY2soYXJncyk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6QXBwbHkodm9pZCAoKmN1c3RvbV9hcmd1bWVudHMpKEJlbmNobWFyayogYmVuY2htYXJrKSkgeworICBjdXN0b21fYXJndW1lbnRzKHRoaXMpOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJhbmdlTXVsdGlwbGllcihpbnQgbXVsdGlwbGllcikgeworICBDSEVDSyhtdWx0aXBsaWVyID4gMSk7CisgIHJhbmdlX211bHRpcGxpZXJfID0gbXVsdGlwbGllcjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKKworQmVuY2htYXJrKiBCZW5jaG1hcms6Ok1pblRpbWUoZG91YmxlIHQpIHsKKyAgQ0hFQ0sodCA+IDAuMCk7CisgIENIRUNLKGl0ZXJhdGlvbnNfID09IDApOworICBtaW5fdGltZV8gPSB0OworICByZXR1cm4gdGhpczsKK30KKworCitCZW5jaG1hcmsqIEJlbmNobWFyazo6SXRlcmF0aW9ucyhzaXplX3QgbikgeworICBDSEVDSyhuID4gMCk7CisgIENIRUNLKElzWmVybyhtaW5fdGltZV8pKTsKKyAgaXRlcmF0aW9uc18gPSBuOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlJlcGV0aXRpb25zKGludCBuKSB7CisgIENIRUNLKG4gPiAwKTsKKyAgcmVwZXRpdGlvbnNfID0gbjsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpSZXBvcnRBZ2dyZWdhdGVzT25seShib29sIHZhbHVlKSB7CisgIHJlcG9ydF9tb2RlXyA9IHZhbHVlID8gUk1fUmVwb3J0QWdncmVnYXRlc09ubHkgOiBSTV9EZWZhdWx0OworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlVzZVJlYWxUaW1lKCkgeworICBDSEVDSyghdXNlX21hbnVhbF90aW1lXykKKyAgICAgIDw8ICJDYW5ub3Qgc2V0IFVzZVJlYWxUaW1lIGFuZCBVc2VNYW51YWxUaW1lIHNpbXVsdGFuZW91c2x5LiI7CisgIHVzZV9yZWFsX3RpbWVfID0gdHJ1ZTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpVc2VNYW51YWxUaW1lKCkgeworICBDSEVDSyghdXNlX3JlYWxfdGltZV8pCisgICAgICA8PCAiQ2Fubm90IHNldCBVc2VSZWFsVGltZSBhbmQgVXNlTWFudWFsVGltZSBzaW11bHRhbmVvdXNseS4iOworICB1c2VfbWFudWFsX3RpbWVfID0gdHJ1ZTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpDb21wbGV4aXR5KEJpZ08gY29tcGxleGl0eSkgeworICBjb21wbGV4aXR5XyA9IGNvbXBsZXhpdHk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6Q29tcGxleGl0eShCaWdPRnVuYyogY29tcGxleGl0eSkgeworICBjb21wbGV4aXR5X2xhbWJkYV8gPSBjb21wbGV4aXR5OworICBjb21wbGV4aXR5XyA9IG9MYW1iZGE7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6Q29tcHV0ZVN0YXRpc3RpY3Moc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzRnVuYyogc3RhdGlzdGljcykgeworICBzdGF0aXN0aWNzXy5lbXBsYWNlX2JhY2sobmFtZSwgc3RhdGlzdGljcyk7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6VGhyZWFkcyhpbnQgdCkgeworICBDSEVDS19HVCh0LCAwKTsKKyAgdGhyZWFkX2NvdW50c18ucHVzaF9iYWNrKHQpOworICByZXR1cm4gdGhpczsKK30KKworQmVuY2htYXJrKiBCZW5jaG1hcms6OlRocmVhZFJhbmdlKGludCBtaW5fdGhyZWFkcywgaW50IG1heF90aHJlYWRzKSB7CisgIENIRUNLX0dUKG1pbl90aHJlYWRzLCAwKTsKKyAgQ0hFQ0tfR0UobWF4X3RocmVhZHMsIG1pbl90aHJlYWRzKTsKKworICBBZGRSYW5nZSgmdGhyZWFkX2NvdW50c18sIG1pbl90aHJlYWRzLCBtYXhfdGhyZWFkcywgMik7CisgIHJldHVybiB0aGlzOworfQorCitCZW5jaG1hcmsqIEJlbmNobWFyazo6RGVuc2VUaHJlYWRSYW5nZShpbnQgbWluX3RocmVhZHMsIGludCBtYXhfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgQ0hFQ0tfR1QobWluX3RocmVhZHMsIDApOworICBDSEVDS19HRShtYXhfdGhyZWFkcywgbWluX3RocmVhZHMpOworICBDSEVDS19HRShzdHJpZGUsIDEpOworCisgIGZvciAoYXV0byBpID0gbWluX3RocmVhZHM7IGkgPCBtYXhfdGhyZWFkczsgaSArPSBzdHJpZGUpIHsKKyAgICB0aHJlYWRfY291bnRzXy5wdXNoX2JhY2soaSk7CisgIH0KKyAgdGhyZWFkX2NvdW50c18ucHVzaF9iYWNrKG1heF90aHJlYWRzKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0JlbmNobWFyayogQmVuY2htYXJrOjpUaHJlYWRQZXJDcHUoKSB7CisgIHRocmVhZF9jb3VudHNfLnB1c2hfYmFjayhDUFVJbmZvOjpHZXQoKS5udW1fY3B1cyk7CisgIHJldHVybiB0aGlzOworfQorCit2b2lkIEJlbmNobWFyazo6U2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCitpbnQgQmVuY2htYXJrOjpBcmdzQ250KCkgY29uc3QgeworICBpZiAoYXJnc18uZW1wdHkoKSkgeworICAgIGlmIChhcmdfbmFtZXNfLmVtcHR5KCkpIHJldHVybiAtMTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihhcmdfbmFtZXNfLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYXJnc18uZnJvbnQoKS5zaXplKCkpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQmVuY2htYXJrCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKwordm9pZCBGdW5jdGlvbkJlbmNobWFyazo6UnVuKFN0YXRlJiBzdCkgeyBmdW5jXyhzdCk7IH0KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit2b2lkIENsZWFyUmVnaXN0ZXJlZEJlbmNobWFya3MoKSB7CisgIGludGVybmFsOjpCZW5jaG1hcmtGYW1pbGllczo6R2V0SW5zdGFuY2UoKS0+Q2xlYXJCZW5jaG1hcmtzKCk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jaGVjay5oIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JlYWQyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY2hlY2suaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIENIRUNLX0hfCisjZGVmaW5lIENIRUNLX0hfCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIHZvaWQoQWJvcnRIYW5kbGVyVCkoKTsKKworaW5saW5lIEFib3J0SGFuZGxlclQqJiBHZXRBYm9ydEhhbmRsZXIoKSB7CisgIHN0YXRpYyBBYm9ydEhhbmRsZXJUKiBoYW5kbGVyID0gJnN0ZDo6YWJvcnQ7CisgIHJldHVybiBoYW5kbGVyOworfQorCitCRU5DSE1BUktfTk9SRVRVUk4gaW5saW5lIHZvaWQgQ2FsbEFib3J0SGFuZGxlcigpIHsKKyAgR2V0QWJvcnRIYW5kbGVyKCkoKTsKKyAgc3RkOjphYm9ydCgpOyAgLy8gZmFsbGJhY2sgdG8gZW5mb3JjZSBub3JldHVybgorfQorCisvLyBDaGVja0hhbmRsZXIgaXMgdGhlIGNsYXNzIGNvbnN0cnVjdGVkIGJ5IGZhaWxpbmcgQ0hFQ0sgbWFjcm9zLiBDaGVja0hhbmRsZXIKKy8vIHdpbGwgbG9nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWlsdXJlcyBhbmQgYWJvcnQgd2hlbiBpdCBpcyBkZXN0cnVjdGVkLgorY2xhc3MgQ2hlY2tIYW5kbGVyIHsKKyBwdWJsaWM6CisgIENoZWNrSGFuZGxlcihjb25zdCBjaGFyKiBjaGVjaywgY29uc3QgY2hhciogZmlsZSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCisgICAgICA6IGxvZ18oR2V0RXJyb3JMb2dJbnN0YW5jZSgpKSB7CisgICAgbG9nXyA8PCBmaWxlIDw8ICI6IiA8PCBsaW5lIDw8ICI6ICIgPDwgZnVuYyA8PCAiOiBDaGVjayBgIiA8PCBjaGVjaworICAgICAgICAgPDwgIicgZmFpbGVkLiAiOworICB9CisKKyAgTG9nVHlwZSYgR2V0TG9nKCkgeyByZXR1cm4gbG9nXzsgfQorCisgIEJFTkNITUFSS19OT1JFVFVSTiB+Q2hlY2tIYW5kbGVyKCkgQkVOQ0hNQVJLX05PRVhDRVBUX09QKGZhbHNlKSB7CisgICAgbG9nXyA8PCBzdGQ6OmVuZGw7CisgICAgQ2FsbEFib3J0SGFuZGxlcigpOworICB9CisKKyAgQ2hlY2tIYW5kbGVyJiBvcGVyYXRvcj0oY29uc3QgQ2hlY2tIYW5kbGVyJikgPSBkZWxldGU7CisgIENoZWNrSGFuZGxlcihjb25zdCBDaGVja0hhbmRsZXImKSA9IGRlbGV0ZTsKKyAgQ2hlY2tIYW5kbGVyKCkgPSBkZWxldGU7CisKKyBwcml2YXRlOgorICBMb2dUeXBlJiBsb2dfOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworLy8gVGhlIENIRUNLIG1hY3JvIHJldHVybnMgYSBzdGQ6Om9zdHJlYW0gb2JqZWN0IHRoYXQgY2FuIGhhdmUgZXh0cmEgaW5mb3JtYXRpb24KKy8vIHdyaXR0ZW4gdG8gaXQuCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBDSEVDSyhiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChiID8gOjpiZW5jaG1hcms6OmludGVybmFsOjpHZXROdWxsTG9nSW5zdGFuY2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkNoZWNrSGFuZGxlcigjYiwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXykgXAorICAgICAgICAgICAuR2V0TG9nKCkpCisjZWxzZQorI2RlZmluZSBDSEVDSyhiKSA6OmJlbmNobWFyazo6aW50ZXJuYWw6OkdldE51bGxMb2dJbnN0YW5jZSgpCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19FUShhLCBiKSBDSEVDSygoYSkgPT0gKGIpKQorI2RlZmluZSBDSEVDS19ORShhLCBiKSBDSEVDSygoYSkgIT0gKGIpKQorI2RlZmluZSBDSEVDS19HRShhLCBiKSBDSEVDSygoYSkgPj0gKGIpKQorI2RlZmluZSBDSEVDS19MRShhLCBiKSBDSEVDSygoYSkgPD0gKGIpKQorI2RlZmluZSBDSEVDS19HVChhLCBiKSBDSEVDSygoYSkgPiAoYikpCisjZGVmaW5lIENIRUNLX0xUKGEsIGIpIENIRUNLKChhKSA8IChiKSkKKworI2RlZmluZSBDSEVDS19GTE9BVF9FUShhLCBiLCBlcHMpIENIRUNLKHN0ZDo6ZmFicygoYSkgLSAoYikpIDwgIChlcHMpKQorI2RlZmluZSBDSEVDS19GTE9BVF9ORShhLCBiLCBlcHMpIENIRUNLKHN0ZDo6ZmFicygoYSkgLSAoYikpID49IChlcHMpKQorI2RlZmluZSBDSEVDS19GTE9BVF9HRShhLCBiLCBlcHMpIENIRUNLKChhKSAtIChiKSA+IC0oZXBzKSkKKyNkZWZpbmUgQ0hFQ0tfRkxPQVRfTEUoYSwgYiwgZXBzKSBDSEVDSygoYikgLSAoYSkgPiAtKGVwcykpCisjZGVmaW5lIENIRUNLX0ZMT0FUX0dUKGEsIGIsIGVwcykgQ0hFQ0soKGEpIC0gKGIpID4gIChlcHMpKQorI2RlZmluZSBDSEVDS19GTE9BVF9MVChhLCBiLCBlcHMpIENIRUNLKChiKSAtIChhKSA+ICAoZXBzKSkKKworI2VuZGlmICAvLyBDSEVDS19IXwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29sb3JwcmludC5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlYzRhOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuY2MKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKyNpZmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworI2luY2x1ZGUgPFdpbmRvd3MuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX09TX1dJTkRPV1MKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCit0eXBlZGVmIFdPUkQgUGxhdGZvcm1Db2xvckNvZGU7CisjZWxzZQordHlwZWRlZiBjb25zdCBjaGFyKiBQbGF0Zm9ybUNvbG9yQ29kZTsKKyNlbmRpZgorCitQbGF0Zm9ybUNvbG9yQ29kZSBHZXRQbGF0Zm9ybUNvbG9yQ29kZShMb2dDb2xvciBjb2xvcikgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisgIHN3aXRjaCAoY29sb3IpIHsKKyAgICBjYXNlIENPTE9SX1JFRDoKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX1JFRDsKKyAgICBjYXNlIENPTE9SX0dSRUVOOgorICAgICAgcmV0dXJuIEZPUkVHUk9VTkRfR1JFRU47CisgICAgY2FzZSBDT0xPUl9ZRUxMT1c6CisgICAgICByZXR1cm4gRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfQkxVRToKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX0JMVUU7CisgICAgY2FzZSBDT0xPUl9NQUdFTlRBOgorICAgICAgcmV0dXJuIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfUkVEOworICAgIGNhc2UgQ09MT1JfQ1lBTjoKKyAgICAgIHJldHVybiBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0dSRUVOOworICAgIGNhc2UgQ09MT1JfV0hJVEU6ICAvLyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdAorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorI2Vsc2UKKyAgc3dpdGNoIChjb2xvcikgeworICAgIGNhc2UgQ09MT1JfUkVEOgorICAgICAgcmV0dXJuICIxIjsKKyAgICBjYXNlIENPTE9SX0dSRUVOOgorICAgICAgcmV0dXJuICIyIjsKKyAgICBjYXNlIENPTE9SX1lFTExPVzoKKyAgICAgIHJldHVybiAiMyI7CisgICAgY2FzZSBDT0xPUl9CTFVFOgorICAgICAgcmV0dXJuICI0IjsKKyAgICBjYXNlIENPTE9SX01BR0VOVEE6CisgICAgICByZXR1cm4gIjUiOworICAgIGNhc2UgQ09MT1JfQ1lBTjoKKyAgICAgIHJldHVybiAiNiI7CisgICAgY2FzZSBDT0xPUl9XSElURToKKyAgICAgIHJldHVybiAiNyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9OworI2VuZGlmCit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgdmFfbGlzdCBhcmdzKSB7CisgIC8vIHdlIG1pZ2h0IG5lZWQgYSBzZWNvbmQgc2hvdCBhdCB0aGlzLCBzbyBwcmUtZW1wdGl2bHkgbWFrZSBhIGNvcHkKKyAgdmFfbGlzdCBhcmdzX2NwOworICB2YV9jb3B5KGFyZ3NfY3AsIGFyZ3MpOworCisgIHN0ZDo6c2l6ZV90IHNpemUgPSAyNTY7CisgIGNoYXIgbG9jYWxfYnVmZlsyNTZdOworICBhdXRvIHJldCA9IHZzbnByaW50Zihsb2NhbF9idWZmLCBzaXplLCBtc2csIGFyZ3NfY3ApOworCisgIHZhX2VuZChhcmdzX2NwKTsKKworICAvLyBjdXJyZW50bHkgdGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgZm9yIGZhaWx1cmUsIHNvIHRoaXMgaXMgaGFjay4KKyAgQ0hFQ0socmV0ID49IDApOworCisgIGlmIChyZXQgPT0gMCkgIC8vIGhhbmRsZSBlbXB0eSBleHBhbnNpb24KKyAgICByZXR1cm4ge307CisgIGVsc2UgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IHNpemUpCisgICAgcmV0dXJuIGxvY2FsX2J1ZmY7CisgIGVsc2UgeworICAgIC8vIHdlIGRpZCBub3QgcHJvdmlkZSBhIGxvbmcgZW5vdWdoIGJ1ZmZlciBvbiBvdXIgZmlyc3QgYXR0ZW1wdC4KKyAgICBzaXplID0gKHNpemVfdClyZXQgKyAxOyAgLy8gKyAxIGZvciB0aGUgbnVsbCBieXRlCisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gYnVmZihuZXcgY2hhcltzaXplXSk7CisgICAgcmV0ID0gdnNucHJpbnRmKGJ1ZmYuZ2V0KCksIHNpemUsIG1zZywgYXJncyk7CisgICAgQ0hFQ0socmV0ID4gMCAmJiAoKHNpemVfdClyZXQpIDwgc2l6ZSk7CisgICAgcmV0dXJuIGJ1ZmYuZ2V0KCk7CisgIH0KK30KKworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgbXNnKTsKKyAgYXV0byB0bXAgPSBGb3JtYXRTdHJpbmcobXNnLCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICByZXR1cm4gdG1wOworfQorCit2b2lkIENvbG9yUHJpbnRmKHN0ZDo6b3N0cmVhbSYgb3V0LCBMb2dDb2xvciBjb2xvciwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICBDb2xvclByaW50ZihvdXQsIGNvbG9yLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgQ29sb3JQcmludGYoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgeworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisgICgodm9pZClvdXQpOyAgLy8gc3VwcHJlc3MgdW51c2VkIHdhcm5pbmcKKworICBjb25zdCBIQU5ETEUgc3Rkb3V0X2hhbmRsZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisKKyAgLy8gR2V0cyB0aGUgY3VycmVudCB0ZXh0IGNvbG9yLgorICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBidWZmZXJfaW5mbzsKKyAgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3Rkb3V0X2hhbmRsZSwgJmJ1ZmZlcl9pbmZvKTsKKyAgY29uc3QgV09SRCBvbGRfY29sb3JfYXR0cnMgPSBidWZmZXJfaW5mby53QXR0cmlidXRlczsKKworICAvLyBXZSBuZWVkIHRvIGZsdXNoIHRoZSBzdHJlYW0gYnVmZmVycyBpbnRvIHRoZSBjb25zb2xlIGJlZm9yZSBlYWNoCisgIC8vIFNldENvbnNvbGVUZXh0QXR0cmlidXRlIGNhbGwgbGVzdCBpdCBhZmZlY3QgdGhlIHRleHQgdGhhdCBpcyBhbHJlYWR5CisgIC8vIHByaW50ZWQgYnV0IGhhcyBub3QgeWV0IHJlYWNoZWQgdGhlIGNvbnNvbGUuCisgIGZmbHVzaChzdGRvdXQpOworICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdGRvdXRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQbGF0Zm9ybUNvbG9yQ29kZShjb2xvcikgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKworICBmZmx1c2goc3Rkb3V0KTsKKyAgLy8gUmVzdG9yZXMgdGhlIHRleHQgY29sb3IuCisgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0ZG91dF9oYW5kbGUsIG9sZF9jb2xvcl9hdHRycyk7CisjZWxzZQorICBjb25zdCBjaGFyKiBjb2xvcl9jb2RlID0gR2V0UGxhdGZvcm1Db2xvckNvZGUoY29sb3IpOworICBpZiAoY29sb3JfY29kZSkgb3V0IDw8IEZvcm1hdFN0cmluZygiXDAzM1swOzMlc20iLCBjb2xvcl9jb2RlKTsKKyAgb3V0IDw8IEZvcm1hdFN0cmluZyhmbXQsIGFyZ3MpIDw8ICJcMDMzW20iOworI2VuZGlmCit9CisKK2Jvb2wgSXNDb2xvclRlcm1pbmFsKCkgeworI2lmIEJFTkNITUFSS19PU19XSU5ET1dTCisgIC8vIE9uIFdpbmRvd3MgdGhlIFRFUk0gdmFyaWFibGUgaXMgdXN1YWxseSBub3Qgc2V0LCBidXQgdGhlCisgIC8vIGNvbnNvbGUgdGhlcmUgZG9lcyBzdXBwb3J0IGNvbG9ycy4KKyAgcmV0dXJuIDAgIT0gX2lzYXR0eShfZmlsZW5vKHN0ZG91dCkpOworI2Vsc2UKKyAgLy8gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB3ZSByZWx5IG9uIHRoZSBURVJNIHZhcmlhYmxlLiBUaGlzIGxpc3Qgb2YKKyAgLy8gc3VwcG9ydGVkIFRFUk0gdmFsdWVzIGlzIGNvcGllZCBmcm9tIEdvb2dsZSBUZXN0OgorICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGV0ZXN0L2Jsb2IvbWFzdGVyL2dvb2dsZXRlc3Qvc3JjL2d0ZXN0LmNjI0wyOTI1Pi4KKyAgY29uc3QgY2hhciogY29uc3QgU1VQUE9SVEVEX1RFUk1fVkFMVUVTW10gPSB7CisgICAgICAieHRlcm0iLCAgICAgICAgICJ4dGVybS1jb2xvciIsICAgICAieHRlcm0tMjU2Y29sb3IiLAorICAgICAgInNjcmVlbiIsICAgICAgICAic2NyZWVuLTI1NmNvbG9yIiwgInRtdXgiLAorICAgICAgInRtdXgtMjU2Y29sb3IiLCAicnh2dC11bmljb2RlIiwgICAgInJ4dnQtdW5pY29kZS0yNTZjb2xvciIsCisgICAgICAibGludXgiLCAgICAgICAgICJjeWd3aW4iLAorICB9OworCisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlcm0gPSBnZXRlbnYoIlRFUk0iKTsKKworICBib29sIHRlcm1fc3VwcG9ydHNfY29sb3IgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBjaGFyKiBjYW5kaWRhdGUgOiBTVVBQT1JURURfVEVSTV9WQUxVRVMpIHsKKyAgICBpZiAodGVybSAmJiAwID09IHN0cmNtcCh0ZXJtLCBjYW5kaWRhdGUpKSB7CisgICAgICB0ZXJtX3N1cHBvcnRzX2NvbG9yID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAwICE9IGlzYXR0eShmaWxlbm8oc3Rkb3V0KSkgJiYgdGVybV9zdXBwb3J0c19jb2xvcjsKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX09TX1dJTkRPV1MKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbG9ycHJpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZmYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29sb3JwcmludC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgQkVOQ0hNQVJLX0NPTE9SUFJJTlRfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0NPTE9SUFJJTlRfSF8KKworI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK2VudW0gTG9nQ29sb3IgeworICBDT0xPUl9ERUZBVUxULAorICBDT0xPUl9SRUQsCisgIENPTE9SX0dSRUVOLAorICBDT0xPUl9ZRUxMT1csCisgIENPTE9SX0JMVUUsCisgIENPTE9SX01BR0VOVEEsCisgIENPTE9SX0NZQU4sCisgIENPTE9SX1dISVRFCit9OworCitzdGQ6OnN0cmluZyBGb3JtYXRTdHJpbmcoY29uc3QgY2hhciogbXNnLCB2YV9saXN0IGFyZ3MpOworc3RkOjpzdHJpbmcgRm9ybWF0U3RyaW5nKGNvbnN0IGNoYXIqIG1zZywgLi4uKTsKKwordm9pZCBDb2xvclByaW50ZihzdGQ6Om9zdHJlYW0mIG91dCwgTG9nQ29sb3IgY29sb3IsIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKK3ZvaWQgQ29sb3JQcmludGYoc3RkOjpvc3RyZWFtJiBvdXQsIExvZ0NvbG9yIGNvbG9yLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBzdGRvdXQgYXBwZWFycyB0byBiZSBhIHRlcm1pbmFsIHRoYXQgc3VwcG9ydHMgY29sb3JlZAorLy8gb3V0cHV0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIElzQ29sb3JUZXJtaW5hbCgpOworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DT0xPUlBSSU5UX0hfCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jb21tYW5kbGluZWZsYWdzLmNjIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM5MjUxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5jYwpAQCAtMCwwICsxLDIxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvbW1hbmRsaW5lZmxhZ3MuaCIKKworI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMKKy8vIHRoZSByZXN1bHQgdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlCisvLyB1bmNoYW5nZWQgYW5kIHJldHVybnMgZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIGludDMyX3QqIHZhbHVlKSB7CisgIC8vIFBhcnNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBkZWNpbWFsIGludGVnZXIuCisgIGNoYXIqIGVuZCA9IG51bGxwdHI7CisgIGNvbnN0IGxvbmcgbG9uZ192YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDEwKTsgIC8vIE5PTElOVAorCisgIC8vIEhhcyBzdHJ0b2woKSBjb25zdW1lZCBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nPworICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgLy8gTm8gLSBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgZW5jb3VudGVyZWQuCisgICAgc3RkOjpjZXJyIDw8IHNyY190ZXh0IDw8ICIgaXMgZXhwZWN0ZWQgdG8gYmUgYSAzMi1iaXQgaW50ZWdlciwgIgorICAgICAgICAgICAgICA8PCAiYnV0IGFjdHVhbGx5IGhhcyB2YWx1ZSBcIiIgPDwgc3RyIDw8ICJcIi5cbiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSXMgdGhlIHBhcnNlZCB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgYW4gSW50MzI/CisgIGNvbnN0IGludDMyX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obG9uZ192YWx1ZSk7CisgIGlmIChsb25nX3ZhbHVlID09IHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZz46Om1heCgpIHx8CisgICAgICBsb25nX3ZhbHVlID09IHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZz46Om1pbigpIHx8CisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhIGxvbmcuICAoc3RydG9sKCkgcmV0dXJucworICAgICAgLy8gTE9OR19NQVggb3IgTE9OR19NSU4gd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzLikKKyAgICAgIHJlc3VsdCAhPSBsb25nX3ZhbHVlCisgICAgICAvLyBUaGUgcGFyc2VkIHZhbHVlIG92ZXJmbG93cyBhcyBhbiBJbnQzMi4KKyAgICAgICkgeworICAgIHN0ZDo6Y2VyciA8PCBzcmNfdGV4dCA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgMzItYml0IGludGVnZXIsICIKKyAgICAgICAgICAgICAgPDwgImJ1dCBhY3R1YWxseSBoYXMgdmFsdWUgXCIiIDw8IHN0ciA8PCAiXCIsICIKKyAgICAgICAgICAgICAgPDwgIndoaWNoIG92ZXJmbG93cy5cbiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnZhbHVlID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyc2VzICdzdHInIGZvciBhIGRvdWJsZS4gIElmIHN1Y2Nlc3NmdWwsIHdyaXRlcyB0aGUgcmVzdWx0IHRvICp2YWx1ZSBhbmQKKy8vIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIGxlYXZlcyAqdmFsdWUgdW5jaGFuZ2VkIGFuZCByZXR1cm5zIGZhbHNlLgorYm9vbCBQYXJzZURvdWJsZShjb25zdCBzdGQ6OnN0cmluZyYgc3JjX3RleHQsIGNvbnN0IGNoYXIqIHN0ciwgZG91YmxlKiB2YWx1ZSkgeworICAvLyBQYXJzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLgorICBjaGFyKiBlbmQgPSBudWxscHRyOworICBjb25zdCBkb3VibGUgZG91YmxlX3ZhbHVlID0gc3RydG9kKHN0ciwgJmVuZCk7ICAvLyBOT0xJTlQKKworICAvLyBIYXMgc3RydG9sKCkgY29uc3VtZWQgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZz8KKyAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgIC8vIE5vIC0gYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIGVuY291bnRlcmVkLgorICAgIHN0ZDo6Y2VyciA8PCBzcmNfdGV4dCA8PCAiIGlzIGV4cGVjdGVkIHRvIGJlIGEgZG91YmxlLCAiCisgICAgICAgICAgICAgIDw8ICJidXQgYWN0dWFsbHkgaGFzIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiLlxuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqdmFsdWUgPSBkb3VibGVfdmFsdWU7CisgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gZ2l2ZW4gZmxhZy4gIEZvciBleGFtcGxlLCBGbGFnVG9FbnZWYXIoImZvbyIpIHdpbGwgcmV0dXJuCisvLyAiQkVOQ0hNQVJLX0ZPTyIgaW4gdGhlIG9wZW4tc291cmNlIHZlcnNpb24uCitzdGF0aWMgc3RkOjpzdHJpbmcgRmxhZ1RvRW52VmFyKGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZmxhZ19zdHIoZmxhZyk7CisKKyAgc3RkOjpzdHJpbmcgZW52X3ZhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gZmxhZ19zdHIubGVuZ3RoKCk7ICsraSkKKyAgICBlbnZfdmFyICs9IHN0YXRpY19jYXN0PGNoYXI+KDo6dG91cHBlcihmbGFnX3N0ci5jX3N0cigpW2ldKSk7CisKKyAgcmV0dXJuICJCRU5DSE1BUktfIiArIGVudl92YXI7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIHRoZSBCb29sZWFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8KKy8vIHRoZSBnaXZlbiBmbGFnOyBpZiBpdCdzIG5vdCBzZXQsIHJldHVybnMgZGVmYXVsdF92YWx1ZS4KKy8vCisvLyBUaGUgdmFsdWUgaXMgY29uc2lkZXJlZCB0cnVlIGlmZiBpdCdzIG5vdCAiMCIuCitib29sIEJvb2xGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWx1ZSkgeworICBjb25zdCBzdGQ6OnN0cmluZyBlbnZfdmFyID0gRmxhZ1RvRW52VmFyKGZsYWcpOworICBjb25zdCBjaGFyKiBjb25zdCBzdHJpbmdfdmFsdWUgPSBnZXRlbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgcmV0dXJuIHN0cmluZ192YWx1ZSA9PSBudWxscHRyID8gZGVmYXVsdF92YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdHJjbXAoc3RyaW5nX3ZhbHVlLCAiMCIpICE9IDA7Cit9CisKKy8vIFJlYWRzIGFuZCByZXR1cm5zIGEgMzItYml0IGludGVnZXIgc3RvcmVkIGluIHRoZSBlbnZpcm9ubWVudAorLy8gdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQgaXNuJ3Qgc2V0IG9yCisvLyBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIDMyLWJpdCBpbnRlZ2VyLCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitpbnQzMl90IEludDMyRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBpbnQzMl90IGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3Qgc3RyaW5nX3ZhbHVlID0gZ2V0ZW52KGVudl92YXIuY19zdHIoKSk7CisgIGlmIChzdHJpbmdfdmFsdWUgPT0gbnVsbHB0cikgeworICAgIC8vIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgaW50MzJfdCByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOworICBpZiAoIVBhcnNlSW50MzIoc3RkOjpzdHJpbmcoIkVudmlyb25tZW50IHZhcmlhYmxlICIpICsgZW52X3Zhciwgc3RyaW5nX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpIHsKKyAgICBzdGQ6OmNvdXQgPDwgIlRoZSBkZWZhdWx0IHZhbHVlICIgPDwgZGVmYXVsdF92YWx1ZSA8PCAiIGlzIHVzZWQuXG4iOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgYW5kIHJldHVybnMgdGhlIHN0cmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb3JyZXNwb25kaW5nIHRvCisvLyB0aGUgZ2l2ZW4gZmxhZzsgaWYgaXQncyBub3Qgc2V0LCByZXR1cm5zIGRlZmF1bHRfdmFsdWUuCitjb25zdCBjaGFyKiBTdHJpbmdGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW52X3ZhciA9IEZsYWdUb0VudlZhcihmbGFnKTsKKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWUgPSBnZXRlbnYoZW52X3Zhci5jX3N0cigpKTsKKyAgcmV0dXJuIHZhbHVlID09IG51bGxwdHIgPyBkZWZhdWx0X3ZhbHVlIDogdmFsdWU7Cit9CisKKy8vIFBhcnNlcyBhIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBmbGFnLiAgVGhlIHN0cmluZyBzaG91bGQgaGF2ZQorLy8gdGhlIGZvcm1hdCAiLS1mbGFnPXZhbHVlIi4gIFdoZW4gZGVmX29wdGlvbmFsIGlzIHRydWUsIHRoZSAiPXZhbHVlIgorLy8gcGFydCBjYW4gYmUgb21pdHRlZC4KKy8vCisvLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZywgb3IgbnVsbHB0ciBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCitjb25zdCBjaGFyKiBQYXJzZUZsYWdWYWx1ZShjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZl9vcHRpb25hbCkgeworICAvLyBzdHIgYW5kIGZsYWcgbXVzdCBub3QgYmUgbnVsbHB0ci4KKyAgaWYgKHN0ciA9PSBudWxscHRyIHx8IGZsYWcgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gVGhlIGZsYWcgbXVzdCBzdGFydCB3aXRoICItLSIuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZsYWdfc3RyID0gc3RkOjpzdHJpbmcoIi0tIikgKyBzdGQ6OnN0cmluZyhmbGFnKTsKKyAgY29uc3Qgc2l6ZV90IGZsYWdfbGVuID0gZmxhZ19zdHIubGVuZ3RoKCk7CisgIGlmIChzdHJuY21wKHN0ciwgZmxhZ19zdHIuY19zdHIoKSwgZmxhZ19sZW4pICE9IDApIHJldHVybiBudWxscHRyOworCisgIC8vIFNraXBzIHRoZSBmbGFnIG5hbWUuCisgIGNvbnN0IGNoYXIqIGZsYWdfZW5kID0gc3RyICsgZmxhZ19sZW47CisKKyAgLy8gV2hlbiBkZWZfb3B0aW9uYWwgaXMgdHJ1ZSwgaXQncyBPSyB0byBub3QgaGF2ZSBhICI9dmFsdWUiIHBhcnQuCisgIGlmIChkZWZfb3B0aW9uYWwgJiYgKGZsYWdfZW5kWzBdID09ICdcMCcpKSByZXR1cm4gZmxhZ19lbmQ7CisKKyAgLy8gSWYgZGVmX29wdGlvbmFsIGlzIHRydWUgYW5kIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlCisgIC8vIGZsYWcgbmFtZSwgb3IgaWYgZGVmX29wdGlvbmFsIGlzIGZhbHNlLCB0aGVyZSBtdXN0IGJlIGEgJz0nIGFmdGVyCisgIC8vIHRoZSBmbGFnIG5hbWUuCisgIGlmIChmbGFnX2VuZFswXSAhPSAnPScpIHJldHVybiBudWxscHRyOworCisgIC8vIFJldHVybnMgdGhlIHN0cmluZyBhZnRlciAiPSIuCisgIHJldHVybiBmbGFnX2VuZCArIDE7Cit9CisKK2Jvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpOworCisgIC8vIEFib3J0cyBpZiB0aGUgcGFyc2luZyBmYWlsZWQuCisgIGlmICh2YWx1ZV9zdHIgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgIC8vIENvbnZlcnRzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYSBib29sLgorICAqdmFsdWUgPSBJc1RydXRoeUZsYWdWYWx1ZSh2YWx1ZV9zdHIpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZUludDMyRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGludDMyX3QqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAvLyBTZXRzICp2YWx1ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGZsYWcuCisgIHJldHVybiBQYXJzZUludDMyKHN0ZDo6c3RyaW5nKCJUaGUgdmFsdWUgb2YgZmxhZyAtLSIpICsgZmxhZywgdmFsdWVfc3RyLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Cit9CisKK2Jvb2wgUGFyc2VEb3VibGVGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgZG91YmxlKiB2YWx1ZSkgeworICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBhcyBhIHN0cmluZy4KKyAgY29uc3QgY2hhciogY29uc3QgdmFsdWVfc3RyID0gUGFyc2VGbGFnVmFsdWUoc3RyLCBmbGFnLCBmYWxzZSk7CisKKyAgLy8gQWJvcnRzIGlmIHRoZSBwYXJzaW5nIGZhaWxlZC4KKyAgaWYgKHZhbHVlX3N0ciA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0cyAqdmFsdWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBmbGFnLgorICByZXR1cm4gUGFyc2VEb3VibGUoc3RkOjpzdHJpbmcoIlRoZSB2YWx1ZSBvZiBmbGFnIC0tIikgKyBmbGFnLCB2YWx1ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Cit9CisKK2Jvb2wgUGFyc2VTdHJpbmdGbGFnKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciogZmxhZywgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIC8vIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGFzIGEgc3RyaW5nLgorICBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZV9zdHIgPSBQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIGZhbHNlKTsKKworICAvLyBBYm9ydHMgaWYgdGhlIHBhcnNpbmcgZmFpbGVkLgorICBpZiAodmFsdWVfc3RyID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAqdmFsdWUgPSB2YWx1ZV9zdHI7CisgIHJldHVybiB0cnVlOworfQorCitib29sIElzRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcpIHsKKyAgcmV0dXJuIChQYXJzZUZsYWdWYWx1ZShzdHIsIGZsYWcsIHRydWUpICE9IG51bGxwdHIpOworfQorCitib29sIElzVHJ1dGh5RmxhZ1ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpZiAodmFsdWUuZW1wdHkoKSkgcmV0dXJuIHRydWU7CisgIGNoYXIgY2ggPSB2YWx1ZVswXTsKKyAgcmV0dXJuIGlzYWxudW0oY2gpICYmCisgICAgICAgICAhKGNoID09ICcwJyB8fCBjaCA9PSAnZicgfHwgY2ggPT0gJ0YnIHx8IGNoID09ICduJyB8fCBjaCA9PSAnTicpOworfQorfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbW1hbmRsaW5lZmxhZ3MuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbW1hbmRsaW5lZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVjOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tbWFuZGxpbmVmbGFncy5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpZm5kZWYgQkVOQ0hNQVJLX0NPTU1BTkRMSU5FRkxBR1NfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0NPTU1BTkRMSU5FRkxBR1NfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBNYWNybyBmb3IgcmVmZXJlbmNpbmcgZmxhZ3MuCisjZGVmaW5lIEZMQUcobmFtZSkgRkxBR1NfIyNuYW1lCisKKy8vIE1hY3JvcyBmb3IgZGVjbGFyaW5nIGZsYWdzLgorI2RlZmluZSBERUNMQVJFX2Jvb2wobmFtZSkgZXh0ZXJuIGJvb2wgRkxBRyhuYW1lKQorI2RlZmluZSBERUNMQVJFX2ludDMyKG5hbWUpIGV4dGVybiBpbnQzMl90IEZMQUcobmFtZSkKKyNkZWZpbmUgREVDTEFSRV9pbnQ2NChuYW1lKSBleHRlcm4gaW50NjRfdCBGTEFHKG5hbWUpCisjZGVmaW5lIERFQ0xBUkVfZG91YmxlKG5hbWUpIGV4dGVybiBkb3VibGUgRkxBRyhuYW1lKQorI2RlZmluZSBERUNMQVJFX3N0cmluZyhuYW1lKSBleHRlcm4gc3RkOjpzdHJpbmcgRkxBRyhuYW1lKQorCisvLyBNYWNyb3MgZm9yIGRlZmluaW5nIGZsYWdzLgorI2RlZmluZSBERUZJTkVfYm9vbChuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBib29sIEZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIERFRklORV9pbnQzMihuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBpbnQzMl90IEZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIERFRklORV9pbnQ2NChuYW1lLCBkZWZhdWx0X3ZhbCwgZG9jKSBpbnQ2NF90IEZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIERFRklORV9kb3VibGUobmFtZSwgZGVmYXVsdF92YWwsIGRvYykgZG91YmxlIEZMQUcobmFtZSkgPSAoZGVmYXVsdF92YWwpCisjZGVmaW5lIERFRklORV9zdHJpbmcobmFtZSwgZGVmYXVsdF92YWwsIGRvYykgXAorICBzdGQ6OnN0cmluZyBGTEFHKG5hbWUpID0gKGRlZmF1bHRfdmFsKQorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKy8vIFBhcnNlcyAnc3RyJyBmb3IgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuICBJZiBzdWNjZXNzZnVsLCB3cml0ZXMgdGhlIHJlc3VsdAorLy8gdG8gKnZhbHVlIGFuZCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSBsZWF2ZXMgKnZhbHVlIHVuY2hhbmdlZCBhbmQgcmV0dXJucworLy8gZmFsc2UuCitib29sIFBhcnNlSW50MzIoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY190ZXh0LCBjb25zdCBjaGFyKiBzdHIsIGludDMyX3QqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgYm9vbC9JbnQzMi9zdHJpbmcgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEdvb2dsZSBUZXN0IGZsYWcuCitib29sIEJvb2xGcm9tRW52KGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wgZGVmYXVsdF92YWwpOworaW50MzJfdCBJbnQzMkZyb21FbnYoY29uc3QgY2hhciogZmxhZywgaW50MzJfdCBkZWZhdWx0X3ZhbCk7Citkb3VibGUgRG91YmxlRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBkb3VibGUgZGVmYXVsdF92YWwpOworY29uc3QgY2hhciogU3RyaW5nRnJvbUVudihjb25zdCBjaGFyKiBmbGFnLCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbCk7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBib29sIGZsYWcsIGluIHRoZSBmb3JtIG9mIGVpdGhlcgorLy8gIi0tZmxhZz12YWx1ZSIgb3IgIi0tZmxhZyIuCisvLworLy8gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdmFsdWUgaXMgdGFrZW4gYXMgdHJ1ZSBpZiBpdCBwYXNzZXMgSXNUcnV0aHlWYWx1ZSgpLgorLy8KKy8vIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHZhbHVlIGlzIHRha2VuIGFzIHRydWUuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VCb29sRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGJvb2wqIHZhbHVlKTsKKworLy8gUGFyc2VzIGEgc3RyaW5nIGZvciBhbiBJbnQzMiBmbGFnLCBpbiB0aGUgZm9ybSBvZgorLy8gIi0tZmxhZz12YWx1ZSIuCisvLworLy8gT24gc3VjY2Vzcywgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgZmxhZyBpbiAqdmFsdWUsIGFuZCByZXR1cm5zCisvLyB0cnVlLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSB3aXRob3V0IGNoYW5naW5nICp2YWx1ZS4KK2Jvb2wgUGFyc2VJbnQzMkZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBpbnQzMl90KiB2YWx1ZSk7CisKKy8vIFBhcnNlcyBhIHN0cmluZyBmb3IgYSBEb3VibGUgZmxhZywgaW4gdGhlIGZvcm0gb2YKKy8vICItLWZsYWc9dmFsdWUiLgorLy8KKy8vIE9uIHN1Y2Nlc3MsIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIGZsYWcgaW4gKnZhbHVlLCBhbmQgcmV0dXJucworLy8gdHJ1ZS4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2Ugd2l0aG91dCBjaGFuZ2luZyAqdmFsdWUuCitib29sIFBhcnNlRG91YmxlRmxhZyhjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIGZsYWcsIGRvdWJsZSogdmFsdWUpOworCisvLyBQYXJzZXMgYSBzdHJpbmcgZm9yIGEgc3RyaW5nIGZsYWcsIGluIHRoZSBmb3JtIG9mCisvLyAiLS1mbGFnPXZhbHVlIi4KKy8vCisvLyBPbiBzdWNjZXNzLCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluICp2YWx1ZSwgYW5kIHJldHVybnMKKy8vIHRydWUuICBPbiBmYWlsdXJlLCByZXR1cm5zIGZhbHNlIHdpdGhvdXQgY2hhbmdpbmcgKnZhbHVlLgorYm9vbCBQYXJzZVN0cmluZ0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnLCBzdGQ6OnN0cmluZyogdmFsdWUpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBmbGFnLgorYm9vbCBJc0ZsYWcoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBmbGFnKTsKKworLy8gUmV0dXJucyB0cnVlIHVubGVzcyB2YWx1ZSBzdGFydHMgd2l0aCBvbmUgb2Y6ICcwJywgJ2YnLCAnRicsICduJyBvciAnTicsIG9yCisvLyBzb21lIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLiBBcyBhIHNwZWNpYWwgY2FzZSwgYWxzbyByZXR1cm5zIHRydWUgaWYKKy8vIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCitib29sIElzVHJ1dGh5RmxhZ1ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DT01NQU5ETElORUZMQUdTX0hfCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jb21wbGV4aXR5LmNjIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODgzMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5jYwpAQCAtMCwwICsxLDIyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgSXNtYWVsIEppbWVuZXogTWFydGluZXouIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFNvdXJjZSBwcm9qZWN0IDogaHR0cHM6Ly9naXRodWIuY29tL2lzbWFlbEppbWVuZXovY3BwLmxlYXN0c3EKKy8vIEFkYXB0ZWQgdG8gYmUgdXNlZCB3aXRoIGdvb2dsZSBiZW5jaG1hcmsKKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW50IHNjYWxhYmlsaXR5IGZvcm1zCitCaWdPRnVuYyogRml0dGluZ0N1cnZlKEJpZ08gY29tcGxleGl0eSkgeworICBzd2l0Y2ggKGNvbXBsZXhpdHkpIHsKKyAgICBjYXNlIG9OOgorICAgICAgcmV0dXJuIFtdKGludCBuKSAtPiBkb3VibGUgeyByZXR1cm4gbjsgfTsKKyAgICBjYXNlIG9OU3F1YXJlZDoKKyAgICAgIHJldHVybiBbXShpbnQgbikgLT4gZG91YmxlIHsgcmV0dXJuIHN0ZDo6cG93KG4sIDIpOyB9OworICAgIGNhc2Ugb05DdWJlZDoKKyAgICAgIHJldHVybiBbXShpbnQgbikgLT4gZG91YmxlIHsgcmV0dXJuIHN0ZDo6cG93KG4sIDMpOyB9OworICAgIGNhc2Ugb0xvZ046CisgICAgICByZXR1cm4gW10oaW50IG4pIHsgcmV0dXJuIGxvZzIobik7IH07CisgICAgY2FzZSBvTkxvZ046CisgICAgICByZXR1cm4gW10oaW50IG4pIHsgcmV0dXJuIG4gKiBsb2cyKG4pOyB9OworICAgIGNhc2UgbzE6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBbXShpbnQpIHsgcmV0dXJuIDEuMDsgfTsKKyAgfQorfQorCisvLyBGdW5jdGlvbiB0byByZXR1cm4gYW4gc3RyaW5nIGZvciB0aGUgY2FsY3VsYXRlZCBjb21wbGV4aXR5CitzdGQ6OnN0cmluZyBHZXRCaWdPU3RyaW5nKEJpZ08gY29tcGxleGl0eSkgeworICBzd2l0Y2ggKGNvbXBsZXhpdHkpIHsKKyAgICBjYXNlIG9OOgorICAgICAgcmV0dXJuICJOIjsKKyAgICBjYXNlIG9OU3F1YXJlZDoKKyAgICAgIHJldHVybiAiTl4yIjsKKyAgICBjYXNlIG9OQ3ViZWQ6CisgICAgICByZXR1cm4gIk5eMyI7CisgICAgY2FzZSBvTG9nTjoKKyAgICAgIHJldHVybiAibGdOIjsKKyAgICBjYXNlIG9OTG9nTjoKKyAgICAgIHJldHVybiAiTmxnTiI7CisgICAgY2FzZSBvMToKKyAgICAgIHJldHVybiAiKDEpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJmKE4pIjsKKyAgfQorfQorCisvLyBGaW5kIHRoZSBjb2VmZmljaWVudCBmb3IgdGhlIGhpZ2gtb3JkZXIgdGVybSBpbiB0aGUgcnVubmluZyB0aW1lLCBieQorLy8gbWluaW1pemluZyB0aGUgc3VtIG9mIHNxdWFyZXMgb2YgcmVsYXRpdmUgZXJyb3IsIGZvciB0aGUgZml0dGluZyBjdXJ2ZQorLy8gZ2l2ZW4gYnkgdGhlIGxhbWJkYSBleHByZXNpb24uCisvLyAgIC0gbiAgICAgICAgICAgICA6IFZlY3RvciBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSBiZW5jaG1hcmsgdGVzdHMuCisvLyAgIC0gdGltZSAgICAgICAgICA6IFZlY3RvciBjb250YWluaW5nIHRoZSB0aW1lcyBmb3IgdGhlIGJlbmNobWFyayB0ZXN0cy4KKy8vICAgLSBmaXR0aW5nX2N1cnZlIDogbGFtYmRhIGV4cHJlc2lvbiAoZS5nLiBbXShpbnQgbikge3JldHVybiBuOyB9OykuCisKKy8vIEZvciBhIGRlZXBlciBleHBsYW5hdGlvbiBvbiB0aGUgYWxnb3JpdGhtIGxvZ2ljLCBsb29rIHRoZSBSRUFETUUgZmlsZSBhdAorLy8gaHR0cDovL2dpdGh1Yi5jb20vaXNtYWVsSmltZW5lei9NaW5pbWFsLUNwcC1MZWFzdC1TcXVhcmVkLUZpdAorCitMZWFzdFNxIE1pbmltYWxMZWFzdFNxKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEJpZ09GdW5jKiBmaXR0aW5nX2N1cnZlKSB7CisgIGRvdWJsZSBzaWdtYV9nbiA9IDAuMDsKKyAgZG91YmxlIHNpZ21hX2duX3NxdWFyZWQgPSAwLjA7CisgIGRvdWJsZSBzaWdtYV90aW1lID0gMC4wOworICBkb3VibGUgc2lnbWFfdGltZV9nbiA9IDAuMDsKKworICAvLyBDYWxjdWxhdGUgbGVhc3Qgc3F1YXJlIGZpdHRpbmcgcGFyYW1ldGVyCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbi5zaXplKCk7ICsraSkgeworICAgIGRvdWJsZSBnbl9pID0gZml0dGluZ19jdXJ2ZShuW2ldKTsKKyAgICBzaWdtYV9nbiArPSBnbl9pOworICAgIHNpZ21hX2duX3NxdWFyZWQgKz0gZ25faSAqIGduX2k7CisgICAgc2lnbWFfdGltZSArPSB0aW1lW2ldOworICAgIHNpZ21hX3RpbWVfZ24gKz0gdGltZVtpXSAqIGduX2k7CisgIH0KKworICBMZWFzdFNxIHJlc3VsdDsKKyAgcmVzdWx0LmNvbXBsZXhpdHkgPSBvTGFtYmRhOworCisgIC8vIENhbGN1bGF0ZSBjb21wbGV4aXR5LgorICByZXN1bHQuY29lZiA9IHNpZ21hX3RpbWVfZ24gLyBzaWdtYV9nbl9zcXVhcmVkOworCisgIC8vIENhbGN1bGF0ZSBSTVMKKyAgZG91YmxlIHJtcyA9IDAuMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuLnNpemUoKTsgKytpKSB7CisgICAgZG91YmxlIGZpdCA9IHJlc3VsdC5jb2VmICogZml0dGluZ19jdXJ2ZShuW2ldKTsKKyAgICBybXMgKz0gcG93KCh0aW1lW2ldIC0gZml0KSwgMik7CisgIH0KKworICAvLyBOb3JtYWxpemVkIFJNUyBieSB0aGUgbWVhbiBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWVzCisgIGRvdWJsZSBtZWFuID0gc2lnbWFfdGltZSAvIG4uc2l6ZSgpOworICByZXN1bHQucm1zID0gc3FydChybXMgLyBuLnNpemUoKSkgLyBtZWFuOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEZpbmQgdGhlIGNvZWZmaWNpZW50IGZvciB0aGUgaGlnaC1vcmRlciB0ZXJtIGluIHRoZSBydW5uaW5nIHRpbWUsIGJ5CisvLyBtaW5pbWl6aW5nIHRoZSBzdW0gb2Ygc3F1YXJlcyBvZiByZWxhdGl2ZSBlcnJvci4KKy8vICAgLSBuICAgICAgICAgIDogVmVjdG9yIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlIGJlbmNobWFyayB0ZXN0cy4KKy8vICAgLSB0aW1lICAgICAgIDogVmVjdG9yIGNvbnRhaW5pbmcgdGhlIHRpbWVzIGZvciB0aGUgYmVuY2htYXJrIHRlc3RzLgorLy8gICAtIGNvbXBsZXhpdHkgOiBJZiBkaWZmZXJlbnQgdGhhbiBvQXV0bywgdGhlIGZpdHRpbmcgY3VydmUgd2lsbCBzdGljayB0bworLy8gICAgICAgICAgICAgICAgICB0aGlzIG9uZS4gSWYgaXQgaXMgb0F1dG8sIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCB0aGUgYmVzdAorLy8gICAgICAgICAgICAgICAgICBmaXR0aW5nIGN1cnZlLgorTGVhc3RTcSBNaW5pbWFsTGVhc3RTcShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB0aW1lLCBjb25zdCBCaWdPIGNvbXBsZXhpdHkpIHsKKyAgQ0hFQ0tfRVEobi5zaXplKCksIHRpbWUuc2l6ZSgpKTsKKyAgQ0hFQ0tfR0Uobi5zaXplKCksIDIpOyAgLy8gRG8gbm90IGNvbXB1dGUgZml0dGluZyBjdXJ2ZSBpcyBsZXNzIHRoYW4gdHdvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbmNobWFyayBydW5zIGFyZSBnaXZlbgorICBDSEVDS19ORShjb21wbGV4aXR5LCBvTm9uZSk7CisKKyAgTGVhc3RTcSBiZXN0X2ZpdDsKKworICBpZiAoY29tcGxleGl0eSA9PSBvQXV0bykgeworICAgIHN0ZDo6dmVjdG9yPEJpZ08+IGZpdF9jdXJ2ZXMgPSB7b0xvZ04sIG9OLCBvTkxvZ04sIG9OU3F1YXJlZCwgb05DdWJlZH07CisKKyAgICAvLyBUYWtlIG8xIGFzIGRlZmF1bHQgYmVzdCBmaXR0aW5nIGN1cnZlCisgICAgYmVzdF9maXQgPSBNaW5pbWFsTGVhc3RTcShuLCB0aW1lLCBGaXR0aW5nQ3VydmUobzEpKTsKKyAgICBiZXN0X2ZpdC5jb21wbGV4aXR5ID0gbzE7CisKKyAgICAvLyBDb21wdXRlIGFsbCBwb3NzaWJsZSBmaXR0aW5nIGN1cnZlcyBhbmQgc3RpY2sgdG8gdGhlIGJlc3Qgb25lCisgICAgZm9yIChjb25zdCBhdXRvJiBmaXQgOiBmaXRfY3VydmVzKSB7CisgICAgICBMZWFzdFNxIGN1cnJlbnRfZml0ID0gTWluaW1hbExlYXN0U3EobiwgdGltZSwgRml0dGluZ0N1cnZlKGZpdCkpOworICAgICAgaWYgKGN1cnJlbnRfZml0LnJtcyA8IGJlc3RfZml0LnJtcykgeworICAgICAgICBiZXN0X2ZpdCA9IGN1cnJlbnRfZml0OworICAgICAgICBiZXN0X2ZpdC5jb21wbGV4aXR5ID0gZml0OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBiZXN0X2ZpdCA9IE1pbmltYWxMZWFzdFNxKG4sIHRpbWUsIEZpdHRpbmdDdXJ2ZShjb21wbGV4aXR5KSk7CisgICAgYmVzdF9maXQuY29tcGxleGl0eSA9IGNvbXBsZXhpdHk7CisgIH0KKworICByZXR1cm4gYmVzdF9maXQ7Cit9CisKK3N0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+IENvbXB1dGVCaWdPKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKSB7CisgIHR5cGVkZWYgQmVuY2htYXJrUmVwb3J0ZXI6OlJ1biBSdW47CisgIHN0ZDo6dmVjdG9yPFJ1bj4gcmVzdWx0czsKKworICBpZiAocmVwb3J0cy5zaXplKCkgPCAyKSByZXR1cm4gcmVzdWx0czsKKworICAvLyBBY2N1bXVsYXRvcnMuCisgIHN0ZDo6dmVjdG9yPGludD4gbjsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZWFsX3RpbWU7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY3B1X3RpbWU7CisKKyAgLy8gUG9wdWxhdGUgdGhlIGFjY3VtdWxhdG9ycy4KKyAgZm9yIChjb25zdCBSdW4mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICBDSEVDS19HVChydW4uY29tcGxleGl0eV9uLCAwKSA8PCAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBTZXRDb21wbGV4aXR5Tj8iOworICAgIG4ucHVzaF9iYWNrKHJ1bi5jb21wbGV4aXR5X24pOworICAgIHJlYWxfdGltZS5wdXNoX2JhY2socnVuLnJlYWxfYWNjdW11bGF0ZWRfdGltZSAvIHJ1bi5pdGVyYXRpb25zKTsKKyAgICBjcHVfdGltZS5wdXNoX2JhY2socnVuLmNwdV9hY2N1bXVsYXRlZF90aW1lIC8gcnVuLml0ZXJhdGlvbnMpOworICB9CisKKyAgTGVhc3RTcSByZXN1bHRfY3B1OworICBMZWFzdFNxIHJlc3VsdF9yZWFsOworCisgIGlmIChyZXBvcnRzWzBdLmNvbXBsZXhpdHkgPT0gb0xhbWJkYSkgeworICAgIHJlc3VsdF9jcHUgPSBNaW5pbWFsTGVhc3RTcShuLCBjcHVfdGltZSwgcmVwb3J0c1swXS5jb21wbGV4aXR5X2xhbWJkYSk7CisgICAgcmVzdWx0X3JlYWwgPSBNaW5pbWFsTGVhc3RTcShuLCByZWFsX3RpbWUsIHJlcG9ydHNbMF0uY29tcGxleGl0eV9sYW1iZGEpOworICB9IGVsc2UgeworICAgIHJlc3VsdF9jcHUgPSBNaW5pbWFsTGVhc3RTcShuLCBjcHVfdGltZSwgcmVwb3J0c1swXS5jb21wbGV4aXR5KTsKKyAgICByZXN1bHRfcmVhbCA9IE1pbmltYWxMZWFzdFNxKG4sIHJlYWxfdGltZSwgcmVzdWx0X2NwdS5jb21wbGV4aXR5KTsKKyAgfQorICBzdGQ6OnN0cmluZyBiZW5jaG1hcmtfbmFtZSA9CisgICAgICByZXBvcnRzWzBdLmJlbmNobWFya19uYW1lLnN1YnN0cigwLCByZXBvcnRzWzBdLmJlbmNobWFya19uYW1lLmZpbmQoJy8nKSk7CisKKyAgLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIGFjY3VtdWxhdG9yIHRvIEJlbmNobWFya1JlcG9ydGVyOjpSdW4ncy4KKyAgUnVuIGJpZ19vOworICBiaWdfby5iZW5jaG1hcmtfbmFtZSA9IGJlbmNobWFya19uYW1lICsgIl9CaWdPIjsKKyAgYmlnX28uaXRlcmF0aW9ucyA9IDA7CisgIGJpZ19vLnJlYWxfYWNjdW11bGF0ZWRfdGltZSA9IHJlc3VsdF9yZWFsLmNvZWY7CisgIGJpZ19vLmNwdV9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X2NwdS5jb2VmOworICBiaWdfby5yZXBvcnRfYmlnX28gPSB0cnVlOworICBiaWdfby5jb21wbGV4aXR5ID0gcmVzdWx0X2NwdS5jb21wbGV4aXR5OworCisgIC8vIEFsbCB0aGUgdGltZSByZXN1bHRzIGFyZSByZXBvcnRlZCBhZnRlciBiZWluZyBtdWx0aXBsaWVkIGJ5IHRoZQorICAvLyB0aW1lIHVuaXQgbXVsdGlwbGllci4gQnV0IHNpbmNlIFJNUyBpcyBhIHJlbGF0aXZlIHF1YW50aXR5IGl0CisgIC8vIHNob3VsZCBub3QgYmUgbXVsdGlwbGllZCBhdCBhbGwuIFNvLCBoZXJlLCB3ZSBfZGl2aWRlXyBpdCBieSB0aGUKKyAgLy8gbXVsdGlwbGllciBzbyB0aGF0IHdoZW4gaXQgaXMgbXVsdGlwbGllZCBsYXRlciB0aGUgcmVzdWx0IGlzIHRoZQorICAvLyBjb3JyZWN0IG9uZS4KKyAgZG91YmxlIG11bHRpcGxpZXIgPSBHZXRUaW1lVW5pdE11bHRpcGxpZXIocmVwb3J0c1swXS50aW1lX3VuaXQpOworCisgIC8vIE9ubHkgYWRkIGxhYmVsIHRvIG1lYW4vc3RkZGV2IGlmIGl0IGlzIHNhbWUgZm9yIGFsbCBydW5zCisgIFJ1biBybXM7CisgIGJpZ19vLnJlcG9ydF9sYWJlbCA9IHJlcG9ydHNbMF0ucmVwb3J0X2xhYmVsOworICBybXMuYmVuY2htYXJrX25hbWUgPSBiZW5jaG1hcmtfbmFtZSArICJfUk1TIjsKKyAgcm1zLnJlcG9ydF9sYWJlbCA9IGJpZ19vLnJlcG9ydF9sYWJlbDsKKyAgcm1zLml0ZXJhdGlvbnMgPSAwOworICBybXMucmVhbF9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X3JlYWwucm1zIC8gbXVsdGlwbGllcjsKKyAgcm1zLmNwdV9hY2N1bXVsYXRlZF90aW1lID0gcmVzdWx0X2NwdS5ybXMgLyBtdWx0aXBsaWVyOworICBybXMucmVwb3J0X3JtcyA9IHRydWU7CisgIHJtcy5jb21wbGV4aXR5ID0gcmVzdWx0X2NwdS5jb21wbGV4aXR5OworICAvLyBkb24ndCBmb3JnZXQgdG8ga2VlcCB0aGUgdGltZSB1bml0LCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvCisgIC8vIHJlY292ZXIgdGhlIGNvcnJlY3QgdmFsdWUuCisgIHJtcy50aW1lX3VuaXQgPSByZXBvcnRzWzBdLnRpbWVfdW5pdDsKKworICByZXN1bHRzLnB1c2hfYmFjayhiaWdfbyk7CisgIHJlc3VsdHMucHVzaF9iYWNrKHJtcyk7CisgIHJldHVybiByZXN1bHRzOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5oIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29tcGxleGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjliNDgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jb21wbGV4aXR5LmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgSXNtYWVsIEppbWVuZXogTWFydGluZXouIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFNvdXJjZSBwcm9qZWN0IDogaHR0cHM6Ly9naXRodWIuY29tL2lzbWFlbEppbWVuZXovY3BwLmxlYXN0c3EKKy8vIEFkYXB0ZWQgdG8gYmUgdXNlZCB3aXRoIGdvb2dsZSBiZW5jaG1hcmsKKworI2lmbmRlZiBDT01QTEVYSVRZX0hfCisjZGVmaW5lIENPTVBMRVhJVFlfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCisvLyBSZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgYmlnTyBhbmQgUk1TIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisvLyBsaXN0IG9mIHJlcG9ydHMuIElmICdyZXBvcnRzLnNpemUoKSA8IDInIGFuIGVtcHR5IHZlY3RvciBpcyByZXR1cm5lZC4KK3N0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+IENvbXB1dGVCaWdPKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKTsKKworLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdCByZXR1cm5lZCBieSBNaW5pbWFsTGVhc3RTcQorLy8gICAtIGNvZWYgICAgICAgIDogRXN0aW1hdGVkIGNvZWZpY2llbnQgZm9yIHRoZSBoaWdoLW9yZGVyIHRlcm0gYXMKKy8vICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlZCBmcm9tIGRhdGEuCisvLyAgIC0gcm1zICAgICAgICAgOiBOb3JtYWxpemVkIFJvb3QgTWVhbiBTcXVhcmVkIEVycm9yLgorLy8gICAtIGNvbXBsZXhpdHkgIDogU2NhbGFiaWxpdHkgZm9ybSAoZS5nLiBvTiwgb05Mb2dOKS4gSW4gY2FzZSBhIHNjYWxhYmlsaXR5CisvLyAgICAgICAgICAgICAgICAgICBmb3JtIGhhcyBiZWVuIHByb3ZpZGVkIHRvIE1pbmltYWxMZWFzdFNxIHRoaXMgd2lsbCByZXR1cm4KKy8vICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHZhbHVlLiBJbiBjYXNlIEJpZ086Om9BdXRvIGhhcyBiZWVuIHNlbGVjdGVkLCB0aGlzCisvLyAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCByZXR1cm4gdGhlIGJlc3QgZml0dGluZyBjdXJ2ZSBkZXRlY3RlZC4KKworc3RydWN0IExlYXN0U3EgeworICBMZWFzdFNxKCkgOiBjb2VmKDAuMCksIHJtcygwLjApLCBjb21wbGV4aXR5KG9Ob25lKSB7fQorCisgIGRvdWJsZSBjb2VmOworICBkb3VibGUgcm1zOworICBCaWdPIGNvbXBsZXhpdHk7Cit9OworCisvLyBGdW5jdGlvbiB0byByZXR1cm4gYW4gc3RyaW5nIGZvciB0aGUgY2FsY3VsYXRlZCBjb21wbGV4aXR5CitzdGQ6OnN0cmluZyBHZXRCaWdPU3RyaW5nKEJpZ08gY29tcGxleGl0eSk7CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQ09NUExFWElUWV9IXwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY29uc29sZV9yZXBvcnRlci5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbnNvbGVfcmVwb3J0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MjBjYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2NvbnNvbGVfcmVwb3J0ZXIuY2MKQEAgLTAsMCArMSwxODIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAiY29tcGxleGl0eS5oIgorI2luY2x1ZGUgImNvdW50ZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJjb2xvcnByaW50LmgiCisjaW5jbHVkZSAiY29tbWFuZGxpbmVmbGFncy5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorI2luY2x1ZGUgInN0cmluZ191dGlsLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCitib29sIENvbnNvbGVSZXBvcnRlcjo6UmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KSB7CisgIG5hbWVfZmllbGRfd2lkdGhfID0gY29udGV4dC5uYW1lX2ZpZWxkX3dpZHRoOworICBwcmludGVkX2hlYWRlcl8gPSBmYWxzZTsKKyAgcHJldl9jb3VudGVyc18uY2xlYXIoKTsKKworICBQcmludEJhc2ljQ29udGV4dCgmR2V0RXJyb3JTdHJlYW0oKSwgY29udGV4dCk7CisKKyNpZmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworICBpZiAoKG91dHB1dF9vcHRpb25zXyAmIE9PX0NvbG9yKSAmJiAmc3RkOjpjb3V0ICE9ICZHZXRPdXRwdXRTdHJlYW0oKSkgeworICAgIEdldEVycm9yU3RyZWFtKCkKKyAgICAgICAgPDwgIkNvbG9yIHByaW50aW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBzdGRvdXQgb24gd2luZG93cy4iCisgICAgICAgICAgICIgRGlzYWJsaW5nIGNvbG9yIHByaW50aW5nXG4iOworICAgIG91dHB1dF9vcHRpb25zXyA9IHN0YXRpY19jYXN0PCBPdXRwdXRPcHRpb25zID4ob3V0cHV0X29wdGlvbnNfICYgfk9PX0NvbG9yKTsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpQcmludEhlYWRlcihjb25zdCBSdW4mIHJ1bikgeworICBzdGQ6OnN0cmluZyBzdHIgPSBGb3JtYXRTdHJpbmcoIiUtKnMgJTEzcyAlMTNzICUxMHMiLCBzdGF0aWNfY2FzdDxpbnQ+KG5hbWVfZmllbGRfd2lkdGhfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZW5jaG1hcmsiLCAiVGltZSIsICJDUFUiLCAiSXRlcmF0aW9ucyIpOworICBpZighcnVuLmNvdW50ZXJzLmVtcHR5KCkpIHsKKyAgICBpZihvdXRwdXRfb3B0aW9uc18gJiBPT19UYWJ1bGFyKSB7CisgICAgICBmb3IoYXV0byBjb25zdCYgYyA6IHJ1bi5jb3VudGVycykgeworICAgICAgICBzdHIgKz0gRm9ybWF0U3RyaW5nKCIgJTEwcyIsIGMuZmlyc3QuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAiIFVzZXJDb3VudGVycy4uLiI7CisgICAgfQorICB9CisgIHN0ciArPSAiXG4iOworICBzdGQ6OnN0cmluZyBsaW5lID0gc3RkOjpzdHJpbmcoc3RyLmxlbmd0aCgpLCAnLScpOworICBHZXRPdXRwdXRTdHJlYW0oKSA8PCBsaW5lIDw8ICJcbiIgPDwgc3RyIDw8IGxpbmUgPDwgIlxuIjsKK30KKwordm9pZCBDb25zb2xlUmVwb3J0ZXI6OlJlcG9ydFJ1bnMoY29uc3Qgc3RkOjp2ZWN0b3I8UnVuPiYgcmVwb3J0cykgeworICBmb3IgKGNvbnN0IGF1dG8mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICAvLyBwcmludCB0aGUgaGVhZGVyOgorICAgIC8vIC0tLSBpZiBub25lIHdhcyBwcmludGVkIHlldAorICAgIGJvb2wgcHJpbnRfaGVhZGVyID0gIXByaW50ZWRfaGVhZGVyXzsKKyAgICAvLyAtLS0gb3IgaWYgdGhlIGZvcm1hdCBpcyB0YWJ1bGFyIGFuZCB0aGlzIHJ1bgorICAgIC8vICAgICBoYXMgZGlmZmVyZW50IGZpZWxkcyBmcm9tIHRoZSBwcmV2IGhlYWRlcgorICAgIHByaW50X2hlYWRlciB8PSAob3V0cHV0X29wdGlvbnNfICYgT09fVGFidWxhcikgJiYKKyAgICAgICAgICAgICAgICAgICAgKCFpbnRlcm5hbDo6U2FtZU5hbWVzKHJ1bi5jb3VudGVycywgcHJldl9jb3VudGVyc18pKTsKKyAgICBpZiAocHJpbnRfaGVhZGVyKSB7CisgICAgICBwcmludGVkX2hlYWRlcl8gPSB0cnVlOworICAgICAgcHJldl9jb3VudGVyc18gPSBydW4uY291bnRlcnM7CisgICAgICBQcmludEhlYWRlcihydW4pOworICAgIH0KKyAgICAvLyBBcyBhbiBhbHRlcm5hdGl2ZSB0byBwcmludGluZyB0aGUgaGVhZGVycyBsaWtlIHRoaXMsIHdlIGNvdWxkIHNvcnQKKyAgICAvLyB0aGUgYmVuY2htYXJrcyBieSBoZWFkZXIgYW5kIHRoZW4gcHJpbnQuIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUKKyAgICAvLyB3YWl0aW5nIGZvciB0aGUgZnVsbCByZXN1bHRzIGJlZm9yZSBwcmludGluZywgb3IgcHJpbnRpbmcgdHdpY2UuCisgICAgUHJpbnRSdW5EYXRhKHJ1bik7CisgIH0KK30KKworc3RhdGljIHZvaWQgSWdub3JlQ29sb3JQcmludChzdGQ6Om9zdHJlYW0mIG91dCwgTG9nQ29sb3IsIGNvbnN0IGNoYXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgb3V0IDw8IEZvcm1hdFN0cmluZyhmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgQ29uc29sZVJlcG9ydGVyOjpQcmludFJ1bkRhdGEoY29uc3QgUnVuJiByZXN1bHQpIHsKKyAgdHlwZWRlZiB2b2lkKFByaW50ZXJGbikoc3RkOjpvc3RyZWFtJiwgTG9nQ29sb3IsIGNvbnN0IGNoYXIqLCAuLi4pOworICBhdXRvJiBPdXQgPSBHZXRPdXRwdXRTdHJlYW0oKTsKKyAgUHJpbnRlckZuKiBwcmludGVyID0gKG91dHB1dF9vcHRpb25zXyAmIE9PX0NvbG9yKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgKFByaW50ZXJGbiopQ29sb3JQcmludGYgOiBJZ25vcmVDb2xvclByaW50OworICBhdXRvIG5hbWVfY29sb3IgPQorICAgICAgKHJlc3VsdC5yZXBvcnRfYmlnX28gfHwgcmVzdWx0LnJlcG9ydF9ybXMpID8gQ09MT1JfQkxVRSA6IENPTE9SX0dSRUVOOworICBwcmludGVyKE91dCwgbmFtZV9jb2xvciwgIiUtKnMgIiwgbmFtZV9maWVsZF93aWR0aF8sCisgICAgICAgICAgcmVzdWx0LmJlbmNobWFya19uYW1lLmNfc3RyKCkpOworCisgIGlmIChyZXN1bHQuZXJyb3Jfb2NjdXJyZWQpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfUkVELCAiRVJST1IgT0NDVVJSRUQ6IFwnJXNcJyIsCisgICAgICAgICAgICByZXN1bHQuZXJyb3JfbWVzc2FnZS5jX3N0cigpKTsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIlxuIik7CisgICAgcmV0dXJuOworICB9CisgIC8vIEZvcm1hdCBieXRlcyBwZXIgc2Vjb25kCisgIHN0ZDo6c3RyaW5nIHJhdGU7CisgIGlmIChyZXN1bHQuYnl0ZXNfcGVyX3NlY29uZCA+IDApIHsKKyAgICByYXRlID0gU3RyQ2F0KCIgIiwgSHVtYW5SZWFkYWJsZU51bWJlcihyZXN1bHQuYnl0ZXNfcGVyX3NlY29uZCksICJCL3MiKTsKKyAgfQorCisgIC8vIEZvcm1hdCBpdGVtcyBwZXIgc2Vjb25kCisgIHN0ZDo6c3RyaW5nIGl0ZW1zOworICBpZiAocmVzdWx0Lml0ZW1zX3Blcl9zZWNvbmQgPiAwKSB7CisgICAgaXRlbXMgPQorICAgICAgICBTdHJDYXQoIiAiLCBIdW1hblJlYWRhYmxlTnVtYmVyKHJlc3VsdC5pdGVtc19wZXJfc2Vjb25kKSwgIiBpdGVtcy9zIik7CisgIH0KKworICBjb25zdCBkb3VibGUgcmVhbF90aW1lID0gcmVzdWx0LkdldEFkanVzdGVkUmVhbFRpbWUoKTsKKyAgY29uc3QgZG91YmxlIGNwdV90aW1lID0gcmVzdWx0LkdldEFkanVzdGVkQ1BVVGltZSgpOworCisgIGlmIChyZXN1bHQucmVwb3J0X2JpZ19vKSB7CisgICAgc3RkOjpzdHJpbmcgYmlnX28gPSBHZXRCaWdPU3RyaW5nKHJlc3VsdC5jb21wbGV4aXR5KTsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfWUVMTE9XLCAiJTEwLjJmICVzICUxMC4yZiAlcyAiLCByZWFsX3RpbWUsIGJpZ19vLmNfc3RyKCksCisgICAgICAgICAgICBjcHVfdGltZSwgYmlnX28uY19zdHIoKSk7CisgIH0gZWxzZSBpZiAocmVzdWx0LnJlcG9ydF9ybXMpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfWUVMTE9XLCAiJTEwLjBmICUlICUxMC4wZiAlJSAiLCByZWFsX3RpbWUgKiAxMDAsCisgICAgICAgICAgICBjcHVfdGltZSAqIDEwMCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgY2hhciogdGltZUxhYmVsID0gR2V0VGltZVVuaXRTdHJpbmcocmVzdWx0LnRpbWVfdW5pdCk7CisgICAgcHJpbnRlcihPdXQsIENPTE9SX1lFTExPVywgIiUxMC4wZiAlcyAlMTAuMGYgJXMgIiwgcmVhbF90aW1lLCB0aW1lTGFiZWwsCisgICAgICAgICAgICBjcHVfdGltZSwgdGltZUxhYmVsKTsKKyAgfQorCisgIGlmICghcmVzdWx0LnJlcG9ydF9iaWdfbyAmJiAhcmVzdWx0LnJlcG9ydF9ybXMpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfQ1lBTiwgIiUxMGxsZCIsIHJlc3VsdC5pdGVyYXRpb25zKTsKKyAgfQorCisgIGZvciAoYXV0byYgYyA6IHJlc3VsdC5jb3VudGVycykgeworICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGNOYW1lTGVuID0gc3RkOjptYXgoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSgxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZpcnN0Lmxlbmd0aCgpKTsKKyAgICBhdXRvIGNvbnN0JiBzID0gSHVtYW5SZWFkYWJsZU51bWJlcihjLnNlY29uZC52YWx1ZSwgMTAwMCk7CisgICAgaWYgKG91dHB1dF9vcHRpb25zXyAmIE9PX1RhYnVsYXIpIHsKKyAgICAgIGlmIChjLnNlY29uZC5mbGFncyAmIENvdW50ZXI6OmtJc1JhdGUpIHsKKyAgICAgICAgcHJpbnRlcihPdXQsIENPTE9SX0RFRkFVTFQsICIgJSpzL3MiLCBjTmFtZUxlbiAtIDIsIHMuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIiAlKnMiLCBjTmFtZUxlbiwgcy5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgY2hhciogdW5pdCA9IChjLnNlY29uZC5mbGFncyAmIENvdW50ZXI6OmtJc1JhdGUpID8gIi9zIiA6ICIiOworICAgICAgcHJpbnRlcihPdXQsIENPTE9SX0RFRkFVTFQsICIgJXM9JXMlcyIsIGMuZmlyc3QuY19zdHIoKSwgcy5jX3N0cigpLAorICAgICAgICAgICAgICB1bml0KTsKKyAgICB9CisgIH0KKworICBpZiAoIXJhdGUuZW1wdHkoKSkgeworICAgIHByaW50ZXIoT3V0LCBDT0xPUl9ERUZBVUxULCAiICUqcyIsIDEzLCByYXRlLmNfc3RyKCkpOworICB9CisKKyAgaWYgKCFpdGVtcy5lbXB0eSgpKSB7CisgICAgcHJpbnRlcihPdXQsIENPTE9SX0RFRkFVTFQsICIgJSpzIiwgMTgsIGl0ZW1zLmNfc3RyKCkpOworICB9CisKKyAgaWYgKCFyZXN1bHQucmVwb3J0X2xhYmVsLmVtcHR5KCkpIHsKKyAgICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIiAlcyIsIHJlc3VsdC5yZXBvcnRfbGFiZWwuY19zdHIoKSk7CisgIH0KKworICBwcmludGVyKE91dCwgQ09MT1JfREVGQVVMVCwgIlxuIik7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jb3VudGVyLmNjIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY291bnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFhYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY291bnRlci5jYwpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY291bnRlci5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2RvdWJsZSBGaW5pc2goQ291bnRlciBjb25zdCYgYywgZG91YmxlIGNwdV90aW1lLCBkb3VibGUgbnVtX3RocmVhZHMpIHsKKyAgZG91YmxlIHYgPSBjLnZhbHVlOworICBpZiAoYy5mbGFncyAmIENvdW50ZXI6OmtJc1JhdGUpIHsKKyAgICB2IC89IGNwdV90aW1lOworICB9CisgIGlmIChjLmZsYWdzICYgQ291bnRlcjo6a0F2Z1RocmVhZHMpIHsKKyAgICB2IC89IG51bV90aHJlYWRzOworICB9CisgIHJldHVybiB2OworfQorCit2b2lkIEZpbmlzaChVc2VyQ291bnRlcnMgKmwsIGRvdWJsZSBjcHVfdGltZSwgZG91YmxlIG51bV90aHJlYWRzKSB7CisgIGZvciAoYXV0byAmYyA6ICpsKSB7CisgICAgYy5zZWNvbmQudmFsdWUgPSBGaW5pc2goYy5zZWNvbmQsIGNwdV90aW1lLCBudW1fdGhyZWFkcyk7CisgIH0KK30KKwordm9pZCBJbmNyZW1lbnQoVXNlckNvdW50ZXJzICpsLCBVc2VyQ291bnRlcnMgY29uc3QmIHIpIHsKKyAgLy8gYWRkIGNvdW50ZXJzIHByZXNlbnQgaW4gYm90aCBvciBqdXN0IGluICpsCisgIGZvciAoYXV0byAmYyA6ICpsKSB7CisgICAgYXV0byBpdCA9IHIuZmluZChjLmZpcnN0KTsKKyAgICBpZiAoaXQgIT0gci5lbmQoKSkgeworICAgICAgYy5zZWNvbmQudmFsdWUgPSBjLnNlY29uZCArIGl0LT5zZWNvbmQ7CisgICAgfQorICB9CisgIC8vIGFkZCBjb3VudGVycyBwcmVzZW50IGluIHIsIGJ1dCBub3QgaW4gKmwKKyAgZm9yIChhdXRvIGNvbnN0ICZ0YyA6IHIpIHsKKyAgICBhdXRvIGl0ID0gbC0+ZmluZCh0Yy5maXJzdCk7CisgICAgaWYgKGl0ID09IGwtPmVuZCgpKSB7CisgICAgICAoKmwpW3RjLmZpcnN0XSA9IHRjLnNlY29uZDsKKyAgICB9CisgIH0KK30KKworYm9vbCBTYW1lTmFtZXMoVXNlckNvdW50ZXJzIGNvbnN0JiBsLCBVc2VyQ291bnRlcnMgY29uc3QmIHIpIHsKKyAgaWYgKCZsID09ICZyKSByZXR1cm4gdHJ1ZTsKKyAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoYXV0byBjb25zdCYgYyA6IGwpIHsKKyAgICBpZiAoci5maW5kKGMuZmlyc3QpID09IHIuZW5kKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY291bnRlci5oIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjg2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9jb3VudGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIHRoZXNlIGNvdW50ZXItcmVsYXRlZCBmdW5jdGlvbnMgYXJlIGhpZGRlbiB0byByZWR1Y2UgQVBJIHN1cmZhY2UuCituYW1lc3BhY2UgaW50ZXJuYWwgewordm9pZCBGaW5pc2goVXNlckNvdW50ZXJzICpsLCBkb3VibGUgdGltZSwgZG91YmxlIG51bV90aHJlYWRzKTsKK3ZvaWQgSW5jcmVtZW50KFVzZXJDb3VudGVycyAqbCwgVXNlckNvdW50ZXJzIGNvbnN0JiByKTsKK2Jvb2wgU2FtZU5hbWVzKFVzZXJDb3VudGVycyBjb25zdCYgbCwgVXNlckNvdW50ZXJzIGNvbnN0JiByKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2Nzdl9yZXBvcnRlci5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2Nzdl9yZXBvcnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUxMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY3N2X3JlcG9ydGVyLmNjCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImNvbXBsZXhpdHkuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInRpbWVycy5oIgorI2luY2x1ZGUgImNoZWNrLmgiCisKKy8vIEZpbGUgZm9ybWF0IHJlZmVyZW5jZTogaHR0cDovL2Vkb2Nlby5jb20vdXRpbGl0YXMvY3N2LWZpbGUtZm9ybWF0LgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworbmFtZXNwYWNlIHsKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtZW50cyA9IHsKKyAgICAibmFtZSIsICAgICAgICAgICAiaXRlcmF0aW9ucyIsICAgICAgICJyZWFsX3RpbWUiLCAgICAgICAgImNwdV90aW1lIiwKKyAgICAidGltZV91bml0IiwgICAgICAiYnl0ZXNfcGVyX3NlY29uZCIsICJpdGVtc19wZXJfc2Vjb25kIiwgImxhYmVsIiwKKyAgICAiZXJyb3Jfb2NjdXJyZWQiLCAiZXJyb3JfbWVzc2FnZSJ9OworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgQ1NWUmVwb3J0ZXI6OlJlcG9ydENvbnRleHQoY29uc3QgQ29udGV4dCYgY29udGV4dCkgeworICBQcmludEJhc2ljQ29udGV4dCgmR2V0RXJyb3JTdHJlYW0oKSwgY29udGV4dCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENTVlJlcG9ydGVyOjpSZXBvcnRSdW5zKGNvbnN0IHN0ZDo6dmVjdG9yPFJ1bj4gJiByZXBvcnRzKSB7CisgIHN0ZDo6b3N0cmVhbSYgT3V0ID0gR2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgaWYgKCFwcmludGVkX2hlYWRlcl8pIHsKKyAgICAvLyBzYXZlIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHVzZXIgY291bnRlcnMKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgY250IDogcnVuLmNvdW50ZXJzKSB7CisgICAgICAgIHVzZXJfY291bnRlcl9uYW1lc18uaW5zZXJ0KGNudC5maXJzdCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpbnQgdGhlIGhlYWRlcgorICAgIGZvciAoYXV0byBCID0gZWxlbWVudHMuYmVnaW4oKTsgQiAhPSBlbGVtZW50cy5lbmQoKTspIHsKKyAgICAgIE91dCA8PCAqQisrOworICAgICAgaWYgKEIgIT0gZWxlbWVudHMuZW5kKCkpIE91dCA8PCAiLCI7CisgICAgfQorICAgIGZvciAoYXV0byBCID0gdXNlcl9jb3VudGVyX25hbWVzXy5iZWdpbigpOyBCICE9IHVzZXJfY291bnRlcl9uYW1lc18uZW5kKCk7KSB7CisgICAgICBPdXQgPDwgIixcIiIgPDwgKkIrKyA8PCAiXCIiOworICAgIH0KKyAgICBPdXQgPDwgIlxuIjsKKworICAgIHByaW50ZWRfaGVhZGVyXyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGN1cnJlbnQgY291bnRlcnMgYXJlIHNhdmVkIGluIHRoZSBuYW1lIHNldAorICAgIGZvciAoY29uc3QgYXV0byYgcnVuIDogcmVwb3J0cykgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBjbnQgOiBydW4uY291bnRlcnMpIHsKKyAgICAgICAgQ0hFQ0sodXNlcl9jb3VudGVyX25hbWVzXy5maW5kKGNudC5maXJzdCkgIT0gdXNlcl9jb3VudGVyX25hbWVzXy5lbmQoKSkKKyAgICAgICAgICAgICAgPDwgIkFsbCBjb3VudGVycyBtdXN0IGJlIHByZXNlbnQgaW4gZWFjaCBydW4uICIKKyAgICAgICAgICAgICAgPDwgIkNvdW50ZXIgbmFtZWQgXCIiIDw8IGNudC5maXJzdAorICAgICAgICAgICAgICA8PCAiXCIgd2FzIG5vdCBpbiBhIHJ1biBhZnRlciBiZWluZyBhZGRlZCB0byB0aGUgaGVhZGVyIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBwcmludCByZXN1bHRzIGZvciBlYWNoIHJ1bgorICBmb3IgKGNvbnN0IGF1dG8mIHJ1biA6IHJlcG9ydHMpIHsKKyAgICBQcmludFJ1bkRhdGEocnVuKTsKKyAgfQorCit9CisKK3ZvaWQgQ1NWUmVwb3J0ZXI6OlByaW50UnVuRGF0YShjb25zdCBSdW4gJiBydW4pIHsKKyAgc3RkOjpvc3RyZWFtJiBPdXQgPSBHZXRPdXRwdXRTdHJlYW0oKTsKKworICAvLyBGaWVsZCB3aXRoIGVtYmVkZGVkIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXJzIG11c3QgYmUgZG91YmxlZCBhbmQgdGhlIGZpZWxkCisgIC8vIGRlbGltaXRlZCB3aXRoIGRvdWJsZS1xdW90ZXMuCisgIHN0ZDo6c3RyaW5nIG5hbWUgPSBydW4uYmVuY2htYXJrX25hbWU7CisgIFJlcGxhY2VBbGwoJm5hbWUsICJcIiIsICJcIlwiIik7CisgIE91dCA8PCAnIicgPDwgbmFtZSA8PCAiXCIsIjsKKyAgaWYgKHJ1bi5lcnJvcl9vY2N1cnJlZCkgeworICAgIE91dCA8PCBzdGQ6OnN0cmluZyhlbGVtZW50cy5zaXplKCkgLSAzLCAnLCcpOworICAgIE91dCA8PCAidHJ1ZSwiOworICAgIHN0ZDo6c3RyaW5nIG1zZyA9IHJ1bi5lcnJvcl9tZXNzYWdlOworICAgIFJlcGxhY2VBbGwoJm1zZywgIlwiIiwgIlwiXCIiKTsKKyAgICBPdXQgPDwgJyInIDw8IG1zZyA8PCAiXCJcbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRG8gbm90IHByaW50IGl0ZXJhdGlvbiBvbiBiaWdPIGFuZCBSTVMgcmVwb3J0CisgIGlmICghcnVuLnJlcG9ydF9iaWdfbyAmJiAhcnVuLnJlcG9ydF9ybXMpIHsKKyAgICBPdXQgPDwgcnVuLml0ZXJhdGlvbnM7CisgIH0KKyAgT3V0IDw8ICIsIjsKKworICBPdXQgPDwgcnVuLkdldEFkanVzdGVkUmVhbFRpbWUoKSA8PCAiLCI7CisgIE91dCA8PCBydW4uR2V0QWRqdXN0ZWRDUFVUaW1lKCkgPDwgIiwiOworCisgIC8vIERvIG5vdCBwcmludCB0aW1lTGFiZWwgb24gYmlnTyBhbmQgUk1TIHJlcG9ydAorICBpZiAocnVuLnJlcG9ydF9iaWdfbykgeworICAgIE91dCA8PCBHZXRCaWdPU3RyaW5nKHJ1bi5jb21wbGV4aXR5KTsKKyAgfSBlbHNlIGlmICghcnVuLnJlcG9ydF9ybXMpIHsKKyAgICBPdXQgPDwgR2V0VGltZVVuaXRTdHJpbmcocnVuLnRpbWVfdW5pdCk7CisgIH0KKyAgT3V0IDw8ICIsIjsKKworICBpZiAocnVuLmJ5dGVzX3Blcl9zZWNvbmQgPiAwLjApIHsKKyAgICBPdXQgPDwgcnVuLmJ5dGVzX3Blcl9zZWNvbmQ7CisgIH0KKyAgT3V0IDw8ICIsIjsKKyAgaWYgKHJ1bi5pdGVtc19wZXJfc2Vjb25kID4gMC4wKSB7CisgICAgT3V0IDw8IHJ1bi5pdGVtc19wZXJfc2Vjb25kOworICB9CisgIE91dCA8PCAiLCI7CisgIGlmICghcnVuLnJlcG9ydF9sYWJlbC5lbXB0eSgpKSB7CisgICAgLy8gRmllbGQgd2l0aCBlbWJlZGRlZCBkb3VibGUtcXVvdGUgY2hhcmFjdGVycyBtdXN0IGJlIGRvdWJsZWQgYW5kIHRoZSBmaWVsZAorICAgIC8vIGRlbGltaXRlZCB3aXRoIGRvdWJsZS1xdW90ZXMuCisgICAgc3RkOjpzdHJpbmcgbGFiZWwgPSBydW4ucmVwb3J0X2xhYmVsOworICAgIFJlcGxhY2VBbGwoJmxhYmVsLCAiXCIiLCAiXCJcIiIpOworICAgIE91dCA8PCAiXCIiIDw8IGxhYmVsIDw8ICJcIiI7CisgIH0KKyAgT3V0IDw8ICIsLCI7ICAvLyBmb3IgZXJyb3Jfb2NjdXJyZWQgYW5kIGVycm9yX21lc3NhZ2UKKworICAvLyBQcmludCB1c2VyIGNvdW50ZXJzCisgIGZvciAoY29uc3QgYXV0byAmdWNuIDogdXNlcl9jb3VudGVyX25hbWVzXykgeworICAgIGF1dG8gaXQgPSBydW4uY291bnRlcnMuZmluZCh1Y24pOworICAgIGlmKGl0ID09IHJ1bi5jb3VudGVycy5lbmQoKSkgeworICAgICAgT3V0IDw8ICIsIjsKKyAgICB9IGVsc2UgeworICAgICAgT3V0IDw8ICIsIiA8PCBpdC0+c2Vjb25kOworICAgIH0KKyAgfQorICBPdXQgPDwgJ1xuJzsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2N5Y2xlY2xvY2suaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2N5Y2xlY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjUxZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvY3ljbGVjbG9jay5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDeWNsZUNsb2NrCisvLyAgICBBIEN5Y2xlQ2xvY2sgdGVsbHMgeW91IHRoZSBjdXJyZW50IHRpbWUgaW4gQ3ljbGVzLiAgVGhlICJ0aW1lIgorLy8gICAgaXMgYWN0dWFsbHkgdGltZSBzaW5jZSBwb3dlci1vbi4gIFRoaXMgaXMgbGlrZSB0aW1lKCkgYnV0IGRvZXNuJ3QKKy8vICAgIGludm9sdmUgYSBzeXN0ZW0gY2FsbCBhbmQgaXMgbXVjaCBtb3JlIHByZWNpc2UuCisvLworLy8gTk9URTogTm90IGFsbCBjcHUvcGxhdGZvcm0va2VybmVsIGNvbWJpbmF0aW9ucyBndWFyYW50ZWUgdGhhdCB0aGlzCisvLyBjbG9jayBpbmNyZW1lbnRzIGF0IGEgY29uc3RhbnQgcmF0ZSBvciBpcyBzeW5jaHJvbml6ZWQgYWNyb3NzIGFsbCBsb2dpY2FsCisvLyBjcHVzIGluIGEgc3lzdGVtLgorLy8KKy8vIElmIHlvdSBuZWVkIHRoZSBhYm92ZSBndWFyYW50ZWVzLCBwbGVhc2UgY29uc2lkZXIgdXNpbmcgYSBkaWZmZXJlbnQKKy8vIEFQSS4gVGhlcmUgYXJlIGVmZm9ydHMgdG8gcHJvdmlkZSBhbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgYSBtaWxsaXNlY29uZAorLy8gZ3JhbnVsYXJpdHkgYW5kIGltcGxlbWVudGVkIGFzIGEgbWVtb3J5IHJlYWQuIEEgbWVtb3J5IHJlYWQgaXMgZ2VuZXJhbGx5CisvLyBjaGVhcGVyIHRoYW4gdGhlIEN5Y2xlQ2xvY2sgZm9yIG1hbnkgYXJjaGl0ZWN0dXJlcy4KKy8vCisvLyBBbHNvLCBpbiBzb21lIG91dCBvZiBvcmRlciBDUFUgaW1wbGVtZW50YXRpb25zLCB0aGUgQ3ljbGVDbG9jayBpcyBub3QKKy8vIHNlcmlhbGl6aW5nLiBTbyBpZiB5b3UncmUgdHJ5aW5nIHRvIGNvdW50IGF0IGN5Y2xlcyBncmFudWxhcml0eSwgeW91cgorLy8gZGF0YSBtaWdodCBiZSBpbmFjY3VyYXRlIGR1ZSB0byBvdXQgb2Ygb3JkZXIgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCisjZGVmaW5lIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfTUFDT1NYKQorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjZW5kaWYKKy8vIEZvciBNU1ZDLCB3ZSB3YW50IHRvIHVzZSAnX2FzbSByZHRzYycgd2hlbiBwb3NzaWJsZSAoc2luY2UgaXQgd29ya3MKKy8vIHdpdGggZXZlbiBhbmNpZW50IE1TVkMgY29tcGlsZXJzKSwgYW5kIHdoZW4gbm90IHBvc3NpYmxlIHRoZQorLy8gX19yZHRzYyBpbnRyaW5zaWMsIGRlY2xhcmVkIGluIDxpbnRyaW4uaD4uICBVbmZvcnR1bmF0ZWx5LCBpbiBzb21lCisvLyBlbnZpcm9ubWVudHMsIDx3aW5kb3dzLmg+IGFuZCA8aW50cmluLmg+IGhhdmUgY29uZmxpY3RpbmcKKy8vIGRlY2xhcmF0aW9ucyBvZiBzb21lIG90aGVyIGludHJpbnNpY3MsIGJyZWFraW5nIGNvbXBpbGF0aW9uLgorLy8gVGhlcmVmb3JlLCB3ZSBzaW1wbHkgZGVjbGFyZSBfX3JkdHNjIG91cnNlbHZlcy4gU2VlIGFsc28KKy8vIGh0dHA6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvMjYyMDQ3CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKSAmJiAhZGVmaW5lZChfTV9JWDg2KQorZXh0ZXJuICJDIiB1aW50NjRfdCBfX3JkdHNjKCk7CisjcHJhZ21hIGludHJpbnNpYyhfX3JkdHNjKQorI2VuZGlmCisKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgQkVOQ0hNQVJLX09TX0VNU0NSSVBURU4KKyNpbmNsdWRlIDxlbXNjcmlwdGVuLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisvLyBOT1RFOiBvbmx5IGkzODYgYW5kIHg4Nl82NCBoYXZlIGJlZW4gd2VsbCB0ZXN0ZWQuCisvLyBQUEMsIHNwYXJjLCBhbHBoYSwgYW5kIGlhNjQgYXJlIGJhc2VkIG9uCisvLyAgICBodHRwOi8vcGV0ZXIua3VzY3Npay5jb20vd29yZHByZXNzLz9wPTE0CisvLyB3aXRoIG1vZGlmaWNhdGlvbnMgYnkgbTNiLiAgU2VlIGFsc28KKy8vICAgIGh0dHBzOi8vc2V0aXN2bi5zc2wuYmVya2VsZXkuZWR1L3N2bi9saWIvZmZ0dy0zLjAuMS9rZXJuZWwvY3ljbGUuaAorbmFtZXNwYWNlIGN5Y2xlY2xvY2sgeworLy8gVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY3ljbGVzIHNpbmNlIHBvd2VyLW9uLiAgVGhyZWFkLXNhZmUuCitpbmxpbmUgQkVOQ0hNQVJLX0FMV0FZU19JTkxJTkUgaW50NjRfdCBOb3coKSB7CisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfTUFDT1NYKQorICAvLyB0aGlzIGdvZXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIG5lZWQgQUxMIE1hY3MsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8gYXJjaGl0ZWN0dXJlLCB0byByZXR1cm4gdGhlIG51bWJlciBvZiAibWFjaCB0aW1lIHVuaXRzIiB0aGF0CisgIC8vIGhhdmUgcGFzc2VkIHNpbmNlIHN0YXJ0dXAuICBTZWUgc3lzaW5mby5jYyB3aGVyZQorICAvLyBJbml0aWFsaXplU3lzdGVtSW5mbygpIHNldHMgdGhlIHN1cHBvc2VkIGNwdSBjbG9jayBmcmVxdWVuY3kgb2YKKyAgLy8gbWFjcyB0byB0aGUgbnVtYmVyIG9mIG1hY2ggdGltZSB1bml0cyBwZXIgc2Vjb25kLCBub3QgYWN0dWFsCisgIC8vIENQVSBjbG9jayBmcmVxdWVuY3kgKHdoaWNoIGNhbiBjaGFuZ2UgaW4gdGhlIGZhY2Ugb2YgQ1BVCisgIC8vIGZyZXF1ZW5jeSBzY2FsaW5nKS4gIEFsc28gbm90ZSB0aGF0IHdoZW4gdGhlIE1hYyBzbGVlcHMsIHRoaXMKKyAgLy8gY291bnRlciBwYXVzZXM7IGl0IGRvZXMgbm90IGNvbnRpbnVlIGNvdW50aW5nLCBub3IgZG9lcyBpdAorICAvLyByZXNldCB0byB6ZXJvLgorICByZXR1cm4gbWFjaF9hYnNvbHV0ZV90aW1lKCk7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19FTVNDUklQVEVOKQorICAvLyB0aGlzIGdvZXMgYWJvdmUgeDg2LXNwZWNpZmljIGNvZGUgYmVjYXVzZSBvbGQgdmVyc2lvbnMgb2YgRW1zY3JpcHRlbgorICAvLyBkZWZpbmUgX194ODZfNjRfXywgYWx0aG91Z2ggdGhleSBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBpdC4KKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGVtc2NyaXB0ZW5fZ2V0X25vdygpICogMWUrNik7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICBpbnQ2NF90IHJldDsKKyAgX19hc21fXyB2b2xhdGlsZSgicmR0c2MiIDogIj1BIihyZXQpKTsKKyAgcmV0dXJuIHJldDsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2FtZDY0X18pCisgIHVpbnQ2NF90IGxvdywgaGlnaDsKKyAgX19hc21fXyB2b2xhdGlsZSgicmR0c2MiIDogIj1hIihsb3cpLCAiPWQiKGhpZ2gpKTsKKyAgcmV0dXJuIChoaWdoIDw8IDMyKSB8IGxvdzsKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykKKyAgLy8gVGhpcyByZXR1cm5zIGEgdGltZS1iYXNlLCB3aGljaCBpcyBub3QgYWx3YXlzIHByZWNpc2VseSBhIGN5Y2xlLWNvdW50LgorICBpbnQ2NF90IHRibCwgdGJ1MCwgdGJ1MTsKKyAgYXNtKCJtZnRidSAlMCIgOiAiPXIiKHRidTApKTsKKyAgYXNtKCJtZnRiICAlMCIgOiAiPXIiKHRibCkpOworICBhc20oIm1mdGJ1ICUwIiA6ICI9ciIodGJ1MSkpOworICB0YmwgJj0gLXN0YXRpY19jYXN0PGludDY0X3Q+KHRidTAgPT0gdGJ1MSk7CisgIC8vIGhpZ2ggMzIgYml0cyBpbiB0YnUxOyBsb3cgMzIgYml0cyBpbiB0YmwgICh0YnUwIGlzIGdhcmJhZ2UpCisgIHJldHVybiAodGJ1MSA8PCAzMikgfCB0Ymw7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKyAgaW50NjRfdCB0aWNrOworICBhc20oIi5ieXRlIDB4ODMsIDB4NDEsIDB4MDAsIDB4MDAiKTsKKyAgYXNtKCJtb3YgICAlJWcxLCAlMCIgOiAiPXIiKHRpY2spKTsKKyAgcmV0dXJuIHRpY2s7CisjZWxpZiBkZWZpbmVkKF9faWE2NF9fKQorICBpbnQ2NF90IGl0YzsKKyAgYXNtKCJtb3YgJTAgPSBhci5pdGMiIDogIj1yIihpdGMpKTsKKyAgcmV0dXJuIGl0YzsKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfTVNWQykgJiYgZGVmaW5lZChfTV9JWDg2KQorICAvLyBPbGRlciBNU1ZDIGNvbXBpbGVycyAobGlrZSA3LngpIGRvbid0IHNlZW0gdG8gc3VwcG9ydCB0aGUKKyAgLy8gX19yZHRzYyBpbnRyaW5zaWMgcHJvcGVybHksIHNvIEkgcHJlZmVyIHRvIHVzZSBfYXNtIGluc3RlYWQKKyAgLy8gd2hlbiBJIGtub3cgaXQgd2lsbCB3b3JrLiAgT3RoZXJ3aXNlLCBJJ2xsIHVzZSBfX3JkdHNjIGFuZCBob3BlCisgIC8vIHRoZSBjb2RlIGlzIGJlaW5nIGNvbXBpbGVkIHdpdGggYSBub24tYW5jaWVudCBjb21waWxlci4KKyAgX2FzbSByZHRzYworI2VsaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorICByZXR1cm4gX19yZHRzYygpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfTkFDTCkKKyAgLy8gTmF0aXZlIENsaWVudCB2YWxpZGF0b3Igb24geDg2L3g4Ni02NCBhbGxvd3MgUkRUU0MgaW5zdHJ1Y3Rpb25zLAorICAvLyBhbmQgdGhpcyBjYXNlIGlzIGhhbmRsZWQgYWJvdmUuIE5hdGl2ZSBDbGllbnQgdmFsaWRhdG9yIG9uIEFSTQorICAvLyByZWplY3RzIE1SQyBpbnN0cnVjdGlvbnMgKHVzZWQgaW4gdGhlIEFSTS1zcGVjaWZpYyBzZXF1ZW5jZSBiZWxvdyksCisgIC8vIHNvIHdlIGhhbmRsZSBpdCBoZXJlLiBQb3J0YWJsZSBOYXRpdmUgQ2xpZW50IGNvbXBpbGVzIHRvCisgIC8vIGFyY2hpdGVjdHVyZS1hZ25vc3RpYyBieXRlY29kZSwgd2hpY2ggZG9lc24ndCBwcm92aWRlIGFueQorICAvLyBjeWNsZSBjb3VudGVyIGFjY2VzcyBtbmVtb25pY3MuCisKKyAgLy8gTmF0aXZlIENsaWVudCBkb2VzIG5vdCBwcm92aWRlIGFueSBBUEkgdG8gYWNjZXNzIGN5Y2xlIGNvdW50ZXIuCisgIC8vIFVzZSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgLi4uKSBpbnN0ZWFkIG9mIGdldHRpbWVvZmRheQorICAvLyBiZWNhdXNlIGlzIHByb3ZpZGVzIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiAod2hpY2ggaXMgbm90aWNhYmxlIGF0CisgIC8vIGxlYXN0IGZvciBQTmFDbCBtb2R1bGVzIHJ1bm5pbmcgb24geDg2IE1hYyAmIExpbnV4KS4KKyAgLy8gSW5pdGlhbGl6ZSB0byBhbHdheXMgcmV0dXJuIDAgaWYgY2xvY2tfZ2V0dGltZSBmYWlscy4KKyAgc3RydWN0IHRpbWVzcGVjIHRzID0geyAwLCAwIH07CisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4odHMudHZfc2VjKSAqIDEwMDAwMDAwMDAgKyB0cy50dl9uc2VjOworI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgLy8gU3lzdGVtIHRpbWVyIG9mIEFSTXY4IHJ1bnMgYXQgYSBkaWZmZXJlbnQgZnJlcXVlbmN5IHRoYW4gdGhlIENQVSdzLgorICAvLyBUaGUgZnJlcXVlbmN5IGlzIGZpeGVkLCB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIDEtNTBNSHouICBJdCBjYW4gYmUKKyAgLy8gcmVhZCBhdCBDTlRGUlEgc3BlY2lhbCByZWdpc3Rlci4gIFdlIGFzc3VtZSB0aGUgT1MgaGFzIHNldCB1cAorICAvLyB0aGUgdmlydHVhbCB0aW1lciBwcm9wZXJseS4KKyAgaW50NjRfdCB2aXJ0dWFsX3RpbWVyX3ZhbHVlOworICBhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dmN0X2VsMCIgOiAiPXIiKHZpcnR1YWxfdGltZXJfdmFsdWUpKTsKKyAgcmV0dXJuIHZpcnR1YWxfdGltZXJfdmFsdWU7CisjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0gpCisgIC8vIFY2IGlzIHRoZSBlYXJsaWVzdCBhcmNoIHRoYXQgaGFzIGEgc3RhbmRhcmQgY3ljbGVjb3VudAorICAvLyBOYXRpdmUgQ2xpZW50IHZhbGlkYXRvciBkb2Vzbid0IGFsbG93IE1SQyBpbnN0cnVjdGlvbnMuCisjaWYgKF9fQVJNX0FSQ0ggPj0gNikKKyAgdWludDMyX3QgcG1jY250cjsKKyAgdWludDMyX3QgcG11c2VyZW47CisgIHVpbnQzMl90IHBtY250ZW5zZXQ7CisgIC8vIFJlYWQgdGhlIHVzZXIgbW9kZSBwZXJmIG1vbml0b3IgY291bnRlciBhY2Nlc3MgcGVybWlzc2lvbnMuCisgIGFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTQsIDAiIDogIj1yIihwbXVzZXJlbikpOworICBpZiAocG11c2VyZW4gJiAxKSB7ICAvLyBBbGxvd3MgcmVhZGluZyBwZXJmbW9uIGNvdW50ZXJzIGZvciB1c2VyIG1vZGUgY29kZS4KKyAgICBhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEyLCAxIiA6ICI9ciIocG1jbnRlbnNldCkpOworICAgIGlmIChwbWNudGVuc2V0ICYgMHg4MDAwMDAwMHVsKSB7ICAvLyBJcyBpdCBjb3VudGluZz8KKyAgICAgIGFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogIj1yIihwbWNjbnRyKSk7CisgICAgICAvLyBUaGUgY291bnRlciBpcyBzZXQgdXAgdG8gY291bnQgZXZlcnkgNjR0aCBjeWNsZQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KHBtY2NudHIpICogNjQ7ICAvLyBTaG91bGQgb3B0aW1pemUgdG8gPDwgNgorICAgIH0KKyAgfQorI2VuZGlmCisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBnZXR0aW1lb2ZkYXkoJnR2LCBudWxscHRyKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KHR2LnR2X3NlYykgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisgIC8vIG1pcHMgYXBwYXJlbnRseSBvbmx5IGFsbG93cyByZHRzYyBmb3Igc3VwZXJ1c2Vycywgc28gd2UgZmFsbAorICAvLyBiYWNrIHRvIGdldHRpbWVvZmRheS4gIEl0J3MgcG9zc2libGUgY2xvY2tfZ2V0dGltZSB3b3VsZCBiZSBiZXR0ZXIuCisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBnZXR0aW1lb2ZkYXkoJnR2LCBudWxscHRyKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KHR2LnR2X3NlYykgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKKyNlbHNlCisvLyBUaGUgc29mdCBmYWlsb3ZlciB0byBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaXMgYXV0b21hdGljIG9ubHkgZm9yIEFSTS4KKy8vIEZvciBvdGhlciBwbGF0Zm9ybXMgdGhlIGRldmVsb3BlciBpcyBleHBlY3RlZCB0byBtYWtlIGFuIGF0dGVtcHQgdG8gY3JlYXRlCisvLyBhIGZhc3QgaW1wbGVtZW50YXRpb24gYW5kIHVzZSBnZW5lcmljIHZlcnNpb24gaWYgbm90aGluZyBiZXR0ZXIgaXMgYXZhaWxhYmxlLgorI2Vycm9yIFlvdSBuZWVkIHRvIGRlZmluZSBDeWNsZVRpbWVyIGZvciB5b3VyIE9TIGFuZCBDUFUKKyNlbmRpZgorfQorfSAgLy8gZW5kIG5hbWVzcGFjZSBjeWNsZWNsb2NrCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19DWUNMRUNMT0NLX0hfCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9pbnRlcm5hbF9tYWNyb3MuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2ludGVybmFsX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGY1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9pbnRlcm5hbF9tYWNyb3MuaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIEJFTkNITUFSS19JTlRFUk5BTF9NQUNST1NfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0lOVEVSTkFMX01BQ1JPU19IXworCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFyay5oIgorCisjaWZuZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgX19oYXNfZmVhdHVyZSh4KSAwCisjZW5kaWYKKyNpZm5kZWYgX19oYXNfYnVpbHRpbgorI2RlZmluZSBfX2hhc19idWlsdGluKHgpIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisgICNpZiAhZGVmaW5lZChDT01QSUxFUl9DTEFORykKKyAgICAjZGVmaW5lIENPTVBJTEVSX0NMQU5HCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgI2lmICFkZWZpbmVkKENPTVBJTEVSX01TVkMpCisgICAgI2RlZmluZSBDT01QSUxFUl9NU1ZDCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgI2lmICFkZWZpbmVkKENPTVBJTEVSX0dDQykKKyAgICAjZGVmaW5lIENPTVBJTEVSX0dDQworICAjZW5kaWYKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShjeHhfYXR0cmlidXRlcykKKyAgI2RlZmluZSBCRU5DSE1BUktfTk9SRVRVUk4gW1tub3JldHVybl1dCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorICAjZGVmaW5lIEJFTkNITUFSS19OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCisjZWxpZiBkZWZpbmVkKENPTVBJTEVSX01TVkMpCisgICNkZWZpbmUgQkVOQ0hNQVJLX05PUkVUVVJOIF9fZGVjbHNwZWMobm9yZXR1cm4pCisjZWxzZQorICAjZGVmaW5lIEJFTkNITUFSS19OT1JFVFVSTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisgICNkZWZpbmUgQkVOQ0hNQVJLX09TX0NZR1dJTiAxCisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfV0lORE9XUyAxCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgI2luY2x1ZGUgIlRhcmdldENvbmRpdGlvbmFscy5oIgorICAjaWYgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQorICAgICNkZWZpbmUgQkVOQ0hNQVJLX09TX01BQ09TWCAxCisgICAgI2lmIGRlZmluZWQoVEFSR0VUX09TX0lQSE9ORSkKKyAgICAgICNkZWZpbmUgQkVOQ0hNQVJLX09TX0lPUyAxCisgICAgI2VuZGlmCisgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfRlJFRUJTRCAxCisjZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisgICNkZWZpbmUgQkVOQ0hNQVJLX09TX05FVEJTRCAxCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfTElOVVggMQorI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyAgI2RlZmluZSBCRU5DSE1BUktfT1NfTkFDTCAxCisjZWxpZiBkZWZpbmVkKEVNU0NSSVBURU4pCisgICNkZWZpbmUgQkVOQ0hNQVJLX09TX0VNU0NSSVBURU4gMQorI2VsaWYgZGVmaW5lZChfX3J0ZW1zX18pCisgICNkZWZpbmUgQkVOQ0hNQVJLX09TX1JURU1TIDEKKyNlbmRpZgorCisjaWYgIV9faGFzX2ZlYXR1cmUoY3h4X2V4Y2VwdGlvbnMpICYmICFkZWZpbmVkKF9fY3BwX2V4Y2VwdGlvbnMpIFwKKyAgICAgJiYgIWRlZmluZWQoX19FWENFUFRJT05TKQorICAjZGVmaW5lIEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTVBJTEVSX0NMQU5HKSB8fCBkZWZpbmVkKENPTVBJTEVSX0dDQykKKyAgI2RlZmluZSBCRU5DSE1BUktfTUFZQkVfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZWxzZQorICAjZGVmaW5lIEJFTkNITUFSS19NQVlCRV9VTlVTRUQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT01QSUxFUl9HQ0MpIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX3VucmVhY2hhYmxlKQorICAjZGVmaW5lIEJFTkNITUFSS19VTlJFQUNIQUJMRSgpIF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpCisjZWxpZiBkZWZpbmVkKENPTVBJTEVSX01TVkMpCisgICNkZWZpbmUgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCkgX19hc3N1bWUoZmFsc2UpCisjZWxzZQorICAjZGVmaW5lIEJFTkNITUFSS19VTlJFQUNIQUJMRSgpICgodm9pZCkwKQorI2VuZGlmCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX0lOVEVSTkFMX01BQ1JPU19IXwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvanNvbl9yZXBvcnRlci5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2pzb25fcmVwb3J0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZTMwMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2pzb25fcmVwb3J0ZXIuY2MKQEAgLTAsMCArMSwyMDEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAiY29tcGxleGl0eS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPiAvLyBmb3Igc2V0cHJlY2lzaW9uCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAic3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIEZvcm1hdEtWKHN0ZDo6c3RyaW5nIGNvbnN0JiBrZXksIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSkgeworICByZXR1cm4gU3RyaW5nUHJpbnRGKCJcIiVzXCI6IFwiJXNcIiIsIGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKK30KKworc3RkOjpzdHJpbmcgRm9ybWF0S1Yoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmV0dXJuIFN0cmluZ1ByaW50RigiXCIlc1wiOiBcIiVzXCIiLCBrZXkuY19zdHIoKSwgdmFsdWUpOworfQorCitzdGQ6OnN0cmluZyBGb3JtYXRLVihzdGQ6OnN0cmluZyBjb25zdCYga2V5LCBib29sIHZhbHVlKSB7CisgIHJldHVybiBTdHJpbmdQcmludEYoIlwiJXNcIjogJXMiLCBrZXkuY19zdHIoKSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKworc3RkOjpzdHJpbmcgRm9ybWF0S1Yoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgaW50NjRfdCB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgJyInIDw8IGtleSA8PCAiXCI6ICIgPDwgdmFsdWU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRm9ybWF0S1Yoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgZG91YmxlIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAnIicgPDwga2V5IDw8ICJcIjogIjsKKworICBjb25zdCBhdXRvIG1heF9kaWdpdHMxMCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUgKHZhbHVlKT46Om1heF9kaWdpdHMxMDsKKyAgY29uc3QgYXV0byBtYXhfZnJhY3Rpb25hbF9kaWdpdHMxMCA9IG1heF9kaWdpdHMxMCAtIDE7CisKKyAgc3MgPDwgc3RkOjpzY2llbnRpZmljIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKG1heF9mcmFjdGlvbmFsX2RpZ2l0czEwKSA8PCB2YWx1ZTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitpbnQ2NF90IFJvdW5kRG91YmxlKGRvdWJsZSB2KSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90Pih2ICsgMC41KTsgfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlCisKK2Jvb2wgSlNPTlJlcG9ydGVyOjpSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQpIHsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSBHZXRPdXRwdXRTdHJlYW0oKTsKKworICBvdXQgPDwgIntcbiI7CisgIHN0ZDo6c3RyaW5nIGlubmVyX2luZGVudCgyLCAnICcpOworCisgIC8vIE9wZW4gY29udGV4dCBibG9jayBhbmQgcHJpbnQgY29udGV4dCBpbmZvcm1hdGlvbi4KKyAgb3V0IDw8IGlubmVyX2luZGVudCA8PCAiXCJjb250ZXh0XCI6IHtcbiI7CisgIHN0ZDo6c3RyaW5nIGluZGVudCg0LCAnICcpOworCisgIHN0ZDo6c3RyaW5nIHdhbGx0aW1lX3ZhbHVlID0gTG9jYWxEYXRlVGltZVN0cmluZygpOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJkYXRlIiwgd2FsbHRpbWVfdmFsdWUpIDw8ICIsXG4iOworCisgIENQVUluZm8gY29uc3QmIGluZm8gPSBjb250ZXh0LmNwdV9pbmZvOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJudW1fY3B1cyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KGluZm8ubnVtX2NwdXMpKQorICAgICAgPDwgIixcbiI7CisgIG91dCA8PCBpbmRlbnQKKyAgICAgIDw8IEZvcm1hdEtWKCJtaHpfcGVyX2NwdSIsCisgICAgICAgICAgICAgICAgICBSb3VuZERvdWJsZShpbmZvLmN5Y2xlc19wZXJfc2Vjb25kIC8gMTAwMDAwMC4wKSkKKyAgICAgIDw8ICIsXG4iOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJjcHVfc2NhbGluZ19lbmFibGVkIiwgaW5mby5zY2FsaW5nX2VuYWJsZWQpCisgICAgICA8PCAiLFxuIjsKKworICBvdXQgPDwgaW5kZW50IDw8ICJcImNhY2hlc1wiOiBbXG4iOworICBpbmRlbnQgPSBzdGQ6OnN0cmluZyg2LCAnICcpOworICBzdGQ6OnN0cmluZyBjYWNoZV9pbmRlbnQoOCwgJyAnKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvLmNhY2hlcy5zaXplKCk7ICsraSkgeworICAgIGF1dG8mIENJID0gaW5mby5jYWNoZXNbaV07CisgICAgb3V0IDw8IGluZGVudCA8PCAie1xuIjsKKyAgICBvdXQgPDwgY2FjaGVfaW5kZW50IDw8IEZvcm1hdEtWKCJ0eXBlIiwgQ0kudHlwZSkgPDwgIixcbiI7CisgICAgb3V0IDw8IGNhY2hlX2luZGVudCA8PCBGb3JtYXRLVigibGV2ZWwiLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihDSS5sZXZlbCkpCisgICAgICAgIDw8ICIsXG4iOworICAgIG91dCA8PCBjYWNoZV9pbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoInNpemUiLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihDSS5zaXplKSAqIDEwMDB1KSA8PCAiLFxuIjsKKyAgICBvdXQgPDwgY2FjaGVfaW5kZW50CisgICAgICAgIDw8IEZvcm1hdEtWKCJudW1fc2hhcmluZyIsIHN0YXRpY19jYXN0PGludDY0X3Q+KENJLm51bV9zaGFyaW5nKSkKKyAgICAgICAgPDwgIlxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJ9IjsKKyAgICBpZiAoaSAhPSBpbmZvLmNhY2hlcy5zaXplKCkgLSAxKSBvdXQgPDwgIiwiOworICAgIG91dCA8PCAiXG4iOworICB9CisgIGluZGVudCA9IHN0ZDo6c3RyaW5nKDQsICcgJyk7CisgIG91dCA8PCBpbmRlbnQgPDwgIl0sXG4iOworCisjaWYgZGVmaW5lZChOREVCVUcpCisgIGNvbnN0IGNoYXIgYnVpbGRfdHlwZVtdID0gInJlbGVhc2UiOworI2Vsc2UKKyAgY29uc3QgY2hhciBidWlsZF90eXBlW10gPSAiZGVidWciOworI2VuZGlmCisgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoImxpYnJhcnlfYnVpbGRfdHlwZSIsIGJ1aWxkX3R5cGUpIDw8ICJcbiI7CisgIC8vIENsb3NlIGNvbnRleHQgYmxvY2sgYW5kIG9wZW4gdGhlIGxpc3Qgb2YgYmVuY2htYXJrcy4KKyAgb3V0IDw8IGlubmVyX2luZGVudCA8PCAifSxcbiI7CisgIG91dCA8PCBpbm5lcl9pbmRlbnQgPDwgIlwiYmVuY2htYXJrc1wiOiBbXG4iOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKU09OUmVwb3J0ZXI6OlJlcG9ydFJ1bnMoc3RkOjp2ZWN0b3I8UnVuPiBjb25zdCYgcmVwb3J0cykgeworICBpZiAocmVwb3J0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6c3RyaW5nIGluZGVudCg0LCAnICcpOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IEdldE91dHB1dFN0cmVhbSgpOworICBpZiAoIWZpcnN0X3JlcG9ydF8pIHsKKyAgICBvdXQgPDwgIixcbiI7CisgIH0KKyAgZmlyc3RfcmVwb3J0XyA9IGZhbHNlOworCisgIGZvciAoYXV0byBpdCA9IHJlcG9ydHMuYmVnaW4oKTsgaXQgIT0gcmVwb3J0cy5lbmQoKTsgKytpdCkgeworICAgIG91dCA8PCBpbmRlbnQgPDwgIntcbiI7CisgICAgUHJpbnRSdW5EYXRhKCppdCk7CisgICAgb3V0IDw8IGluZGVudCA8PCAnfSc7CisgICAgYXV0byBpdF9jcCA9IGl0OworICAgIGlmICgrK2l0X2NwICE9IHJlcG9ydHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLFxuIjsKKyAgICB9CisgIH0KK30KKwordm9pZCBKU09OUmVwb3J0ZXI6OkZpbmFsaXplKCkgeworICAvLyBDbG9zZSB0aGUgbGlzdCBvZiBiZW5jaG1hcmtzIGFuZCB0aGUgdG9wIGxldmVsIG9iamVjdC4KKyAgR2V0T3V0cHV0U3RyZWFtKCkgPDwgIlxuICBdXG59XG4iOworfQorCit2b2lkIEpTT05SZXBvcnRlcjo6UHJpbnRSdW5EYXRhKFJ1biBjb25zdCYgcnVuKSB7CisgIHN0ZDo6c3RyaW5nIGluZGVudCg2LCAnICcpOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IEdldE91dHB1dFN0cmVhbSgpOworICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJuYW1lIiwgcnVuLmJlbmNobWFya19uYW1lKSA8PCAiLFxuIjsKKyAgaWYgKHJ1bi5lcnJvcl9vY2N1cnJlZCkgeworICAgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoImVycm9yX29jY3VycmVkIiwgcnVuLmVycm9yX29jY3VycmVkKSA8PCAiLFxuIjsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJlcnJvcl9tZXNzYWdlIiwgcnVuLmVycm9yX21lc3NhZ2UpIDw8ICIsXG4iOworICB9CisgIGlmICghcnVuLnJlcG9ydF9iaWdfbyAmJiAhcnVuLnJlcG9ydF9ybXMpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJpdGVyYXRpb25zIiwgcnVuLml0ZXJhdGlvbnMpIDw8ICIsXG4iOworICAgIG91dCA8PCBpbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoInJlYWxfdGltZSIsIHJ1bi5HZXRBZGp1c3RlZFJlYWxUaW1lKCkpCisgICAgICAgIDw8ICIsXG4iOworICAgIG91dCA8PCBpbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoImNwdV90aW1lIiwgcnVuLkdldEFkanVzdGVkQ1BVVGltZSgpKTsKKyAgICBvdXQgPDwgIixcbiIKKyAgICAgICAgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJ0aW1lX3VuaXQiLCBHZXRUaW1lVW5pdFN0cmluZyhydW4udGltZV91bml0KSk7CisgIH0gZWxzZSBpZiAocnVuLnJlcG9ydF9iaWdfbykgeworICAgIG91dCA8PCBpbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoImNwdV9jb2VmZmljaWVudCIsIHJ1bi5HZXRBZGp1c3RlZENQVVRpbWUoKSkKKyAgICAgICAgPDwgIixcbiI7CisgICAgb3V0IDw8IGluZGVudAorICAgICAgICA8PCBGb3JtYXRLVigicmVhbF9jb2VmZmljaWVudCIsIHJ1bi5HZXRBZGp1c3RlZFJlYWxUaW1lKCkpCisgICAgICAgIDw8ICIsXG4iOworICAgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoImJpZ19vIiwgR2V0QmlnT1N0cmluZyhydW4uY29tcGxleGl0eSkpIDw8ICIsXG4iOworICAgIG91dCA8PCBpbmRlbnQgPDwgRm9ybWF0S1YoInRpbWVfdW5pdCIsIEdldFRpbWVVbml0U3RyaW5nKHJ1bi50aW1lX3VuaXQpKTsKKyAgfSBlbHNlIGlmIChydW4ucmVwb3J0X3JtcykgeworICAgIG91dCA8PCBpbmRlbnQKKyAgICAgICAgPDwgRm9ybWF0S1YoInJtcyIsIHJ1bi5HZXRBZGp1c3RlZENQVVRpbWUoKSk7CisgIH0KKyAgaWYgKHJ1bi5ieXRlc19wZXJfc2Vjb25kID4gMC4wKSB7CisgICAgb3V0IDw8ICIsXG4iCisgICAgICAgIDw8IGluZGVudAorICAgICAgICA8PCBGb3JtYXRLVigiYnl0ZXNfcGVyX3NlY29uZCIsIHJ1bi5ieXRlc19wZXJfc2Vjb25kKTsKKyAgfQorICBpZiAocnVuLml0ZW1zX3Blcl9zZWNvbmQgPiAwLjApIHsKKyAgICBvdXQgPDwgIixcbiIKKyAgICAgICAgPDwgaW5kZW50CisgICAgICAgIDw8IEZvcm1hdEtWKCJpdGVtc19wZXJfc2Vjb25kIiwgcnVuLml0ZW1zX3Blcl9zZWNvbmQpOworICB9CisgIGZvcihhdXRvICZjIDogcnVuLmNvdW50ZXJzKSB7CisgICAgb3V0IDw8ICIsXG4iCisgICAgICAgIDw8IGluZGVudAorICAgICAgICA8PCBGb3JtYXRLVihjLmZpcnN0LCBjLnNlY29uZCk7CisgIH0KKyAgaWYgKCFydW4ucmVwb3J0X2xhYmVsLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIixcbiIgPDwgaW5kZW50IDw8IEZvcm1hdEtWKCJsYWJlbCIsIHJ1bi5yZXBvcnRfbGFiZWwpOworICB9CisgIG91dCA8PCAnXG4nOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9sb2cuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmUxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9sb2cuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIEJFTkNITUFSS19MT0dfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX0xPR19IXworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyPiYoRW5kTFR5cGUpKHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyPiYpOworCitjbGFzcyBMb2dUeXBlIHsKKyAgZnJpZW5kIExvZ1R5cGUmIEdldE51bGxMb2dJbnN0YW5jZSgpOworICBmcmllbmQgTG9nVHlwZSYgR2V0RXJyb3JMb2dJbnN0YW5jZSgpOworCisgIC8vIEZJWE1FOiBBZGQgbG9ja2luZyB0byBvdXRwdXQuCisgIHRlbXBsYXRlIDxjbGFzcyBUcD4KKyAgZnJpZW5kIExvZ1R5cGUmIG9wZXJhdG9yPDwoTG9nVHlwZSYsIFRwIGNvbnN0Jik7CisgIGZyaWVuZCBMb2dUeXBlJiBvcGVyYXRvcjw8KExvZ1R5cGUmLCBFbmRMVHlwZSopOworCisgcHJpdmF0ZToKKyAgTG9nVHlwZShzdGQ6Om9zdHJlYW0qIG91dCkgOiBvdXRfKG91dCkge30KKyAgc3RkOjpvc3RyZWFtKiBvdXRfOworICBCRU5DSE1BUktfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvZ1R5cGUpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRwPgorTG9nVHlwZSYgb3BlcmF0b3I8PChMb2dUeXBlJiBsb2csIFRwIGNvbnN0JiB2YWx1ZSkgeworICBpZiAobG9nLm91dF8pIHsKKyAgICAqbG9nLm91dF8gPDwgdmFsdWU7CisgIH0KKyAgcmV0dXJuIGxvZzsKK30KKworaW5saW5lIExvZ1R5cGUmIG9wZXJhdG9yPDwoTG9nVHlwZSYgbG9nLCBFbmRMVHlwZSogbSkgeworICBpZiAobG9nLm91dF8pIHsKKyAgICAqbG9nLm91dF8gPDwgbTsKKyAgfQorICByZXR1cm4gbG9nOworfQorCitpbmxpbmUgaW50JiBMb2dMZXZlbCgpIHsKKyAgc3RhdGljIGludCBsb2dfbGV2ZWwgPSAwOworICByZXR1cm4gbG9nX2xldmVsOworfQorCitpbmxpbmUgTG9nVHlwZSYgR2V0TnVsbExvZ0luc3RhbmNlKCkgeworICBzdGF0aWMgTG9nVHlwZSBsb2cobnVsbHB0cik7CisgIHJldHVybiBsb2c7Cit9CisKK2lubGluZSBMb2dUeXBlJiBHZXRFcnJvckxvZ0luc3RhbmNlKCkgeworICBzdGF0aWMgTG9nVHlwZSBsb2coJnN0ZDo6Y2xvZyk7CisgIHJldHVybiBsb2c7Cit9CisKK2lubGluZSBMb2dUeXBlJiBHZXRMb2dJbnN0YW5jZUZvckxldmVsKGludCBsZXZlbCkgeworICBpZiAobGV2ZWwgPD0gTG9nTGV2ZWwoKSkgeworICAgIHJldHVybiBHZXRFcnJvckxvZ0luc3RhbmNlKCk7CisgIH0KKyAgcmV0dXJuIEdldE51bGxMb2dJbnN0YW5jZSgpOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZGVmaW5lIFZMT0coeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICg6OmJlbmNobWFyazo6aW50ZXJuYWw6OkdldExvZ0luc3RhbmNlRm9yTGV2ZWwoeCkgPDwgIi0tIExPRygiIDw8IHggPDwgIik6IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL211dGV4LmggYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDYxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9tdXRleC5oCkBAIC0wLDAgKzEsMTU1IEBACisjaWZuZGVmIEJFTkNITUFSS19NVVRFWF9IXworI2RlZmluZSBCRU5DSE1BUktfTVVURVhfSF8KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisKKy8vIEVuYWJsZSB0aHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMgb25seSB3aXRoIGNsYW5nLgorLy8gVGhlIGF0dHJpYnV0ZXMgY2FuIGJlIHNhZmVseSBlcmFzZWQgd2hlbiBjb21waWxpbmcgd2l0aCBvdGhlciBjb21waWxlcnMuCisjaWYgZGVmaW5lZChIQVZFX1RIUkVBRF9TQUZFVFlfQVRUUklCVVRFUykKKyNkZWZpbmUgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oeCkgX19hdHRyaWJ1dGVfXygoeCkpCisjZWxzZQorI2RlZmluZSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyh4KSAgLy8gbm8tb3AKKyNlbmRpZgorCisjZGVmaW5lIENBUEFCSUxJVFkoeCkgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oY2FwYWJpbGl0eSh4KSkKKworI2RlZmluZSBTQ09QRURfQ0FQQUJJTElUWSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhzY29wZWRfbG9ja2FibGUpCisKKyNkZWZpbmUgR1VBUkRFRF9CWSh4KSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhndWFyZGVkX2J5KHgpKQorCisjZGVmaW5lIFBUX0dVQVJERURfQlkoeCkgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocHRfZ3VhcmRlZF9ieSh4KSkKKworI2RlZmluZSBBQ1FVSVJFRF9CRUZPUkUoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFjcXVpcmVkX2JlZm9yZShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgQUNRVUlSRURfQUZURVIoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFjcXVpcmVkX2FmdGVyKF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBSRVFVSVJFUyguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocmVxdWlyZXNfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgUkVRVUlSRVNfU0hBUkVEKC4uLikgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgQUNRVUlSRSguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oYWNxdWlyZV9jYXBhYmlsaXR5KF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBBQ1FVSVJFX1NIQVJFRCguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgUkVMRUFTRSguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocmVsZWFzZV9jYXBhYmlsaXR5KF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBSRUxFQVNFX1NIQVJFRCguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eShfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgVFJZX0FDUVVJUkUoLi4uKSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHRyeV9hY3F1aXJlX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIFRSWV9BQ1FVSVJFX1NIQVJFRCguLi4pIFwKKyAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18odHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEVYQ0xVREVTKC4uLikgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18obG9ja3NfZXhjbHVkZWQoX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEFTU0VSVF9DQVBBQklMSVRZKHgpIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFzc2VydF9jYXBhYmlsaXR5KHgpKQorCisjZGVmaW5lIEFTU0VSVF9TSEFSRURfQ0FQQUJJTElUWSh4KSBcCisgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSh4KSkKKworI2RlZmluZSBSRVRVUk5fQ0FQQUJJTElUWSh4KSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhsb2NrX3JldHVybmVkKHgpKQorCisjZGVmaW5lIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgXAorICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzKQorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKwordHlwZWRlZiBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBDb25kaXRpb247CisKKy8vIE5PVEU6IFdyYXBwZXJzIGZvciBzdGQ6Om11dGV4IGFuZCBzdGQ6OnVuaXF1ZV9sb2NrIGFyZSBwcm92aWRlZCBzbyB0aGF0CisvLyB3ZSBjYW4gYW5ub3RhdGUgdGhlbSB3aXRoIHRocmVhZCBzYWZldHkgYXR0cmlidXRlcyBhbmQgdXNlIHRoZQorLy8gLVd0aHJlYWQtc2FmZXR5IHdhcm5pbmcgd2l0aCBjbGFuZy4gVGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgY2Fubm90IGJlCisvLyB1c2VkIGRpcmVjdGx5IGJlY2F1c2UgdGhleSBkbyBub3QgcHJvdmlkZWQgdGhlIHJlcXVpcmVkIGFubm90YXRpb25zLgorY2xhc3MgQ0FQQUJJTElUWSgibXV0ZXgiKSBNdXRleCB7CisgcHVibGljOgorICBNdXRleCgpIHt9CisKKyAgdm9pZCBsb2NrKCkgQUNRVUlSRSgpIHsgbXV0Xy5sb2NrKCk7IH0KKyAgdm9pZCB1bmxvY2soKSBSRUxFQVNFKCkgeyBtdXRfLnVubG9jaygpOyB9CisgIHN0ZDo6bXV0ZXgmIG5hdGl2ZV9oYW5kbGUoKSB7IHJldHVybiBtdXRfOyB9CisKKyBwcml2YXRlOgorICBzdGQ6Om11dGV4IG11dF87Cit9OworCitjbGFzcyBTQ09QRURfQ0FQQUJJTElUWSBNdXRleExvY2sgeworICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTXV0ZXhMb2NrSW1wOworCisgcHVibGljOgorICBNdXRleExvY2soTXV0ZXgmIG0pIEFDUVVJUkUobSkgOiBtbF8obS5uYXRpdmVfaGFuZGxlKCkpIHt9CisgIH5NdXRleExvY2soKSBSRUxFQVNFKCkge30KKyAgTXV0ZXhMb2NrSW1wJiBuYXRpdmVfaGFuZGxlKCkgeyByZXR1cm4gbWxfOyB9CisKKyBwcml2YXRlOgorICBNdXRleExvY2tJbXAgbWxfOworfTsKKworY2xhc3MgQmFycmllciB7CisgcHVibGljOgorICBCYXJyaWVyKGludCBudW1fdGhyZWFkcykgOiBydW5uaW5nX3RocmVhZHNfKG51bV90aHJlYWRzKSB7fQorCisgIC8vIENhbGxlZCBieSBlYWNoIHRocmVhZAorICBib29sIHdhaXQoKSBFWENMVURFUyhsb2NrXykgeworICAgIGJvb2wgbGFzdF90aHJlYWQgPSBmYWxzZTsKKyAgICB7CisgICAgICBNdXRleExvY2sgbWwobG9ja18pOworICAgICAgbGFzdF90aHJlYWQgPSBjcmVhdGVCYXJyaWVyKG1sKTsKKyAgICB9CisgICAgaWYgKGxhc3RfdGhyZWFkKSBwaGFzZV9jb25kaXRpb25fLm5vdGlmeV9hbGwoKTsKKyAgICByZXR1cm4gbGFzdF90aHJlYWQ7CisgIH0KKworICB2b2lkIHJlbW92ZVRocmVhZCgpIEVYQ0xVREVTKGxvY2tfKSB7CisgICAgTXV0ZXhMb2NrIG1sKGxvY2tfKTsKKyAgICAtLXJ1bm5pbmdfdGhyZWFkc187CisgICAgaWYgKGVudGVyZWRfICE9IDApIHBoYXNlX2NvbmRpdGlvbl8ubm90aWZ5X2FsbCgpOworICB9CisKKyBwcml2YXRlOgorICBNdXRleCBsb2NrXzsKKyAgQ29uZGl0aW9uIHBoYXNlX2NvbmRpdGlvbl87CisgIGludCBydW5uaW5nX3RocmVhZHNfOworCisgIC8vIFN0YXRlIGZvciBiYXJyaWVyIG1hbmFnZW1lbnQKKyAgaW50IHBoYXNlX251bWJlcl8gPSAwOworICBpbnQgZW50ZXJlZF8gPSAwOyAgLy8gTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBoYXZlIGVudGVyZWQgdGhpcyBiYXJyaWVyCisKKyAgLy8gRW50ZXIgdGhlIGJhcnJpZXIgYW5kIHdhaXQgdW50aWwgYWxsIG90aGVyIHRocmVhZHMgaGF2ZSBhbHNvCisgIC8vIGVudGVyZWQgdGhlIGJhcnJpZXIuICBSZXR1cm5zIGlmZiB0aGlzIGlzIHRoZSBsYXN0IHRocmVhZCB0bworICAvLyBlbnRlciB0aGUgYmFycmllci4KKyAgYm9vbCBjcmVhdGVCYXJyaWVyKE11dGV4TG9jayYgbWwpIFJFUVVJUkVTKGxvY2tfKSB7CisgICAgQ0hFQ0tfTFQoZW50ZXJlZF8sIHJ1bm5pbmdfdGhyZWFkc18pOworICAgIGVudGVyZWRfKys7CisgICAgaWYgKGVudGVyZWRfIDwgcnVubmluZ190aHJlYWRzXykgeworICAgICAgLy8gV2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gZW50ZXIKKyAgICAgIGludCBwaGFzZV9udW1iZXJfY3AgPSBwaGFzZV9udW1iZXJfOworICAgICAgYXV0byBjYiA9IFt0aGlzLCBwaGFzZV9udW1iZXJfY3BdKCkgeworICAgICAgICByZXR1cm4gdGhpcy0+cGhhc2VfbnVtYmVyXyA+IHBoYXNlX251bWJlcl9jcCB8fAorICAgICAgICAgICAgICAgZW50ZXJlZF8gPT0gcnVubmluZ190aHJlYWRzXzsgIC8vIEEgdGhyZWFkIGhhcyBhYm9ydGVkIGluIGVycm9yCisgICAgICB9OworICAgICAgcGhhc2VfY29uZGl0aW9uXy53YWl0KG1sLm5hdGl2ZV9oYW5kbGUoKSwgY2IpOworICAgICAgaWYgKHBoYXNlX251bWJlcl8gPiBwaGFzZV9udW1iZXJfY3ApIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIGVsc2UgKHJ1bm5pbmdfdGhyZWFkc18gPT0gZW50ZXJlZF8pIGFuZCB3ZSBhcmUgdGhlIGxhc3QgdGhyZWFkLgorICAgIH0KKyAgICAvLyBMYXN0IHRocmVhZCBoYXMgcmVhY2hlZCB0aGUgYmFycmllcgorICAgIHBoYXNlX251bWJlcl8rKzsKKyAgICBlbnRlcmVkXyA9IDA7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCisKKyNlbmRpZiAgLy8gQkVOQ0hNQVJLX01VVEVYX0hfCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9yZS5oIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU5NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvcmUuaApAQCAtMCwwICsxLDE0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBCRU5DSE1BUktfUkVfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX1JFX0hfCisKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworLy8gUHJlZmVyIEMgcmVnZXggbGlicmFyaWVzIHdoZW4gY29tcGlsaW5nIHcvbyBleGNlcHRpb25zIHNvIHRoYXQgd2UgY2FuCisvLyBjb3JyZWN0bHkgcmVwb3J0IGVycm9ycy4KKyNpZiBkZWZpbmVkKEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUykgJiYgZGVmaW5lZChIQVZFX1NURF9SRUdFWCkgJiYgXAorICAgIChkZWZpbmVkKEhBVkVfR05VX1BPU0lYX1JFR0VYKSB8fCBkZWZpbmVkKEhBVkVfUE9TSVhfUkVHRVgpKQorI3VuZGVmIEhBVkVfU1REX1JFR0VYCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9TVERfUkVHRVgpCisjaW5jbHVkZSA8cmVnZXg+CisjZWxpZiBkZWZpbmVkKEhBVkVfR05VX1BPU0lYX1JFR0VYKQorI2luY2x1ZGUgPGdudXJlZ2V4Lmg+CisjZWxpZiBkZWZpbmVkKEhBVkVfUE9TSVhfUkVHRVgpCisjaW5jbHVkZSA8cmVnZXguaD4KKyNlbHNlCisjZXJyb3IgTm8gcmVndWxhciBleHByZXNzaW9uIGJhY2tlbmQgd2FzIGZvdW5kIQorI2VuZGlmCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIEEgd3JhcHBlciBhcm91bmQgdGhlIFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbiBBUEkgdGhhdCBwcm92aWRlcyBhdXRvbWF0aWMKKy8vIGNsZWFudXAKK2NsYXNzIFJlZ2V4IHsKKyBwdWJsaWM6CisgIFJlZ2V4KCkgOiBpbml0XyhmYWxzZSkge30KKworICB+UmVnZXgoKTsKKworICAvLyBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXIgZnJvbSBzcGVjLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vCisgIC8vIE9uIGZhaWx1cmUgKGFuZCBpZiBlcnJvciBpcyBub3QgbnVsbHB0ciksIGVycm9yIGlzIHBvcHVsYXRlZCB3aXRoIGEgaHVtYW4KKyAgLy8gcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuCisgIGJvb2wgSW5pdChjb25zdCBzdGQ6OnN0cmluZyYgc3BlYywgc3RkOjpzdHJpbmcqIGVycm9yKTsKKworICAvLyBSZXR1cm5zIHdoZXRoZXIgc3RyIG1hdGNoZXMgdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgYm9vbCBNYXRjaChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworIHByaXZhdGU6CisgIGJvb2wgaW5pdF87CisvLyBVbmRlcmx5aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QKKyNpZiBkZWZpbmVkKEhBVkVfU1REX1JFR0VYKQorICBzdGQ6OnJlZ2V4IHJlXzsKKyNlbGlmIGRlZmluZWQoSEFWRV9QT1NJWF9SRUdFWCkgfHwgZGVmaW5lZChIQVZFX0dOVV9QT1NJWF9SRUdFWCkKKyAgcmVnZXhfdCByZV87CisjZWxzZQorI2Vycm9yIE5vIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYWNrZW5kIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZQorI2VuZGlmCit9OworCisjaWYgZGVmaW5lZChIQVZFX1NURF9SRUdFWCkKKworaW5saW5lIGJvb2wgUmVnZXg6OkluaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNwZWMsIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworI2lmZGVmIEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUworICAoKHZvaWQpZXJyb3IpOyAvLyBzdXBwcmVzcyB1bnVzZWQgd2FybmluZworI2Vsc2UKKyAgdHJ5IHsKKyNlbmRpZgorICAgIHJlXyA9IHN0ZDo6cmVnZXgoc3BlYywgc3RkOjpyZWdleF9jb25zdGFudHM6OmV4dGVuZGVkKTsKKyAgICBpbml0XyA9IHRydWU7CisjaWZuZGVmIEJFTkNITUFSS19IQVNfTk9fRVhDRVBUSU9OUworICB9IGNhdGNoIChjb25zdCBzdGQ6OnJlZ2V4X2Vycm9yJiBlKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBlLndoYXQoKTsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gaW5pdF87Cit9CisKK2lubGluZSBSZWdleDo6flJlZ2V4KCkge30KKworaW5saW5lIGJvb2wgUmVnZXg6Ok1hdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgaWYgKCFpbml0XykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gc3RkOjpyZWdleF9zZWFyY2goc3RyLCByZV8pOworfQorCisjZWxzZQoraW5saW5lIGJvb2wgUmVnZXg6OkluaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNwZWMsIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBpbnQgZWMgPSByZWdjb21wKCZyZV8sIHNwZWMuY19zdHIoKSwgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKTsKKyAgaWYgKGVjICE9IDApIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgIHNpemVfdCBuZWVkZWQgPSByZWdlcnJvcihlYywgJnJlXywgbnVsbHB0ciwgMCk7CisgICAgICBjaGFyKiBlcnJidWYgPSBuZXcgY2hhcltuZWVkZWRdOworICAgICAgcmVnZXJyb3IoZWMsICZyZV8sIGVycmJ1ZiwgbmVlZGVkKTsKKworICAgICAgLy8gcmVnZXJyb3IgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBudWxsIHRlcm1pbmF0ZQorICAgICAgLy8gdGhlIHN0cmluZywgc28gd2UgbW92ZSB0aGF0IHdoZW4gYXNzaWduaW5nIHRvIGVycm9yLgorICAgICAgQ0hFQ0tfTkUobmVlZGVkLCAwKTsKKyAgICAgIGVycm9yLT5hc3NpZ24oZXJyYnVmLCBuZWVkZWQgLSAxKTsKKworICAgICAgZGVsZXRlW10gZXJyYnVmOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGluaXRfID0gdHJ1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBSZWdleDo6flJlZ2V4KCkgeworICBpZiAoaW5pdF8pIHsKKyAgICByZWdmcmVlKCZyZV8pOworICB9Cit9CisKK2lubGluZSBib29sIFJlZ2V4OjpNYXRjaChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIGlmICghaW5pdF8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJlZ2V4ZWMoJnJlXywgc3RyLmNfc3RyKCksIDAsIG51bGxwdHIsIDApID09IDA7Cit9CisjZW5kaWYKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworI2VuZGlmICAvLyBCRU5DSE1BUktfUkVfSF8KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3JlcG9ydGVyLmNjIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvcmVwb3J0ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZmEwNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3JlcG9ydGVyLmNjCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiZW5jaG1hcmsvYmVuY2htYXJrLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKK0JlbmNobWFya1JlcG9ydGVyOjpCZW5jaG1hcmtSZXBvcnRlcigpCisgICAgOiBvdXRwdXRfc3RyZWFtXygmc3RkOjpjb3V0KSwgZXJyb3Jfc3RyZWFtXygmc3RkOjpjZXJyKSB7fQorCitCZW5jaG1hcmtSZXBvcnRlcjo6fkJlbmNobWFya1JlcG9ydGVyKCkge30KKwordm9pZCBCZW5jaG1hcmtSZXBvcnRlcjo6UHJpbnRCYXNpY0NvbnRleHQoc3RkOjpvc3RyZWFtICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnN0ICZjb250ZXh0KSB7CisgIENIRUNLKG91dCkgPDwgImNhbm5vdCBiZSBudWxsIjsKKyAgYXV0byAmT3V0ID0gKm91dDsKKworICBPdXQgPDwgTG9jYWxEYXRlVGltZVN0cmluZygpIDw8ICJcbiI7CisKKyAgY29uc3QgQ1BVSW5mbyAmaW5mbyA9IGNvbnRleHQuY3B1X2luZm87CisgIE91dCA8PCAiUnVuIG9uICgiIDw8IGluZm8ubnVtX2NwdXMgPDwgIiBYICIKKyAgICAgIDw8IChpbmZvLmN5Y2xlc19wZXJfc2Vjb25kIC8gMTAwMDAwMC4wKSA8PCAiIE1IeiBDUFUgIgorICAgICAgPDwgKChpbmZvLm51bV9jcHVzID4gMSkgPyAicyIgOiAiIikgPDwgIilcbiI7CisgIGlmIChpbmZvLmNhY2hlcy5zaXplKCkgIT0gMCkgeworICAgIE91dCA8PCAiQ1BVIENhY2hlczpcbiI7CisgICAgZm9yIChhdXRvICZDSW5mbyA6IGluZm8uY2FjaGVzKSB7CisgICAgICBPdXQgPDwgIiAgTCIgPDwgQ0luZm8ubGV2ZWwgPDwgIiAiIDw8IENJbmZvLnR5cGUgPDwgIiAiCisgICAgICAgICAgPDwgKENJbmZvLnNpemUgLyAxMDAwKSA8PCAiSyI7CisgICAgICBpZiAoQ0luZm8ubnVtX3NoYXJpbmcgIT0gMCkKKyAgICAgICAgT3V0IDw8ICIgKHgiIDw8IChpbmZvLm51bV9jcHVzIC8gQ0luZm8ubnVtX3NoYXJpbmcpIDw8ICIpIjsKKyAgICAgIE91dCA8PCAiXG4iOworICAgIH0KKyAgfQorCisgIGlmIChpbmZvLnNjYWxpbmdfZW5hYmxlZCkgeworICAgIE91dCA8PCAiKioqV0FSTklORyoqKiBDUFUgc2NhbGluZyBpcyBlbmFibGVkLCB0aGUgYmVuY2htYXJrICIKKyAgICAgICAgICAgInJlYWwgdGltZSBtZWFzdXJlbWVudHMgbWF5IGJlIG5vaXN5IGFuZCB3aWxsIGluY3VyIGV4dHJhICIKKyAgICAgICAgICAgIm92ZXJoZWFkLlxuIjsKKyAgfQorCisjaWZuZGVmIE5ERUJVRworICBPdXQgPDwgIioqKldBUk5JTkcqKiogTGlicmFyeSB3YXMgYnVpbHQgYXMgREVCVUcuIFRpbWluZ3MgbWF5IGJlICIKKyAgICAgICAgICJhZmZlY3RlZC5cbiI7CisjZW5kaWYKK30KKworQmVuY2htYXJrUmVwb3J0ZXI6OkNvbnRleHQ6OkNvbnRleHQoKSA6IGNwdV9pbmZvKENQVUluZm86OkdldCgpKSB7fQorCitkb3VibGUgQmVuY2htYXJrUmVwb3J0ZXI6OlJ1bjo6R2V0QWRqdXN0ZWRSZWFsVGltZSgpIGNvbnN0IHsKKyAgZG91YmxlIG5ld190aW1lID0gcmVhbF9hY2N1bXVsYXRlZF90aW1lICogR2V0VGltZVVuaXRNdWx0aXBsaWVyKHRpbWVfdW5pdCk7CisgIGlmIChpdGVyYXRpb25zICE9IDApIG5ld190aW1lIC89IHN0YXRpY19jYXN0PGRvdWJsZT4oaXRlcmF0aW9ucyk7CisgIHJldHVybiBuZXdfdGltZTsKK30KKworZG91YmxlIEJlbmNobWFya1JlcG9ydGVyOjpSdW46OkdldEFkanVzdGVkQ1BVVGltZSgpIGNvbnN0IHsKKyAgZG91YmxlIG5ld190aW1lID0gY3B1X2FjY3VtdWxhdGVkX3RpbWUgKiBHZXRUaW1lVW5pdE11bHRpcGxpZXIodGltZV91bml0KTsKKyAgaWYgKGl0ZXJhdGlvbnMgIT0gMCkgbmV3X3RpbWUgLz0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdGVyYXRpb25zKTsKKyAgcmV0dXJuIG5ld190aW1lOworfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc2xlZXAuY2MgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9zbGVlcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFhMDRhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc2xlZXAuY2MKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInNsZWVwLmgiCisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjdGltZT4KKworI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCisjaWZkZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisjaWZkZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKy8vIFdpbmRvdydzIFNsZWVwIHRha2VzIG1pbGxpc2Vjb25kcyBhcmd1bWVudC4KK3ZvaWQgU2xlZXBGb3JNaWxsaXNlY29uZHMoaW50IG1pbGxpc2Vjb25kcykgeyBTbGVlcChtaWxsaXNlY29uZHMpOyB9Cit2b2lkIFNsZWVwRm9yU2Vjb25kcyhkb3VibGUgc2Vjb25kcykgeworICBTbGVlcEZvck1pbGxpc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ+KGtOdW1NaWxsaXNQZXJTZWNvbmQgKiBzZWNvbmRzKSk7Cit9CisjZWxzZSAgIC8vIEJFTkNITUFSS19PU19XSU5ET1dTCit2b2lkIFNsZWVwRm9yTWljcm9zZWNvbmRzKGludCBtaWNyb3NlY29uZHMpIHsKKyAgc3RydWN0IHRpbWVzcGVjIHNsZWVwX3RpbWU7CisgIHNsZWVwX3RpbWUudHZfc2VjID0gbWljcm9zZWNvbmRzIC8ga051bU1pY3Jvc1BlclNlY29uZDsKKyAgc2xlZXBfdGltZS50dl9uc2VjID0gKG1pY3Jvc2Vjb25kcyAlIGtOdW1NaWNyb3NQZXJTZWNvbmQpICoga051bU5hbm9zUGVyTWljcm87CisgIHdoaWxlIChuYW5vc2xlZXAoJnNsZWVwX3RpbWUsICZzbGVlcF90aW1lKSAhPSAwICYmIGVycm5vID09IEVJTlRSKQorICAgIDsgIC8vIElnbm9yZSBzaWduYWxzIGFuZCB3YWl0IGZvciB0aGUgZnVsbCBpbnRlcnZhbCB0byBlbGFwc2UuCit9CisKK3ZvaWQgU2xlZXBGb3JNaWxsaXNlY29uZHMoaW50IG1pbGxpc2Vjb25kcykgeworICBTbGVlcEZvck1pY3Jvc2Vjb25kcyhtaWxsaXNlY29uZHMgKiBrTnVtTWljcm9zUGVyTWlsbGkpOworfQorCit2b2lkIFNsZWVwRm9yU2Vjb25kcyhkb3VibGUgc2Vjb25kcykgeworICBTbGVlcEZvck1pY3Jvc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ+KHNlY29uZHMgKiBrTnVtTWljcm9zUGVyU2Vjb25kKSk7Cit9CisjZW5kaWYgIC8vIEJFTkNITUFSS19PU19XSU5ET1dTCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc2xlZXAuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3NsZWVwLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBCRU5DSE1BUktfU0xFRVBfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX1NMRUVQX0hfCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworY29uc3QgaW50IGtOdW1NaWxsaXNQZXJTZWNvbmQgPSAxMDAwOworY29uc3QgaW50IGtOdW1NaWNyb3NQZXJNaWxsaSA9IDEwMDA7Citjb25zdCBpbnQga051bU1pY3Jvc1BlclNlY29uZCA9IGtOdW1NaWxsaXNQZXJTZWNvbmQgKiAxMDAwOworY29uc3QgaW50IGtOdW1OYW5vc1Blck1pY3JvID0gMTAwMDsKK2NvbnN0IGludCBrTnVtTmFub3NQZXJTZWNvbmQgPSBrTnVtTmFub3NQZXJNaWNybyAqIGtOdW1NaWNyb3NQZXJTZWNvbmQ7CisKK3ZvaWQgU2xlZXBGb3JNaWxsaXNlY29uZHMoaW50IG1pbGxpc2Vjb25kcyk7Cit2b2lkIFNsZWVwRm9yU2Vjb25kcyhkb3VibGUgc2Vjb25kcyk7Cit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19TTEVFUF9IXwpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc3RhdGlzdGljcy5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzMmFkNAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuY2MKQEAgLTAsMCArMSwxNzUgQEAKKy8vIENvcHlyaWdodCAyMDE2IElzbWFlbCBKaW1lbmV6IE1hcnRpbmV6LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUm9tYW4gTGViZWRldi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJzdGF0aXN0aWNzLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCithdXRvIFN0YXRpc3RpY3NTdW0gPSBbXShjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2KSB7CisgIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUodi5iZWdpbigpLCB2LmVuZCgpLCAwLjApOworfTsKKworZG91YmxlIFN0YXRpc3RpY3NNZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpIHsKKyAgaWYgKHYuc2l6ZSgpID09IDApIHJldHVybiAwLjA7CisgIHJldHVybiBTdGF0aXN0aWNzU3VtKHYpICogKDEuMCAvIHYuc2l6ZSgpKTsKK30KKworZG91YmxlIFN0YXRpc3RpY3NNZWRpYW4oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICBpZiAodi5zaXplKCkgPCAzKSByZXR1cm4gU3RhdGlzdGljc01lYW4odik7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcGFydGlhbDsKKyAgLy8gd2UgbmVlZCByb3VuZERvd24oY291bnQvMikrMSBzbG90cworICBwYXJ0aWFsLnJlc2l6ZSgxICsgKHYuc2l6ZSgpIC8gMikpOworICBzdGQ6OnBhcnRpYWxfc29ydF9jb3B5KHYuYmVnaW4oKSwgdi5lbmQoKSwgcGFydGlhbC5iZWdpbigpLCBwYXJ0aWFsLmVuZCgpKTsKKyAgLy8gZGlkIHdlIGhhdmUgb2RkIG51bWJlciBvZiBzYW1wbGVzPworICAvLyBpZiB5ZXMsIHRoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiBwYXJ0aWFsbHktc29ydGVkIHZlY3RvciBpcyB0aGUgbWVkaWFuCisgIC8vIGl0IG5vLCB0aGVuIHRoZSBhdmVyYWdlIG9mIHRoZSBsYXN0IHR3byBlbGVtZW50cyBpcyB0aGUgbWVkaWFuCisgIGlmKHYuc2l6ZSgpICUgMiA9PSAxKQorICAgIHJldHVybiBwYXJ0aWFsLmJhY2soKTsKKyAgcmV0dXJuIChwYXJ0aWFsW3BhcnRpYWwuc2l6ZSgpIC0gMl0gKyBwYXJ0aWFsW3BhcnRpYWwuc2l6ZSgpIC0gMV0pIC8gMi4wOworfQorCisvLyBSZXR1cm4gdGhlIHN1bSBvZiB0aGUgc3F1YXJlcyBvZiB0aGlzIHNhbXBsZSBzZXQKK2F1dG8gU3VtU3F1YXJlcyA9IFtdKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpIHsKKyAgcmV0dXJuIHN0ZDo6aW5uZXJfcHJvZHVjdCh2LmJlZ2luKCksIHYuZW5kKCksIHYuYmVnaW4oKSwgMC4wKTsKK307CisKK2F1dG8gU3FyID0gW10oY29uc3QgZG91YmxlIGRhdCkgeyByZXR1cm4gZGF0ICogZGF0OyB9OworYXV0byBTcXJ0ID0gW10oY29uc3QgZG91YmxlIGRhdCkgeworICAvLyBBdm9pZCBOYU4gZHVlIHRvIGltcHJlY2lzaW9uIGluIHRoZSBjYWxjdWxhdGlvbnMKKyAgaWYgKGRhdCA8IDAuMCkgcmV0dXJuIDAuMDsKKyAgcmV0dXJuIHN0ZDo6c3FydChkYXQpOworfTsKKworZG91YmxlIFN0YXRpc3RpY3NTdGREZXYoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdikgeworICBjb25zdCBhdXRvIG1lYW4gPSBTdGF0aXN0aWNzTWVhbih2KTsKKyAgaWYgKHYuc2l6ZSgpID09IDApIHJldHVybiBtZWFuOworCisgIC8vIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgdW5kZWZpbmVkIGZvciBuID0gMQorICBpZiAodi5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gMC4wOworCisgIGNvbnN0IGRvdWJsZSBhdmdfc3F1YXJlcyA9IFN1bVNxdWFyZXModikgKiAoMS4wIC8gdi5zaXplKCkpOworICByZXR1cm4gU3FydCh2LnNpemUoKSAvICh2LnNpemUoKSAtIDEuMCkgKiAoYXZnX3NxdWFyZXMgLSBTcXIobWVhbikpKTsKK30KKworc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gQ29tcHV0ZVN0YXRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKSB7CisgIHR5cGVkZWYgQmVuY2htYXJrUmVwb3J0ZXI6OlJ1biBSdW47CisgIHN0ZDo6dmVjdG9yPFJ1bj4gcmVzdWx0czsKKworICBhdXRvIGVycm9yX2NvdW50ID0KKyAgICAgIHN0ZDo6Y291bnRfaWYocmVwb3J0cy5iZWdpbigpLCByZXBvcnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBbXShSdW4gY29uc3QmIHJ1bikgeyByZXR1cm4gcnVuLmVycm9yX29jY3VycmVkOyB9KTsKKworICBpZiAocmVwb3J0cy5zaXplKCkgLSBlcnJvcl9jb3VudCA8IDIpIHsKKyAgICAvLyBXZSBkb24ndCByZXBvcnQgYWdncmVnYXRlZCBkYXRhIGlmIHRoZXJlIHdhcyBhIHNpbmdsZSBydW4uCisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICAvLyBBY2N1bXVsYXRvcnMuCisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcmVhbF9hY2N1bXVsYXRlZF90aW1lX3N0YXQ7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY3B1X2FjY3VtdWxhdGVkX3RpbWVfc3RhdDsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBieXRlc19wZXJfc2Vjb25kX3N0YXQ7CisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gaXRlbXNfcGVyX3NlY29uZF9zdGF0OworCisgIHJlYWxfYWNjdW11bGF0ZWRfdGltZV9zdGF0LnJlc2VydmUocmVwb3J0cy5zaXplKCkpOworICBjcHVfYWNjdW11bGF0ZWRfdGltZV9zdGF0LnJlc2VydmUocmVwb3J0cy5zaXplKCkpOworICBieXRlc19wZXJfc2Vjb25kX3N0YXQucmVzZXJ2ZShyZXBvcnRzLnNpemUoKSk7CisgIGl0ZW1zX3Blcl9zZWNvbmRfc3RhdC5yZXNlcnZlKHJlcG9ydHMuc2l6ZSgpKTsKKworICAvLyBBbGwgcmVwZXRpdGlvbnMgc2hvdWxkIGJlIHJ1biB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVyYXRpb25zIHNvIHdlCisgIC8vIGNhbiB0YWtlIHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlyc3QgYmVuY2htYXJrLgorICBpbnQ2NF90IGNvbnN0IHJ1bl9pdGVyYXRpb25zID0gcmVwb3J0cy5mcm9udCgpLml0ZXJhdGlvbnM7CisgIC8vIGNyZWF0ZSBzdGF0cyBmb3IgdXNlciBjb3VudGVycworICBzdHJ1Y3QgQ291bnRlclN0YXQgeworICAgIENvdW50ZXIgYzsKKyAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHM7CisgIH07CisgIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZywgQ291bnRlclN0YXQgPiBjb3VudGVyX3N0YXRzOworICBmb3IoUnVuIGNvbnN0JiByIDogcmVwb3J0cykgeworICAgIGZvcihhdXRvIGNvbnN0JiBjbnQgOiByLmNvdW50ZXJzKSB7CisgICAgICBhdXRvIGl0ID0gY291bnRlcl9zdGF0cy5maW5kKGNudC5maXJzdCk7CisgICAgICBpZihpdCA9PSBjb3VudGVyX3N0YXRzLmVuZCgpKSB7CisgICAgICAgIGNvdW50ZXJfc3RhdHMuaW5zZXJ0KHtjbnQuZmlyc3QsIHtjbnQuc2Vjb25kLCBzdGQ6OnZlY3Rvcjxkb3VibGU+e319fSk7CisgICAgICAgIGl0ID0gY291bnRlcl9zdGF0cy5maW5kKGNudC5maXJzdCk7CisgICAgICAgIGl0LT5zZWNvbmQucy5yZXNlcnZlKHJlcG9ydHMuc2l6ZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLX0VRKGNvdW50ZXJfc3RhdHNbY250LmZpcnN0XS5jLmZsYWdzLCBjbnQuc2Vjb25kLmZsYWdzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBQb3B1bGF0ZSB0aGUgYWNjdW11bGF0b3JzLgorICBmb3IgKFJ1biBjb25zdCYgcnVuIDogcmVwb3J0cykgeworICAgIENIRUNLX0VRKHJlcG9ydHNbMF0uYmVuY2htYXJrX25hbWUsIHJ1bi5iZW5jaG1hcmtfbmFtZSk7CisgICAgQ0hFQ0tfRVEocnVuX2l0ZXJhdGlvbnMsIHJ1bi5pdGVyYXRpb25zKTsKKyAgICBpZiAocnVuLmVycm9yX29jY3VycmVkKSBjb250aW51ZTsKKyAgICByZWFsX2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5lbXBsYWNlX2JhY2socnVuLnJlYWxfYWNjdW11bGF0ZWRfdGltZSk7CisgICAgY3B1X2FjY3VtdWxhdGVkX3RpbWVfc3RhdC5lbXBsYWNlX2JhY2socnVuLmNwdV9hY2N1bXVsYXRlZF90aW1lKTsKKyAgICBpdGVtc19wZXJfc2Vjb25kX3N0YXQuZW1wbGFjZV9iYWNrKHJ1bi5pdGVtc19wZXJfc2Vjb25kKTsKKyAgICBieXRlc19wZXJfc2Vjb25kX3N0YXQuZW1wbGFjZV9iYWNrKHJ1bi5ieXRlc19wZXJfc2Vjb25kKTsKKyAgICAvLyB1c2VyIGNvdW50ZXJzCisgICAgZm9yKGF1dG8gY29uc3QmIGNudCA6IHJ1bi5jb3VudGVycykgeworICAgICAgYXV0byBpdCA9IGNvdW50ZXJfc3RhdHMuZmluZChjbnQuZmlyc3QpOworICAgICAgQ0hFQ0tfTkUoaXQsIGNvdW50ZXJfc3RhdHMuZW5kKCkpOworICAgICAgaXQtPnNlY29uZC5zLmVtcGxhY2VfYmFjayhjbnQuc2Vjb25kKTsKKyAgICB9CisgIH0KKworICAvLyBPbmx5IGFkZCBsYWJlbCBpZiBpdCBpcyBzYW1lIGZvciBhbGwgcnVucworICBzdGQ6OnN0cmluZyByZXBvcnRfbGFiZWwgPSByZXBvcnRzWzBdLnJlcG9ydF9sYWJlbDsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IHJlcG9ydHMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAocmVwb3J0c1tpXS5yZXBvcnRfbGFiZWwgIT0gcmVwb3J0X2xhYmVsKSB7CisgICAgICByZXBvcnRfbGFiZWwgPSAiIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGZvcihjb25zdCBhdXRvJiBTdGF0IDogKnJlcG9ydHNbMF0uc3RhdGlzdGljcykgeworICAgIC8vIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBhY2N1bXVsYXRvciB0byBCZW5jaG1hcmtSZXBvcnRlcjo6UnVuJ3MuCisgICAgUnVuIGRhdGE7CisgICAgZGF0YS5iZW5jaG1hcmtfbmFtZSA9IHJlcG9ydHNbMF0uYmVuY2htYXJrX25hbWUgKyAiXyIgKyBTdGF0Lm5hbWVfOworICAgIGRhdGEucmVwb3J0X2xhYmVsID0gcmVwb3J0X2xhYmVsOworICAgIGRhdGEuaXRlcmF0aW9ucyA9IHJ1bl9pdGVyYXRpb25zOworCisgICAgZGF0YS5yZWFsX2FjY3VtdWxhdGVkX3RpbWUgPSBTdGF0LmNvbXB1dGVfKHJlYWxfYWNjdW11bGF0ZWRfdGltZV9zdGF0KTsKKyAgICBkYXRhLmNwdV9hY2N1bXVsYXRlZF90aW1lID0gU3RhdC5jb21wdXRlXyhjcHVfYWNjdW11bGF0ZWRfdGltZV9zdGF0KTsKKyAgICBkYXRhLmJ5dGVzX3Blcl9zZWNvbmQgPSBTdGF0LmNvbXB1dGVfKGJ5dGVzX3Blcl9zZWNvbmRfc3RhdCk7CisgICAgZGF0YS5pdGVtc19wZXJfc2Vjb25kID0gU3RhdC5jb21wdXRlXyhpdGVtc19wZXJfc2Vjb25kX3N0YXQpOworCisgICAgZGF0YS50aW1lX3VuaXQgPSByZXBvcnRzWzBdLnRpbWVfdW5pdDsKKworICAgIC8vIHVzZXIgY291bnRlcnMKKyAgICBmb3IoYXV0byBjb25zdCYga3YgOiBjb3VudGVyX3N0YXRzKSB7CisgICAgICBjb25zdCBhdXRvIHVjX3N0YXQgPSBTdGF0LmNvbXB1dGVfKGt2LnNlY29uZC5zKTsKKyAgICAgIGF1dG8gYyA9IENvdW50ZXIodWNfc3RhdCwgY291bnRlcl9zdGF0c1trdi5maXJzdF0uYy5mbGFncyk7CisgICAgICBkYXRhLmNvdW50ZXJzW2t2LmZpcnN0XSA9IGM7CisgICAgfQorCisgICAgcmVzdWx0cy5wdXNoX2JhY2soZGF0YSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0czsKK30KKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0YXRpc3RpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNjYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE2IElzbWFlbCBKaW1lbmV6IE1hcnRpbmV6LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUm9tYW4gTGViZWRldi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFUSVNUSUNTX0hfCisjZGVmaW5lIFNUQVRJU1RJQ1NfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJlbmNobWFyay9iZW5jaG1hcmsuaCIKKworbmFtZXNwYWNlIGJlbmNobWFyayB7CisKKy8vIFJldHVybiBhIHZlY3RvciBjb250YWluaW5nIHRoZSBtZWFuLCBtZWRpYW4gYW5kIHN0YW5kYXJkIGRldmF0aW9uIGluZm9ybWF0aW9uCisvLyAoYW5kIGFueSB1c2VyLXNwZWNpZmllZCBpbmZvKSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0IG9mIHJlcG9ydHMuIElmICdyZXBvcnRzJworLy8gY29udGFpbnMgbGVzcyB0aGFuIHR3byBub24tZXJyb3JlZCBydW5zIGFuIGVtcHR5IHZlY3RvciBpcyByZXR1cm5lZAorc3RkOjp2ZWN0b3I8QmVuY2htYXJrUmVwb3J0ZXI6OlJ1bj4gQ29tcHV0ZVN0YXRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJlbmNobWFya1JlcG9ydGVyOjpSdW4+JiByZXBvcnRzKTsKKworZG91YmxlIFN0YXRpc3RpY3NNZWFuKGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHYpOworZG91YmxlIFN0YXRpc3RpY3NNZWRpYW4oY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdik7Citkb3VibGUgU3RhdGlzdGljc1N0ZERldihjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB2KTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworI2VuZGlmICAvLyBTVEFUSVNUSUNTX0hfCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9zdHJpbmdfdXRpbC5jYyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9zdHJpbmdfdXRpbC5jYwpAQCAtMCwwICsxLDE3MiBAQAorI2luY2x1ZGUgInN0cmluZ191dGlsLmgiCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImFycmF5c2l6ZS5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKK25hbWVzcGFjZSB7CisKKy8vIGtpbG8sIE1lZ2EsIEdpZ2EsIFRlcmEsIFBldGEsIEV4YSwgWmV0dGEsIFlvdHRhLgorY29uc3QgY2hhciBrQmlnU0lVbml0c1tdID0gImtNR1RQRVpZIjsKKy8vIEtpYmksIE1lYmksIEdpYmksIFRlYmksIFBlYmksIEV4YmksIFplYmksIFlvYmkuCitjb25zdCBjaGFyIGtCaWdJRUNVbml0c1tdID0gIktNR1RQRVpZIjsKKy8vIG1pbGxpLCBtaWNybywgbmFubywgcGljbywgZmVtdG8sIGF0dG8sIHplcHRvLCB5b2N0by4KK2NvbnN0IGNoYXIga1NtYWxsU0lVbml0c1tdID0gIm11bnBmYXp5IjsKKworLy8gV2UgcmVxdWlyZSB0aGF0IGFsbCB0aHJlZSBhcnJheXMgaGF2ZSB0aGUgc2FtZSBzaXplLgorc3RhdGljX2Fzc2VydChhcnJheXNpemUoa0JpZ1NJVW5pdHMpID09IGFycmF5c2l6ZShrQmlnSUVDVW5pdHMpLAorICAgICAgICAgICAgICAiU0kgYW5kIElFQyB1bml0IGFycmF5cyBtdXN0IGJlIHRoZSBzYW1lIHNpemUiKTsKK3N0YXRpY19hc3NlcnQoYXJyYXlzaXplKGtTbWFsbFNJVW5pdHMpID09IGFycmF5c2l6ZShrQmlnU0lVbml0cyksCisgICAgICAgICAgICAgICJTbWFsbCBTSSBhbmQgQmlnIFNJIHVuaXQgYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSIpOworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrVW5pdHNTaXplID0gYXJyYXlzaXplKGtCaWdTSVVuaXRzKTsKKwordm9pZCBUb0V4cG9uZW50QW5kTWFudGlzc2EoZG91YmxlIHZhbCwgZG91YmxlIHRocmVzaCwgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBvbmVfaywgc3RkOjpzdHJpbmcqIG1hbnRpc3NhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogZXhwb25lbnQpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gbWFudGlzc2Ffc3RyZWFtOworCisgIGlmICh2YWwgPCAwKSB7CisgICAgbWFudGlzc2Ffc3RyZWFtIDw8ICItIjsKKyAgICB2YWwgPSAtdmFsOworICB9CisKKyAgLy8gQWRqdXN0IHRocmVzaG9sZCBzbyB0aGF0IGl0IG5ldmVyIGV4Y2x1ZGVzIHRoaW5ncyB3aGljaCBjYW4ndCBiZSByZW5kZXJlZAorICAvLyBpbiAncHJlY2lzaW9uJyBkaWdpdHMuCisgIGNvbnN0IGRvdWJsZSBhZGp1c3RlZF90aHJlc2hvbGQgPQorICAgICAgc3RkOjptYXgodGhyZXNoLCAxLjAgLyBzdGQ6OnBvdygxMC4wLCBwcmVjaXNpb24pKTsKKyAgY29uc3QgZG91YmxlIGJpZ190aHJlc2hvbGQgPSBhZGp1c3RlZF90aHJlc2hvbGQgKiBvbmVfazsKKyAgY29uc3QgZG91YmxlIHNtYWxsX3RocmVzaG9sZCA9IGFkanVzdGVkX3RocmVzaG9sZDsKKyAgLy8gVmFsdWVzIGluIF1zaW1wbGVfdGhyZXNob2xkLHNtYWxsX3RocmVzaG9sZFsgd2lsbCBiZSBwcmludGVkIGFzLWlzCisgIGNvbnN0IGRvdWJsZSBzaW1wbGVfdGhyZXNob2xkID0gMC4wMTsKKworICBpZiAodmFsID4gYmlnX3RocmVzaG9sZCkgeworICAgIC8vIFBvc2l0aXZlIHBvd2VycworICAgIGRvdWJsZSBzY2FsZWQgPSB2YWw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheXNpemUoa0JpZ1NJVW5pdHMpOyArK2kpIHsKKyAgICAgIHNjYWxlZCAvPSBvbmVfazsKKyAgICAgIGlmIChzY2FsZWQgPD0gYmlnX3RocmVzaG9sZCkgeworICAgICAgICBtYW50aXNzYV9zdHJlYW0gPDwgc2NhbGVkOworICAgICAgICAqZXhwb25lbnQgPSBpICsgMTsKKyAgICAgICAgKm1hbnRpc3NhID0gbWFudGlzc2Ffc3RyZWFtLnN0cigpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIG1hbnRpc3NhX3N0cmVhbSA8PCB2YWw7CisgICAgKmV4cG9uZW50ID0gMDsKKyAgfSBlbHNlIGlmICh2YWwgPCBzbWFsbF90aHJlc2hvbGQpIHsKKyAgICAvLyBOZWdhdGl2ZSBwb3dlcnMKKyAgICBpZiAodmFsIDwgc2ltcGxlX3RocmVzaG9sZCkgeworICAgICAgZG91YmxlIHNjYWxlZCA9IHZhbDsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKGtTbWFsbFNJVW5pdHMpOyArK2kpIHsKKyAgICAgICAgc2NhbGVkICo9IG9uZV9rOworICAgICAgICBpZiAoc2NhbGVkID49IHNtYWxsX3RocmVzaG9sZCkgeworICAgICAgICAgIG1hbnRpc3NhX3N0cmVhbSA8PCBzY2FsZWQ7CisgICAgICAgICAgKmV4cG9uZW50ID0gLXN0YXRpY19jYXN0PGludDY0X3Q+KGkgKyAxKTsKKyAgICAgICAgICAqbWFudGlzc2EgPSBtYW50aXNzYV9zdHJlYW0uc3RyKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1hbnRpc3NhX3N0cmVhbSA8PCB2YWw7CisgICAgKmV4cG9uZW50ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBtYW50aXNzYV9zdHJlYW0gPDwgdmFsOworICAgICpleHBvbmVudCA9IDA7CisgIH0KKyAgKm1hbnRpc3NhID0gbWFudGlzc2Ffc3RyZWFtLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBFeHBvbmVudFRvUHJlZml4KGludDY0X3QgZXhwb25lbnQsIGJvb2wgaWVjKSB7CisgIGlmIChleHBvbmVudCA9PSAwKSByZXR1cm4gIiI7CisKKyAgY29uc3QgaW50NjRfdCBpbmRleCA9IChleHBvbmVudCA+IDAgPyBleHBvbmVudCAtIDEgOiAtZXhwb25lbnQgLSAxKTsKKyAgaWYgKGluZGV4ID49IGtVbml0c1NpemUpIHJldHVybiAiIjsKKworICBjb25zdCBjaGFyKiBhcnJheSA9CisgICAgICAoZXhwb25lbnQgPiAwID8gKGllYyA/IGtCaWdJRUNVbml0cyA6IGtCaWdTSVVuaXRzKSA6IGtTbWFsbFNJVW5pdHMpOworICBpZiAoaWVjKQorICAgIHJldHVybiBhcnJheVtpbmRleF0gKyBzdGQ6OnN0cmluZygiaSIpOworICBlbHNlCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKDEsIGFycmF5W2luZGV4XSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRvQmluYXJ5U3RyaW5nRnVsbHlTcGVjaWZpZWQoZG91YmxlIHZhbHVlLCBkb3VibGUgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlY2lzaW9uLCBkb3VibGUgb25lX2sgPSAxMDI0LjApIHsKKyAgc3RkOjpzdHJpbmcgbWFudGlzc2E7CisgIGludDY0X3QgZXhwb25lbnQ7CisgIFRvRXhwb25lbnRBbmRNYW50aXNzYSh2YWx1ZSwgdGhyZXNob2xkLCBwcmVjaXNpb24sIG9uZV9rLCAmbWFudGlzc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAmZXhwb25lbnQpOworICByZXR1cm4gbWFudGlzc2EgKyBFeHBvbmVudFRvUHJlZml4KGV4cG9uZW50LCBmYWxzZSk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKwordm9pZCBBcHBlbmRIdW1hblJlYWRhYmxlKGludCBuLCBzdGQ6OnN0cmluZyogc3RyKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAvLyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IFNJIHByZWZpeC4KKyAgc3MgPDwgVG9CaW5hcnlTdHJpbmdGdWxseVNwZWNpZmllZChuLCAxLjAsIDApOworICAqc3RyICs9IHNzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBIdW1hblJlYWRhYmxlTnVtYmVyKGRvdWJsZSBuLCBkb3VibGUgb25lX2spIHsKKyAgLy8gMS4xIG1lYW5zIHRoYXQgZmlndXJlcyB1cCB0byAxLjFrIHNob3VsZCBiZSBzaG93biB3aXRoIHRoZSBuZXh0IHVuaXQgZG93bjsKKyAgLy8gdGhpcyBzb2Z0ZW5zIGVkZ2UgZWZmZWN0cy4KKyAgLy8gMSBtZWFucyB0aGF0IHdlIHNob3VsZCBzaG93IG9uZSBkZWNpbWFsIHBsYWNlIG9mIHByZWNpc2lvbi4KKyAgcmV0dXJuIFRvQmluYXJ5U3RyaW5nRnVsbHlTcGVjaWZpZWQobiwgMS4xLCAxLCBvbmVfayk7Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmluZ1ByaW50RkltcChjb25zdCBjaGFyKiBtc2csIHZhX2xpc3QgYXJncykgeworICAvLyB3ZSBtaWdodCBuZWVkIGEgc2Vjb25kIHNob3QgYXQgdGhpcywgc28gcHJlLWVtcHRpdmx5IG1ha2UgYSBjb3B5CisgIHZhX2xpc3QgYXJnc19jcDsKKyAgdmFfY29weShhcmdzX2NwLCBhcmdzKTsKKworICAvLyBUT0RPKGVyaWN3Zik6IHVzZSBzdGQ6OmFycmF5IGZvciBmaXJzdCBhdHRlbXB0IHRvIGF2b2lkIG9uZSBtZW1vcnkKKyAgLy8gYWxsb2NhdGlvbiBndWVzcyB3aGF0IHRoZSBzaXplIG1pZ2h0IGJlCisgIHN0ZDo6YXJyYXk8Y2hhciwgMjU2PiBsb2NhbF9idWZmOworICBzdGQ6OnNpemVfdCBzaXplID0gbG9jYWxfYnVmZi5zaXplKCk7CisgIC8vIDIwMTUtMTAtMDg6IHZzbnByaW50ZiBpcyB1c2VkIGluc3RlYWQgb2Ygc25kOjp2c25wcmludGYgZHVlIHRvIGEgbGltaXRhdGlvbgorICAvLyBpbiB0aGUgYW5kcm9pZC1uZGsKKyAgYXV0byByZXQgPSB2c25wcmludGYobG9jYWxfYnVmZi5kYXRhKCksIHNpemUsIG1zZywgYXJnc19jcCk7CisKKyAgdmFfZW5kKGFyZ3NfY3ApOworCisgIC8vIGhhbmRsZSBlbXB0eSBleHBhbnNpb24KKyAgaWYgKHJldCA9PSAwKSByZXR1cm4gc3RkOjpzdHJpbmd7fTsKKyAgaWYgKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihyZXQpIDwgc2l6ZSkKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcobG9jYWxfYnVmZi5kYXRhKCkpOworCisgIC8vIHdlIGRpZCBub3QgcHJvdmlkZSBhIGxvbmcgZW5vdWdoIGJ1ZmZlciBvbiBvdXIgZmlyc3QgYXR0ZW1wdC4KKyAgLy8gYWRkIDEgdG8gc2l6ZSB0byBhY2NvdW50IGZvciBudWxsLWJ5dGUgaW4gc2l6ZSBjYXN0IHRvIHByZXZlbnQgb3ZlcmZsb3cKKyAgc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihyZXQpICsgMTsKKyAgYXV0byBidWZmX3B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+KG5ldyBjaGFyW3NpemVdKTsKKyAgLy8gMjAxNS0xMC0wODogdnNucHJpbnRmIGlzIHVzZWQgaW5zdGVhZCBvZiBzbmQ6OnZzbnByaW50ZiBkdWUgdG8gYSBsaW1pdGF0aW9uCisgIC8vIGluIHRoZSBhbmRyb2lkLW5kaworICByZXQgPSB2c25wcmludGYoYnVmZl9wdHIuZ2V0KCksIHNpemUsIG1zZywgYXJncyk7CisgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmX3B0ci5nZXQoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmluZ1ByaW50Rihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgIHN0ZDo6c3RyaW5nIHRtcCA9IFN0cmluZ1ByaW50RkltcChmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHJldHVybiB0bXA7Cit9CisKK3ZvaWQgUmVwbGFjZUFsbChzdGQ6OnN0cmluZyogc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG8pIHsKKyAgc3RkOjpzaXplX3Qgc3RhcnQgPSAwOworICB3aGlsZSAoKHN0YXJ0ID0gc3RyLT5maW5kKGZyb20sIHN0YXJ0KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBzdHItPnJlcGxhY2Uoc3RhcnQsIGZyb20ubGVuZ3RoKCksIHRvKTsKKyAgICBzdGFydCArPSB0by5sZW5ndGgoKTsKKyAgfQorfQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvc3RyaW5nX3V0aWwuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNTNiZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N0cmluZ191dGlsLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBCRU5DSE1BUktfU1RSSU5HX1VUSUxfSF8KKyNkZWZpbmUgQkVOQ0hNQVJLX1NUUklOR19VVElMX0hfCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgImludGVybmFsX21hY3Jvcy5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKwordm9pZCBBcHBlbmRIdW1hblJlYWRhYmxlKGludCBuLCBzdGQ6OnN0cmluZyogc3RyKTsKKworc3RkOjpzdHJpbmcgSHVtYW5SZWFkYWJsZU51bWJlcihkb3VibGUgbiwgZG91YmxlIG9uZV9rID0gMTAyNC4wKTsKKworc3RkOjpzdHJpbmcgU3RyaW5nUHJpbnRGKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgU3RyaW5nQ2F0SW1wKHN0ZDo6b3N0cmVhbSYgb3V0KSBCRU5DSE1BUktfTk9FWENFUFQgeworICByZXR1cm4gb3V0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRmlyc3QsIGNsYXNzLi4uIFJlc3Q+CitpbmxpbmUgc3RkOjpvc3RyZWFtJiBTdHJpbmdDYXRJbXAoc3RkOjpvc3RyZWFtJiBvdXQsIEZpcnN0JiYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0JiYuLi4gcmVzdCkgeworICBvdXQgPDwgc3RkOjpmb3J3YXJkPEZpcnN0PihmKTsKKyAgcmV0dXJuIFN0cmluZ0NhdEltcChvdXQsIHN0ZDo6Zm9yd2FyZDxSZXN0PihyZXN0KS4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgoraW5saW5lIHN0ZDo6c3RyaW5nIFN0ckNhdChBcmdzJiYuLi4gYXJncykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIFN0cmluZ0NhdEltcChzcywgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFJlcGxhY2VBbGwoc3RkOjpzdHJpbmcqIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRvKTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBiZW5jaG1hcmsKKworI2VuZGlmICAvLyBCRU5DSE1BUktfU1RSSU5HX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3N5c2luZm8uY2MgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9zeXNpbmZvLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjBhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy9zeXNpbmZvLmNjCkBAIC0wLDAgKzEsNTE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiaW50ZXJuYWxfbWFjcm9zLmgiCisKKyNpZmRlZiBCRU5DSE1BUktfT1NfV0lORE9XUworI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNpbmNsdWRlIDxWZXJzaW9uSGVscGVycy5oPgorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gdGhpcyBoZWFkZXIgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgJ3N5cy9zeXNjdGwuaCcgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3Igb24gRnJlZUJTRAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIGRlZmluZWQgQkVOQ0hNQVJLX09TX0ZSRUVCU0QgfHwgZGVmaW5lZCBCRU5DSE1BUktfT1NfTUFDT1NYIHx8IFwKKyAgICBkZWZpbmVkIEJFTkNITUFSS19PU19ORVRCU0QKKyNkZWZpbmUgQkVOQ0hNQVJLX0hBU19TWVNDVEwKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImN5Y2xlY2xvY2suaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzbGVlcC5oIgorI2luY2x1ZGUgInN0cmluZ191dGlsLmgiCisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworbmFtZXNwYWNlIHsKKwordm9pZCBQcmludEltcChzdGQ6Om9zdHJlYW0mIG91dCkgeyBvdXQgPDwgc3RkOjplbmRsOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBGaXJzdCwgY2xhc3MuLi4gUmVzdD4KK3ZvaWQgUHJpbnRJbXAoc3RkOjpvc3RyZWFtJiBvdXQsIEZpcnN0JiYgZiwgUmVzdCYmLi4uIHJlc3QpIHsKKyAgb3V0IDw8IHN0ZDo6Zm9yd2FyZDxGaXJzdD4oZik7CisgIFByaW50SW1wKG91dCwgc3RkOjpmb3J3YXJkPFJlc3Q+KHJlc3QpLi4uKTsKK30KKwordGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CitCRU5DSE1BUktfTk9SRVRVUk4gdm9pZCBQcmludEVycm9yQW5kRGllKEFyZ3MmJi4uLiBhcmdzKSB7CisgIFByaW50SW1wKHN0ZDo6Y2Vyciwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgc3RkOjpleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKyNpZmRlZiBCRU5DSE1BUktfSEFTX1NZU0NUTAorCisvLy8gVmFsdWVVbmlvbiAtIEEgdHlwZSB1c2VkIHRvIGNvcnJlY3RseSBhbGlhcyB0aGUgYnl0ZS1mb3ItYnl0ZSBvdXRwdXQgb2YKKy8vLyBgc3lzY3RsYCB3aXRoIHRoZSByZXN1bHQgdHlwZSBpdCdzIHRvIGJlIGludGVycHJldGVkIGFzLgorc3RydWN0IFZhbHVlVW5pb24geworICB1bmlvbiBEYXRhVCB7CisgICAgdWludDMyX3QgdWludDMyX3ZhbHVlOworICAgIHVpbnQ2NF90IHVpbnQ2NF92YWx1ZTsKKyAgICAvLyBGb3IgY29ycmVjdCBhbGlhc2luZyBvZiB1bmlvbiBtZW1iZXJzIGZyb20gYnl0ZXMuCisgICAgY2hhciBieXRlc1s4XTsKKyAgfTsKKyAgdXNpbmcgRGF0YVB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxEYXRhVCwgZGVjbHR5cGUoJnN0ZDo6ZnJlZSk+OworCisgIC8vIFRoZSBzaXplIG9mIHRoZSBkYXRhIHVuaW9uIG1lbWJlciArIGl0cyB0cmFpbGluZyBhcnJheSBzaXplLgorICBzaXplX3QgU2l6ZTsKKyAgRGF0YVB0ciBCdWZmOworCisgcHVibGljOgorICBWYWx1ZVVuaW9uKCkgOiBTaXplKDApLCBCdWZmKG51bGxwdHIsICZzdGQ6OmZyZWUpIHt9CisKKyAgZXhwbGljaXQgVmFsdWVVbmlvbihzaXplX3QgQnVmZlNpemUpCisgICAgICA6IFNpemUoc2l6ZW9mKERhdGFUKSArIEJ1ZmZTaXplKSwKKyAgICAgICAgQnVmZig6Om5ldyAoc3RkOjptYWxsb2MoU2l6ZSkpIERhdGFUKCksICZzdGQ6OmZyZWUpIHt9CisKKyAgVmFsdWVVbmlvbihWYWx1ZVVuaW9uJiYgb3RoZXIpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbChCdWZmKTsgfQorCisgIGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBCdWZmLT5ieXRlczsgfQorCisgIHN0ZDo6c3RyaW5nIEdldEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoZGF0YSgpKTsgfQorCisgIGludDY0X3QgR2V0QXNJbnRlZ2VyKCkgY29uc3QgeworICAgIGlmIChTaXplID09IHNpemVvZihCdWZmLT51aW50MzJfdmFsdWUpKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KEJ1ZmYtPnVpbnQzMl92YWx1ZSk7CisgICAgZWxzZSBpZiAoU2l6ZSA9PSBzaXplb2YoQnVmZi0+dWludDY0X3ZhbHVlKSkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihCdWZmLT51aW50NjRfdmFsdWUpOworICAgIEJFTkNITUFSS19VTlJFQUNIQUJMRSgpOworICB9CisKKyAgdWludDY0X3QgR2V0QXNVbnNpZ25lZCgpIGNvbnN0IHsKKyAgICBpZiAoU2l6ZSA9PSBzaXplb2YoQnVmZi0+dWludDMyX3ZhbHVlKSkKKyAgICAgIHJldHVybiBCdWZmLT51aW50MzJfdmFsdWU7CisgICAgZWxzZSBpZiAoU2l6ZSA9PSBzaXplb2YoQnVmZi0+dWludDY0X3ZhbHVlKSkKKyAgICAgIHJldHVybiBCdWZmLT51aW50NjRfdmFsdWU7CisgICAgQkVOQ0hNQVJLX1VOUkVBQ0hBQkxFKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgaW50IE4+CisgIHN0ZDo6YXJyYXk8VCwgTj4gR2V0QXNBcnJheSgpIHsKKyAgICBjb25zdCBpbnQgQXJyU2l6ZSA9IHNpemVvZihUKSAqIE47CisgICAgQ0hFQ0tfTEUoQXJyU2l6ZSwgU2l6ZSk7CisgICAgc3RkOjphcnJheTxULCBOPiBBcnI7CisgICAgc3RkOjptZW1jcHkoQXJyLmRhdGEoKSwgZGF0YSgpLCBBcnJTaXplKTsKKyAgICByZXR1cm4gQXJyOworICB9Cit9OworCitWYWx1ZVVuaW9uIEdldFN5c2N0bEltcChzdGQ6OnN0cmluZyBjb25zdCYgTmFtZSkgeworICBzaXplX3QgQ3VyQnVmZlNpemUgPSAwOworICBpZiAoc3lzY3RsYnluYW1lKE5hbWUuY19zdHIoKSwgbnVsbHB0ciwgJkN1ckJ1ZmZTaXplLCBudWxscHRyLCAwKSA9PSAtMSkKKyAgICByZXR1cm4gVmFsdWVVbmlvbigpOworCisgIFZhbHVlVW5pb24gYnVmZihDdXJCdWZmU2l6ZSk7CisgIGlmIChzeXNjdGxieW5hbWUoTmFtZS5jX3N0cigpLCBidWZmLmRhdGEoKSwgJmJ1ZmYuU2l6ZSwgbnVsbHB0ciwgMCkgPT0gMCkKKyAgICByZXR1cm4gYnVmZjsKKyAgcmV0dXJuIFZhbHVlVW5pb24oKTsKK30KKworQkVOQ0hNQVJLX01BWUJFX1VOVVNFRAorYm9vbCBHZXRTeXNjdGwoc3RkOjpzdHJpbmcgY29uc3QmIE5hbWUsIHN0ZDo6c3RyaW5nKiBPdXQpIHsKKyAgT3V0LT5jbGVhcigpOworICBhdXRvIEJ1ZmYgPSBHZXRTeXNjdGxJbXAoTmFtZSk7CisgIGlmICghQnVmZikgcmV0dXJuIGZhbHNlOworICBPdXQtPmFzc2lnbihCdWZmLmRhdGEoKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHAsCisgICAgICAgICAgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFRwPjo6dmFsdWU+Ojp0eXBlPgorYm9vbCBHZXRTeXNjdGwoc3RkOjpzdHJpbmcgY29uc3QmIE5hbWUsIFRwKiBPdXQpIHsKKyAgKk91dCA9IDA7CisgIGF1dG8gQnVmZiA9IEdldFN5c2N0bEltcChOYW1lKTsKKyAgaWYgKCFCdWZmKSByZXR1cm4gZmFsc2U7CisgICpPdXQgPSBzdGF0aWNfY2FzdDxUcD4oQnVmZi5HZXRBc1Vuc2lnbmVkKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRwLCBzaXplX3QgTj4KK2Jvb2wgR2V0U3lzY3RsKHN0ZDo6c3RyaW5nIGNvbnN0JiBOYW1lLCBzdGQ6OmFycmF5PFRwLCBOPiogT3V0KSB7CisgIGF1dG8gQnVmZiA9IEdldFN5c2N0bEltcChOYW1lKTsKKyAgaWYgKCFCdWZmKSByZXR1cm4gZmFsc2U7CisgICpPdXQgPSBCdWZmLkdldEFzQXJyYXk8VHAsIE4+KCk7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBBcmdUPgorYm9vbCBSZWFkRnJvbUZpbGUoc3RkOjpzdHJpbmcgY29uc3QmIGZuYW1lLCBBcmdUKiBhcmcpIHsKKyAgKmFyZyA9IEFyZ1QoKTsKKyAgc3RkOjppZnN0cmVhbSBmKGZuYW1lLmNfc3RyKCkpOworICBpZiAoIWYuaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisgIGYgPj4gKmFyZzsKKyAgcmV0dXJuIGYuZ29vZCgpOworfQorCitib29sIENwdVNjYWxpbmdFbmFibGVkKGludCBudW1fY3B1cykgeworICAvLyBXZSBkb24ndCBoYXZlIGEgdmFsaWQgQ1BVIGNvdW50LCBzbyBkb24ndCBldmVuIGJvdGhlci4KKyAgaWYgKG51bV9jcHVzIDw9IDApIHJldHVybiBmYWxzZTsKKyNpZm5kZWYgQkVOQ0hNQVJLX09TX1dJTkRPV1MKKyAgLy8gT24gTGludXgsIHRoZSBDUFVmcmVxIHN1YnN5c3RlbSBleHBvc2VzIENQVSBpbmZvcm1hdGlvbiBhcyBmaWxlcyBvbiB0aGUKKyAgLy8gbG9jYWwgZmlsZSBzeXN0ZW0uIElmIHJlYWRpbmcgdGhlIGV4cG9ydGVkIGZpbGVzIGZhaWxzLCB0aGVuIHdlIG1heSBub3QgYmUKKyAgLy8gcnVubmluZyBvbiBMaW51eCwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGFsbCB0aGUgcmVhZCBlcnJvcnMuCisgIHN0ZDo6c3RyaW5nIHJlczsKKyAgZm9yIChpbnQgY3B1ID0gMDsgY3B1IDwgbnVtX2NwdXM7ICsrY3B1KSB7CisgICAgc3RkOjpzdHJpbmcgZ292ZXJub3JfZmlsZSA9CisgICAgICAgIFN0ckNhdCgiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1IiwgY3B1LCAiL2NwdWZyZXEvc2NhbGluZ19nb3Zlcm5vciIpOworICAgIGlmIChSZWFkRnJvbUZpbGUoZ292ZXJub3JfZmlsZSwgJnJlcykgJiYgcmVzICE9ICJwZXJmb3JtYW5jZSIpIHJldHVybiB0cnVlOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgQ291bnRTZXRCaXRzSW5DUFVNYXAoc3RkOjpzdHJpbmcgVmFsKSB7CisgIGF1dG8gQ291bnRCaXRzID0gW10oc3RkOjpzdHJpbmcgUGFydCkgeworICAgIHVzaW5nIENQVU1hc2sgPSBzdGQ6OmJpdHNldDxzaXplb2Yoc3RkOjp1aW50cHRyX3QpICogQ0hBUl9CSVQ+OworICAgIFBhcnQgPSAiMHgiICsgUGFydDsKKyAgICBDUFVNYXNrIE1hc2soc3RkOjpzdG91bChQYXJ0LCBudWxscHRyLCAxNikpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KE1hc2suY291bnQoKSk7CisgIH07CisgIHNpemVfdCBQb3M7CisgIGludCB0b3RhbCA9IDA7CisgIHdoaWxlICgoUG9zID0gVmFsLmZpbmQoJywnKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICB0b3RhbCArPSBDb3VudEJpdHMoVmFsLnN1YnN0cigwLCBQb3MpKTsKKyAgICBWYWwgPSBWYWwuc3Vic3RyKFBvcyArIDEpOworICB9CisgIGlmICghVmFsLmVtcHR5KCkpIHsKKyAgICB0b3RhbCArPSBDb3VudEJpdHMoVmFsKTsKKyAgfQorICByZXR1cm4gdG90YWw7Cit9CisKK0JFTkNITUFSS19NQVlCRV9VTlVTRUQKK3N0ZDo6dmVjdG9yPENQVUluZm86OkNhY2hlSW5mbz4gR2V0Q2FjaGVTaXplc0Zyb21LVkZTKCkgeworICBzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IHJlczsKKyAgc3RkOjpzdHJpbmcgZGlyID0gIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvY2FjaGUvIjsKKyAgaW50IElkeCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgQ1BVSW5mbzo6Q2FjaGVJbmZvIGluZm87CisgICAgc3RkOjpzdHJpbmcgRlBhdGggPSBTdHJDYXQoZGlyLCAiaW5kZXgiLCBJZHgrKywgIi8iKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGYoU3RyQ2F0KEZQYXRoLCAic2l6ZSIpLmNfc3RyKCkpOworICAgIGlmICghZi5pc19vcGVuKCkpIGJyZWFrOworICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICBmID4+IGluZm8uc2l6ZTsKKyAgICBpZiAoZi5mYWlsKCkpCisgICAgICBQcmludEVycm9yQW5kRGllKCJGYWlsZWQgd2hpbGUgcmVhZGluZyBmaWxlICciLCBGUGF0aCwgInNpemUnIik7CisgICAgaWYgKGYuZ29vZCgpKSB7CisgICAgICBmID4+IHN1ZmZpeDsKKyAgICAgIGlmIChmLmJhZCgpKQorICAgICAgICBQcmludEVycm9yQW5kRGllKAorICAgICAgICAgICAgIkludmFsaWQgY2FjaGUgc2l6ZSBmb3JtYXQ6IGZhaWxlZCB0byByZWFkIHNpemUgc3VmZml4Iik7CisgICAgICBlbHNlIGlmIChmICYmIHN1ZmZpeCAhPSAiSyIpCisgICAgICAgIFByaW50RXJyb3JBbmREaWUoIkludmFsaWQgY2FjaGUgc2l6ZSBmb3JtYXQ6IEV4cGVjdGVkIGJ5dGVzICIsIHN1ZmZpeCk7CisgICAgICBlbHNlIGlmIChzdWZmaXggPT0gIksiKQorICAgICAgICBpbmZvLnNpemUgKj0gMTAwMDsKKyAgICB9CisgICAgaWYgKCFSZWFkRnJvbUZpbGUoU3RyQ2F0KEZQYXRoLCAidHlwZSIpLCAmaW5mby50eXBlKSkKKyAgICAgIFByaW50RXJyb3JBbmREaWUoIkZhaWxlZCB0byByZWFkIGZyb20gZmlsZSAiLCBGUGF0aCwgInR5cGUiKTsKKyAgICBpZiAoIVJlYWRGcm9tRmlsZShTdHJDYXQoRlBhdGgsICJsZXZlbCIpLCAmaW5mby5sZXZlbCkpCisgICAgICBQcmludEVycm9yQW5kRGllKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGZpbGUgIiwgRlBhdGgsICJsZXZlbCIpOworICAgIHN0ZDo6c3RyaW5nIG1hcF9zdHI7CisgICAgaWYgKCFSZWFkRnJvbUZpbGUoU3RyQ2F0KEZQYXRoLCAic2hhcmVkX2NwdV9tYXAiKSwgJm1hcF9zdHIpKQorICAgICAgUHJpbnRFcnJvckFuZERpZSgiRmFpbGVkIHRvIHJlYWQgZnJvbSBmaWxlICIsIEZQYXRoLCAic2hhcmVkX2NwdV9tYXAiKTsKKyAgICBpbmZvLm51bV9zaGFyaW5nID0gQ291bnRTZXRCaXRzSW5DUFVNYXAobWFwX3N0cik7CisgICAgcmVzLnB1c2hfYmFjayhpbmZvKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKyNpZmRlZiBCRU5DSE1BUktfT1NfTUFDT1NYCitzdGQ6OnZlY3RvcjxDUFVJbmZvOjpDYWNoZUluZm8+IEdldENhY2hlU2l6ZXNNYWNPU1goKSB7CisgIHN0ZDo6dmVjdG9yPENQVUluZm86OkNhY2hlSW5mbz4gcmVzOworICBzdGQ6OmFycmF5PHVpbnQ2NF90LCA0PiBDYWNoZUNvdW50c3t7MCwgMCwgMCwgMH19OworICBHZXRTeXNjdGwoImh3LmNhY2hlY29uZmlnIiwgJkNhY2hlQ291bnRzKTsKKworICBzdHJ1Y3QgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICBpbnQgbGV2ZWw7CisgICAgc2l6ZV90IG51bV9zaGFyaW5nOworICB9IENhc2VzW10gPSB7eyJody5sMWRjYWNoZXNpemUiLCAiRGF0YSIsIDEsIENhY2hlQ291bnRzWzFdfSwKKyAgICAgICAgICAgICAgIHsiaHcubDFpY2FjaGVzaXplIiwgIkluc3RydWN0aW9uIiwgMSwgQ2FjaGVDb3VudHNbMV19LAorICAgICAgICAgICAgICAgeyJody5sMmNhY2hlc2l6ZSIsICJVbmlmaWVkIiwgMiwgQ2FjaGVDb3VudHNbMl19LAorICAgICAgICAgICAgICAgeyJody5sM2NhY2hlc2l6ZSIsICJVbmlmaWVkIiwgMywgQ2FjaGVDb3VudHNbM119fTsKKyAgZm9yIChhdXRvJiBDIDogQ2FzZXMpIHsKKyAgICBpbnQgdmFsOworICAgIGlmICghR2V0U3lzY3RsKEMubmFtZSwgJnZhbCkpIGNvbnRpbnVlOworICAgIENQVUluZm86OkNhY2hlSW5mbyBpbmZvOworICAgIGluZm8udHlwZSA9IEMudHlwZTsKKyAgICBpbmZvLmxldmVsID0gQy5sZXZlbDsKKyAgICBpbmZvLnNpemUgPSB2YWw7CisgICAgaW5mby5udW1fc2hhcmluZyA9IHN0YXRpY19jYXN0PGludD4oQy5udW1fc2hhcmluZyk7CisgICAgcmVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5mbykpOworICB9CisgIHJldHVybiByZXM7Cit9CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiBHZXRDYWNoZVNpemVzV2luZG93cygpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiByZXM7CisgIERXT1JEIGJ1ZmZlcl9zaXplID0gMDsKKyAgdXNpbmcgUEluZm8gPSBTWVNURU1fTE9HSUNBTF9QUk9DRVNTT1JfSU5GT1JNQVRJT047CisgIHVzaW5nIENJbmZvID0gQ0FDSEVfREVTQ1JJUFRPUjsKKworICB1c2luZyBVUHRyID0gc3RkOjp1bmlxdWVfcHRyPFBJbmZvLCBkZWNsdHlwZSgmc3RkOjpmcmVlKT47CisgIEdldExvZ2ljYWxQcm9jZXNzb3JJbmZvcm1hdGlvbihudWxscHRyLCAmYnVmZmVyX3NpemUpOworICBVUHRyIGJ1ZmYoKFBJbmZvKiltYWxsb2MoYnVmZmVyX3NpemUpLCAmc3RkOjpmcmVlKTsKKyAgaWYgKCFHZXRMb2dpY2FsUHJvY2Vzc29ySW5mb3JtYXRpb24oYnVmZi5nZXQoKSwgJmJ1ZmZlcl9zaXplKSkKKyAgICBQcmludEVycm9yQW5kRGllKCJGYWlsZWQgZHVyaW5nIGNhbGwgdG8gR2V0TG9naWNhbFByb2Nlc3NvckluZm9ybWF0aW9uOiAiLAorICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworCisgIFBJbmZvKiBpdCA9IGJ1ZmYuZ2V0KCk7CisgIFBJbmZvKiBlbmQgPSBidWZmLmdldCgpICsgKGJ1ZmZlcl9zaXplIC8gc2l6ZW9mKFBJbmZvKSk7CisKKyAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdC0+UmVsYXRpb25zaGlwICE9IFJlbGF0aW9uQ2FjaGUpIGNvbnRpbnVlOworICAgIHVzaW5nIEJpdFNldCA9IHN0ZDo6Yml0c2V0PHNpemVvZihVTE9OR19QVFIpICogQ0hBUl9CSVQ+OworICAgIEJpdFNldCBCKGl0LT5Qcm9jZXNzb3JNYXNrKTsKKyAgICAvLyBUbyBwcmV2ZW50IGR1cGxpY2F0ZXMsIG9ubHkgY29uc2lkZXIgY2FjaGVzIHdoZXJlIENQVSAwIGlzIHNwZWNpZmllZAorICAgIGlmICghQi50ZXN0KDApKSBjb250aW51ZTsKKyAgICBDSW5mbyogQ2FjaGUgPSAmaXQtPkNhY2hlOworICAgIENQVUluZm86OkNhY2hlSW5mbyBDOworICAgIEMubnVtX3NoYXJpbmcgPSBCLmNvdW50KCk7CisgICAgQy5sZXZlbCA9IENhY2hlLT5MZXZlbDsKKyAgICBDLnNpemUgPSBDYWNoZS0+U2l6ZTsKKyAgICBzd2l0Y2ggKENhY2hlLT5UeXBlKSB7CisgICAgICBjYXNlIENhY2hlVW5pZmllZDoKKyAgICAgICAgQy50eXBlID0gIlVuaWZpZWQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ2FjaGVJbnN0cnVjdGlvbjoKKyAgICAgICAgQy50eXBlID0gIkluc3RydWN0aW9uIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENhY2hlRGF0YToKKyAgICAgICAgQy50eXBlID0gIkRhdGEiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ2FjaGVUcmFjZToKKyAgICAgICAgQy50eXBlID0gIlRyYWNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBDLnR5cGUgPSAiVW5rbm93biI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXMucHVzaF9iYWNrKEMpOworICB9CisgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworc3RkOjp2ZWN0b3I8Q1BVSW5mbzo6Q2FjaGVJbmZvPiBHZXRDYWNoZVNpemVzKCkgeworI2lmZGVmIEJFTkNITUFSS19PU19NQUNPU1gKKyAgcmV0dXJuIEdldENhY2hlU2l6ZXNNYWNPU1goKTsKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1dJTkRPV1MpCisgIHJldHVybiBHZXRDYWNoZVNpemVzV2luZG93cygpOworI2Vsc2UKKyAgcmV0dXJuIEdldENhY2hlU2l6ZXNGcm9tS1ZGUygpOworI2VuZGlmCit9CisKK2ludCBHZXROdW1DUFVzKCkgeworI2lmZGVmIEJFTkNITUFSS19IQVNfU1lTQ1RMCisgIGludCBOdW1DUFUgPSAtMTsKKyAgaWYgKEdldFN5c2N0bCgiaHcubmNwdSIsICZOdW1DUFUpKSByZXR1cm4gTnVtQ1BVOworICBmcHJpbnRmKHN0ZGVyciwgIkVycjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgIHN0ZDo6ZXhpdChFWElUX0ZBSUxVUkUpOworI2VsaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfV0lORE9XUykKKyAgU1lTVEVNX0lORk8gc3lzaW5mbzsKKyAgLy8gVXNlIG1lbXNldCBhcyBvcHBvc2VkIHRvID0ge30gdG8gYXZvaWQgR0NDIG1pc3NpbmcgaW5pdGlhbGl6ZXIgZmFsc2UKKyAgLy8gcG9zaXRpdmVzLgorICBzdGQ6Om1lbXNldCgmc3lzaW5mbywgMCwgc2l6ZW9mKFNZU1RFTV9JTkZPKSk7CisgIEdldFN5c3RlbUluZm8oJnN5c2luZm8pOworICByZXR1cm4gc3lzaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsgIC8vIG51bWJlciBvZiBsb2dpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29ycyBpbiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwCisjZWxzZQorICBpbnQgTnVtQ1BVcyA9IDA7CisgIGludCBNYXhJRCA9IC0xOworICBzdGQ6Omlmc3RyZWFtIGYoIi9wcm9jL2NwdWluZm8iKTsKKyAgaWYgKCFmLmlzX29wZW4oKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiZmFpbGVkIHRvIG9wZW4gL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgS2V5ID0gInByb2Nlc3NvciI7CisgIHN0ZDo6c3RyaW5nIGxuOworICB3aGlsZSAoc3RkOjpnZXRsaW5lKGYsIGxuKSkgeworICAgIGlmIChsbi5lbXB0eSgpKSBjb250aW51ZTsKKyAgICBzaXplX3QgU3BsaXRJZHggPSBsbi5maW5kKCc6Jyk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgaWYgKFNwbGl0SWR4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB2YWx1ZSA9IGxuLnN1YnN0cihTcGxpdElkeCArIDEpOworICAgIGlmIChsbi5zaXplKCkgPj0gS2V5LnNpemUoKSAmJiBsbi5jb21wYXJlKDAsIEtleS5zaXplKCksIEtleSkgPT0gMCkgeworICAgICAgTnVtQ1BVcysrOworICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIGludCBDdXJJRCA9IHN0ZDo6c3RvaSh2YWx1ZSk7CisgICAgICAgIE1heElEID0gc3RkOjptYXgoQ3VySUQsIE1heElEKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGYuYmFkKCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkZhaWx1cmUgcmVhZGluZyAvcHJvYy9jcHVpbmZvXG4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIWYuZW9mKCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byByZWFkIHRvIGVuZCBvZiAvcHJvYy9jcHVpbmZvXG4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBmLmNsb3NlKCk7CisKKyAgaWYgKChNYXhJRCArIDEpICE9IE51bUNQVXMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJDUFUgSUQgYXNzaWdubWVudHMgaW4gL3Byb2MvY3B1aW5mbyBzZWVtIG1lc3NlZCB1cC4iCisgICAgICAgICAgICAiIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBiYWQgQklPUy5cbiIpOworICB9CisgIHJldHVybiBOdW1DUFVzOworI2VuZGlmCisgIEJFTkNITUFSS19VTlJFQUNIQUJMRSgpOworfQorCitkb3VibGUgR2V0Q1BVQ3ljbGVzUGVyU2Vjb25kKCkgeworI2lmIGRlZmluZWQgQkVOQ0hNQVJLX09TX0xJTlVYIHx8IGRlZmluZWQgQkVOQ0hNQVJLX09TX0NZR1dJTgorICBsb25nIGZyZXE7CisKKyAgLy8gSWYgdGhlIGtlcm5lbCBpcyBleHBvcnRpbmcgdGhlIHRzYyBmcmVxdWVuY3kgdXNlIHRoYXQuIFRoZXJlIGFyZSBpc3N1ZXMKKyAgLy8gd2hlcmUgY3B1aW5mb19tYXhfZnJlcSBjYW5ub3QgYmUgcmVsaWVkIG9uIGJlY2F1c2UgdGhlIEJJT1MgbWF5IGJlCisgIC8vIGV4cG9yaW50ZyBhbiBpbnZhbGlkIHAtc3RhdGUgKG9uIHg4Nikgb3IgcC1zdGF0ZXMgbWF5IGJlIHVzZWQgdG8gcHV0IHRoZQorICAvLyBwcm9jZXNzb3IgaW4gYSBuZXcgbW9kZSAodHVyYm8gbW9kZSkuIEVzc2VudGlhbGx5LCB0aG9zZSBmcmVxdWVuY2llcworICAvLyBjYW5ub3QgYWx3YXlzIGJlIHJlbGllZCB1cG9uLiBUaGUgc2FtZSByZWFzb25zIGFwcGx5IHRvIC9wcm9jL2NwdWluZm8gYXMKKyAgLy8gd2VsbC4KKyAgaWYgKFJlYWRGcm9tRmlsZSgiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC90c2NfZnJlcV9raHoiLCAmZnJlcSkKKyAgICAgIC8vIElmIENQVSBzY2FsaW5nIGlzIGluIGVmZmVjdCwgd2Ugd2FudCB0byB1c2UgdGhlICptYXhpbXVtKiBmcmVxdWVuY3ksCisgICAgICAvLyBub3Qgd2hhdGV2ZXIgQ1BVIHNwZWVkIHNvbWUgcmFuZG9tIHByb2Nlc3NvciBoYXBwZW5zIHRvIGJlIHVzaW5nIG5vdy4KKyAgICAgIHx8IFJlYWRGcm9tRmlsZSgiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9jcHVmcmVxL2NwdWluZm9fbWF4X2ZyZXEiLAorICAgICAgICAgICAgICAgICAgICAgICZmcmVxKSkgeworICAgIC8vIFRoZSB2YWx1ZSBpcyBpbiBrSHogKGFzIHRoZSBmaWxlIG5hbWUgc3VnZ2VzdHMpLiAgRm9yIGV4YW1wbGUsIG9uIGEKKyAgICAvLyAyR0h6IHdhcnBzdGF0aW9uLCB0aGUgZmlsZSBjb250YWlucyB0aGUgdmFsdWUgIjIwMDAwMDAiLgorICAgIHJldHVybiBmcmVxICogMTAwMC4wOworICB9CisKKyAgY29uc3QgZG91YmxlIGVycm9yX3ZhbHVlID0gLTE7CisgIGRvdWJsZSBib2dvX2Nsb2NrID0gZXJyb3JfdmFsdWU7CisKKyAgc3RkOjppZnN0cmVhbSBmKCIvcHJvYy9jcHVpbmZvIik7CisgIGlmICghZi5pc19vcGVuKCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgImZhaWxlZCB0byBvcGVuIC9wcm9jL2NwdWluZm9cbiI7CisgICAgcmV0dXJuIGVycm9yX3ZhbHVlOworICB9CisKKyAgYXV0byBzdGFydHNXaXRoS2V5ID0gW10oc3RkOjpzdHJpbmcgY29uc3QmIFZhbHVlLCBzdGQ6OnN0cmluZyBjb25zdCYgS2V5KSB7CisgICAgaWYgKEtleS5zaXplKCkgPiBWYWx1ZS5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIENtcCA9IFsmXShjaGFyIFgsIGNoYXIgWSkgeworICAgICAgcmV0dXJuIHN0ZDo6dG9sb3dlcihYKSA9PSBzdGQ6OnRvbG93ZXIoWSk7CisgICAgfTsKKyAgICByZXR1cm4gc3RkOjplcXVhbChLZXkuYmVnaW4oKSwgS2V5LmVuZCgpLCBWYWx1ZS5iZWdpbigpLCBDbXApOworICB9OworCisgIHN0ZDo6c3RyaW5nIGxuOworICB3aGlsZSAoc3RkOjpnZXRsaW5lKGYsIGxuKSkgeworICAgIGlmIChsbi5lbXB0eSgpKSBjb250aW51ZTsKKyAgICBzaXplX3QgU3BsaXRJZHggPSBsbi5maW5kKCc6Jyk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgaWYgKFNwbGl0SWR4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB2YWx1ZSA9IGxuLnN1YnN0cihTcGxpdElkeCArIDEpOworICAgIC8vIFdoZW4gcGFyc2luZyB0aGUgImNwdSBNSHoiIGFuZCAiYm9nb21pcHMiIChmYWxsYmFjaykgZW50cmllcywgd2Ugb25seQorICAgIC8vIGFjY2VwdCBwb3N0aXZlIHZhbHVlcy4gU29tZSBlbnZpcm9ubWVudHMgKHZpcnR1YWwgbWFjaGluZXMpIHJlcG9ydCB6ZXJvLAorICAgIC8vIHdoaWNoIHdvdWxkIGNhdXNlIGluZmluaXRlIGxvb3BpbmcgaW4gV2FsbFRpbWVfSW5pdC4KKyAgICBpZiAoc3RhcnRzV2l0aEtleShsbiwgImNwdSBNSHoiKSkgeworICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIGRvdWJsZSBjeWNsZXNfcGVyX3NlY29uZCA9IHN0ZDo6c3RvZCh2YWx1ZSkgKiAxMDAwMDAwLjA7CisgICAgICAgIGlmIChjeWNsZXNfcGVyX3NlY29uZCA+IDApIHJldHVybiBjeWNsZXNfcGVyX3NlY29uZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGhLZXkobG4sICJib2dvbWlwcyIpKSB7CisgICAgICBpZiAoIXZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgYm9nb19jbG9jayA9IHN0ZDo6c3RvZCh2YWx1ZSkgKiAxMDAwMDAwLjA7CisgICAgICAgIGlmIChib2dvX2Nsb2NrIDwgMC4wKSBib2dvX2Nsb2NrID0gZXJyb3JfdmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChmLmJhZCgpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJGYWlsdXJlIHJlYWRpbmcgL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gZXJyb3JfdmFsdWU7CisgIH0KKyAgaWYgKCFmLmVvZigpKSB7CisgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gcmVhZCB0byBlbmQgb2YgL3Byb2MvY3B1aW5mb1xuIjsKKyAgICByZXR1cm4gZXJyb3JfdmFsdWU7CisgIH0KKyAgZi5jbG9zZSgpOworICAvLyBJZiB3ZSBmb3VuZCB0aGUgYm9nb21pcHMgY2xvY2ssIGJ1dCBub3RoaW5nIGJldHRlciwgd2UnbGwgdXNlIGl0IChidXQKKyAgLy8gd2UncmUgbm90IGhhcHB5IGFib3V0IGl0KTsgb3RoZXJ3aXNlLCBmYWxsYmFjayB0byB0aGUgcm91Z2ggZXN0aW1hdGlvbgorICAvLyBiZWxvdy4KKyAgaWYgKGJvZ29fY2xvY2sgPj0gMC4wKSByZXR1cm4gYm9nb19jbG9jazsKKworI2VsaWYgZGVmaW5lZCBCRU5DSE1BUktfSEFTX1NZU0NUTAorICBjb25zdGV4cHIgYXV0byogRnJlcVN0ciA9CisjaWYgZGVmaW5lZChCRU5DSE1BUktfT1NfRlJFRUJTRCkgfHwgZGVmaW5lZChCRU5DSE1BUktfT1NfTkVUQlNEKQorICAgICAgIm1hY2hkZXAudHNjX2ZyZXEiOworI2Vsc2UKKyAgICAgICJody5jcHVmcmVxdWVuY3kiOworI2VuZGlmCisgIHVuc2lnbmVkIGxvbmcgbG9uZyBoeiA9IDA7CisgIGlmIChHZXRTeXNjdGwoRnJlcVN0ciwgJmh6KSkgcmV0dXJuIGh6OworCisgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRldGVybWluZSBjbG9jayByYXRlIGZyb20gc3lzY3RsOiAlczogJXNcbiIsCisgICAgICAgICAgRnJlcVN0ciwgc3RyZXJyb3IoZXJybm8pKTsKKworI2VsaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfV0lORE9XUworICAvLyBJbiBOVCwgcmVhZCBNSHogZnJvbSB0aGUgcmVnaXN0cnkuIElmIHdlIGZhaWwgdG8gZG8gc28gb3Igd2UncmUgaW4gd2luOXgKKyAgLy8gdGhlbiBtYWtlIGEgY3J1ZGUgZXN0aW1hdGUuCisgIERXT1JEIGRhdGEsIGRhdGFfc2l6ZSA9IHNpemVvZihkYXRhKTsKKyAgaWYgKElzV2luZG93c1hQT3JHcmVhdGVyKCkgJiYKKyAgICAgIFNVQ0NFRURFRCgKKyAgICAgICAgICBTSEdldFZhbHVlQShIS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgIkhBUkRXQVJFXFxERVNDUklQVElPTlxcU3lzdGVtXFxDZW50cmFsUHJvY2Vzc29yXFwwIiwKKyAgICAgICAgICAgICAgICAgICAgICAifk1IeiIsIG51bGxwdHIsICZkYXRhLCAmZGF0YV9zaXplKSkpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oKGludDY0X3QpZGF0YSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKDEwMDAgKiAxMDAwKSk7ICAvLyB3YXMgbWh6CisjZW5kaWYKKyAgLy8gSWYgd2UndmUgZmFsbGVuIHRocm91Z2gsIGF0dGVtcHQgdG8gcm91Z2hseSBlc3RpbWF0ZSB0aGUgQ1BVIGNsb2NrIHJhdGUuCisgIGNvbnN0IGludCBlc3RpbWF0ZV90aW1lX21zID0gMTAwMDsKKyAgY29uc3QgYXV0byBzdGFydF90aWNrcyA9IGN5Y2xlY2xvY2s6Ok5vdygpOworICBTbGVlcEZvck1pbGxpc2Vjb25kcyhlc3RpbWF0ZV90aW1lX21zKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oY3ljbGVjbG9jazo6Tm93KCkgLSBzdGFydF90aWNrcyk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworY29uc3QgQ1BVSW5mbyYgQ1BVSW5mbzo6R2V0KCkgeworICBzdGF0aWMgY29uc3QgQ1BVSW5mbyogaW5mbyA9IG5ldyBDUFVJbmZvKCk7CisgIHJldHVybiAqaW5mbzsKK30KKworQ1BVSW5mbzo6Q1BVSW5mbygpCisgICAgOiBudW1fY3B1cyhHZXROdW1DUFVzKCkpLAorICAgICAgY3ljbGVzX3Blcl9zZWNvbmQoR2V0Q1BVQ3ljbGVzUGVyU2Vjb25kKCkpLAorICAgICAgY2FjaGVzKEdldENhY2hlU2l6ZXMoKSksCisgICAgICBzY2FsaW5nX2VuYWJsZWQoQ3B1U2NhbGluZ0VuYWJsZWQobnVtX2NwdXMpKSB7fQorCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyawpkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvdGltZXJzLmNjIGIvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNobWFyay9zcmMvdGltZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzI3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy90aW1lcnMuY2MKQEAgLTAsMCArMSwyMTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbF9tYWNyb3MuaCIKKworI2lmZGVmIEJFTkNITUFSS19PU19XSU5ET1dTCisjaW5jbHVkZSA8U2hsd2FwaS5oPgorI2luY2x1ZGUgPFZlcnNpb25IZWxwZXJzLmg+CisjaW5jbHVkZSA8V2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAvLyB0aGlzIGhlYWRlciBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSAnc3lzL3N5c2N0bC5oJyB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvciBvbiBGcmVlQlNECisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaWYgZGVmaW5lZCBCRU5DSE1BUktfT1NfRlJFRUJTRCB8fCBkZWZpbmVkIEJFTkNITUFSS19PU19NQUNPU1gKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19NQUNPU1gpCisjaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyNpbmNsdWRlIDxtYWNoL21hY2hfcG9ydC5oPgorI2luY2x1ZGUgPG1hY2gvdGhyZWFkX2FjdC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEJFTkNITUFSS19PU19FTVNDUklQVEVOCisjaW5jbHVkZSA8ZW1zY3JpcHRlbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2xlZXAuaCIKKyNpbmNsdWRlICJzdHJpbmdfdXRpbC5oIgorCituYW1lc3BhY2UgYmVuY2htYXJrIHsKKworLy8gU3VwcHJlc3MgdW51c2VkIHdhcm5pbmdzIG9uIGhlbHBlciBmdW5jdGlvbnMuCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorZG91YmxlIE1ha2VUaW1lKEZJTEVUSU1FIGNvbnN0JiBrZXJuZWxfdGltZSwgRklMRVRJTUUgY29uc3QmIHVzZXJfdGltZSkgeworICBVTEFSR0VfSU5URUdFUiBrZXJuZWw7CisgIFVMQVJHRV9JTlRFR0VSIHVzZXI7CisgIGtlcm5lbC5IaWdoUGFydCA9IGtlcm5lbF90aW1lLmR3SGlnaERhdGVUaW1lOworICBrZXJuZWwuTG93UGFydCA9IGtlcm5lbF90aW1lLmR3TG93RGF0ZVRpbWU7CisgIHVzZXIuSGlnaFBhcnQgPSB1c2VyX3RpbWUuZHdIaWdoRGF0ZVRpbWU7CisgIHVzZXIuTG93UGFydCA9IHVzZXJfdGltZS5kd0xvd0RhdGVUaW1lOworICByZXR1cm4gKHN0YXRpY19jYXN0PGRvdWJsZT4oa2VybmVsLlF1YWRQYXJ0KSArCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPih1c2VyLlF1YWRQYXJ0KSkgKgorICAgICAgICAgMWUtNzsKK30KKyNlbHNlCitkb3VibGUgTWFrZVRpbWUoc3RydWN0IHJ1c2FnZSBjb25zdCYgcnUpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxkb3VibGU+KHJ1LnJ1X3V0aW1lLnR2X3NlYykgKworICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ocnUucnVfdXRpbWUudHZfdXNlYykgKiAxZS02ICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJ1LnJ1X3N0aW1lLnR2X3NlYykgKworICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4ocnUucnVfc3RpbWUudHZfdXNlYykgKiAxZS02KTsKK30KKyNlbmRpZgorI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX01BQ09TWCkKK2RvdWJsZSBNYWtlVGltZSh0aHJlYWRfYmFzaWNfaW5mb19kYXRhX3QgY29uc3QmIGluZm8pIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxkb3VibGU+KGluZm8udXNlcl90aW1lLnNlY29uZHMpICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGluZm8udXNlcl90aW1lLm1pY3Jvc2Vjb25kcykgKiAxZS02ICsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGluZm8uc3lzdGVtX3RpbWUuc2Vjb25kcykgKworICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oaW5mby5zeXN0ZW1fdGltZS5taWNyb3NlY29uZHMpICogMWUtNik7Cit9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCkgfHwgZGVmaW5lZChDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKK2RvdWJsZSBNYWtlVGltZShzdHJ1Y3QgdGltZXNwZWMgY29uc3QmIHRzKSB7CisgIHJldHVybiB0cy50dl9zZWMgKyAoc3RhdGljX2Nhc3Q8ZG91YmxlPih0cy50dl9uc2VjKSAqIDFlLTkpOworfQorI2VuZGlmCisKK0JFTkNITUFSS19OT1JFVFVSTiBzdGF0aWMgdm9pZCBEaWFnbm9zZUFuZEV4aXQoY29uc3QgY2hhciogbXNnKSB7CisgIHN0ZDo6Y2VyciA8PCAiRVJST1I6ICIgPDwgbXNnIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworZG91YmxlIFByb2Nlc3NDUFVVc2FnZSgpIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorICBIQU5ETEUgcHJvYyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgIEZJTEVUSU1FIGNyZWF0aW9uX3RpbWU7CisgIEZJTEVUSU1FIGV4aXRfdGltZTsKKyAgRklMRVRJTUUga2VybmVsX3RpbWU7CisgIEZJTEVUSU1FIHVzZXJfdGltZTsKKyAgaWYgKEdldFByb2Nlc3NUaW1lcyhwcm9jLCAmY3JlYXRpb25fdGltZSwgJmV4aXRfdGltZSwgJmtlcm5lbF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX3RpbWUpKQorICAgIHJldHVybiBNYWtlVGltZShrZXJuZWxfdGltZSwgdXNlcl90aW1lKTsKKyAgRGlhZ25vc2VBbmRFeGl0KCJHZXRQcm9jY2Vzc1RpbWVzKCkgZmFpbGVkIik7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19FTVNDUklQVEVOKQorICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgLi4uKSByZXR1cm5zIDAgb24gRW1zY3JpcHRlbi4KKyAgLy8gVXNlIEVtc2NyaXB0ZW4tc3BlY2lmaWMgQVBJLiBSZXBvcnRlZCBDUFUgdGltZSB3b3VsZCBiZSBleGFjdGx5IHRoZQorICAvLyBzYW1lIGFzIHRvdGFsIHRpbWUsIGJ1dCB0aGlzIGlzIG9rIGJlY2F1c2UgdGhlcmUgYXJlbid0IGxvbmctbGF0ZW5jeQorICAvLyBzeW5jcm9ub3VzIHN5c3RlbSBjYWxscyBpbiBFbXNjcmlwdGVuLgorICByZXR1cm4gZW1zY3JpcHRlbl9nZXRfbm93KCkgKiAxZS0zOworI2VsaWYgZGVmaW5lZChDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQpICYmICFkZWZpbmVkKEJFTkNITUFSS19PU19NQUNPU1gpCisgIC8vIEZJWE1FIFdlIHdhbnQgdG8gdXNlIGNsb2NrX2dldHRpbWUsIGJ1dCBpdHMgbm90IGF2YWlsYWJsZSBpbiBNYWNPUyAxMC4xMS4gU2VlCisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYmVuY2htYXJrL3B1bGwvMjkyCisgIHN0cnVjdCB0aW1lc3BlYyBzcGVjOworICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZzcGVjKSA9PSAwKQorICAgIHJldHVybiBNYWtlVGltZShzcGVjKTsKKyAgRGlhZ25vc2VBbmRFeGl0KCJjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgLi4uKSBmYWlsZWQiKTsKKyNlbHNlCisgIHN0cnVjdCBydXNhZ2UgcnU7CisgIGlmIChnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydSkgPT0gMCkgcmV0dXJuIE1ha2VUaW1lKHJ1KTsKKyAgRGlhZ25vc2VBbmRFeGl0KCJnZXRydXNhZ2UoUlVTQUdFX1NFTEYsIC4uLikgZmFpbGVkIik7CisjZW5kaWYKK30KKworZG91YmxlIFRocmVhZENQVVVzYWdlKCkgeworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1dJTkRPV1MpCisgIEhBTkRMRSB0aGlzX3RocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKKyAgRklMRVRJTUUgY3JlYXRpb25fdGltZTsKKyAgRklMRVRJTUUgZXhpdF90aW1lOworICBGSUxFVElNRSBrZXJuZWxfdGltZTsKKyAgRklMRVRJTUUgdXNlcl90aW1lOworICBHZXRUaHJlYWRUaW1lcyh0aGlzX3RocmVhZCwgJmNyZWF0aW9uX3RpbWUsICZleGl0X3RpbWUsICZrZXJuZWxfdGltZSwKKyAgICAgICAgICAgICAgICAgJnVzZXJfdGltZSk7CisgIHJldHVybiBNYWtlVGltZShrZXJuZWxfdGltZSwgdXNlcl90aW1lKTsKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX01BQ09TWCkKKyAgLy8gRklYTUUgV2Ugd2FudCB0byB1c2UgY2xvY2tfZ2V0dGltZSwgYnV0IGl0cyBub3QgYXZhaWxhYmxlIGluIE1hY09TIDEwLjExLiBTZWUKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9iZW5jaG1hcmsvcHVsbC8yOTIKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBjb3VudCA9IFRIUkVBRF9CQVNJQ19JTkZPX0NPVU5UOworICB0aHJlYWRfYmFzaWNfaW5mb19kYXRhX3QgaW5mbzsKKyAgbWFjaF9wb3J0X3QgdGhyZWFkID0gcHRocmVhZF9tYWNoX3RocmVhZF9ucChwdGhyZWFkX3NlbGYoKSk7CisgIGlmICh0aHJlYWRfaW5mbyh0aHJlYWQsIFRIUkVBRF9CQVNJQ19JTkZPLCAodGhyZWFkX2luZm9fdCkmaW5mbywgJmNvdW50KSA9PQorICAgICAgS0VSTl9TVUNDRVNTKSB7CisgICAgcmV0dXJuIE1ha2VUaW1lKGluZm8pOworICB9CisgIERpYWdub3NlQW5kRXhpdCgiVGhyZWFkQ1BVVXNhZ2UoKSBmYWlsZWQgd2hlbiBldmFsdWF0aW5nIHRocmVhZF9pbmZvIik7CisjZWxpZiBkZWZpbmVkKEJFTkNITUFSS19PU19FTVNDUklQVEVOKQorICAvLyBFbXNjcmlwdGVuIGRvZXNuJ3Qgc3VwcG9ydCB0cmFkaXRpb25hbCB0aHJlYWRzCisgIHJldHVybiBQcm9jZXNzQ1BVVXNhZ2UoKTsKKyNlbGlmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1JURU1TKQorICAvLyBSVEVNUyBkb2Vzbid0IHN1cHBvcnQgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQuIFNlZQorICAvLyBodHRwczovL2dpdGh1Yi5jb20vUlRFTVMvcnRlbXMvYmxvYi9tYXN0ZXIvY3B1a2l0L3Bvc2l4L3NyYy9jbG9ja2dldHRpbWUuYworICByZXR1cm4gUHJvY2Vzc0NQVVVzYWdlKCk7CisjZWxpZiBkZWZpbmVkKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQorICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmdHMpID09IDApIHJldHVybiBNYWtlVGltZSh0cyk7CisgIERpYWdub3NlQW5kRXhpdCgiY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgLi4uKSBmYWlsZWQiKTsKKyNlbHNlCisjZXJyb3IgUGVyLXRocmVhZCB0aW1pbmcgaXMgbm90IGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbS4KKyNlbmRpZgorfQorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBEYXRlVGltZVN0cmluZyhib29sIGxvY2FsKSB7CisgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jayBDbG9jazsKKyAgc3RkOjp0aW1lX3Qgbm93ID0gQ2xvY2s6OnRvX3RpbWVfdChDbG9jazo6bm93KCkpOworICBjb25zdCBzdGQ6OnNpemVfdCBrU3RvcmFnZVNpemUgPSAxMjg7CisgIGNoYXIgc3RvcmFnZVtrU3RvcmFnZVNpemVdOworICBzdGQ6OnNpemVfdCB3cml0dGVuOworCisgIGlmIChsb2NhbCkgeworI2lmIGRlZmluZWQoQkVOQ0hNQVJLX09TX1dJTkRPV1MpCisgICAgd3JpdHRlbiA9CisgICAgICAgIHN0ZDo6c3RyZnRpbWUoc3RvcmFnZSwgc2l6ZW9mKHN0b3JhZ2UpLCAiJXggJVgiLCA6OmxvY2FsdGltZSgmbm93KSk7CisjZWxzZQorICAgIHN0ZDo6dG0gdGltZWluZm87CisgICAgc3RkOjptZW1zZXQoJnRpbWVpbmZvLCAwLCBzaXplb2Yoc3RkOjp0bSkpOworICAgIDo6bG9jYWx0aW1lX3IoJm5vdywgJnRpbWVpbmZvKTsKKyAgICB3cml0dGVuID0gc3RkOjpzdHJmdGltZShzdG9yYWdlLCBzaXplb2Yoc3RvcmFnZSksICIlRiAlVCIsICZ0aW1laW5mbyk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKEJFTkNITUFSS19PU19XSU5ET1dTKQorICAgIHdyaXR0ZW4gPSBzdGQ6OnN0cmZ0aW1lKHN0b3JhZ2UsIHNpemVvZihzdG9yYWdlKSwgIiV4ICVYIiwgOjpnbXRpbWUoJm5vdykpOworI2Vsc2UKKyAgICBzdGQ6OnRtIHRpbWVpbmZvOworICAgIHN0ZDo6bWVtc2V0KCZ0aW1laW5mbywgMCwgc2l6ZW9mKHN0ZDo6dG0pKTsKKyAgICA6OmdtdGltZV9yKCZub3csICZ0aW1laW5mbyk7CisgICAgd3JpdHRlbiA9IHN0ZDo6c3RyZnRpbWUoc3RvcmFnZSwgc2l6ZW9mKHN0b3JhZ2UpLCAiJUYgJVQiLCAmdGltZWluZm8pOworI2VuZGlmCisgIH0KKyAgQ0hFQ0sod3JpdHRlbiA8IGtTdG9yYWdlU2l6ZSk7CisgICgodm9pZCl3cml0dGVuKTsgIC8vIHByZXZlbnQgdW51c2VkIHZhcmlhYmxlIGluIG9wdGltaXplZCBtb2RlLgorICByZXR1cm4gc3RkOjpzdHJpbmcoc3RvcmFnZSk7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgTG9jYWxEYXRlVGltZVN0cmluZygpIHsgcmV0dXJuIERhdGVUaW1lU3RyaW5nKHRydWUpOyB9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgYmVuY2htYXJrCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy90aW1lcnMuaCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaG1hcmsvc3JjL3RpbWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjA2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2htYXJrL3NyYy90aW1lcnMuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIEJFTkNITUFSS19USU1FUlNfSAorI2RlZmluZSBCRU5DSE1BUktfVElNRVJTX0gKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBiZW5jaG1hcmsgeworCisvLyBSZXR1cm4gdGhlIENQVSB1c2FnZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzCitkb3VibGUgUHJvY2Vzc0NQVVVzYWdlKCk7CisKKy8vIFJldHVybiB0aGUgQ1BVIHVzYWdlIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBwcm9jZXNzCitkb3VibGUgQ2hpbGRyZW5DUFVVc2FnZSgpOworCisvLyBSZXR1cm4gdGhlIENQVSB1c2FnZSBvZiB0aGUgY3VycmVudCB0aHJlYWQKK2RvdWJsZSBUaHJlYWRDUFVVc2FnZSgpOworCisjaWYgZGVmaW5lZChIQVZFX1NURUFEWV9DTE9DSykKK3RlbXBsYXRlIDxib29sIEhpZ2hSZXNJc1N0ZWFkeSA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6OmlzX3N0ZWFkeT4KK3N0cnVjdCBDaG9vc2VTdGVhZHlDbG9jayB7CisgIHR5cGVkZWYgc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jayB0eXBlOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDaG9vc2VTdGVhZHlDbG9jazxmYWxzZT4geworICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2sgdHlwZTsKK307CisjZW5kaWYKKworc3RydWN0IENob29zZUNsb2NrVHlwZSB7CisjaWYgZGVmaW5lZChIQVZFX1NURUFEWV9DTE9DSykKKyAgdHlwZWRlZiBDaG9vc2VTdGVhZHlDbG9jazw+Ojp0eXBlIHR5cGU7CisjZWxzZQorICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2sgdHlwZTsKKyNlbmRpZgorfTsKKworaW5saW5lIGRvdWJsZSBDaHJvbm9DbG9ja05vdygpIHsKKyAgdHlwZWRlZiBDaG9vc2VDbG9ja1R5cGU6OnR5cGUgQ2xvY2tUeXBlOworICB1c2luZyBGcFNlY29uZHMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6OmNocm9ubzo6c2Vjb25kczo6cGVyaW9kPjsKKyAgcmV0dXJuIEZwU2Vjb25kcyhDbG9ja1R5cGU6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSkuY291bnQoKTsKK30KKworc3RkOjpzdHJpbmcgTG9jYWxEYXRlVGltZVN0cmluZygpOworCit9ICAvLyBlbmQgbmFtZXNwYWNlIGJlbmNobWFyaworCisjZW5kaWYgIC8vIEJFTkNITUFSS19USU1FUlNfSApkaWZmIC0tZ2l0IGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNocHJlc3MvTElDRU5TRSBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaHByZXNzL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MmVmYzQuLjAwMDAwMDAKLS0tIGEvYmVuY2htYXJrcy90aGlyZHBhcnR5L2JlbmNocHJlc3MvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLVRoZSBNSVQgTGljZW5zZSAoTUlUKQotCi1Db3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXN0b3BoZXIgR2lsYmVydAotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvYmVuY2hwcmVzcy9iZW5jaHByZXNzLmhwcCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaHByZXNzL2JlbmNocHJlc3MuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhlNGFmLi4wMDAwMDAwCi0tLSBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9iZW5jaHByZXNzL2JlbmNocHJlc3MuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qCi0qIENvcHlyaWdodCAoQykgMjAxNSBDaHJpc3RvcGhlciBHaWxiZXJ0LgotKgotKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ci0qIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi0qIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLSogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAotKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSoKLSogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi0qIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0qCi0qIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0qIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLSogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQotKiBTT0ZUV0FSRS4KLSovCi0jaWZuZGVmIEJFTkNIUFJFU1NfSFBQCi0jZGVmaW5lIEJFTkNIUFJFU1NfSFBQCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+ICAgLy8gbWF4LCBtaW4KLSNpbmNsdWRlIDxhdG9taWM+ICAgICAgLy8gYXRvbWljX2ludG1heF90Ci0jaW5jbHVkZSA8Y2hyb25vPiAgICAgIC8vIGhpZ2hfcmVzb2x1dGlvbl90aW1lciwgZHVyYXRpb24KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPiAgLy8gZnVuY3Rpb24KLSNpbmNsdWRlIDxpb21hbmlwPiAgICAgLy8gc2V0dwotI2luY2x1ZGUgPGlvc3RyZWFtPiAgICAvLyBjb3V0Ci0jaW5jbHVkZSA8cmVnZXg+ICAgICAgIC8vIHJlZ2V4LCByZWdleF9tYXRjaAotI2luY2x1ZGUgPHNzdHJlYW0+ICAgICAvLyBzdHJpbmdzdHJlYW0KLSNpbmNsdWRlIDxzdHJpbmc+ICAgICAgLy8gc3RyaW5nCi0jaW5jbHVkZSA8dGhyZWFkPiAgICAgIC8vIHRocmVhZAotI2luY2x1ZGUgPHZlY3Rvcj4gICAgICAvLyB2ZWN0b3IKLQotbmFtZXNwYWNlIGJlbmNocHJlc3MgewotCi0vKgotICogVGhlIG9wdGlvbnMgY2xhc3MgZW5jYXBzdWxhdGVzIGFsbCBvcHRpb25zIGZvciBydW5uaW5nIGJlbmNobWFya3MuCi0gKgotICogV2hlbiBpbmNsdWRpbmcgYmVuY2hwcmVzcywgYSBtYWluIGZ1bmN0aW9uIGNhbiBiZSBlbWl0dGVkIHdoaWNoIGluY2x1ZGVzIGEgY29tbWFuZC1saW5lIHBhcnNlciBmb3IgYnVpbGRpbmcgYW4KLSAqIG9wdGlvbnMgb2JqZWN0LiBIb3dldmVyIGZyb20gdGltZS10by10aW1lIGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZSBkZXZlbG9wZXIgdG8gaGF2ZSB0byBidWlsZCB0aGVpciBvd24gbWFpbgotICogc3R1YiBhbmQgY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBtYW51YWxseS4KLSAqCi0gKiBvcHRpb25zIG9wdHM7Ci0gKiBvcHRzCi0gKiAgICAgLmJlbmNoKCIuKiIpCi0gKiAgICAgLmJlbmNodGltZSgxKQotICogICAgIC5jcHUoNCk7Ci0gKi8KLWNsYXNzIG9wdGlvbnMgewotICAgIHN0ZDo6c3RyaW5nIGRfYmVuY2g7Ci0gICAgc2l6ZV90ICAgICAgZF9iZW5jaHRpbWU7Ci0gICAgc2l6ZV90ICAgICAgZF9jcHU7Ci1wdWJsaWM6Ci0gICAgb3B0aW9ucygpCi0gICAgICAgIDogZF9iZW5jaCgiLioiKQotICAgICAgICAsIGRfYmVuY2h0aW1lKDEpCi0gICAgICAgICwgZF9jcHUoc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCkpCi0gICAge30KLSAgICBvcHRpb25zJiBiZW5jaChjb25zdCBzdGQ6OnN0cmluZyYgYmVuY2gpIHsKLSAgICAgICAgZF9iZW5jaCA9IGJlbmNoOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIG9wdGlvbnMmIGJlbmNodGltZShzaXplX3QgYmVuY2h0aW1lKSB7Ci0gICAgICAgIGRfYmVuY2h0aW1lID0gYmVuY2h0aW1lOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIG9wdGlvbnMmIGNwdShzaXplX3QgY3B1KSB7Ci0gICAgICAgIGRfY3B1ID0gY3B1OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGdldF9iZW5jaCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGRfYmVuY2g7Ci0gICAgfQotICAgIHNpemVfdCBnZXRfYmVuY2h0aW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZF9iZW5jaHRpbWU7Ci0gICAgfQotICAgIHNpemVfdCBnZXRfY3B1KCkgY29uc3QgewotICAgICAgICByZXR1cm4gZF9jcHU7Ci0gICAgfQotfTsKLQotY2xhc3MgY29udGV4dDsKLQotLyoKLSAqIFRoZSBiZW5jaG1hcmtfaW5mbyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIGEgZnVuY3Rpb24gbmFtZSAvIHBvaW50ZXIgcGFpci4KLSAqCi0gKiBiZW5jaG1hcmtfaW5mbyBiaSgiZXhhbXBsZSIsIFtdKGJlbmNocHJlc3M6OmNvbnRleHQqIGIpIHsKLSAqICAgICAvLyBiZW5jaG1hcmsgZnVuY3Rpb24KLSAqIH0pOwotICovCi1jbGFzcyBiZW5jaG1hcmtfaW5mbyB7Ci0gICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgICAgZF9uYW1lOwotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb250ZXh0Kik+IGRfZnVuYzsKLQotcHVibGljOgotICAgIGJlbmNobWFya19pbmZvKHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb250ZXh0Kik+IGZ1bmMpCi0gICAgICAgIDogZF9uYW1lKG5hbWUpCi0gICAgICAgICwgZF9mdW5jKGZ1bmMpCi0gICAge30KLQotICAgIHN0ZDo6c3RyaW5nICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gZF9uYW1lOyB9Ci0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnRleHQqKT4gZ2V0X2Z1bmMoKSBjb25zdCB7IHJldHVybiBkX2Z1bmM7IH0KLX07Ci0KLS8qCi0gKiBUaGUgcmVnaXN0cmF0aW9uIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSBzaW5nbGUgZ2xvYmFsIHBvaW50IG9mIHJlZmVyZW5jZSBmb3IgcmVnaXN0ZXJpbmcKLSAqIGJlbmNobWFyayBmdW5jdGlvbnMuCi0gKgotICogcmVnaXN0cmF0aW9uOjpnZXRfcHRyKCktPnJlZ2lzdGVyX2JlbmNobWFyayhpbmZvKTsKLSAqLwotY2xhc3MgcmVnaXN0cmF0aW9uIHsKLSAgICBzdGF0aWMgcmVnaXN0cmF0aW9uKiAgICAgICAgZF90aGlzOwotICAgIHN0ZDo6dmVjdG9yPGJlbmNobWFya19pbmZvPiBkX2JlbmNobWFya3M7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgcmVnaXN0cmF0aW9uKiBnZXRfcHRyKCkgewotICAgICAgICBpZiAobnVsbHB0ciA9PSBkX3RoaXMpIHsKLSAgICAgICAgICAgIGRfdGhpcyA9IG5ldyByZWdpc3RyYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZF90aGlzOwotICAgIH0KLQotICAgIHZvaWQgcmVnaXN0ZXJfYmVuY2htYXJrKGJlbmNobWFya19pbmZvJiBpbmZvKSB7Ci0gICAgICAgIGRfYmVuY2htYXJrcy5wdXNoX2JhY2soaW5mbyk7Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8YmVuY2htYXJrX2luZm8+IGdldF9iZW5jaG1hcmtzKCkgeyByZXR1cm4gZF9iZW5jaG1hcmtzOyB9Ci19OwotCi0vKgotICogVGhlIGF1dG9fcmVnaXN0ZXIgY2xhc3MgaXMgYSBoZWxwZXIgdXNlZCB0byByZWdpc3RlciBiZW5jaG1hcmtzLgotICovCi1jbGFzcyBhdXRvX3JlZ2lzdGVyIHsKLXB1YmxpYzoKLSAgICBhdXRvX3JlZ2lzdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29udGV4dCopPiBmdW5jKSB7Ci0gICAgICAgIGJlbmNobWFya19pbmZvIGluZm8obmFtZSwgZnVuYyk7Ci0gICAgICAgIHJlZ2lzdHJhdGlvbjo6Z2V0X3B0cigpLT5yZWdpc3Rlcl9iZW5jaG1hcmsoaW5mbyk7Ci0gICAgfQotfTsKLQotI2RlZmluZSBDT05DQVQoeCwgeSkgeCAjIyB5Ci0jZGVmaW5lIENPTkNBVDIoeCwgeSkgQ09OQ0FUKHgsIHkpCi0KLS8vIFRoZSBCRU5DSE1BUksgbWFjcm8gaXMgYSBoZWxwZXIgZm9yIGNyZWF0aW5nIGJlbmNobWFyayBmdW5jdGlvbnMgYW5kIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJpbmcgdGhlbSB3aXRoIHRoZQotLy8gcmVnaXN0cmF0aW9uIGNsYXNzLgotI2RlZmluZSBCRU5DSE1BUksoeCwgZikgYmVuY2hwcmVzczo6YXV0b19yZWdpc3RlciBDT05DQVQyKHJlZ2lzdGVyXywgX19MSU5FX18pKCh4KSwgKGYpKTsKLQotLy8gVGhpcyBtYWNybyB3aWxsIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gcmVtb3ZpbmcgYSByZWR1bmRhbnQgY29kZSBwYXRoIHdoaWNoIGhhcyBubyBzaWRlLWVmZmVjdHMuCi0jZGVmaW5lIERJU0FCTEVfUkVEVU5EQU5UX0NPREVfT1BUKCkgeyBhc20oIiIpOyB9Ci0KLS8qCi0gKiBUaGUgcmVzdWx0IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgYSBwcmludGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYmVuY2htYXJrIHJ1bi4KLSAqLwotY2xhc3MgcmVzdWx0IHsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgZF9udW1faXRlcmF0aW9uczsKLSAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgZF9kdXJhdGlvbjsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgZF9udW1fYnl0ZXM7Ci0KLXB1YmxpYzoKLSAgICByZXN1bHQoc2l6ZV90IG51bV9pdGVyYXRpb25zLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgZHVyYXRpb24sIHNpemVfdCBudW1fYnl0ZXMpCi0gICAgICAgIDogZF9udW1faXRlcmF0aW9ucyhudW1faXRlcmF0aW9ucykKLSAgICAgICAgLCBkX2R1cmF0aW9uKGR1cmF0aW9uKQotICAgICAgICAsIGRfbnVtX2J5dGVzKG51bV9ieXRlcykKLSAgICB7fQotCi0gICAgc2l6ZV90IGdldF9uc19wZXJfb3AoKSBjb25zdCB7Ci0gICAgICAgIGlmIChkX251bV9pdGVyYXRpb25zIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkX2R1cmF0aW9uLmNvdW50KCkgLyBkX251bV9pdGVyYXRpb25zOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRfbWJfcGVyX3MoKSBjb25zdCB7Ci0gICAgICAgIGlmIChkX251bV9pdGVyYXRpb25zIDw9IDAgfHwgZF9kdXJhdGlvbi5jb3VudCgpIDw9IDAgfHwgZF9udW1fYnl0ZXMgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoZG91YmxlKGRfbnVtX2J5dGVzKSAqIGRvdWJsZShkX251bV9pdGVyYXRpb25zKSAvIGRvdWJsZSgxZTYpKSAvCi0gICAgICAgICAgICAgICAgZG91YmxlKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPihkX2R1cmF0aW9uKS5jb3VudCgpKSk7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCkgY29uc3QgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSB0bXA7Ci0gICAgICAgIHRtcCA8PCBzdGQ6OnNldHcoMTIpIDw8IHN0ZDo6cmlnaHQgPDwgZF9udW1faXRlcmF0aW9uczsKLSAgICAgICAgc2l6ZV90IG5wbyA9IGdldF9uc19wZXJfb3AoKTsKLSAgICAgICAgdG1wIDw8IHN0ZDo6c2V0dygxMikgPDwgc3RkOjpyaWdodCA8PCBucG8gPDwgc3RkOjpzZXR3KDApIDw8ICIgbnMvb3AiOwotICAgICAgICBkb3VibGUgbWJzID0gZ2V0X21iX3Blcl9zKCk7Ci0gICAgICAgIGlmIChtYnMgPiAwLjApIHsKLSAgICAgICAgICAgIHRtcCA8PCBzdGQ6OnNldHcoMTIpIDw8IHN0ZDo6cmlnaHQgPDwgbWJzIDw8IHN0ZDo6c2V0dygwKSA8PCAiIE1CL3MiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyh0bXAuc3RyKCkpOwotICAgIH0KLX07Ci0KLS8qCi0gKiBUaGUgcGFyYWxsZWxfY29udGV4dCBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdGhyZWFkLXNhZmUgY29udGV4dCBmb3IgcGFyYWxsZWwgYmVuY2htYXJrIGNvZGUuCi0gKi8KLWNsYXNzIHBhcmFsbGVsX2NvbnRleHQgewotICAgIHN0ZDo6YXRvbWljX2ludG1heF90IGRfbnVtX2l0ZXJhdGlvbnM7Ci1wdWJsaWM6Ci0gICAgcGFyYWxsZWxfY29udGV4dChzaXplX3QgbnVtX2l0ZXJhdGlvbnMpCi0gICAgICAgIDogZF9udW1faXRlcmF0aW9ucyhudW1faXRlcmF0aW9ucykKLSAgICB7fQotCi0gICAgYm9vbCBuZXh0KCkgewotICAgICAgICByZXR1cm4gKGRfbnVtX2l0ZXJhdGlvbnMuZmV0Y2hfc3ViKDEpID4gMCk7Ci0gICAgfQotfTsKLQotLyoKLSAqIFRoZSBjb250ZXh0IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIGZvciBjYXB0dXJpbmcgYmVuY2htYXJrIG1ldHJpY3MgdG8gYmVuY2htYXJrIGZ1bmN0aW9ucy4KLSAqLwotY2xhc3MgY29udGV4dCB7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX3RpbWVyX29uOwotICAgIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgZF9zdGFydDsKLSAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgICAgICAgICAgICAgICAgICAgICAgIGRfZHVyYXRpb247Ci0gICAgc3RkOjpjaHJvbm86OnNlY29uZHMgICAgICAgICAgICAgICAgICAgICAgICAgICBkX2JlbmNodGltZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfbnVtX2l0ZXJhdGlvbnM7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX251bV90aHJlYWRzOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9udW1fYnl0ZXM7Ci0gICAgYmVuY2htYXJrX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX2JlbmNobWFyazsKLQotcHVibGljOgotICAgIGNvbnRleHQoY29uc3QgYmVuY2htYXJrX2luZm8mIGluZm8sIGNvbnN0IG9wdGlvbnMmIG9wdHMpCi0gICAgICAgIDogZF90aW1lcl9vbihmYWxzZSkKLSAgICAgICAgLCBkX3N0YXJ0KCkKLSAgICAgICAgLCBkX2R1cmF0aW9uKCkKLSAgICAgICAgLCBkX2JlbmNodGltZShzdGQ6OmNocm9ubzo6c2Vjb25kcyhvcHRzLmdldF9iZW5jaHRpbWUoKSkpCi0gICAgICAgICwgZF9udW1faXRlcmF0aW9ucygxKQotICAgICAgICAsIGRfbnVtX3RocmVhZHMob3B0cy5nZXRfY3B1KCkpCi0gICAgICAgICwgZF9udW1fYnl0ZXMoMCkKLSAgICAgICAgLCBkX2JlbmNobWFyayhpbmZvKQotICAgIHt9Ci0KLSAgICBzaXplX3QgbnVtX2l0ZXJhdGlvbnMoKSBjb25zdCB7IHJldHVybiBkX251bV9pdGVyYXRpb25zOyB9Ci0KLSAgICB2b2lkIHNldF9udW1fdGhyZWFkcyhzaXplX3QgbikgeyBkX251bV90aHJlYWRzID0gbjsgfQotICAgIHNpemVfdCBudW1fdGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIGRfbnVtX3RocmVhZHM7IH0KLQotICAgIHZvaWQgc3RhcnRfdGltZXIoKSB7Ci0gICAgICAgIGlmICghZF90aW1lcl9vbikgewotICAgICAgICAgICAgZF9zdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwotICAgICAgICAgICAgZF90aW1lcl9vbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBzdG9wX3RpbWVyKCkgewotICAgICAgICBpZiAoZF90aW1lcl9vbikgewotICAgICAgICAgICAgZF9kdXJhdGlvbiArPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSAtIGRfc3RhcnQ7Ci0gICAgICAgICAgICBkX3RpbWVyX29uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCByZXNldF90aW1lcigpIHsKLSAgICAgICAgaWYgKGRfdGltZXJfb24pIHsKLSAgICAgICAgICAgIGRfc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKLSAgICAgICAgfQotICAgICAgICBkX2R1cmF0aW9uID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzOjp6ZXJvKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRfYnl0ZXMoaW50NjRfdCBieXRlcykgeyBkX251bV9ieXRlcyA9IGJ5dGVzOyB9Ci0KLSAgICBzaXplX3QgZ2V0X25zX3Blcl9vcCgpIHsKLSAgICAgICAgaWYgKGRfbnVtX2l0ZXJhdGlvbnMgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRfZHVyYXRpb24uY291bnQoKSAvIGRfbnVtX2l0ZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgdm9pZCBydW5fbihzaXplX3QgbikgewotICAgICAgICBkX251bV9pdGVyYXRpb25zID0gbjsKLSAgICAgICAgcmVzZXRfdGltZXIoKTsKLSAgICAgICAgc3RhcnRfdGltZXIoKTsKLSAgICAgICAgZF9iZW5jaG1hcmsuZ2V0X2Z1bmMoKSh0aGlzKTsKLSAgICAgICAgc3RvcF90aW1lcigpOwotICAgIH0KLQotICAgIHZvaWQgcnVuX3BhcmFsbGVsKHN0ZDo6ZnVuY3Rpb248dm9pZChwYXJhbGxlbF9jb250ZXh0Kik+IGYpIHsKLSAgICAgICAgcGFyYWxsZWxfY29udGV4dCBwYyhkX251bV9pdGVyYXRpb25zKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRocmVhZHM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZF9udW1fdGhyZWFkczsgKytpKSB7Ci0gICAgICAgICAgICB0aHJlYWRzLnB1c2hfYmFjayhzdGQ6OnRocmVhZChbJnBjLCZmXSgpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgIGYoJnBjKTsKLSAgICAgICAgICAgIH0pKTsKLSAgICAgICAgfQotICAgICAgICBmb3IoYXV0byYgdGhyZWFkIDogdGhyZWFkcyl7Ci0gICAgICAgICAgICB0aHJlYWQuam9pbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0IHJ1bigpIHsKLSAgICAgICAgc2l6ZV90IG4gPSAxOwotICAgICAgICBydW5fbihuKTsKLSAgICAgICAgd2hpbGUgKGRfZHVyYXRpb24gPCBkX2JlbmNodGltZSAmJiBuIDwgMWU5KSB7Ci0gICAgICAgICAgICBzaXplX3QgbGFzdCA9IG47Ci0gICAgICAgICAgICBpZiAoZ2V0X25zX3Blcl9vcCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBuID0gMWU5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuID0gZF9kdXJhdGlvbi5jb3VudCgpIC8gZ2V0X25zX3Blcl9vcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbiA9IHN0ZDo6bWF4KHN0ZDo6bWluKG4rbi8yLCAxMDAqbGFzdCksIGxhc3QrMSk7Ci0gICAgICAgICAgICBuID0gcm91bmRfdXAobik7Ci0gICAgICAgICAgICBydW5fbihuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0KG4sIGRfZHVyYXRpb24sIGRfbnVtX2J5dGVzKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBUIHJvdW5kX2Rvd25fMTAoVCBuKSB7Ci0gICAgICAgIGludCB0ZW5zID0gMDsKLSAgICAgICAgd2hpbGUgKG4gPiAxMCkgewotICAgICAgICAgICAgbiAvPSAxMDsKLSAgICAgICAgICAgIHRlbnMrKzsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmVzdWx0ID0gMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW5zOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdCAqPSAxMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgVCByb3VuZF91cChUIG4pIHsKLSAgICAgICAgVCBiYXNlID0gcm91bmRfZG93bl8xMChuKTsKLSAgICAgICAgaWYgKG4gPCAoMiAqIGJhc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMiAqIGJhc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG4gPCAoNSAqIGJhc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gNSAqIGJhc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDEwICogYmFzZTsKLSAgICB9Ci19OwotCi0vKgotICogVGhlIHJ1bl9iZW5jaG1hcmtzIGZ1bmN0aW9uIHdpbGwgcnVuIHRoZSByZWdpc3RlcmVkIGJlbmNobWFya3MuCi0gKi8KLXZvaWQgcnVuX2JlbmNobWFya3MoY29uc3Qgb3B0aW9ucyYgb3B0cykgewotICAgIHN0ZDo6cmVnZXggbWF0Y2hfcihvcHRzLmdldF9iZW5jaCgpKTsKLSAgICBhdXRvIGJlbmNobWFya3MgPSByZWdpc3RyYXRpb246OmdldF9wdHIoKS0+Z2V0X2JlbmNobWFya3MoKTsKLSAgICBmb3IgKGF1dG8mIGluZm8gOiBiZW5jaG1hcmtzKSB7Ci0gICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGluZm8uZ2V0X25hbWUoKSwgbWF0Y2hfcikpIHsKLSAgICAgICAgICAgIGNvbnRleHQgYyhpbmZvLCBvcHRzKTsKLSAgICAgICAgICAgIGF1dG8gciA9IGMucnVuKCk7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KDM1KSA8PCBzdGQ6OmxlZnQgPDwgaW5mby5nZXRfbmFtZSgpIDw8IHIudG9fc3RyaW5nKCkgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBiZW5jaHByZXNzCi0KLS8qCi0gKiBJZiBCRU5DSFBSRVNTX0NPTkZJR19NQUlOIGlzIGRlZmluZWQgd2hlbiB0aGUgZmlsZSBpcyBpbmNsdWRlZCB0aGVuIGEgbWFpbiBmdW5jdGlvbiB3aWxsIGJlIGVtaXR0ZWQgd2hpY2ggcHJvdmlkZXMgYQotICogY29tbWFuZC1saW5lIHBhcnNlciBhbmQgdGhlbiBleGVjdXRlcyBydW5fYmVuY2htYXJrcy4KLSAqLwotI2lmZGVmIEJFTkNIUFJFU1NfQ09ORklHX01BSU4KLSNpbmNsdWRlICJjeHhvcHRzLmhwcCIKLWJlbmNocHJlc3M6OnJlZ2lzdHJhdGlvbiogYmVuY2hwcmVzczo6cmVnaXN0cmF0aW9uOjpkX3RoaXM7Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IGJwX3N0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7Ci0gICAgYmVuY2hwcmVzczo6b3B0aW9ucyBiZW5jaF9vcHRzOwotICAgIHRyeSB7Ci0gICAgICAgIGN4eG9wdHM6Ok9wdGlvbnMgY21kX29wdHMoYXJndlswXSwgIiAtIGNvbW1hbmQgbGluZSBvcHRpb25zIik7Ci0gICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb25zKCkKLSAgICAgICAgICAgICgiYmVuY2giLCAicnVuIGJlbmNobWFya3MgbWF0Y2hpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiIsIGN4eG9wdHM6OnZhbHVlPHN0ZDo6c3RyaW5nPigpCi0gICAgICAgICAgICAgICAgLT5kZWZhdWx0X3ZhbHVlKCIuKiIpKQotICAgICAgICAgICAgKCJiZW5jaHRpbWUiLCAicnVuIGVub3VnaCBpdGVyYXRpb25zIG9mIGVhY2ggYmVuY2htYXJrIHRvIHRha2UgdCBzZWNvbmRzIiwgY3h4b3B0czo6dmFsdWU8c2l6ZV90PigpCi0gICAgICAgICAgICAgICAgLT5kZWZhdWx0X3ZhbHVlKCIxIikpCi0gICAgICAgICAgICAoImNwdSIsICJzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UgZm9yIHBhcmFsbGVsIGJlbmNobWFya3MiLCBjeHhvcHRzOjp2YWx1ZTxzaXplX3Q+KCkKLSAgICAgICAgICAgICAgICAtPmRlZmF1bHRfdmFsdWUoc3RkOjp0b19zdHJpbmcoc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCkpKSkKLSAgICAgICAgICAgICgiaGVscCIsICJwcmludCBoZWxwIikKLSAgICAgICAgOwotICAgICAgICBjbWRfb3B0cy5wYXJzZShhcmdjLCBhcmd2KTsKLSAgICAgICAgaWYgKGNtZF9vcHRzLmNvdW50KCJoZWxwIikpIHsKLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBjbWRfb3B0cy5oZWxwKHsiIn0pIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNtZF9vcHRzLmNvdW50KCJiZW5jaCIpKSB7Ci0gICAgICAgICAgICBiZW5jaF9vcHRzLmJlbmNoKGNtZF9vcHRzWyJiZW5jaCJdLmFzPHN0ZDo6c3RyaW5nPigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY21kX29wdHMuY291bnQoImJlbmNodGltZSIpKSB7Ci0gICAgICAgICAgICBiZW5jaF9vcHRzLmJlbmNodGltZShjbWRfb3B0c1siYmVuY2h0aW1lIl0uYXM8c2l6ZV90PigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY21kX29wdHMuY291bnQoImNwdSIpKSB7Ci0gICAgICAgICAgICBiZW5jaF9vcHRzLmNwdShjbWRfb3B0c1siY3B1Il0uYXM8c2l6ZV90PigpKTsKLSAgICAgICAgfQotICAgIH0gY2F0Y2ggKGNvbnN0IGN4eG9wdHM6Ok9wdGlvbkV4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgImVycm9yIHBhcnNpbmcgb3B0aW9uczogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGJlbmNocHJlc3M6OnJ1bl9iZW5jaG1hcmtzKGJlbmNoX29wdHMpOwotICAgIGZsb2F0IGR1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCi0gICAgICAgICAgICBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSAtIGJwX3N0YXJ0Ci0gICAgKS5jb3VudCgpIC8gMTAwMC5mOwotICAgIHN0ZDo6Y291dCA8PCBhcmd2WzBdIDw8ICIgIiA8PCBkdXJhdGlvbiA8PCAicyIgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvLyBCRU5DSFBSRVNTX0hQUApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9jeHhvcHRzL0xJQ0VOU0UgYi9iZW5jaG1hcmtzL3RoaXJkcGFydHkvY3h4b3B0cy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRhMjAzLi4wMDAwMDAwCi0tLSBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9jeHhvcHRzL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMTQgSmFycnlkIEJlY2sKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9iZW5jaG1hcmtzL3RoaXJkcGFydHkvY3h4b3B0cy9jeHhvcHRzLmhwcCBiL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9jeHhvcHRzL2N4eG9wdHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRkMzFjLi4wMDAwMDAwCi0tLSBhL2JlbmNobWFya3MvdGhpcmRwYXJ0eS9jeHhvcHRzL2N4eG9wdHMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMiArMCwwIEBACi0vKgotCi1Db3B5cmlnaHQgKGMpIDIwMTQgSmFycnlkIEJlY2sKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCi1USEUgU09GVFdBUkUuCi0KLSovCi0KLSNpZm5kZWYgQ1hYX09QVFNfSFBQCi0jZGVmaW5lIENYWF9PUFRTX0hQUAotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV25vbi12aXJ0dWFsLWR0b3IiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHJlZ2V4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLy93aGVuIHdlIGFzayBjeHhvcHRzIHRvIHVzZSBVbmljb2RlLCBoZWxwIHN0cmluZ3MgYXJlIHByb2Nlc3NlZCB1c2luZyBJQ1UsCi0vL3doaWNoIHJlc3VsdHMgaW4gdGhlIGNvcnJlY3QgbGVuZ3RocyBiZWluZyBjb21wdXRlZCBmb3Igc3RyaW5ncyB3aGVuIHRoZXkKLS8vYXJlIGZvcm1hdHRlZCBmb3IgdGhlIGhlbHAgb3V0cHV0Ci0vL2l0IGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhhdCA8dW5pY29kZS91bmlzdHIuaD4gY2FuIGJlIGZvdW5kIGJ5IHRoZQotLy9jb21waWxlciwgYW5kIHRoYXQgaWN1LXVjIGlzIGxpbmtlZCBpbiB0byB0aGUgYmluYXJ5LgotCi0jaWZkZWYgQ1hYT1BUU19VU0VfVU5JQ09ERQotI2luY2x1ZGUgPHVuaWNvZGUvdW5pc3RyLmg+Ci0KLW5hbWVzcGFjZSBjeHhvcHRzCi17Ci0gIHR5cGVkZWYgaWN1OjpVbmljb2RlU3RyaW5nIFN0cmluZzsKLQotICBpbmxpbmUKLSAgU3RyaW5nCi0gIHRvTG9jYWxTdHJpbmcoc3RkOjpzdHJpbmcgcykKLSAgewotICAgIHJldHVybiBpY3U6OlVuaWNvZGVTdHJpbmc6OmZyb21VVEY4KHMpOwotICB9Ci0KLSAgY2xhc3MgVW5pY29kZVN0cmluZ0l0ZXJhdG9yIDogcHVibGljCi0gICAgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBpbnQzMl90PgotICB7Ci0gICAgcHVibGljOgotCi0gICAgVW5pY29kZVN0cmluZ0l0ZXJhdG9yKGNvbnN0IGljdTo6VW5pY29kZVN0cmluZyogcywgaW50MzJfdCBwb3MpCi0gICAgOiBzKHMpCi0gICAgLCBpKHBvcykKLSAgICB7Ci0gICAgfQotCi0gICAgdmFsdWVfdHlwZQotICAgIG9wZXJhdG9yKigpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIHMtPmNoYXIzMkF0KGkpOwotICAgIH0KLQotICAgIGJvb2wKLSAgICBvcGVyYXRvcj09KGNvbnN0IFVuaWNvZGVTdHJpbmdJdGVyYXRvciYgcmhzKSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiBzID09IHJocy5zICYmIGkgPT0gcmhzLmk7Ci0gICAgfQotCi0gICAgYm9vbAotICAgIG9wZXJhdG9yIT0oY29uc3QgVW5pY29kZVN0cmluZ0l0ZXJhdG9yJiByaHMpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKLSAgICB9Ci0KLSAgICBVbmljb2RlU3RyaW5nSXRlcmF0b3ImCi0gICAgb3BlcmF0b3IrKygpCi0gICAgewotICAgICAgKytpOwotICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIFVuaWNvZGVTdHJpbmdJdGVyYXRvcgotICAgIG9wZXJhdG9yKyhpbnQzMl90IHYpCi0gICAgewotICAgICAgcmV0dXJuIFVuaWNvZGVTdHJpbmdJdGVyYXRvcihzLCBpICsgdik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICBjb25zdCBpY3U6OlVuaWNvZGVTdHJpbmcqIHM7Ci0gICAgaW50MzJfdCBpOwotICB9OwotCi0gIGlubGluZQotICBTdHJpbmcmCi0gIHN0cmluZ0FwcGVuZChTdHJpbmcmcywgU3RyaW5nIGEpCi0gIHsKLSAgICByZXR1cm4gcy5hcHBlbmQoc3RkOjptb3ZlKGEpKTsKLSAgfQotCi0gIGlubGluZQotICBTdHJpbmcmCi0gIHN0cmluZ0FwcGVuZChTdHJpbmcmIHMsIGludCBuLCBVQ2hhcjMyIGMpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSAhPSBuOyArK2kpCi0gICAgewotICAgICAgcy5hcHBlbmQoYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gIFN0cmluZyYKLSAgc3RyaW5nQXBwZW5kKFN0cmluZyYgcywgSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkKLSAgewotICAgIHdoaWxlIChiZWdpbiAhPSBlbmQpCi0gICAgewotICAgICAgcy5hcHBlbmQoKmJlZ2luKTsKLSAgICAgICsrYmVnaW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICBpbmxpbmUKLSAgc2l6ZV90Ci0gIHN0cmluZ0xlbmd0aChjb25zdCBTdHJpbmcmIHMpCi0gIHsKLSAgICByZXR1cm4gcy5sZW5ndGgoKTsKLSAgfQotCi0gIGlubGluZQotICBzdGQ6OnN0cmluZwotICB0b1VURjhTdHJpbmcoY29uc3QgU3RyaW5nJiBzKQotICB7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgIHMudG9VVEY4U3RyaW5nKHJlc3VsdCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLW5hbWVzcGFjZSBzdGQKLXsKLSAgY3h4b3B0czo6VW5pY29kZVN0cmluZ0l0ZXJhdG9yCi0gIGJlZ2luKGNvbnN0IGljdTo6VW5pY29kZVN0cmluZyYgcykKLSAgewotICAgIHJldHVybiBjeHhvcHRzOjpVbmljb2RlU3RyaW5nSXRlcmF0b3IoJnMsIDApOwotICB9Ci0KLSAgY3h4b3B0czo6VW5pY29kZVN0cmluZ0l0ZXJhdG9yCi0gIGVuZChjb25zdCBpY3U6OlVuaWNvZGVTdHJpbmcmIHMpCi0gIHsKLSAgICByZXR1cm4gY3h4b3B0czo6VW5pY29kZVN0cmluZ0l0ZXJhdG9yKCZzLCBzLmxlbmd0aCgpKTsKLSAgfQotfQotCi0vL2lmZGVmIENYWE9QVFNfVVNFX1VOSUNPREUKLSNlbHNlCi0KLW5hbWVzcGFjZSBjeHhvcHRzCi17Ci0gIHR5cGVkZWYgc3RkOjpzdHJpbmcgU3RyaW5nOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBUCi0gIHRvTG9jYWxTdHJpbmcoVCYmIHQpCi0gIHsKLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIGlubGluZQotICBzaXplX3QKLSAgc3RyaW5nTGVuZ3RoKGNvbnN0IFN0cmluZyYgcykKLSAgewotICAgIHJldHVybiBzLmxlbmd0aCgpOwotICB9Ci0KLSAgaW5saW5lCi0gIFN0cmluZyYKLSAgc3RyaW5nQXBwZW5kKFN0cmluZyZzLCBTdHJpbmcgYSkKLSAgewotICAgIHJldHVybiBzLmFwcGVuZChzdGQ6Om1vdmUoYSkpOwotICB9Ci0KLSAgaW5saW5lCi0gIFN0cmluZyYKLSAgc3RyaW5nQXBwZW5kKFN0cmluZyYgcywgc2l6ZV90IG4sIGNoYXIgYykKLSAgewotICAgIHJldHVybiBzLmFwcGVuZChuLCBjKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLSAgU3RyaW5nJgotICBzdHJpbmdBcHBlbmQoU3RyaW5nJiBzLCBJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kKQotICB7Ci0gICAgcmV0dXJuIHMuYXBwZW5kKGJlZ2luLCBlbmQpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0ZDo6c3RyaW5nCi0gIHRvVVRGOFN0cmluZyhUJiYgdCkKLSAgewotICAgIHJldHVybiBzdGQ6OmZvcndhcmQ8VD4odCk7Ci0gIH0KLQotfQotCi0vL2lmZGVmIENYWE9QVFNfVVNFX1VOSUNPREUKLSNlbmRpZgotCi1uYW1lc3BhY2UgY3h4b3B0cwotewotICBjbGFzcyBWYWx1ZSA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFZhbHVlPgotICB7Ci0gICAgcHVibGljOgotCi0gICAgdmlydHVhbCB2b2lkCi0gICAgcGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAotICAgIHBhcnNlKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBib29sCi0gICAgaGFzX2FyZygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbAotICAgIGhhc19kZWZhdWx0KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBib29sCi0gICAgaGFzX2ltcGxpY2l0KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzdGQ6OnN0cmluZwotICAgIGdldF9kZWZhdWx0X3ZhbHVlKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzdGQ6OnN0cmluZwotICAgIGdldF9pbXBsaWNpdF92YWx1ZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPgotICAgIGRlZmF1bHRfdmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxWYWx1ZT4KLSAgICBpbXBsaWNpdF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpID0gMDsKLSAgfTsKLQotICBjbGFzcyBPcHRpb25FeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KLSAgewotICAgIHB1YmxpYzoKLSAgICBPcHRpb25FeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCi0gICAgOiBtX21lc3NhZ2UobWVzc2FnZSkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKgotICAgIHdoYXQoKSBjb25zdCBub2V4Y2VwdAotICAgIHsKLSAgICAgIHJldHVybiBtX21lc3NhZ2UuY19zdHIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIG1fbWVzc2FnZTsKLSAgfTsKLQotICBjbGFzcyBPcHRpb25TcGVjRXhjZXB0aW9uIDogcHVibGljIE9wdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcHVibGljOgotCi0gICAgT3B0aW9uU3BlY0V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKLSAgICA6IE9wdGlvbkV4Y2VwdGlvbihtZXNzYWdlKQotICAgIHsKLSAgICB9Ci0gIH07Ci0KLSAgY2xhc3MgT3B0aW9uUGFyc2VFeGNlcHRpb24gOiBwdWJsaWMgT3B0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBwdWJsaWM6Ci0gICAgT3B0aW9uUGFyc2VFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCi0gICAgOiBPcHRpb25FeGNlcHRpb24obWVzc2FnZSkKLSAgICB7Ci0gICAgfQotICB9OwotCi0gIGNsYXNzIG9wdGlvbl9leGlzdHNfZXJyb3IgOiBwdWJsaWMgT3B0aW9uU3BlY0V4Y2VwdGlvbgotICB7Ci0gICAgcHVibGljOgotICAgIG9wdGlvbl9leGlzdHNfZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbikKLSAgICA6IE9wdGlvblNwZWNFeGNlcHRpb24odTgiT3B0aW9uIOKAmCIgKyBvcHRpb24gKyB1OCLigJkgYWxyZWFkeSBleGlzdHMiKQotICAgIHsKLSAgICB9Ci0gIH07Ci0KLSAgY2xhc3MgaW52YWxpZF9vcHRpb25fZm9ybWF0X2Vycm9yIDogcHVibGljIE9wdGlvblNwZWNFeGNlcHRpb24KLSAgewotICAgIHB1YmxpYzoKLSAgICBpbnZhbGlkX29wdGlvbl9mb3JtYXRfZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIGZvcm1hdCkKLSAgICA6IE9wdGlvblNwZWNFeGNlcHRpb24odTgiSW52YWxpZCBvcHRpb24gZm9ybWF0IOKAmCIgKyBmb3JtYXQgKyB1OCLigJkiKQotICAgIHsKLSAgICB9Ci0gIH07Ci0KLSAgY2xhc3Mgb3B0aW9uX25vdF9leGlzdHNfZXhjZXB0aW9uIDogcHVibGljIE9wdGlvblBhcnNlRXhjZXB0aW9uCi0gIHsKLSAgICBwdWJsaWM6Ci0gICAgb3B0aW9uX25vdF9leGlzdHNfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24pCi0gICAgOiBPcHRpb25QYXJzZUV4Y2VwdGlvbih1OCJPcHRpb24g4oCYIiArIG9wdGlvbiArIHU4IuKAmSBkb2VzIG5vdCBleGlzdCIpCi0gICAgewotICAgIH0KLSAgfTsKLQotICBjbGFzcyBtaXNzaW5nX2FyZ3VtZW50X2V4Y2VwdGlvbiA6IHB1YmxpYyBPcHRpb25QYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgcHVibGljOgotICAgIG1pc3NpbmdfYXJndW1lbnRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24pCi0gICAgOiBPcHRpb25QYXJzZUV4Y2VwdGlvbih1OCJPcHRpb24g4oCYIiArIG9wdGlvbiArIHU4IuKAmSBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50IikKLSAgICB7Ci0gICAgfQotICB9OwotCi0gIGNsYXNzIG9wdGlvbl9yZXF1aXJlc19hcmd1bWVudF9leGNlcHRpb24gOiBwdWJsaWMgT3B0aW9uUGFyc2VFeGNlcHRpb24KLSAgewotICAgIHB1YmxpYzoKLSAgICBvcHRpb25fcmVxdWlyZXNfYXJndW1lbnRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24pCi0gICAgOiBPcHRpb25QYXJzZUV4Y2VwdGlvbih1OCJPcHRpb24g4oCYIiArIG9wdGlvbiArIHU4IuKAmSByZXF1aXJlcyBhbiBhcmd1bWVudCIpCi0gICAgewotICAgIH0KLSAgfTsKLQotICBjbGFzcyBvcHRpb25fbm90X2hhc19hcmd1bWVudF9leGNlcHRpb24gOiBwdWJsaWMgT3B0aW9uUGFyc2VFeGNlcHRpb24KLSAgewotICAgIHB1YmxpYzoKLSAgICBvcHRpb25fbm90X2hhc19hcmd1bWVudF9leGNlcHRpb24KLSAgICAoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZwotICAgICkKLSAgICA6IE9wdGlvblBhcnNlRXhjZXB0aW9uKAotICAgICAgICB1OCJPcHRpb24g4oCYIiArIG9wdGlvbiArIHU4IuKAmSBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50LCBidXQgYXJndW1lbnTigJgiCi0gICAgICAgICsgYXJnICsgIuKAmSBnaXZlbiIpCi0gICAgewotICAgIH0KLSAgfTsKLQotICBjbGFzcyBvcHRpb25fbm90X3ByZXNlbnRfZXhjZXB0aW9uIDogcHVibGljIE9wdGlvblBhcnNlRXhjZXB0aW9uCi0gIHsKLSAgICBwdWJsaWM6Ci0gICAgb3B0aW9uX25vdF9wcmVzZW50X2V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uKQotICAgIDogT3B0aW9uUGFyc2VFeGNlcHRpb24odTgiT3B0aW9uIOKAmCIgKyBvcHRpb24gKyB1OCLigJkgbm90IHByZXNlbnQiKQotICAgIHsKLSAgICB9Ci0gIH07Ci0KLSAgY2xhc3MgYXJndW1lbnRfaW5jb3JyZWN0X3R5cGUgOiBwdWJsaWMgT3B0aW9uUGFyc2VFeGNlcHRpb24KLSAgewotICAgIHB1YmxpYzoKLSAgICBhcmd1bWVudF9pbmNvcnJlY3RfdHlwZQotICAgICgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcKLSAgICApCi0gICAgOiBPcHRpb25QYXJzZUV4Y2VwdGlvbigKLSAgICAgIHU4IkFyZ3VtZW50IOKAmCIgKyBhcmcgKyB1OCLigJkgZmFpbGVkIHRvIHBhcnNlIgotICAgICkKLSAgICB7Ci0gICAgfQotICB9OwotCi0gIG5hbWVzcGFjZSB2YWx1ZXMKLSAgewotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHZvaWQKLSAgICBwYXJzZV92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdGV4dCwgVCYgdmFsdWUpCi0gICAgewotICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGlzKHRleHQpOwotICAgICAgaWYgKCEoaXMgPj4gdmFsdWUpKQotICAgICAgewotICAgICAgICBzdGQ6OmNlcnIgPDwgImNhbm5vdCBwYXJzZSBlbXB0eSB2YWx1ZSIgPDwgc3RkOjplbmRsOwotICAgICAgICB0aHJvdyBhcmd1bWVudF9pbmNvcnJlY3RfdHlwZSh0ZXh0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzLnJkYnVmKCktPmluX2F2YWlsKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgYXJndW1lbnRfaW5jb3JyZWN0X3R5cGUodGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgdm9pZAotICAgIHBhcnNlX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBzdGQ6OnZlY3RvcjxUPiYgdmFsdWUpCi0gICAgewotICAgICAgVCB2OwotICAgICAgcGFyc2VfdmFsdWUodGV4dCwgdik7Ci0gICAgICB2YWx1ZS5wdXNoX2JhY2sodik7Ci0gICAgfQotCi0gICAgaW5saW5lCi0gICAgdm9pZAotICAgIHBhcnNlX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKnRleHQqLywgYm9vbCYgdmFsdWUpCi0gICAgewotICAgICAgLy9UT0RPIHJlY29nbmlzZSBvbiwgb2ZmLCB5ZXMsIG5vLCBlbmFibGUsIGRpc2FibGUKLSAgICAgIC8vc28gdGhhdCB3ZSBjYW4gd3JpdGUgLS1sb25nPXllcyBleHBsaWNpdGx5Ci0gICAgICB2YWx1ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaW5saW5lCi0gICAgdm9pZAotICAgIHBhcnNlX3ZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBzdGQ6OnN0cmluZyYgdmFsdWUpCi0gICAgewotICAgICAgdmFsdWUgPSB0ZXh0OwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHN0cnVjdCB2YWx1ZV9oYXNfYXJnCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gdHJ1ZTsKLSAgICB9OwotCi0gICAgdGVtcGxhdGUgPD4KLSAgICBzdHJ1Y3QgdmFsdWVfaGFzX2FyZzxib29sPgotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IGZhbHNlOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBjbGFzcyBzdGFuZGFyZF92YWx1ZSA6IHB1YmxpYyBWYWx1ZQotICAgIHsKLSAgICAgIHB1YmxpYzoKLSAgICAgIHN0YW5kYXJkX3ZhbHVlKCkKLSAgICAgIDogbV9yZXN1bHQoc3RkOjptYWtlX3NoYXJlZDxUPigpKQotICAgICAgLCBtX3N0b3JlKG1fcmVzdWx0LmdldCgpKQotICAgICAgewotICAgICAgfQotCi0gICAgICBzdGFuZGFyZF92YWx1ZShUKiB0KQotICAgICAgOiBtX3N0b3JlKHQpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHZvaWQKLSAgICAgIHBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KSBjb25zdAotICAgICAgewotICAgICAgICBpZiAobV9pbXBsaWNpdCAmJiB0ZXh0LmVtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJzZV92YWx1ZShtX2ltcGxpY2l0X3ZhbHVlLCAqbV9zdG9yZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcGFyc2VfdmFsdWUodGV4dCwgKm1fc3RvcmUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHZvaWQKLSAgICAgIHBhcnNlKCkgY29uc3QKLSAgICAgIHsKLSAgICAgICAgcGFyc2VfdmFsdWUobV9kZWZhdWx0X3ZhbHVlLCAqbV9zdG9yZSk7Ci0gICAgICB9Ci0KLSAgICAgIGJvb2wKLSAgICAgIGhhc19hcmcoKSBjb25zdAotICAgICAgewotICAgICAgICByZXR1cm4gdmFsdWVfaGFzX2FyZzxUPjo6dmFsdWU7Ci0gICAgICB9Ci0KLSAgICAgIGJvb2wKLSAgICAgIGhhc19kZWZhdWx0KCkgY29uc3QKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZGVmYXVsdDsKLSAgICAgIH0KLQotICAgICAgYm9vbAotICAgICAgaGFzX2ltcGxpY2l0KCkgY29uc3QKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW1wbGljaXQ7Ci0gICAgICB9Ci0KLSAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPgotICAgICAgZGVmYXVsdF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpewotICAgICAgICBtX2RlZmF1bHQgPSB0cnVlOwotICAgICAgICBtX2RlZmF1bHRfdmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHNoYXJlZF9mcm9tX3RoaXMoKTsKLSAgICAgIH0KLQotICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+Ci0gICAgICBpbXBsaWNpdF92YWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpewotICAgICAgICBtX2ltcGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgbV9pbXBsaWNpdF92YWx1ZSA9IHZhbHVlOwotICAgICAgICByZXR1cm4gc2hhcmVkX2Zyb21fdGhpcygpOwotICAgICAgfQotCi0gICAgICBzdGQ6OnN0cmluZwotICAgICAgZ2V0X2RlZmF1bHRfdmFsdWUoKSBjb25zdAotICAgICAgewotICAgICAgICByZXR1cm4gbV9kZWZhdWx0X3ZhbHVlOwotICAgICAgfQotCi0gICAgICBzdGQ6OnN0cmluZwotICAgICAgZ2V0X2ltcGxpY2l0X3ZhbHVlKCkgY29uc3QKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW1wbGljaXRfdmFsdWU7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN0IFQmCi0gICAgICBnZXQoKSBjb25zdAotICAgICAgewotICAgICAgICBpZiAobV9zdG9yZSA9PSBudWxscHRyKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuICptX3Jlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKm1fc3RvcmU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkOgotICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IG1fcmVzdWx0OwotICAgICAgVCogbV9zdG9yZTsKLSAgICAgIGJvb2wgbV9kZWZhdWx0ID0gZmFsc2U7Ci0gICAgICBzdGQ6OnN0cmluZyBtX2RlZmF1bHRfdmFsdWU7Ci0gICAgICBib29sIG1faW1wbGljaXQgPSBmYWxzZTsKLSAgICAgIHN0ZDo6c3RyaW5nIG1faW1wbGljaXRfdmFsdWU7Ci0gICAgfTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGQ6OnNoYXJlZF9wdHI8VmFsdWU+Ci0gIHZhbHVlKCkKLSAgewotICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPHZhbHVlczo6c3RhbmRhcmRfdmFsdWU8VD4+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RkOjpzaGFyZWRfcHRyPFZhbHVlPgotICB2YWx1ZShUJiB0KQotICB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8dmFsdWVzOjpzdGFuZGFyZF92YWx1ZTxUPj4oJnQpOwotICB9Ci0KLSAgY2xhc3MgT3B0aW9uQWRkZXI7Ci0KLSAgY2xhc3MgT3B0aW9uRGV0YWlscwotICB7Ci0gICAgcHVibGljOgotICAgIE9wdGlvbkRldGFpbHMKLSAgICAoCi0gICAgICBjb25zdCBTdHJpbmcmIGRlc2NyaXB0aW9uLAotICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFZhbHVlPiB2YWx1ZQotICAgICkKLSAgICA6IG1fZGVzYyhkZXNjcmlwdGlvbikKLSAgICAsIG1fdmFsdWUodmFsdWUpCi0gICAgLCBtX2NvdW50KDApCi0gICAgewotICAgIH0KLQotICAgIGNvbnN0IFN0cmluZyYKLSAgICBkZXNjcmlwdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIG1fZGVzYzsKLSAgICB9Ci0KLSAgICBib29sCi0gICAgaGFzX2FyZygpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIG1fdmFsdWUtPmhhc19hcmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkCi0gICAgcGFyc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQpCi0gICAgewotICAgICAgbV92YWx1ZS0+cGFyc2UodGV4dCk7Ci0gICAgICArK21fY291bnQ7Ci0gICAgfQotCi0gICAgdm9pZAotICAgIHBhcnNlX2RlZmF1bHQoKQotICAgIHsKLSAgICAgIG1fdmFsdWUtPnBhcnNlKCk7Ci0gICAgICArK21fY291bnQ7Ci0gICAgfQotCi0gICAgaW50Ci0gICAgY291bnQoKSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiBtX2NvdW50OwotICAgIH0KLQotICAgIGNvbnN0IFZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICptX3ZhbHVlOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIGNvbnN0IFQmCi0gICAgYXMoKSBjb25zdAotICAgIHsKLSNpZmRlZiBDWFhPUFRTX05PX1JUVEkKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB2YWx1ZXM6OnN0YW5kYXJkX3ZhbHVlPFQ+Jj4oKm1fdmFsdWUpLmdldCgpOwotI2Vsc2UKLSAgICAgIHJldHVybiBkeW5hbWljX2Nhc3Q8Y29uc3QgdmFsdWVzOjpzdGFuZGFyZF92YWx1ZTxUPiY+KCptX3ZhbHVlKS5nZXQoKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgU3RyaW5nIG1fZGVzYzsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVmFsdWU+IG1fdmFsdWU7Ci0gICAgaW50IG1fY291bnQ7Ci0gIH07Ci0KLSAgc3RydWN0IEhlbHBPcHRpb25EZXRhaWxzCi0gIHsKLSAgICBzdGQ6OnN0cmluZyBzOwotICAgIHN0ZDo6c3RyaW5nIGw7Ci0gICAgU3RyaW5nIGRlc2M7Ci0gICAgYm9vbCBoYXNfYXJnOwotICAgIGJvb2wgaGFzX2RlZmF1bHQ7Ci0gICAgc3RkOjpzdHJpbmcgZGVmYXVsdF92YWx1ZTsKLSAgICBib29sIGhhc19pbXBsaWNpdDsKLSAgICBzdGQ6OnN0cmluZyBpbXBsaWNpdF92YWx1ZTsKLSAgICBzdGQ6OnN0cmluZyBhcmdfaGVscDsKLSAgfTsKLQotICBzdHJ1Y3QgSGVscEdyb3VwRGV0YWlscwotICB7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBzdGQ6OnZlY3RvcjxIZWxwT3B0aW9uRGV0YWlscz4gb3B0aW9uczsKLSAgfTsKLQotICBjbGFzcyBPcHRpb25zCi0gIHsKLSAgICBwdWJsaWM6Ci0KLSAgICBPcHRpb25zKHN0ZDo6c3RyaW5nIHByb2dyYW0sIHN0ZDo6c3RyaW5nIGhlbHBfc3RyaW5nID0gIiIpCi0gICAgOiBtX3Byb2dyYW0oc3RkOjptb3ZlKHByb2dyYW0pKQotICAgICwgbV9oZWxwX3N0cmluZyh0b0xvY2FsU3RyaW5nKHN0ZDo6bW92ZShoZWxwX3N0cmluZykpKQotICAgIHsKLSAgICB9Ci0KLSAgICBpbmxpbmUKLSAgICB2b2lkCi0gICAgcGFyc2UoaW50JiBhcmdjLCBjaGFyKiomIGFyZ3YpOwotCi0gICAgaW5saW5lCi0gICAgT3B0aW9uQWRkZXIKLSAgICBhZGRfb3B0aW9ucyhzdGQ6OnN0cmluZyBncm91cCA9ICIiKTsKLQotICAgIGlubGluZQotICAgIHZvaWQKLSAgICBhZGRfb3B0aW9uCi0gICAgKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdyb3VwLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbCwKLSAgICAgIHN0ZDo6c3RyaW5nIGRlc2MsCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVmFsdWU+IHZhbHVlLAotICAgICAgc3RkOjpzdHJpbmcgYXJnX2hlbHAKLSAgICApOwotCi0gICAgaW50Ci0gICAgY291bnQoY29uc3Qgc3RkOjpzdHJpbmcmIG8pIGNvbnN0Ci0gICAgewotICAgICAgYXV0byBpdGVyID0gbV9vcHRpb25zLmZpbmQobyk7Ci0gICAgICBpZiAoaXRlciA9PSBtX29wdGlvbnMuZW5kKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICByZXR1cm4gaXRlci0+c2Vjb25kLT5jb3VudCgpOwotICAgIH0KLQotICAgIGNvbnN0IE9wdGlvbkRldGFpbHMmCi0gICAgb3BlcmF0b3JbXShjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uKSBjb25zdAotICAgIHsKLSAgICAgIGF1dG8gaXRlciA9IG1fb3B0aW9ucy5maW5kKG9wdGlvbik7Ci0KLSAgICAgIGlmIChpdGVyID09IG1fb3B0aW9ucy5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgb3B0aW9uX25vdF9wcmVzZW50X2V4Y2VwdGlvbihvcHRpb24pOwotICAgICAgfQotCi0gICAgICByZXR1cm4gKml0ZXItPnNlY29uZDsKLSAgICB9Ci0KLSAgICAvL3BhcnNlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGludG8gdGhlIGdpdmVuIG9wdGlvbgotICAgIGlubGluZQotICAgIHZvaWQKLSAgICBwYXJzZV9wb3NpdGlvbmFsKHN0ZDo6c3RyaW5nIG9wdGlvbik7Ci0KLSAgICBpbmxpbmUKLSAgICBzdGQ6OnN0cmluZwotICAgIGhlbHAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBncm91cHMgPSB7IiJ9KSBjb25zdDsKLQotICAgIGlubGluZQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPgotICAgIGdyb3VwcygpIGNvbnN0OwotCi0gICAgaW5saW5lCi0gICAgY29uc3QgSGVscEdyb3VwRGV0YWlscyYKLSAgICBncm91cF9oZWxwKGNvbnN0IHN0ZDo6c3RyaW5nJiBncm91cCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgaW5saW5lCi0gICAgdm9pZAotICAgIGFkZF9vbmVfb3B0aW9uCi0gICAgKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbiwKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxPcHRpb25EZXRhaWxzPiBkZXRhaWxzCi0gICAgKTsKLQotICAgIGlubGluZQotICAgIGJvb2wKLSAgICBjb25zdW1lX3Bvc2l0aW9uYWwoc3RkOjpzdHJpbmcgYSk7Ci0KLSAgICBpbmxpbmUKLSAgICB2b2lkCi0gICAgYWRkX3RvX29wdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgYXJnKTsKLQotICAgIGlubGluZQotICAgIHZvaWQKLSAgICBwYXJzZV9vcHRpb24KLSAgICAoCi0gICAgICBzdGQ6OnNoYXJlZF9wdHI8T3B0aW9uRGV0YWlscz4gdmFsdWUsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcgPSAiIgotICAgICk7Ci0KLSAgICBpbmxpbmUKLSAgICB2b2lkCi0gICAgY2hlY2tlZF9wYXJzZV9hcmcKLSAgICAoCi0gICAgICBpbnQgYXJnYywKLSAgICAgIGNoYXIqIGFyZ3ZbXSwKLSAgICAgIGludCYgY3VycmVudCwKLSAgICAgIHN0ZDo6c2hhcmVkX3B0cjxPcHRpb25EZXRhaWxzPiB2YWx1ZSwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lCi0gICAgKTsKLQotICAgIGlubGluZQotICAgIFN0cmluZwotICAgIGhlbHBfb25lX2dyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nJiBncm91cCkgY29uc3Q7Ci0KLSAgICBzdGQ6OnN0cmluZyBtX3Byb2dyYW07Ci0gICAgU3RyaW5nIG1faGVscF9zdHJpbmc7Ci0KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPE9wdGlvbkRldGFpbHM+PiBtX29wdGlvbnM7Ci0gICAgc3RkOjpzdHJpbmcgbV9wb3NpdGlvbmFsOwotCi0gICAgLy9tYXBwaW5nIGZyb20gZ3JvdXBzIHRvIGhlbHAgb3B0aW9ucwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBIZWxwR3JvdXBEZXRhaWxzPiBtX2hlbHA7Ci0gIH07Ci0KLSAgY2xhc3MgT3B0aW9uQWRkZXIKLSAgewotICAgIHB1YmxpYzoKLQotICAgIE9wdGlvbkFkZGVyKE9wdGlvbnMmIG9wdGlvbnMsIHN0ZDo6c3RyaW5nIGdyb3VwKQotICAgIDogbV9vcHRpb25zKG9wdGlvbnMpLCBtX2dyb3VwKHN0ZDo6bW92ZShncm91cCkpCi0gICAgewotICAgIH0KLQotICAgIGlubGluZQotICAgIE9wdGlvbkFkZGVyJgotICAgIG9wZXJhdG9yKCkKLSAgICAoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0cywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLAotICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFZhbHVlPiB2YWx1ZQotICAgICAgICA9IDo6Y3h4b3B0czo6dmFsdWU8Ym9vbD4oKSwKLSAgICAgIHN0ZDo6c3RyaW5nIGFyZ19oZWxwID0gIiIKLSAgICApOwotCi0gICAgcHJpdmF0ZToKLSAgICBPcHRpb25zJiBtX29wdGlvbnM7Ci0gICAgc3RkOjpzdHJpbmcgbV9ncm91cDsKLSAgfTsKLQotfQotCi1uYW1lc3BhY2UgY3h4b3B0cwotewotCi0gIG5hbWVzcGFjZQotICB7Ci0KLSAgICBjb25zdGV4cHIgaW50IE9QVElPTl9MT05HRVNUID0gMzA7Ci0gICAgY29uc3RleHByIGludCBPUFRJT05fREVTQ19HQVAgPSAyOwotCi0gICAgc3RkOjpiYXNpY19yZWdleDxjaGFyPiBvcHRpb25fbWF0Y2hlcgotICAgICAgKCItLShbWzphbG51bTpdXVstX1s6YWxudW06XV0rKSg9KC4qKSk/fC0oW2EtekEtWl0rKSIpOwotCi0gICAgc3RkOjpiYXNpY19yZWdleDxjaGFyPiBvcHRpb25fc3BlY2lmaWVyCi0gICAgICAoIigoW2EtekEtWl0pLCk/KFthLXpBLVowLTldWy1fYS16QS1aMC05XSspIik7Ci0KLSAgICBTdHJpbmcKLSAgICBmb3JtYXRfb3B0aW9uCi0gICAgKAotICAgICAgY29uc3QgSGVscE9wdGlvbkRldGFpbHMmIG8KLSAgICApCi0gICAgewotICAgICAgYXV0byYgcyA9IG8uczsKLSAgICAgIGF1dG8mIGwgPSBvLmw7Ci0KLSAgICAgIFN0cmluZyByZXN1bHQgPSAiICAiOwotCi0gICAgICBpZiAocy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gIi0iICsgdG9Mb2NhbFN0cmluZyhzKSArICIsIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgICAiOwotICAgICAgfQotCi0gICAgICBpZiAobC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gIiAtLSIgKyB0b0xvY2FsU3RyaW5nKGwpOwotICAgICAgfQotCi0gICAgICBpZiAoby5oYXNfYXJnKQotICAgICAgewotICAgICAgICBhdXRvIGFyZyA9IG8uYXJnX2hlbHAuc2l6ZSgpID4gMCA/IHRvTG9jYWxTdHJpbmcoby5hcmdfaGVscCkgOiAiYXJnIjsKLQotICAgICAgICBpZiAoby5oYXNfaW1wbGljaXQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gIiBbPSIgKyBhcmcgKyAiKD0iICsgdG9Mb2NhbFN0cmluZyhvLmltcGxpY2l0X3ZhbHVlKSArICIpXSI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgIiArIGFyZzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIFN0cmluZwotICAgIGZvcm1hdF9kZXNjcmlwdGlvbgotICAgICgKLSAgICAgIGNvbnN0IEhlbHBPcHRpb25EZXRhaWxzJiBvLAotICAgICAgc2l6ZV90IHN0YXJ0LAotICAgICAgc2l6ZV90IHdpZHRoCi0gICAgKQotICAgIHsKLSAgICAgIGF1dG8gZGVzYyA9IG8uZGVzYzsKLQotICAgICAgaWYgKG8uaGFzX2RlZmF1bHQpCi0gICAgICB7Ci0gICAgICAgIGRlc2MgKz0gdG9Mb2NhbFN0cmluZygiIChkZWZhdWx0OiIgKyBvLmRlZmF1bHRfdmFsdWUgKyAiKSIpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgcmVzdWx0OwotCi0gICAgICBhdXRvIGN1cnJlbnQgPSBzdGQ6OmJlZ2luKGRlc2MpOwotICAgICAgYXV0byBzdGFydExpbmUgPSBjdXJyZW50OwotICAgICAgYXV0byBsYXN0U3BhY2UgPSBjdXJyZW50OwotCi0gICAgICBhdXRvIHNpemUgPSBzaXplX3R7fTsKLQotICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gc3RkOjplbmQoZGVzYykpCi0gICAgICB7Ci0gICAgICAgIGlmICgqY3VycmVudCA9PSAnICcpCi0gICAgICAgIHsKLSAgICAgICAgICBsYXN0U3BhY2UgPSBjdXJyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemUgPiB3aWR0aCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsYXN0U3BhY2UgPT0gc3RhcnRMaW5lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZ0FwcGVuZChyZXN1bHQsIHN0YXJ0TGluZSwgY3VycmVudCArIDEpOwotICAgICAgICAgICAgc3RyaW5nQXBwZW5kKHJlc3VsdCwgIlxuIik7Ci0gICAgICAgICAgICBzdHJpbmdBcHBlbmQocmVzdWx0LCBzdGFydCwgJyAnKTsKLSAgICAgICAgICAgIHN0YXJ0TGluZSA9IGN1cnJlbnQgKyAxOwotICAgICAgICAgICAgbGFzdFNwYWNlID0gc3RhcnRMaW5lOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nQXBwZW5kKHJlc3VsdCwgc3RhcnRMaW5lLCBsYXN0U3BhY2UpOwotICAgICAgICAgICAgc3RyaW5nQXBwZW5kKHJlc3VsdCwgIlxuIik7Ci0gICAgICAgICAgICBzdHJpbmdBcHBlbmQocmVzdWx0LCBzdGFydCwgJyAnKTsKLSAgICAgICAgICAgIHN0YXJ0TGluZSA9IGxhc3RTcGFjZSArIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICsrc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgICsrY3VycmVudDsKLSAgICAgIH0KLQotICAgICAgLy9hcHBlbmQgd2hhdGV2ZXIgaXMgbGVmdAotICAgICAgc3RyaW5nQXBwZW5kKHJlc3VsdCwgc3RhcnRMaW5lLCBjdXJyZW50KTsKLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotT3B0aW9uQWRkZXIKLU9wdGlvbnM6OmFkZF9vcHRpb25zKHN0ZDo6c3RyaW5nIGdyb3VwKQotewotICByZXR1cm4gT3B0aW9uQWRkZXIoKnRoaXMsIHN0ZDo6bW92ZShncm91cCkpOwotfQotCi1PcHRpb25BZGRlciYKLU9wdGlvbkFkZGVyOjpvcGVyYXRvcigpCi0oCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRzLAotICBjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywKLSAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFZhbHVlPiB2YWx1ZSwKLSAgc3RkOjpzdHJpbmcgYXJnX2hlbHAKLSkKLXsKLSAgc3RkOjptYXRjaF9yZXN1bHRzPGNvbnN0IGNoYXIqPiByZXN1bHQ7Ci0gIHN0ZDo6cmVnZXhfbWF0Y2gob3B0cy5jX3N0cigpLCByZXN1bHQsIG9wdGlvbl9zcGVjaWZpZXIpOwotCi0gIGlmIChyZXN1bHQuZW1wdHkoKSkKLSAgewotICAgIHRocm93IGludmFsaWRfb3B0aW9uX2Zvcm1hdF9lcnJvcihvcHRzKTsKLSAgfQotCi0gIGNvbnN0IGF1dG8mIHMgPSByZXN1bHRbMl07Ci0gIGNvbnN0IGF1dG8mIGwgPSByZXN1bHRbM107Ci0KLSAgbV9vcHRpb25zLmFkZF9vcHRpb24obV9ncm91cCwgcy5zdHIoKSwgbC5zdHIoKSwgZGVzYywgdmFsdWUsCi0gICAgc3RkOjptb3ZlKGFyZ19oZWxwKSk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkCi1PcHRpb25zOjpwYXJzZV9vcHRpb24KLSgKLSAgc3RkOjpzaGFyZWRfcHRyPE9wdGlvbkRldGFpbHM+IHZhbHVlLAotICBjb25zdCBzdGQ6OnN0cmluZyYgLypuYW1lKi8sCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcKLSkKLXsKLSAgdmFsdWUtPnBhcnNlKGFyZyk7Ci19Ci0KLXZvaWQKLU9wdGlvbnM6OmNoZWNrZWRfcGFyc2VfYXJnCi0oCi0gIGludCBhcmdjLAotICBjaGFyKiBhcmd2W10sCi0gIGludCYgY3VycmVudCwKLSAgc3RkOjpzaGFyZWRfcHRyPE9wdGlvbkRldGFpbHM+IHZhbHVlLAotICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZQotKQotewotICBpZiAoY3VycmVudCArIDEgPj0gYXJnYykKLSAgewotICAgIGlmICh2YWx1ZS0+dmFsdWUoKS5oYXNfaW1wbGljaXQoKSkKLSAgICB7Ci0gICAgICBwYXJzZV9vcHRpb24odmFsdWUsIG5hbWUsICIiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG1pc3NpbmdfYXJndW1lbnRfZXhjZXB0aW9uKG5hbWUpOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoYXJndltjdXJyZW50ICsgMV1bMF0gPT0gJy0nICYmIHZhbHVlLT52YWx1ZSgpLmhhc19pbXBsaWNpdCgpKQotICAgIHsKLSAgICAgIHBhcnNlX29wdGlvbih2YWx1ZSwgbmFtZSwgIiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcGFyc2Vfb3B0aW9uKHZhbHVlLCBuYW1lLCBhcmd2W2N1cnJlbnQgKyAxXSk7Ci0gICAgICArK2N1cnJlbnQ7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQKLU9wdGlvbnM6OmFkZF90b19vcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykKLXsKLSAgYXV0byBpdGVyID0gbV9vcHRpb25zLmZpbmQob3B0aW9uKTsKLQotICBpZiAoaXRlciA9PSBtX29wdGlvbnMuZW5kKCkpCi0gIHsKLSAgICB0aHJvdyBvcHRpb25fbm90X2V4aXN0c19leGNlcHRpb24ob3B0aW9uKTsKLSAgfQotCi0gIHBhcnNlX29wdGlvbihpdGVyLT5zZWNvbmQsIG9wdGlvbiwgYXJnKTsKLX0KLQotYm9vbAotT3B0aW9uczo6Y29uc3VtZV9wb3NpdGlvbmFsKHN0ZDo6c3RyaW5nIGEpCi17Ci0gIGlmIChtX3Bvc2l0aW9uYWwuc2l6ZSgpID4gMCkKLSAgewotICAgIGFkZF90b19vcHRpb24obV9wb3NpdGlvbmFsLCBhKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZAotT3B0aW9uczo6cGFyc2VfcG9zaXRpb25hbChzdGQ6OnN0cmluZyBvcHRpb24pCi17Ci0gIG1fcG9zaXRpb25hbCA9IHN0ZDo6bW92ZShvcHRpb24pOwotfQotCi12b2lkCi1PcHRpb25zOjpwYXJzZShpbnQmIGFyZ2MsIGNoYXIqKiYgYXJndikKLXsKLSAgaW50IGN1cnJlbnQgPSAxOwotCi0gIGludCBuZXh0S2VlcCA9IDE7Ci0KLSAgd2hpbGUgKGN1cnJlbnQgIT0gYXJnYykKLSAgewotICAgIHN0ZDo6bWF0Y2hfcmVzdWx0czxjb25zdCBjaGFyKj4gcmVzdWx0OwotICAgIHN0ZDo6cmVnZXhfbWF0Y2goYXJndltjdXJyZW50XSwgcmVzdWx0LCBvcHRpb25fbWF0Y2hlcik7Ci0KLSAgICBpZiAocmVzdWx0LmVtcHR5KCkpCi0gICAgewotICAgICAgLy9ub3QgYSBmbGFnCi0KLSAgICAgIC8vaWYgdHJ1ZSBpcyByZXR1cm5lZCBoZXJlIHRoZW4gaXQgd2FzIGNvbnN1bWVkLCBvdGhlcndpc2UgaXQgaXMKLSAgICAgIC8vaWdub3JlZAotICAgICAgaWYgKGNvbnN1bWVfcG9zaXRpb25hbChhcmd2W2N1cnJlbnRdKSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYXJndltuZXh0S2VlcF0gPSBhcmd2W2N1cnJlbnRdOwotICAgICAgICArK25leHRLZWVwOwotICAgICAgfQotICAgICAgLy9pZiB3ZSByZXR1cm4gZnJvbSBoZXJlIHRoZW4gaXQgd2FzIHBhcnNlZCBzdWNjZXNzZnVsbHksIHNvIGNvbnRpbnVlCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL3Nob3J0IG9yIGxvbmcgb3B0aW9uPwotICAgICAgaWYgKHJlc3VsdFs0XS5sZW5ndGgoKSAhPSAwKQotICAgICAgewotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcyA9IHJlc3VsdFs0XTsKLQotICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lKDEsIHNbaV0pOwotICAgICAgICAgIGF1dG8gaXRlciA9IG1fb3B0aW9ucy5maW5kKG5hbWUpOwotCi0gICAgICAgICAgaWYgKGl0ZXIgPT0gbV9vcHRpb25zLmVuZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG9wdGlvbl9ub3RfZXhpc3RzX2V4Y2VwdGlvbihuYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBhdXRvIHZhbHVlID0gaXRlci0+c2Vjb25kOwotCi0gICAgICAgICAgLy9pZiBubyBhcmd1bWVudCB0aGVuIGp1c3QgYWRkIGl0Ci0gICAgICAgICAgaWYgKCF2YWx1ZS0+aGFzX2FyZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlX29wdGlvbih2YWx1ZSwgbmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2l0IG11c3QgYmUgdGhlIGxhc3QgYXJndW1lbnQKLSAgICAgICAgICAgIGlmIChpICsgMSA9PSBzLnNpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hlY2tlZF9wYXJzZV9hcmcoYXJnYywgYXJndiwgY3VycmVudCwgdmFsdWUsIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUtPnZhbHVlKCkuaGFzX2ltcGxpY2l0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcnNlX29wdGlvbih2YWx1ZSwgbmFtZSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2Vycm9yCi0gICAgICAgICAgICAgIHRocm93IG9wdGlvbl9yZXF1aXJlc19hcmd1bWVudF9leGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChyZXN1bHRbMV0ubGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSByZXN1bHRbMV07Ci0KLSAgICAgICAgYXV0byBpdGVyID0gbV9vcHRpb25zLmZpbmQobmFtZSk7Ci0KLSAgICAgICAgaWYgKGl0ZXIgPT0gbV9vcHRpb25zLmVuZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgb3B0aW9uX25vdF9leGlzdHNfZXhjZXB0aW9uKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBvcHQgPSBpdGVyLT5zZWNvbmQ7Ci0KLSAgICAgICAgLy9lcXVhbHMgcHJvdmlkZWQgZm9yIGxvbmcgb3B0aW9uPwotICAgICAgICBpZiAocmVzdWx0WzNdLmxlbmd0aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAvL3BhcnNlIHRoZSBvcHRpb24gZ2l2ZW4KLQotICAgICAgICAgIC8vYnV0IGlmIGl0IGRvZXNuJ3QgdGFrZSBhbiBhcmd1bWVudCwgdGhpcyBpcyBhbiBlcnJvcgotICAgICAgICAgIGlmICghb3B0LT5oYXNfYXJnKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgb3B0aW9uX25vdF9oYXNfYXJndW1lbnRfZXhjZXB0aW9uKG5hbWUsIHJlc3VsdFszXSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcGFyc2Vfb3B0aW9uKG9wdCwgbmFtZSwgcmVzdWx0WzNdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAob3B0LT5oYXNfYXJnKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9wYXJzZSB0aGUgbmV4dCBhcmd1bWVudAotICAgICAgICAgICAgY2hlY2tlZF9wYXJzZV9hcmcoYXJnYywgYXJndiwgY3VycmVudCwgb3B0LCBuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vcGFyc2Ugd2l0aCBlbXB0eSBhcmd1bWVudAotICAgICAgICAgICAgcGFyc2Vfb3B0aW9uKG9wdCwgbmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICArK2N1cnJlbnQ7Ci0gIH0KLQotICBmb3IgKGF1dG8mIG9wdCA6IG1fb3B0aW9ucykKLSAgewotICAgIGF1dG8mIGRldGFpbCA9IG9wdC5zZWNvbmQ7Ci0gICAgYXV0byYgdmFsdWUgPSBkZXRhaWwtPnZhbHVlKCk7Ci0KLSAgICBpZighZGV0YWlsLT5jb3VudCgpICYmIHZhbHVlLmhhc19kZWZhdWx0KCkpewotICAgICAgZGV0YWlsLT5wYXJzZV9kZWZhdWx0KCk7Ci0gICAgfQotICB9Ci0KLSAgYXJnYyA9IG5leHRLZWVwOwotfQotCi12b2lkCi1PcHRpb25zOjphZGRfb3B0aW9uCi0oCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBncm91cCwKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHMsCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBsLAotICBzdGQ6OnN0cmluZyBkZXNjLAotICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVmFsdWU+IHZhbHVlLAotICBzdGQ6OnN0cmluZyBhcmdfaGVscAotKQotewotICBhdXRvIHN0cmluZ0Rlc2MgPSB0b0xvY2FsU3RyaW5nKHN0ZDo6bW92ZShkZXNjKSk7Ci0gIGF1dG8gb3B0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxPcHRpb25EZXRhaWxzPihzdHJpbmdEZXNjLCB2YWx1ZSk7Ci0KLSAgaWYgKHMuc2l6ZSgpID4gMCkKLSAgewotICAgIGFkZF9vbmVfb3B0aW9uKHMsIG9wdGlvbik7Ci0gIH0KLQotICBpZiAobC5zaXplKCkgPiAwKQotICB7Ci0gICAgYWRkX29uZV9vcHRpb24obCwgb3B0aW9uKTsKLSAgfQotCi0gIC8vYWRkIHRoZSBoZWxwIGRldGFpbHMKLSAgYXV0byYgb3B0aW9ucyA9IG1faGVscFtncm91cF07Ci0KLSAgb3B0aW9ucy5vcHRpb25zLmVtcGxhY2VfYmFjayhIZWxwT3B0aW9uRGV0YWlsc3tzLCBsLCBzdHJpbmdEZXNjLAotICAgICAgdmFsdWUtPmhhc19hcmcoKSwKLSAgICAgIHZhbHVlLT5oYXNfZGVmYXVsdCgpLCB2YWx1ZS0+Z2V0X2RlZmF1bHRfdmFsdWUoKSwKLSAgICAgIHZhbHVlLT5oYXNfaW1wbGljaXQoKSwgdmFsdWUtPmdldF9pbXBsaWNpdF92YWx1ZSgpLAotICAgICAgc3RkOjptb3ZlKGFyZ19oZWxwKX0pOwotfQotCi12b2lkCi1PcHRpb25zOjphZGRfb25lX29wdGlvbgotKAotICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uLAotICBzdGQ6OnNoYXJlZF9wdHI8T3B0aW9uRGV0YWlscz4gZGV0YWlscwotKQotewotICBhdXRvIGluID0gbV9vcHRpb25zLmVtcGxhY2Uob3B0aW9uLCBkZXRhaWxzKTsKLQotICBpZiAoIWluLnNlY29uZCkKLSAgewotICAgIHRocm93IG9wdGlvbl9leGlzdHNfZXJyb3Iob3B0aW9uKTsKLSAgfQotfQotCi1TdHJpbmcKLU9wdGlvbnM6OmhlbHBfb25lX2dyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nJiBnKSBjb25zdAotewotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcsIFN0cmluZz4+IE9wdGlvbkhlbHA7Ci0KLSAgYXV0byBncm91cCA9IG1faGVscC5maW5kKGcpOwotICBpZiAoZ3JvdXAgPT0gbV9oZWxwLmVuZCgpKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgT3B0aW9uSGVscCBmb3JtYXQ7Ci0KLSAgc2l6ZV90IGxvbmdlc3QgPSAwOwotCi0gIFN0cmluZyByZXN1bHQ7Ci0KLSAgaWYgKCFnLmVtcHR5KCkpCi0gIHsKLSAgICByZXN1bHQgKz0gdG9Mb2NhbFN0cmluZygiICIgKyBnICsgIiBvcHRpb25zOlxuXG4iKTsKLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgbyA6IGdyb3VwLT5zZWNvbmQub3B0aW9ucykKLSAgewotICAgIGF1dG8gcyA9IGZvcm1hdF9vcHRpb24obyk7Ci0gICAgbG9uZ2VzdCA9IHN0ZDo6bWF4KGxvbmdlc3QsIHN0cmluZ0xlbmd0aChzKSk7Ci0gICAgZm9ybWF0LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzLCBTdHJpbmcoKSkpOwotICB9Ci0KLSAgbG9uZ2VzdCA9IHN0ZDo6bWluKGxvbmdlc3QsIHN0YXRpY19jYXN0PHNpemVfdD4oT1BUSU9OX0xPTkdFU1QpKTsKLQotICAvL3dpZGVzdCBhbGxvd2VkIGRlc2NyaXB0aW9uCi0gIGF1dG8gYWxsb3dlZCA9IHNpemVfdHs3Nn0gLSBsb25nZXN0IC0gT1BUSU9OX0RFU0NfR0FQOwotCi0gIGF1dG8gZml0ZXIgPSBmb3JtYXQuYmVnaW4oKTsKLSAgZm9yIChjb25zdCBhdXRvJiBvIDogZ3JvdXAtPnNlY29uZC5vcHRpb25zKQotICB7Ci0gICAgYXV0byBkID0gZm9ybWF0X2Rlc2NyaXB0aW9uKG8sIGxvbmdlc3QgKyBPUFRJT05fREVTQ19HQVAsIGFsbG93ZWQpOwotCi0gICAgcmVzdWx0ICs9IGZpdGVyLT5maXJzdDsKLSAgICBpZiAoc3RyaW5nTGVuZ3RoKGZpdGVyLT5maXJzdCkgPiBsb25nZXN0KQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgICAgcmVzdWx0ICs9IHRvTG9jYWxTdHJpbmcoc3RkOjpzdHJpbmcobG9uZ2VzdCArIE9QVElPTl9ERVNDX0dBUCwgJyAnKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gdG9Mb2NhbFN0cmluZyhzdGQ6OnN0cmluZyhsb25nZXN0ICsgT1BUSU9OX0RFU0NfR0FQIC0KLSAgICAgICAgc3RyaW5nTGVuZ3RoKGZpdGVyLT5maXJzdCksCi0gICAgICAgICcgJykpOwotICAgIH0KLSAgICByZXN1bHQgKz0gZDsKLSAgICByZXN1bHQgKz0gIlxuIjsKLQotICAgICsrZml0ZXI7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZwotT3B0aW9uczo6aGVscChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdyb3VwcykgY29uc3QKLXsKLSAgU3RyaW5nIHJlc3VsdCA9ICJVc2FnZTpcbiAgIiArIHRvTG9jYWxTdHJpbmcobV9wcm9ncmFtKSArICIgW09QVElPTi4uLl0iCi0gICAgKyBtX2hlbHBfc3RyaW5nICsgIlxuXG4iOwotCi0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBncm91cHMuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICByZXN1bHQgKz0gaGVscF9vbmVfZ3JvdXAoZ3JvdXBzW2ldKTsKLSAgICBpZiAoaSA8IGdyb3Vwcy5zaXplKCkgLSAxKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0b1VURjhTdHJpbmcocmVzdWx0KTsKLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ci1PcHRpb25zOjpncm91cHMoKSBjb25zdAotewotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZzsKLQotICBzdGQ6OnRyYW5zZm9ybSgKLSAgICBtX2hlbHAuYmVnaW4oKSwKLSAgICBtX2hlbHAuZW5kKCksCi0gICAgc3RkOjpiYWNrX2luc2VydGVyKGcpLAotICAgIFtdIChjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSGVscEdyb3VwRGV0YWlscz46OnZhbHVlX3R5cGUmIHBhaXIpCi0gICAgewotICAgICAgcmV0dXJuIHBhaXIuZmlyc3Q7Ci0gICAgfQotICApOwotCi0gIHJldHVybiBnOwotfQotCi1jb25zdCBIZWxwR3JvdXBEZXRhaWxzJgotT3B0aW9uczo6Z3JvdXBfaGVscChjb25zdCBzdGQ6OnN0cmluZyYgZ3JvdXApIGNvbnN0Ci17Ci0gIHJldHVybiBtX2hlbHAuYXQoZ3JvdXApOwotfQotCi19Ci0KLSNpZiBkZWZpbmVkKF9fR05VX18pCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLSNlbmRpZiAvL0NYWF9PUFRTX0hQUApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9Eb3h5ZmlsZSBiL2RvYy9Eb3h5ZmlsZQppbmRleCA4NzhlZTJhLi4xY2NiZjI2IDEwMDY0NAotLS0gYS9kb2MvRG94eWZpbGUKKysrIGIvZG9jL0RveHlmaWxlCkBAIC0xLDE3ICsxLDE4IEBACi0jIERveHlmaWxlIDEuOC4xNAorIyBEb3h5ZmlsZSAxLjguMTUKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKIFBST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiSlNPTiBmb3IgTW9kZXJuIEMrKyIKLVBST0pFQ1RfTlVNQkVSICAgICAgICAgPSAzLjAuMQorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IDMuMS4wCiBQUk9KRUNUX0JSSUVGICAgICAgICAgID0KIFBST0pFQ1RfTE9HTyAgICAgICAgICAgPQogT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IC4KIENSRUFURV9TVUJESVJTICAgICAgICAgPSBOTwogQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCiBPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorT1VUUFVUX1RFWFRfRElSRUNUSU9OICA9IE5vbmUKIEJSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKIFJFUEVBVF9CUklFRiAgICAgICAgICAgPSBOTwogQUJCUkVWSUFURV9CUklFRiAgICAgICA9CkBAIC0yNywxMSArMjgsMTEgQEAKIElOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKIFNFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBZRVMKIFRBQl9TSVpFICAgICAgICAgICAgICAgPSA0Ci1BTElBU0VTICAgICAgICAgICAgICAgID0gImNvbXBsZXhpdHk9QHBhciBDb21wbGV4aXR5XG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZWV4YW1wbGV7Mn09QHBhciBFeGFtcGxlXG4gXDEgXG4gQGluY2x1ZGVsaW5lbm8gXDIuY3BwIFxuIE91dHB1dCAocGxheSB3aXRoIHRoaXMgZXhhbXBsZSBAaHRtbGluY2x1ZGUgXDIubGluayk6XG4gQHZlcmJpbmNsdWRlIFwyLm91dHB1dCBcbiBUaGUgPGEgaHJlZj0gaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vYmxvYi9kZXZlbG9wL2RvYy9leGFtcGxlcy9cMi5jcHA+ZXhhbXBsZSBjb2RlPC9hPiBhYm92ZSBjYW4gYmUgdHJhbnNsYXRlZCB3aXRoIEB2ZXJiYXRpbSBnKysgLXN0ZD1jKysxMSAtSXNyYyBkb2MvZXhhbXBsZXMvXDIuY3BwIC1vIFwyIEBlbmR2ZXJiYXRpbSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlbWVudD1AcGFyIFJlcXVpcmVtZW50c1xuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnNhZmV0eT1AcGFyIEV4Y2VwdGlvbiBzYWZldHlcbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvcnM9QHBhciBJdGVyYXRvciB2YWxpZGl0eVxuIgorQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJjb21wbGV4aXR5PUBwYXIgQ29tcGxleGl0eV5eIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpdmVleGFtcGxlezJ9PUBwYXIgRXhhbXBsZV5eIFwxIF5eIEBpbmNsdWRlbGluZW5vIFwyLmNwcCBcbiBPdXRwdXQgKHBsYXkgd2l0aCB0aGlzIGV4YW1wbGUgQGh0bWxpbmNsdWRlIFwyLmxpbmspOl5eIEB2ZXJiaW5jbHVkZSBcMi5vdXRwdXQgXl4gVGhlIDxhIGhyZWY9IGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL2Jsb2IvZGV2ZWxvcC9kb2MvZXhhbXBsZXMvXDIuY3BwPmV4YW1wbGUgY29kZTwvYT4gYWJvdmUgY2FuIGJlIHRyYW5zbGF0ZWQgd2l0aCBAdmVyYmF0aW0gZysrIC1zdGQ9YysrMTEgLUlzaW5nbGVfaW5jbHVkZSBkb2MvZXhhbXBsZXMvXDIuY3BwIC1vIFwyIEBlbmR2ZXJiYXRpbSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlbWVudD1AcGFyIFJlcXVpcmVtZW50c15eIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnNhZmV0eT1AcGFyIEV4Y2VwdGlvbiBzYWZldHleXiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvcnM9QHBhciBJdGVyYXRvciB2YWxpZGl0eV5eIgogVENMX1NVQlNUICAgICAgICAgICAgICA9CiBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KIE9QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTwpAQCAtMTA2LDggKzEwNywxMCBAQAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlOUFVUICAgICAgICAgICAgICAgICAgPSAuLi9zcmMvanNvbi5ocHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm1kIGZhcS5tZAorSU5QVVQgICAgICAgICAgICAgICAgICA9IC4uL3NpbmdsZV9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5tZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFxLm1kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlfZm9ybWF0cy5tZAogSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CiBGSUxFX1BBVFRFUk5TICAgICAgICAgID0KIFJFQ1VSU0lWRSAgICAgICAgICAgICAgPSBOTwpAQCAtMTM4LDYgKzE0MSw3IEBACiBWRVJCQVRJTV9IRUFERVJTICAgICAgID0gTk8KIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKIENMQU5HX09QVElPTlMgICAgICAgICAgPSAtc3RkPWMrKzExCitDTEFOR19DT01QSUxBVElPTl9EQVRBQkFTRV9QQVRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kb2MvTWFrZWZpbGUgYi9kb2MvTWFrZWZpbGUKaW5kZXggODg2Mzc4YS4uMzBlZTc0OCAxMDA2NDQKLS0tIGEvZG9jL01ha2VmaWxlCisrKyBiL2RvYy9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLVNSQ0RJUiA9IC4uL3NyYworU1JDRElSID0gLi4vc2luZ2xlX2luY2x1ZGUKIFNFRDo9JChzaGVsbCBjb21tYW5kIC12IGdzZWQgfHwgd2hpY2ggc2VkKQogCiBhbGw6IGRveHlnZW4KQEAgLTI4LDcgKzI4LDcgQEAKICUubGluazogJS5jcHAKIAlybSAtZnIgdG1wCiAJbWtkaXIgdG1wCi0JY3AgJChTUkNESVIpL2pzb24uaHBwIHRtcAorCWNwIC1yICQoU1JDRElSKS9ubG9obWFubiB0bXAKIAlzY3JpcHRzL3NlbmRfdG9fd2FuZGJveC5weSB0bXAgJDwgPiAkQC50bXAKIAkvYmluL2VjaG8gLW4gIjxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJgY2F0ICRALnRtcGBcIj48Yj5vbmxpbmU8L2I+PC9hPiIgPiAkQAogCXJtIC1mciB0bXAgJEAudG1wCmRpZmYgLS1naXQgYS9kb2MvYXZhdGFycy5wbmcgYi9kb2MvYXZhdGFycy5wbmcKaW5kZXggNDU1MTMxNy4uZDNiYTUxYyAxMDA2NDQKLS0tIGEvZG9jL2F2YXRhcnMucG5nCisrKyBiL2RvYy9hdmF0YXJzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvYmluYXJ5X2Zvcm1hdHMubWQgYi9kb2MvYmluYXJ5X2Zvcm1hdHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMjMzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iaW5hcnlfZm9ybWF0cy5tZApAQCAtMCwwICsxLDE3MSBAQAorIyBCaW5hcnkgZm9ybWF0cworCishW2NvbnZlcnNpb24gYmV0d2VlbiBKU09OIGFuZCBiaW5hcnkgZm9ybWF0c10oaW1hZ2VzL2JpbmFyeS5wbmcpCisKK1NldmVyYWwgZm9ybWF0cyBleGlzdCB0aGF0IGVuY29kZSBKU09OIHZhbHVlcyBpbiBhIGJpbmFyeSBmb3JtYXQgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBlbmNvZGVkIHZhbHVlIGFzIHdlbGwgYXMgdGhlIHJlcXVpcmVkIGVmZm9ydCB0byBwYXJzZSBlbmNvZGVkIHZhbHVlLiBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIHRocmVlIGZvcm1hdHMsIG5hbWVseQorCistIFtDQk9SXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzA0OSkgKENvbmNpc2UgQmluYXJ5IE9iamVjdCBSZXByZXNlbnRhdGlvbikKKy0gW01lc3NhZ2VQYWNrXShodHRwczovL21zZ3BhY2sub3JnKQorLSBbVUJKU09OXShodHRwOi8vdWJqc29uLm9yZykgKFVuaXZlcnNhbCBCaW5hcnkgSlNPTikKKworIyMgSW50ZXJmYWNlCisKKyMjIyBKU09OIHRvIGJpbmFyeSBmb3JtYXQKKworRm9yIGVhY2ggZm9ybWF0LCB0aGUgYHRvXypgIGZ1bmN0aW9ucyAoaS5lLiwgYHRvX2Nib3JgLCBgdG9fbXNncGFja2AsIGFuZCBgdG9fdWJqc29uYCkgY29udmVydCBhIEpTT04gdmFsdWUgaW50byB0aGUgcmVzcGVjdGl2ZSBiaW5hcnkgZm9ybWF0LiBUYWtpbmcgQ0JPUiBhcyBleGFtcGxlLCB0aGUgY29uY3JldGUgcHJvdG90eXBlcyBhcmU6CisKK2BgYGNwcAorc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRvX2Nib3IoY29uc3QgYmFzaWNfanNvbiYgaik7ICAgICAgICAgICAgICAgICAgICAvLyAxCitzdGF0aWMgdm9pZCB0b19jYm9yKGNvbnN0IGJhc2ljX2pzb24mIGosIGRldGFpbDo6b3V0cHV0X2FkYXB0ZXI8dWludDhfdD4gbyk7IC8vIDIKK3N0YXRpYyB2b2lkIHRvX2Nib3IoY29uc3QgYmFzaWNfanNvbiYgaiwgZGV0YWlsOjpvdXRwdXRfYWRhcHRlcjxjaGFyPiBvKTsgICAgLy8gMworYGBgCisKK1RoZSBmaXJzdCBmdW5jdGlvbiBjcmVhdGVzIGEgYnl0ZSB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gSlNPTiB2YWx1ZS4gVGhlIHNlY29uZCBhbmQgdGhpcmQgZnVuY3Rpb24gd3JpdGVzIHRvIGFuIG91dHB1dCBhZGFwdGVyIG9mIGB1aW50OF90YCBhbmQgYGNoYXJgLCByZXNwZWN0aXZlbHkuIE91dHB1dCBhZGFwdGVycyBhcmUgaW1wbGVtZW50ZWQgZm9yIHN0cmluZ3MsIG91dHB1dCBzdHJlYW1zLCBhbmQgdmVjdG9ycy4KKworR2l2ZW4gYSBKU09OIHZhbHVlIGBqYCwgdGhlIGZvbGxvd2luZyBjYWxscyBhcmUgcG9zc2libGU6CisKK2BgYGNwcAorc3RkOjp2ZWN0b3I8dWludDhfdD4gdjsKK3YgPSBqc29uOjp0b19jYm9yKGopOyAgIC8vIDEKKworanNvbjo6dG9fY2JvcihqLCB2KTsgICAgLy8gMgorCitzdGQ6OnN0cmluZyBzOworanNvbjo6dG9fY2JvcihqLCBzKTsgICAgLy8gMworCitzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworanNvbjo6dG9fY2JvcihqLCBvc3MpOyAgLy8gMworYGBgCisKKyMjIyBCaW5hcnkgZm9ybWF0IHRvIEpTT04KKworTGlrZXdpc2UsIHRoZSBgZnJvbV8qYCBmdW5jdGlvbnMgKGkuZSwgYGZyb21fY2JvcmAsIGBmcm9tX21zZ3BhY2tgLCBhbmQgYGZyb21fdWJqc29uYCkgY29udmVydCBhIGJpbmFyeSBlbmNvZGVkIHZhbHVlIGludG8gYSBKU09OIHZhbHVlLiBUYWtpbmcgQ0JPUiBhcyBleGFtcGxlLCB0aGUgY29uY3JldGUgcHJvdG90eXBlcyBhcmU6CisKK2BgYGNwcAorc3RhdGljIGJhc2ljX2pzb24gZnJvbV9jYm9yKGRldGFpbDo6aW5wdXRfYWRhcHRlciBpLCBjb25zdCBib29sIHN0cmljdCA9IHRydWUpOyAvLyAxCitzdGF0aWMgYmFzaWNfanNvbiBmcm9tX2Nib3IoQTEgJiYgYTEsIEEyICYmIGEyLCBjb25zdCBib29sIHN0cmljdCA9IHRydWUpOyAgICAgIC8vIDIKK2BgYAorCitCb3RoIGZ1bmN0aW9ucyByZWFkIGZyb20gYW4gaW5wdXQgYWRhcHRlcjogdGhlIGZpcnN0IGZ1bmN0aW9uIHRha2VzIGl0IGRpcmVjdGx5IGZvcm0gYXJndW1lbnQgYGlgLCB3aGVyZWFzIHRoZSBzZWNvbmQgZnVuY3Rpb24gY3JlYXRlcyBpdCBmcm9tIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgYGExYCBhbmQgYGEyYC4gSWYgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBgc3RyaWN0YCBpcyB0cnVlLCB0aGUgaW5wdXQgbXVzdCBiZSByZWFkIGNvbXBsZXRlbHkgKG9yIGEgcGFyc2UgZXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bikuIElmIGl0IGlzIGZhbHNlLCBwYXJzaW5nIHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIGlucHV0IGlzIG5vdCBjb21wbGV0ZWx5IHJlYWQuCisKK0lucHV0IGFkYXB0ZXJzIGFyZSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQgc3RyZWFtcywgY2hhcmFjdGVyIGJ1ZmZlcnMsIHN0cmluZyBsaXRlcmFscywgYW5kIGl0ZXJhdG9yIHJhbmdlcy4KKworR2l2ZW4gc2V2ZXJhbCBpbnB1dHMgKHdoaWNoIHdlIGFzc3VtZSB0byBiZSBmaWxsZWQgd2l0aCBhIENCT1IgdmFsdWUpLCB0aGUgZm9sbG93aW5nIGNhbGxzIGFyZSBwb3NzaWJsZToKKworYGBgY3BwCitzdGQ6OnN0cmluZyBzOworanNvbiBqMSA9IGpzb246OmZyb21fY2JvcihzKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorCitzdGQ6Omlmc3RyZWFtIGlzKCJzb21lZmlsZS5jYm9yIiwgc3RkOjppb3M6OmJpbmFyeSk7Citqc29uIGoyID0ganNvbjo6ZnJvbV9jYm9yKGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHY7Citqc29uIGozID0ganNvbjo6ZnJvbV9jYm9yKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisKK2NvbnN0IGNoYXIqIGJ1ZmY7CitzdGQ6OnNpemVfdCBidWZmX3NpemU7Citqc29uIGo0ID0ganNvbjo6ZnJvbV9jYm9yKGJ1ZmYsIGJ1ZmZfc2l6ZSk7ICAgICAgICAgICAvLyAyCitgYGAKKworIyMgRGV0YWlscworCisjIyMgQ0JPUgorCitUaGUgbWFwcGluZyBmcm9tIENCT1IgdG8gSlNPTiBpcyAqKmluY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBub3QgYWxsIENCT1IgdHlwZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUuIFRoZSBmb2xsb3dpbmcgQ0JPUiB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCB5aWVsZCBwYXJzZSBlcnJvcnMgKHBhcnNlX2Vycm9yLjExMik6CisKKy0gYnl0ZSBzdHJpbmdzICgweDQwLi4weDVGKQorLSBkYXRlL3RpbWUgKDB4QzAuLjB4QzEpCistIGJpZ251bSAoMHhDMi4uMHhDMykKKy0gZGVjaW1hbCBmcmFjdGlvbiAoMHhDNCkKKy0gYmlnZmxvYXQgKDB4QzUpCistIHRhZ2dlZCBpdGVtcyAoMHhDNi4uMHhENCwgMHhEOC4uMHhEQikKKy0gZXhwZWN0ZWQgY29udmVyc2lvbnMgKDB4RDUuLjB4RDcpCistIHNpbXBsZSB2YWx1ZXMgKDB4RTAuLjB4RjMsIDB4RjgpCistIHVuZGVmaW5lZCAoMHhGNykKKworQ0JPUiBmdXJ0aGVyIGFsbG93cyBtYXAga2V5cyBvZiBhbnkgdHlwZSwgd2hlcmVhcyBKU09OIG9ubHkgYWxsb3dzIHN0cmluZ3MgYXMga2V5cyBpbiBvYmplY3QgdmFsdWVzLiBUaGVyZWZvcmUsIENCT1IgbWFwcyB3aXRoIGtleXMgb3RoZXIgdGhhbiBVVEYtOCBzdHJpbmdzIGFyZSByZWplY3RlZCAocGFyc2VfZXJyb3IuMTEzKS4KKworVGhlIG1hcHBpbmcgZnJvbSBKU09OIHRvIENCT1IgaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBKU09OIHZhbHVlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhIENCT1IgdmFsdWUuCisKK0lmIE5hTiBvciBJbmZpbml0eSBhcmUgc3RvcmVkIGluc2lkZSBhIEpTT04gbnVtYmVyLCB0aGV5IGFyZSBzZXJpYWxpemVkIHByb3Blcmx5LiBUaGlzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGUgZHVtcCgpIGZ1bmN0aW9uIHdoaWNoIHNlcmlhbGl6ZXMgTmFOIG9yIEluZmluaXR5IHRvIG51bGwuCisKK1RoZSBmb2xsb3dpbmcgQ0JPUiB0eXBlcyBhcmUgbm90IHVzZWQgaW4gdGhlIGNvbnZlcnNpb246CisKKy0gYnl0ZSBzdHJpbmdzICgweDQwLi4weDVGKQorLSBVVEYtOCBzdHJpbmdzIHRlcm1pbmF0ZWQgYnkgImJyZWFrIiAoMHg3RikKKy0gYXJyYXlzIHRlcm1pbmF0ZWQgYnkgImJyZWFrIiAoMHg5RikKKy0gbWFwcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIgKDB4QkYpCistIGRhdGUvdGltZSAoMHhDMC4uMHhDMSkKKy0gYmlnbnVtICgweEMyLi4weEMzKQorLSBkZWNpbWFsIGZyYWN0aW9uICgweEM0KQorLSBiaWdmbG9hdCAoMHhDNSkKKy0gdGFnZ2VkIGl0ZW1zICgweEM2Li4weEQ0LCAweEQ4Li4weERCKQorLSBleHBlY3RlZCBjb252ZXJzaW9ucyAoMHhENS4uMHhENykKKy0gc2ltcGxlIHZhbHVlcyAoMHhFMC4uMHhGMywgMHhGOCkKKy0gdW5kZWZpbmVkICgweEY3KQorLSBoYWxmIGFuZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cyAoMHhGOS0weEZBKQorLSBicmVhayAoMHhGRikKKworIyMjIE1lc3NhZ2VQYWNrCisKK1RoZSBtYXBwaW5nIGZyb20gTWVzc2FnZVBhY2sgdG8gSlNPTiBpcyAqKmluY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBub3QgYWxsIE1lc3NhZ2VQYWNrIHR5cGVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBKU09OIHZhbHVlLiBUaGUgZm9sbG93aW5nIE1lc3NhZ2VQYWNrIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIHlpZWxkIHBhcnNlIGVycm9yczoKKworLSBiaW4gOCAtIGJpbiAzMiAoMHhDNC4uMHhDNikKKy0gZXh0IDggLSBleHQgMzIgKDB4QzcuLjB4QzkpCistIGZpeGV4dCAxIC0gZml4ZXh0IDE2ICgweEQ0Li4weEQ4KQorCitUaGUgbWFwcGluZyBmcm9tIEpTT04gdG8gTWVzc2FnZVBhY2sgaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBKU09OIHZhbHVlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhIE1lc3NhZ2VQYWNrIHZhbHVlLgorCitUaGUgZm9sbG93aW5nIHZhbHVlcyBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBhIE1lc3NhZ2VQYWNrIHZhbHVlOgorCistIHN0cmluZ3Mgd2l0aCBtb3JlIHRoYW4gNDI5NDk2NzI5NSBieXRlcworLSBhcnJheXMgd2l0aCBtb3JlIHRoYW4gNDI5NDk2NzI5NSBlbGVtZW50cworLSBvYmplY3RzIHdpdGggbW9yZSB0aGFuIDQyOTQ5NjcyOTUgZWxlbWVudHMKKworVGhlIGZvbGxvd2luZyBNZXNzYWdlUGFjayB0eXBlcyBhcmUgbm90IHVzZWQgaW4gdGhlIGNvbnZlcnNpb246CisKKy0gYmluIDggLSBiaW4gMzIgKDB4QzQuLjB4QzYpCistIGV4dCA4IC0gZXh0IDMyICgweEM3Li4weEM5KQorLSBmbG9hdCAzMiAoMHhDQSkKKy0gZml4ZXh0IDEgLSBmaXhleHQgMTYgKDB4RDQuLjB4RDgpCisKK0FueSBNZXNzYWdlUGFjayBvdXRwdXQgY3JlYXRlZCBgdG9fbXNncGFja2AgY2FuIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYnkgYGZyb21fbXNncGFja2AuCisKK0lmIE5hTiBvciBJbmZpbml0eSBhcmUgc3RvcmVkIGluc2lkZSBhIEpTT04gbnVtYmVyLCB0aGV5IGFyZSBzZXJpYWxpemVkIHByb3Blcmx5LiBUaGlzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGUgYGR1bXAoKWAgZnVuY3Rpb24gd2hpY2ggc2VyaWFsaXplcyBOYU4gb3IgSW5maW5pdHkgdG8gYG51bGxgLgorCisjIyMgVUJKU09OCisKK1RoZSBtYXBwaW5nIGZyb20gVUJKU09OIHRvIEpTT04gaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBVQkpTT04gdmFsdWUgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUuCisKK1RoZSBtYXBwaW5nIGZyb20gSlNPTiB0byBVQkpTT04gaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBKU09OIHZhbHVlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhIFVCSlNPTiB2YWx1ZS4KKworVGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBVQkpTT04gdmFsdWU6CisKKy0gc3RyaW5ncyB3aXRoIG1vcmUgdGhhbiA5MjIzMzcyMDM2ODU0Nzc1ODA3IGJ5dGVzICh0aGVvcmV0aWNhbCkKKy0gdW5zaWduZWQgaW50ZWdlciBudW1iZXJzIGFib3ZlIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKworVGhlIGZvbGxvd2luZyBtYXJrZXJzIGFyZSBub3QgdXNlZCBpbiB0aGUgY29udmVyc2lvbjoKKworLSBgWmA6IG5vLW9wIHZhbHVlcyBhcmUgbm90IGNyZWF0ZWQuCistIGBDYDogc2luZ2xlLWJ5dGUgc3RyaW5ncyBhcmUgc2VyaWFsaXplZCB3aXRoIFMgbWFya2Vycy4KKworQW55IFVCSlNPTiBvdXRwdXQgY3JlYXRlZCB0b191Ympzb24gY2FuIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYnkgZnJvbV91Ympzb24uCisKK0lmIE5hTiBvciBJbmZpbml0eSBhcmUgc3RvcmVkIGluc2lkZSBhIEpTT04gbnVtYmVyLCB0aGV5IGFyZSBzZXJpYWxpemVkIHByb3Blcmx5LiBUaGlzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGUgYGR1bXAoKWAgZnVuY3Rpb24gd2hpY2ggc2VyaWFsaXplcyBOYU4gb3IgSW5maW5pdHkgdG8gbnVsbC4KKworVGhlIG9wdGltaXplZCBmb3JtYXRzIGZvciBjb250YWluZXJzIGFyZSBzdXBwb3J0ZWQ6IFBhcmFtZXRlciBgdXNlX3NpemVgIGFkZHMgc2l6ZSBpbmZvcm1hdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIGEgY29udGFpbmVyIGFuZCByZW1vdmVzIHRoZSBjbG9zaW5nIG1hcmtlci4gUGFyYW1ldGVyIGB1c2VfdHlwZWAgZnVydGhlciBjaGVja3Mgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBjb250YWluZXIgaGF2ZSB0aGUgc2FtZSB0eXBlIGFuZCBhZGRzIHRoZSB0eXBlIG1hcmtlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250YWluZXIuIFRoZSBgdXNlX3R5cGVgIHBhcmFtZXRlciBtdXN0IG9ubHkgYmUgdXNlZCB0b2dldGhlciB3aXRoIGB1c2Vfc2l6ZSA9IHRydWVgLiBOb3RlIHRoYXQgYHVzZV9zaXplID0gdHJ1ZWAgYWxvbmUgbWF5IHJlc3VsdCBpbiBsYXJnZXIgcmVwcmVzZW50YXRpb25zIC0gdGhlIGJlbmVmaXQgb2YgdGhpcyBwYXJhbWV0ZXIgaXMgdGhhdCB0aGUgcmVjZWl2aW5nIHNpZGUgaXMgaW1tZWRpYXRlbHkgaW5mb3JtZWQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgY29udGFpbmVyLgorCisjIyBTaXplIGNvbXBhcmlzb24gZXhhbXBsZXMKKworVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgc2l6ZSBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgSlNPTiB2YWx1ZSBmb3IgZGlmZmVyZW50IGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cy4KKworfCBmb3JtYXQgICAgICAgICAgICAgICAgICB8IHNhbXBsZS5qc29uIHwgYWxsX3VuaWNvZGUuanNvbiB8IGZsb2F0cy5qc29uIHwgc2lnbmVkX2ludHMuanNvbiB8IGplb3BhcmR5Lmpzb24gfCBjYW5hZGEuanNvbiB8Cit8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS06fCAtLS0tLS0tLS0tLS0tLS0tOnwgLS0tLS0tLS0tLS06fCAtLS0tLS0tLS0tLS0tLS0tOnwgLS0tLS0tLS0tLS0tLTp8IC0tLS0tLS0tLS0tOnwKK3wgSlNPTiAgICAgICAgICAgICAgICAgICAgfCAgICAxMDAuMDAgJSB8ICAgICAgICAgMTAwLjAwICUgfCAgICAxMDAuMDAgJSB8ICAgICAgICAgMTAwLjAwICUgfCAgICAgIDEwMC4wMCAlIHwgICAgMTAwLjAwICUgfAorfCBDQk9SICAgICAgICAgICAgICAgICAgICB8ICAgICA4Ny4yMSAlIHwgICAgICAgICAgNzEuMTggJSB8ICAgICA0OC4yMCAlIHwgICAgICAgICAgNDQuMTYgJSB8ICAgICAgIDg3Ljk2ICUgfCAgICAgNTAuNTMgJSB8Cit8IE1lc3NhZ2VQYWNrICAgICAgICAgICAgIHwgICAgIDg3LjE2ICUgfCAgICAgICAgICA3MS4xOCAlIHwgICAgIDQ4LjIwICUgfCAgICAgICAgICA0NC4xNiAlIHwgICAgICAgODcuOTEgJSB8ICAgICA1MC41NiAlIHwKK3wgVUJKU09OIHVub3B0aW1pemVkICAgICAgfCAgICAgODguMTUgJSB8ICAgICAgICAgMTAwLjAwICUgfCAgICAgNDguMjAgJSB8ICAgICAgICAgIDQ0LjE2ICUgfCAgICAgICA5Ni41OCAlIHwgICAgIDUzLjIwICUgfAorfCBVQkpTT04gc2l6ZS1vcHRpbWl6ZWQgICB8ICAgICA4OS4yNiAlIHwgICAgICAgICAxMDAuMDAgJSB8ICAgICA0OC4yMCAlIHwgICAgICAgICAgNDQuMTYgJSB8ICAgICAgIDk3LjQwICUgfCAgICAgNTguNTYgJSB8Cit8IFVCSlNPTiBmb3JtYXQtb3B0aW1pemVkIHwgICAgIDg5LjQ1ICUgfCAgICAgICAgIDEwMC4wMCAlIHwgICAgIDQyLjg1ICUgfCAgICAgICAgICAzOS4yNiAlIHwgICAgICAgOTQuOTYgJSB8ICAgICA1NS45MyAlIHwKKworVGhlIHJlc3VsdHMgc2hvdyB0aGF0IHRoZXJlIGRvZXMgbm90IGV4aXN0IGEgImJlc3QiIGVuY29kaW5nLiBGdXJ0aGVybW9yZSwgaXQgaXMgbm90IGFsd2F5cyB3b3J0aHdoaWxlIHRvIHVzZSBVQkpTT04ncyBvcHRpbWl6YXRpb25zLgpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1JFQURNRS5jcHAgYi9kb2MvZXhhbXBsZXMvUkVBRE1FLmNwcAppbmRleCA1YThhYjM4Li4wNGI0ODhkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvUkVBRE1FLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvUkVBRE1FLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvUkVBRE1FLmxpbmsgYi9kb2MvZXhhbXBsZXMvUkVBRE1FLmxpbmsKaW5kZXggNTQwM2UwZC4uMzY1YTg4MyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1JFQURNRS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9SRUFETUUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvT3A1N1gwVjdmVGYydGR3bCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9WSHBiYVpCT25yWmNibjdqIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9hcnJheS5jcHAgYi9kb2MvZXhhbXBsZXMvYXJyYXkuY3BwCmluZGV4IGI0M2JlNWEuLjEzOWI1ZWYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9hcnJheS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2FycmF5LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXJyYXkubGluayBiL2RvYy9leGFtcGxlcy9hcnJheS5saW5rCmluZGV4IGNkNzdlZDEuLjVmMDJmOGMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9hcnJheS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9hcnJheS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9qS3dsUWQ3cEZnNlVjSU41Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3BpV3JhWWhWZzJDVjNqMkgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlLmNwcAppbmRleCAwNDMwNjE3Li4yMDJmOGEyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlLmxpbmsKaW5kZXggYjRkNmVmYy4uYmFjNjdhZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9hdF9fb2JqZWN0X3Rfa2V5X3R5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRlIyeVlBQ1pweDBrM1J6cCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay93dFd6UFNRV1dpdXhsZFZzIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9hdF9fb2JqZWN0X3Rfa2V5X3R5cGVfY29uc3QuY3BwIGIvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZV9jb25zdC5jcHAKaW5kZXggOWFhMmVkMy4uNTZjZTU3NiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZV9jb25zdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZV9jb25zdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZV9jb25zdC5saW5rIGIvZG9jL2V4YW1wbGVzL2F0X19vYmplY3RfdF9rZXlfdHlwZV9jb25zdC5saW5rCmluZGV4IDZlNmNhMzMuLjMwMDBjYzUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9hdF9fb2JqZWN0X3Rfa2V5X3R5cGVfY29uc3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvYXRfX29iamVjdF90X2tleV90eXBlX2NvbnN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2FlRjhTMkQ4OUE4bGZWeDEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvWmgzaVRuWk54c1NnQnZtMyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZS5jcHAKaW5kZXggMjAyZTQ0Yi4uNjViYWVkZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F0X19zaXplX3R5cGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9hdF9fc2l6ZV90eXBlLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZS5saW5rIGIvZG9jL2V4YW1wbGVzL2F0X19zaXplX3R5cGUubGluawppbmRleCA1ZGVjMzc1Li5iMDZlZjcwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9hdF9fc2l6ZV90eXBlLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0dtTmRRYWRjOGNXRHpZcG4iPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTWZNOFhJdVBXTXZ4eGRlYiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZV9jb25zdC5jcHAgYi9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZV9jb25zdC5jcHAKaW5kZXggMzMxMDhjZS4uZmFhNGNmZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F0X19zaXplX3R5cGVfY29uc3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9hdF9fc2l6ZV90eXBlX2NvbnN0LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZV9jb25zdC5saW5rIGIvZG9jL2V4YW1wbGVzL2F0X19zaXplX3R5cGVfY29uc3QubGluawppbmRleCA3NDEyZjA5Li5iYTQ2NWQzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYXRfX3NpemVfdHlwZV9jb25zdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9hdF9fc2l6ZV90eXBlX2NvbnN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3pMa3A4MEpGc0tFdVBkMXQiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvZUZFY25GWnhmZExHU01odyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyLmNwcCBiL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXIuY3BwCmluZGV4IGY0M2IxYmMuLmVkNDUwZjcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXIubGluayBiL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXIubGluawppbmRleCA5OWViZjAxLi40YmFlMGNhIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2F0X2pzb25fcG9pbnRlci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay8zUk8wbmFRZVkzY1dYTkF6Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1NUMmxyYXhwUExkRE9VRm4iPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2F0X2pzb25fcG9pbnRlcl9jb25zdC5jcHAgYi9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyX2NvbnN0LmNwcAppbmRleCA4MDA5ZTk1Li42ZjJiMmY1IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyX2NvbnN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyX2NvbnN0LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyX2NvbnN0LmxpbmsgYi9kb2MvZXhhbXBsZXMvYXRfanNvbl9wb2ludGVyX2NvbnN0LmxpbmsKaW5kZXggOTAxMWI5OS4uMjFlMDAwYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F0X2pzb25fcG9pbnRlcl9jb25zdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9hdF9qc29uX3BvaW50ZXJfY29uc3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTHd0R05xckdnamNXZXkzUCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9Ga1B3cXVJbHI5cG9qdkdmIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYWNrLmNwcCBiL2RvYy9leGFtcGxlcy9iYWNrLmNwcAppbmRleCBjYjIyN2MyLi4xNDM5YTgyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFjay5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2JhY2suY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYWNrLmxpbmsgYi9kb2MvZXhhbXBsZXMvYmFjay5saW5rCmluZGV4IGZhMWNlOTEuLjA5YTg1ZmQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYWNrLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2JhY2subGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVlhUZkxKUWw5eDdOYUhySSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9BeEhDMVhsNktBTFdKMEZKIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19Db21wYXRpYmxlVHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGUuY3BwCmluZGV4IDY5NDkzNTUuLmQzOWZkN2EgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19Db21wYXRpYmxlVHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX0NvbXBhdGlibGVUeXBlLmNwcApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8dmFsYXJyYXk+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX0NvbXBhdGlibGVUeXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGUubGluawppbmRleCBhNmU3ODZhLi42ZjQwMTQ0IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGUubGluaworKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvczdFY3k3aERZU21VV0h5eCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9weWxGY2lRVWhPeDZ6WFc4Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19Db21wYXRpYmxlVHlwZS5vdXRwdXQgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGUub3V0cHV0CmluZGV4IGNkNTkyM2IuLjIzMzdlODEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19Db21wYXRpYmxlVHlwZS5vdXRwdXQKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX0NvbXBhdGlibGVUeXBlLm91dHB1dApAQCAtMjgsMTAgKzI4LDEwIEBACiAxMDI0CiAtMTcKIDgKLTMuMTQxNTkyNjUzNTg5NzkKKzMuMTQxNTkyNjUzNTg5NzkzCiBudWxsCiBudWxsCi00Mi4yMjk5OTk1NDIyMzYzCis0Mi4yMjk5OTk1NDIyMzYzMwogbnVsbAogMjMuNDIKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX0lucHV0SXRfSW5wdXRJdC5jcHAgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fSW5wdXRJdF9JbnB1dEl0LmNwcAppbmRleCAzNmM2ZjU3Li5lZDVhZmY5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fSW5wdXRJdF9JbnB1dEl0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fSW5wdXRJdF9JbnB1dEl0LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fSW5wdXRJdF9JbnB1dEl0LmxpbmsgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fSW5wdXRJdF9JbnB1dEl0LmxpbmsKaW5kZXggYWFkNThmNy4uYmQ4MTcwZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX0lucHV0SXRfSW5wdXRJdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19JbnB1dEl0X0lucHV0SXQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvcXBGUVJTQ25QNmlWYjNkRiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9LQ2ZSdmJXM1FUdmdobEZiIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19iYXNpY19qc29uLmNwcCBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19iYXNpY19qc29uLmNwcAppbmRleCA5OGRmNjEwLi4xNzEzNmY0IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fYmFzaWNfanNvbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2Jhc2ljX2pzb24uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19iYXNpY19qc29uLmxpbmsgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fYmFzaWNfanNvbi5saW5rCmluZGV4IGU4OTRiNjYuLjhlNDRmYTcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19iYXNpY19qc29uLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2Jhc2ljX2pzb24ubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvaFJyS2dIUDJhMHpnZHhKMSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9UTTBPa2RTZ0VJR0JEYnJ2Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19jb3B5YXNzaWdubWVudC5jcHAgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fY29weWFzc2lnbm1lbnQuY3BwCmluZGV4IDRmMWJjNDMuLjJkODY1NzQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19jb3B5YXNzaWdubWVudC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2NvcHlhc3NpZ25tZW50LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fY29weWFzc2lnbm1lbnQubGluayBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19jb3B5YXNzaWdubWVudC5saW5rCmluZGV4IGVlYzkyNTguLmI1NThhYTAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19jb3B5YXNzaWdubWVudC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19jb3B5YXNzaWdubWVudC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay80cDB6Y2NqcjlnVUk2NUgyIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2pXREpQWHc0OTBJRm9WTDEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2xpc3RfaW5pdF90LmNwcCBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19saXN0X2luaXRfdC5jcHAKaW5kZXggYmExYmNlNC4uNzg2MTFlMSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2xpc3RfaW5pdF90LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbGlzdF9pbml0X3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19saXN0X2luaXRfdC5saW5rIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2xpc3RfaW5pdF90LmxpbmsKaW5kZXggNzUyMzRiNi4uYjkyYTlmYSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2xpc3RfaW5pdF90LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX2xpc3RfaW5pdF90LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1h5RFZCbEdzVTFESHBSbDkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRlIySW1FajA1UjFicXFaMiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbW92ZWNvbnN0cnVjdG9yLmNwcCBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19tb3ZlY29uc3RydWN0b3IuY3BwCmluZGV4IDM0ODI3MjUuLjQ4YjY4ZjYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19tb3ZlY29uc3RydWN0b3IuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19tb3ZlY29uc3RydWN0b3IuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19tb3ZlY29uc3RydWN0b3IubGluayBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19tb3ZlY29uc3RydWN0b3IubGluawppbmRleCBmOTA0NzMwLi5jNDVlMDliIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbW92ZWNvbnN0cnVjdG9yLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX21vdmVjb25zdHJ1Y3Rvci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9aMXVUb09jemE5QUxKeE5VIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1hUSE4wbE1UOVFzbUJjQnkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX251bGxwdHJfdC5jcHAgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbnVsbHB0cl90LmNwcAppbmRleCA4ODZkNWVhLi43YTQzNjY2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbnVsbHB0cl90LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbnVsbHB0cl90LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbnVsbHB0cl90LmxpbmsgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fbnVsbHB0cl90LmxpbmsKaW5kZXggMDAzMTEwZi4uMzA1NjhlZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX251bGxwdHJfdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19udWxscHRyX3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvSlFVR0daVDhxWnlRc0hSdiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9pQ3d2WEppbkNWWTdxMXZpIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19zaXplX3R5cGVfYmFzaWNfanNvbi5jcHAgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fc2l6ZV90eXBlX2Jhc2ljX2pzb24uY3BwCmluZGV4IGEwMjFlZGQuLjllYzc2NzcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19zaXplX3R5cGVfYmFzaWNfanNvbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3NpemVfdHlwZV9iYXNpY19qc29uLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fc2l6ZV90eXBlX2Jhc2ljX2pzb24ubGluayBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19zaXplX3R5cGVfYmFzaWNfanNvbi5saW5rCmluZGV4IGU0OGI5ZmQuLjJiMjg2ZGMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19zaXplX3R5cGVfYmFzaWNfanNvbi5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX19zaXplX3R5cGVfYmFzaWNfanNvbi5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9sNGZFZTdVbjVjdENRTnVBIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0J6eWVXcXQ0dVRRMm5iZngiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlLmNwcCBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZS5jcHAKaW5kZXggNDJkNGFhMy4uOTQ4OGQzMCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fdmFsdWUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZS5saW5rIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlLmxpbmsKaW5kZXggZDAxODI3OC4uZGYyYmJkYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0JSdDFRcFRzT0JraVZjUkMiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvekZXYTNaeW90Mm9NM1o4TyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fdmFsdWVfcHRyLmNwcCBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV9wdHIuY3BwCmluZGV4IDRmNmY5OTkuLmYyNWI3NzMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV9wdHIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV9wdHIuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV9wdHIubGluayBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV9wdHIubGluawppbmRleCA3OTlmOTZmLi4zZjM5MzY5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fdmFsdWVfcHRyLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlX3B0ci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay96VGx1YklIWU9LNkVHeG5jIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0VDZnZNcjRtNjhNZnIxOTIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlX3QuY3BwIGIvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlX3QuY3BwCmluZGV4IGQ1MmU2MjguLmMzMDY3MzEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV90LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fdmFsdWVfdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlX3QubGluayBiL2RvYy9leGFtcGxlcy9iYXNpY19qc29uX192YWx1ZV90LmxpbmsKaW5kZXggYTY2YjFkZC4uOGRjNDFiMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Jhc2ljX2pzb25fX3ZhbHVlX3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvYmFzaWNfanNvbl9fdmFsdWVfdC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9ObEt1SkVrS0R4N0loTjlaIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0xOY2s3R2t0bTE0Ym1QeTAiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2JlZ2luLmNwcCBiL2RvYy9leGFtcGxlcy9iZWdpbi5jcHAKaW5kZXggZWJmOTdlNS4uNDI3MTBkMSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2JlZ2luLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvYmVnaW4uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9iZWdpbi5saW5rIGIvZG9jL2V4YW1wbGVzL2JlZ2luLmxpbmsKaW5kZXggNjRhYzVmYi4uMzg3NTQyMSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2JlZ2luLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2JlZ2luLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2ZUbmFpQjd3Mm9jZ0FzdzgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsveEtBaTNIR0FkQ1U1eTJkUyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2JlZ2luLmNwcCBiL2RvYy9leGFtcGxlcy9jYmVnaW4uY3BwCmluZGV4IGQxMmM4NjAuLjMyMjZmZDIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jYmVnaW4uY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jYmVnaW4uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jYmVnaW4ubGluayBiL2RvYy9leGFtcGxlcy9jYmVnaW4ubGluawppbmRleCBmZTY3MGYxLi41NDdhZTQ4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2JlZ2luLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2NiZWdpbi5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9JN2JsQ3lJTkpIQlg4MUpHIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL29LTm8zR0RVYTljeGpnVkIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NlbmQuY3BwIGIvZG9jL2V4YW1wbGVzL2NlbmQuY3BwCmluZGV4IDhkMTQxYWMuLjlkNzk3OGQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jZW5kLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvY2VuZC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NlbmQubGluayBiL2RvYy9leGFtcGxlcy9jZW5kLmxpbmsKaW5kZXggM2M3MjY0Mi4uN2I4YmNiYSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2NlbmQubGluaworKysgYi9kb2MvZXhhbXBsZXMvY2VuZC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9MUW1Wb295TGlRV2pxbnJhIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL21QNGNPU0c0TXRYbVhsRnciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsZWFyLmNwcCBiL2RvYy9leGFtcGxlcy9jbGVhci5jcHAKaW5kZXggZTg5MmIxMy4uZjA4MWU3ZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2NsZWFyLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvY2xlYXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGVhci5saW5rIGIvZG9jL2V4YW1wbGVzL2NsZWFyLmxpbmsKaW5kZXggMTEyM2UyZi4uY2FkNzAwYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2NsZWFyLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2NsZWFyLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2JKSFlWRWN0dm1hc3pkQmoiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvMFc2eFlwUVdTNUtkNjRDRiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY291bnQuY3BwIGIvZG9jL2V4YW1wbGVzL2NvdW50LmNwcAppbmRleCBjZDAzMGZmLi4wZWExOWI2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY291bnQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jb3VudC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NvdW50LmxpbmsgYi9kb2MvZXhhbXBsZXMvY291bnQubGluawppbmRleCA4NDY2Njc0Li45MzU1YmQyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY291bnQubGluaworKysgYi9kb2MvZXhhbXBsZXMvY291bnQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvbkFENXBVZ2p2MURjTWhoNyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay80cW1iTFNBNzVzdHpQZ3RaIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jcmJlZ2luLmNwcCBiL2RvYy9leGFtcGxlcy9jcmJlZ2luLmNwcAppbmRleCA2ZGM0YTZmLi5kYzMyMDljIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY3JiZWdpbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2NyYmVnaW4uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jcmJlZ2luLmxpbmsgYi9kb2MvZXhhbXBsZXMvY3JiZWdpbi5saW5rCmluZGV4IGY5N2RhYzYuLjYwNzllN2EgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jcmJlZ2luLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2NyYmVnaW4ubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvM3lsY3FYQ016c0tCU2t4WiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9tY2poMWtEWFhrenE3VHhNIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jcmVuZC5jcHAgYi9kb2MvZXhhbXBsZXMvY3JlbmQuY3BwCmluZGV4IDlhMDA5NTAuLmRmZjI2MDkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jcmVuZC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2NyZW5kLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY3JlbmQubGluayBiL2RvYy9leGFtcGxlcy9jcmVuZC5saW5rCmluZGV4IDIwOGM3YzkuLjEyNjNmYzEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jcmVuZC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9jcmVuZC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay92aU9LbTRWMGNjeTIzOG1VIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzZ0SDNobnA1M2lWekFRWlEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2RpZmYuY3BwIGIvZG9jL2V4YW1wbGVzL2RpZmYuY3BwCmluZGV4IDI3NGU1NmIuLmEyOWYxNGQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9kaWZmLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZGlmZi5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2RpZmYubGluayBiL2RvYy9leGFtcGxlcy9kaWZmLmxpbmsKaW5kZXggYTAyZGRiZC4uZGZkMTc3MiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2RpZmYubGluaworKysgYi9kb2MvZXhhbXBsZXMvZGlmZi5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9RSmxHYU83UnFndmliQ2JSIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3RmSThEdUN1WnMzVkI5VkYiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2R1bXAuY3BwIGIvZG9jL2V4YW1wbGVzL2R1bXAuY3BwCmluZGV4IDFjNDg1OTcuLjRkZWI2NGEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9kdW1wLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZHVtcC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2R1bXAubGluayBiL2RvYy9leGFtcGxlcy9kdW1wLmxpbmsKaW5kZXggNGRlNzAzNC4uYzA3MmMwZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2R1bXAubGluaworKysgYi9kb2MvZXhhbXBsZXMvZHVtcC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9tSEg5VGliSVRDWVBwTHd5Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3VDNGtuYTdRc1EwckF0ODAiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VtcGxhY2UuY3BwIGIvZG9jL2V4YW1wbGVzL2VtcGxhY2UuY3BwCmluZGV4IDdlODBiNjguLmE1MzE0OTEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lbXBsYWNlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZW1wbGFjZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VtcGxhY2UubGluayBiL2RvYy9leGFtcGxlcy9lbXBsYWNlLmxpbmsKaW5kZXggODA5Y2MyMS4uMzZmMmVkMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2VtcGxhY2UubGluaworKysgYi9kb2MvZXhhbXBsZXMvZW1wbGFjZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay94YzdIb21XMUVGTTVQVjZuIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3pJUUJHWTZmS3FpTW1idmIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VtcGxhY2VfYmFjay5jcHAgYi9kb2MvZXhhbXBsZXMvZW1wbGFjZV9iYWNrLmNwcAppbmRleCA2YTUwZmQyLi5lOTc5YTk0IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZW1wbGFjZV9iYWNrLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZW1wbGFjZV9iYWNrLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZW1wbGFjZV9iYWNrLmxpbmsgYi9kb2MvZXhhbXBsZXMvZW1wbGFjZV9iYWNrLmxpbmsKaW5kZXggOTM5N2E4OS4uMmVhMjBmMyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2VtcGxhY2VfYmFjay5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9lbXBsYWNlX2JhY2subGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvMldTVlFYV3pSVnVBZzVwViI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9RRWJwQ25qR0lwRldtWWJFIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lbXB0eS5jcHAgYi9kb2MvZXhhbXBsZXMvZW1wdHkuY3BwCmluZGV4IDk0YmM0NmEuLjZlZjZlNDAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lbXB0eS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2VtcHR5LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZW1wdHkubGluayBiL2RvYy9leGFtcGxlcy9lbXB0eS5saW5rCmluZGV4IDkwYTY1OTAuLmExODJjMTIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lbXB0eS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9lbXB0eS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay8xZk4ycTlSOHlKOUxDU2xtIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0FjRW1rR21tbXowZFBkSFciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VuZC5jcHAgYi9kb2MvZXhhbXBsZXMvZW5kLmNwcAppbmRleCAyOTg0ZjllLi41YTViNmU3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZW5kLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZW5kLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZW5kLmxpbmsgYi9kb2MvZXhhbXBsZXMvZW5kLmxpbmsKaW5kZXggMjY5NWUxZC4uOWVmMzIyYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2VuZC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9lbmQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvYWtnSHRRdzZFRm9zSlNEcSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9yU1RNSTNWWFVGdE5DV05jIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlLmNwcCBiL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlLmNwcAppbmRleCAwYmE3ZTZmLi5iZjVkM2RkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZXJhc2VfX0l0ZXJhdG9yVHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2VyYXNlX19JdGVyYXRvclR5cGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX0l0ZXJhdG9yVHlwZS5saW5rCmluZGV4IDcxZDQxMTQuLjY3ZWE1NWEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2VyYXNlX19JdGVyYXRvclR5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTGJOTVZZQ1hhd2JFZWxvMCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9uaDUxTmhvN2l1QUFBUHlrIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX0l0ZXJhdG9yVHlwZV9JdGVyYXRvclR5cGUuY3BwCmluZGV4IGVmYmY3ODkuLjdjZGRhYzYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2VyYXNlX19JdGVyYXRvclR5cGVfSXRlcmF0b3JUeXBlLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZXJhc2VfX0l0ZXJhdG9yVHlwZV9JdGVyYXRvclR5cGUubGluayBiL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZS5saW5rCmluZGV4IDkyMDlmNjQuLjBlYTI5ODkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9lcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9La25Vd2Rwcmc2bElwNVlLIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3hxZjQ1YTI3elFxZ3RodEIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VyYXNlX19rZXlfdHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX2tleV90eXBlLmNwcAppbmRleCA1OTJhYTAyLi40MGM3NTUxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZXJhc2VfX2tleV90eXBlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX2tleV90eXBlLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZXJhc2VfX2tleV90eXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX2tleV90eXBlLmxpbmsKaW5kZXggYjNhYjQ1ZS4uMWQwMmRkNSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2VyYXNlX19rZXlfdHlwZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9lcmFzZV9fa2V5X3R5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvSU40QVE5QUQxSlBETmo5USI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9sTWNhR3pUUXVXbjQ0bHkxIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lcmFzZV9fc2l6ZV90eXBlLmNwcCBiL2RvYy9leGFtcGxlcy9lcmFzZV9fc2l6ZV90eXBlLmNwcAppbmRleCA3MjAyMWJhLi5iNmQ3YjAxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZXJhc2VfX3NpemVfdHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2VyYXNlX19zaXplX3R5cGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9lcmFzZV9fc2l6ZV90eXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvZXJhc2VfX3NpemVfdHlwZS5saW5rCmluZGV4IDMzYTEyNGMuLmMzZDk0YmIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9lcmFzZV9fc2l6ZV90eXBlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2VyYXNlX19zaXplX3R5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsveENNMEJHOVpWNmlFTWRnciI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay83ZkEyUW9jbEJOQUdacHJZIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9leGNlcHRpb24uY3BwIGIvZG9jL2V4YW1wbGVzL2V4Y2VwdGlvbi5jcHAKaW5kZXggMTM5MjZiMi4uODI2OTZlNiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2V4Y2VwdGlvbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2V4Y2VwdGlvbi5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2V4Y2VwdGlvbi5saW5rIGIvZG9jL2V4YW1wbGVzL2V4Y2VwdGlvbi5saW5rCmluZGV4IDcwNDM3OTIuLmVkNGNiNDQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9leGNlcHRpb24ubGluaworKysgYi9kb2MvZXhhbXBsZXMvZXhjZXB0aW9uLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3lIamRzS0dUWVNSRk56RDciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvOUVTZ0lCV1JhclpSSnZDdyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZmluZF9fa2V5X3R5cGUuY3BwIGIvZG9jL2V4YW1wbGVzL2ZpbmRfX2tleV90eXBlLmNwcAppbmRleCBjNDExYmE0Li42ODViYTc3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZmluZF9fa2V5X3R5cGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9maW5kX19rZXlfdHlwZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2ZpbmRfX2tleV90eXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvZmluZF9fa2V5X3R5cGUubGluawppbmRleCAwYmU3YTI0Li5mMjNhYmM4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZmluZF9fa2V5X3R5cGUubGluaworKysgYi9kb2MvZXhhbXBsZXMvZmluZF9fa2V5X3R5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvaXUyQnBSdGppS2VKdTJwdiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9BUXViZkNtdjg0OFE2NlppIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mbGF0dGVuLmNwcCBiL2RvYy9leGFtcGxlcy9mbGF0dGVuLmNwcAppbmRleCA5MDhiMzcxLi4yYmQ3ZTllIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZmxhdHRlbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2ZsYXR0ZW4uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mbGF0dGVuLmxpbmsgYi9kb2MvZXhhbXBsZXMvZmxhdHRlbi5saW5rCmluZGV4IGQzMjU4OGYuLjhlYjgxYTYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9mbGF0dGVuLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2ZsYXR0ZW4ubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRUJxZGIydWhYeUtUYnI5ZiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9FMUhRZWRrbDF6bzQ4V1c1Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mcm9tX2Nib3IuY3BwIGIvZG9jL2V4YW1wbGVzL2Zyb21fY2Jvci5jcHAKaW5kZXggYjM3YjM3NS4uNjMzYjNlNyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2Zyb21fY2Jvci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Zyb21fY2Jvci5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Zyb21fY2Jvci5saW5rIGIvZG9jL2V4YW1wbGVzL2Zyb21fY2Jvci5saW5rCmluZGV4IDZlMWY0ZTIuLjZlMjdkYjkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9mcm9tX2Nib3IubGluaworKysgYi9kb2MvZXhhbXBsZXMvZnJvbV9jYm9yLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL05rU0lqNkc4OURYUlhYOXUiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvbXlhOGRVRGNERFZvVWxCWiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZnJvbV9tc2dwYWNrLmNwcCBiL2RvYy9leGFtcGxlcy9mcm9tX21zZ3BhY2suY3BwCmluZGV4IDg0YzdkMWYuLjhhOTliM2MgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9mcm9tX21zZ3BhY2suY3BwCisrKyBiL2RvYy9leGFtcGxlcy9mcm9tX21zZ3BhY2suY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mcm9tX21zZ3BhY2subGluayBiL2RvYy9leGFtcGxlcy9mcm9tX21zZ3BhY2subGluawppbmRleCA0OTNmNDQzLi5kZGZkY2IzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZnJvbV9tc2dwYWNrLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2Zyb21fbXNncGFjay5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9EbEtSbzgwRVNJNDI4Z0g4Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3NNbUVLeFc1TUdPZ0xDN3oiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Zyb21fdWJqc29uLmNwcCBiL2RvYy9leGFtcGxlcy9mcm9tX3VianNvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwOTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9mcm9tX3VianNvbi5jcHAKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgorCit1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CisKK2ludCBtYWluKCkKK3sKKyAgICAvLyBjcmVhdGUgYnl0ZSB2ZWN0b3IKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0gezB4N0IsIDB4NjksIDB4MDcsIDB4NjMsIDB4NkYsIDB4NkQsIDB4NzAsIDB4NjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYzLCAweDc0LCAweDU0LCAweDY5LCAweDA2LCAweDczLCAweDYzLCAweDY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSwgMHg2RCwgMHg2MSwgMHg2OSwgMHgwMCwgMHg3RAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgLy8gZGVzZXJpYWxpemUgaXQgd2l0aCBVQkpTT04KKyAgICBqc29uIGogPSBqc29uOjpmcm9tX3VianNvbih2KTsKKworICAgIC8vIHByaW50IHRoZSBkZXNlcmlhbGl6ZWQgSlNPTiB2YWx1ZQorICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMikgPDwgaiA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZnJvbV91Ympzb24ubGluayBiL2RvYy9leGFtcGxlcy9mcm9tX3VianNvbi5saW5rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTVmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvZnJvbV91Ympzb24ubGluawpAQCAtMCwwICsxIEBACis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9xcTI5amZFVHE3blpScmg1Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mcm9tX3VianNvbi5vdXRwdXQgYi9kb2MvZXhhbXBsZXMvZnJvbV91Ympzb24ub3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWY2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvZnJvbV91Ympzb24ub3V0cHV0CkBAIC0wLDAgKzEsNCBAQAoreworICAiY29tcGFjdCI6IHRydWUsCisgICJzY2hlbWEiOiAwCit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZnJvbnQuY3BwIGIvZG9jL2V4YW1wbGVzL2Zyb250LmNwcAppbmRleCBiYmMzNzJlLi5hMGY2MzA2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZnJvbnQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9mcm9udC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2Zyb250LmxpbmsgYi9kb2MvZXhhbXBsZXMvZnJvbnQubGluawppbmRleCA0ZjhiY2Q3Li4xNzI5MjRmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZnJvbnQubGluaworKysgYi9kb2MvZXhhbXBsZXMvZnJvbnQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvYks2OVNFR2FyYkN3bnFJQiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay81TnRDYkFmUHpDbW1QZDVTIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9nZXRfX1BvaW50ZXJUeXBlLmNwcCBiL2RvYy9leGFtcGxlcy9nZXRfX1BvaW50ZXJUeXBlLmNwcAppbmRleCAyOWY5YWQzLi4yZjMyZWQ3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZ2V0X19Qb2ludGVyVHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2dldF9fUG9pbnRlclR5cGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9nZXRfX1BvaW50ZXJUeXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvZ2V0X19Qb2ludGVyVHlwZS5saW5rCmluZGV4IDczYTNmYzUuLjFjNjdmNzMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9nZXRfX1BvaW50ZXJUeXBlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2dldF9fUG9pbnRlclR5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvZU1ybVhoUFdEMDJISlg5eCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9mclFkQzBuaWd3VVZTWjIxIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9nZXRfX1ZhbHVlVHlwZV9jb25zdC5jcHAgYi9kb2MvZXhhbXBsZXMvZ2V0X19WYWx1ZVR5cGVfY29uc3QuY3BwCmluZGV4IGQ3OGE2YjIuLjdhNzAzYWEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9nZXRfX1ZhbHVlVHlwZV9jb25zdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2dldF9fVmFsdWVUeXBlX2NvbnN0LmNwcApAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9nZXRfX1ZhbHVlVHlwZV9jb25zdC5saW5rIGIvZG9jL2V4YW1wbGVzL2dldF9fVmFsdWVUeXBlX2NvbnN0LmxpbmsKaW5kZXggN2JmNWU4YS4uYTNkZTZkNiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2dldF9fVmFsdWVUeXBlX2NvbnN0LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2dldF9fVmFsdWVUeXBlX2NvbnN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2pBWndGcmRaUzNEZ1BoMW4iPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTTRFSGxmME1hdWpCUWx1YiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZ2V0X3B0ci5jcHAgYi9kb2MvZXhhbXBsZXMvZ2V0X3B0ci5jcHAKaW5kZXggMjdkZWIxNC4uNTY0Y2UwZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2dldF9wdHIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9nZXRfcHRyLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZ2V0X3B0ci5saW5rIGIvZG9jL2V4YW1wbGVzL2dldF9wdHIubGluawppbmRleCA2YzRhMDY4Li5hYjA1ZTRhIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZ2V0X3B0ci5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9nZXRfcHRyLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3FuSnZGZElRQVRNUHVMNlIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRzFwZzlaQkQ1bjE1VFpsaSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZ2V0X3JlZi5jcHAgYi9kb2MvZXhhbXBsZXMvZ2V0X3JlZi5jcHAKaW5kZXggOTUxZmVhMy4uYWIyNTk0NiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2dldF9yZWYuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9nZXRfcmVmLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZ2V0X3JlZi5saW5rIGIvZG9jL2V4YW1wbGVzL2dldF9yZWYubGluawppbmRleCBkNWJiNGNmLi5kNDU4OTEyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZ2V0X3JlZi5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9nZXRfcmVmLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0JidGhvcE53SWhLZ2I0WTkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvZUtsQ2JkbTJVZHFYczNoUyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaW5zZXJ0LmNwcCBiL2RvYy9leGFtcGxlcy9pbnNlcnQuY3BwCmluZGV4IDkxM2FkMDkuLjRlZTYwOTggMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pbnNlcnQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pbnNlcnQuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pbnNlcnQubGluayBiL2RvYy9leGFtcGxlcy9pbnNlcnQubGluawppbmRleCA4MDNkNWM2Li41NjQyMjZmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaW5zZXJ0LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2luc2VydC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9LclQ2UFNSVXJFQzNFNmN4Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzJySFRrV1lBME9Vd2tLQlEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9fY291bnQuY3BwIGIvZG9jL2V4YW1wbGVzL2luc2VydF9fY291bnQuY3BwCmluZGV4IDNjMmFjMjQuLmNlMzNiOTMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pbnNlcnRfX2NvdW50LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19jb3VudC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9fY291bnQubGluayBiL2RvYy9leGFtcGxlcy9pbnNlcnRfX2NvdW50LmxpbmsKaW5kZXggYTc2Y2Q4ZS4uMTAwY2QzNiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2luc2VydF9fY291bnQubGluaworKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19jb3VudC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9SUkdxSHc4UGJ1SGZKMk1GIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2ZZRVhXdnV4alZpYVBaRlMiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9faWxpc3QuY3BwIGIvZG9jL2V4YW1wbGVzL2luc2VydF9faWxpc3QuY3BwCmluZGV4IDkwOTY1YjMuLmEyMDc2NmEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pbnNlcnRfX2lsaXN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19pbGlzdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9faWxpc3QubGluayBiL2RvYy9leGFtcGxlcy9pbnNlcnRfX2lsaXN0LmxpbmsKaW5kZXggMzg3ZGNlNi4uMzZiMTgxZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2luc2VydF9faWxpc3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19pbGlzdC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9Gb3VocXYxcGZtV1E4aDE3Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1FyOGlJdklSbnVkc3NUdmQiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2UuY3BwIGIvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2UuY3BwCmluZGV4IDViMGFhOWUuLjkyZmU2M2IgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pbnNlcnRfX3JhbmdlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19yYW5nZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2UubGluayBiL2RvYy9leGFtcGxlcy9pbnNlcnRfX3JhbmdlLmxpbmsKaW5kZXggY2Q4MTA3Yy4uMDBlODNhYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2UubGluaworKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19yYW5nZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9FV0tsYkVtMk5jeklYMEt0Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL09iVTJjQzlXcm50TGs4WngiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2Vfb2JqZWN0LmNwcCBiL2RvYy9leGFtcGxlcy9pbnNlcnRfX3JhbmdlX29iamVjdC5jcHAKaW5kZXggYjgxMWY4YS4uOTczNzNkMyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2Vfb2JqZWN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaW5zZXJ0X19yYW5nZV9vYmplY3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pbnNlcnRfX3JhbmdlX29iamVjdC5saW5rIGIvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2Vfb2JqZWN0LmxpbmsKaW5kZXggN2M2NzA5My4uNzBkNDNlZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2Vfb2JqZWN0LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2luc2VydF9fcmFuZ2Vfb2JqZWN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0pld0MwcUR4ZGNiQUIwb0IiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVGxXZGFEY3RIYUhueUZCbSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaW52YWxpZF9pdGVyYXRvci5jcHAgYi9kb2MvZXhhbXBsZXMvaW52YWxpZF9pdGVyYXRvci5jcHAKaW5kZXggMmQ2MTM1OS4uNWQzZTYyMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2ludmFsaWRfaXRlcmF0b3IuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pbnZhbGlkX2l0ZXJhdG9yLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaW52YWxpZF9pdGVyYXRvci5saW5rIGIvZG9jL2V4YW1wbGVzL2ludmFsaWRfaXRlcmF0b3IubGluawppbmRleCAwYmI4Njk1Li43MjkyNDNkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaW52YWxpZF9pdGVyYXRvci5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pbnZhbGlkX2l0ZXJhdG9yLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1BXOWRRV0Z5TmFVeHpFVlkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvUEY2VEVoc2lhemdnaW1pbCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfYXJyYXkuY3BwIGIvZG9jL2V4YW1wbGVzL2lzX2FycmF5LmNwcAppbmRleCAxZGJiZjVkLi4yMzVkYWI3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfYXJyYXkuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pc19hcnJheS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX2FycmF5LmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfYXJyYXkubGluawppbmRleCA3ODIwZDMzLi40MjMyYTkyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfYXJyYXkubGluaworKysgYi9kb2MvZXhhbXBsZXMvaXNfYXJyYXkubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvekwyWjZWMm9EQVlCZnN3OCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9FWGRwZkhhaDE1MzBUUElFIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19ib29sZWFuLmNwcCBiL2RvYy9leGFtcGxlcy9pc19ib29sZWFuLmNwcAppbmRleCA0ODVmOTcwLi5jY2MyMDJkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfYm9vbGVhbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2lzX2Jvb2xlYW4uY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19ib29sZWFuLmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfYm9vbGVhbi5saW5rCmluZGV4IDliNTZmNmUuLjE5ZjBiMDAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19ib29sZWFuLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2lzX2Jvb2xlYW4ubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvT1B4TngwelBRQnlMNndURCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay83c25peU5Qb2JiUVFkQkhKIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19kaXNjYXJkZWQuY3BwIGIvZG9jL2V4YW1wbGVzL2lzX2Rpc2NhcmRlZC5jcHAKaW5kZXggMGIwNDM1Yy4uNzgyZTY0OSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX2Rpc2NhcmRlZC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2lzX2Rpc2NhcmRlZC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX2Rpc2NhcmRlZC5saW5rIGIvZG9jL2V4YW1wbGVzL2lzX2Rpc2NhcmRlZC5saW5rCmluZGV4IGYyMGQ5Y2UuLjllYzc3OGYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19kaXNjYXJkZWQubGluaworKysgYi9kb2MvZXhhbXBsZXMvaXNfZGlzY2FyZGVkLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1FSRmpJTEdFbXFGdjhVVEgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvaFdxelJKdFNqWTBjU29RViI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVsbC5jcHAgYi9kb2MvZXhhbXBsZXMvaXNfbnVsbC5jcHAKaW5kZXggMzA0M2UxOC4uNGE2MzUwOSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX251bGwuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pc19udWxsLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVsbC5saW5rIGIvZG9jL2V4YW1wbGVzL2lzX251bGwubGluawppbmRleCAwNWIyNzAxLi5kZDFhNWFhIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfbnVsbC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pc19udWxsLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzI4b2k0d1U0NFZKbEFGdU4iPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvcjBaNm1ocVkyMFhvd0FQaiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyLmNwcCBiL2RvYy9leGFtcGxlcy9pc19udW1iZXIuY3BwCmluZGV4IDA4ZmExMzguLmViMjNiZDIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19udW1iZXIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pc19udW1iZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19udW1iZXIubGluayBiL2RvYy9leGFtcGxlcy9pc19udW1iZXIubGluawppbmRleCBiMWU5YWQyLi40M2M1MmI0IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2lzX251bWJlci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay84WkR0RVN1djRheHd6TFdTIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2UwUk1Pa1ZUNFFyd2hQVjkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX251bWJlcl9mbG9hdC5jcHAgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2Zsb2F0LmNwcAppbmRleCBhZWVmNzhlLi4zNDM1YTdlIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2Zsb2F0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2Zsb2F0LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2Zsb2F0LmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2Zsb2F0LmxpbmsKaW5kZXggMTcyMDgwNy4uNGQ4ZjBlYSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX251bWJlcl9mbG9hdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pc19udW1iZXJfZmxvYXQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVEJNUm1PZVZNVnFBcXRlUSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9UaGgxOERWdU9vYWlZaWREIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19udW1iZXJfaW50ZWdlci5jcHAgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2ludGVnZXIuY3BwCmluZGV4IDkwYmQyMTQuLjZmNmU0MjAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19udW1iZXJfaW50ZWdlci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2lzX251bWJlcl9pbnRlZ2VyLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX2ludGVnZXIubGluayBiL2RvYy9leGFtcGxlcy9pc19udW1iZXJfaW50ZWdlci5saW5rCmluZGV4IGEzNWJlNzUuLjAyMzNlMGYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19udW1iZXJfaW50ZWdlci5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pc19udW1iZXJfaW50ZWdlci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9hRWJTVUJLVW1XbDdEdGd1Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3dGWlNDNlJzd1dYd1NuY2IiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX251bWJlcl91bnNpZ25lZC5jcHAgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX3Vuc2lnbmVkLmNwcAppbmRleCA0OTk1MzBjLi4yZWEyNjczIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX3Vuc2lnbmVkLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX3Vuc2lnbmVkLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX3Vuc2lnbmVkLmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfbnVtYmVyX3Vuc2lnbmVkLmxpbmsKaW5kZXggMGEyYmEwMi4uODk4MTc2MyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX251bWJlcl91bnNpZ25lZC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pc19udW1iZXJfdW5zaWduZWQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvWVJIc1RHbUIyQzJvbGJPQiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9ham8xRjFWSndvc3pjRDdZIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19vYmplY3QuY3BwIGIvZG9jL2V4YW1wbGVzL2lzX29iamVjdC5jcHAKaW5kZXggYTBjMDNhNy4uNDJjZWRmOCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX29iamVjdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2lzX29iamVjdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX29iamVjdC5saW5rIGIvZG9jL2V4YW1wbGVzL2lzX29iamVjdC5saW5rCmluZGV4IDBjZjNkNGEuLjVkZDMwNWIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19vYmplY3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvaXNfb2JqZWN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3pNZEY3TllGTXI5S0JFUHYiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvb2pLazVBTVZLOXhGOWJtUSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfcHJpbWl0aXZlLmNwcCBiL2RvYy9leGFtcGxlcy9pc19wcmltaXRpdmUuY3BwCmluZGV4IGFiMzI5YmQuLmQ3MGM4M2UgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19wcmltaXRpdmUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9pc19wcmltaXRpdmUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19wcmltaXRpdmUubGluayBiL2RvYy9leGFtcGxlcy9pc19wcmltaXRpdmUubGluawppbmRleCAyYTBlOTFiLi5hZTU4YjJkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfcHJpbWl0aXZlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2lzX3ByaW1pdGl2ZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9Nbkh2V0F6U3lxeEdrTWpCIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0I3RjBlTWtXMEVLZFpHY0MiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2lzX3N0cmluZy5jcHAgYi9kb2MvZXhhbXBsZXMvaXNfc3RyaW5nLmNwcAppbmRleCA0NGNiNDgzLi4yNjc5Y2QxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfc3RyaW5nLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvaXNfc3RyaW5nLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvaXNfc3RyaW5nLmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfc3RyaW5nLmxpbmsKaW5kZXggZjM2NzJkYi4uOTJiMDVlNyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2lzX3N0cmluZy5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9pc19zdHJpbmcubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvSThCcHd0RmMyUUo2WjFWbCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay8ySXE5d3RheEV2cmI1QjY4Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19zdHJ1Y3R1cmVkLmNwcCBiL2RvYy9leGFtcGxlcy9pc19zdHJ1Y3R1cmVkLmNwcAppbmRleCBiN2RmYzg1Li4zM2UyYmJkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXNfc3RydWN0dXJlZC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2lzX3N0cnVjdHVyZWQuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pc19zdHJ1Y3R1cmVkLmxpbmsgYi9kb2MvZXhhbXBsZXMvaXNfc3RydWN0dXJlZC5saW5rCmluZGV4IDhlYTNhNzUuLjQ0ZTA2ZTkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pc19zdHJ1Y3R1cmVkLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2lzX3N0cnVjdHVyZWQubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvc0UzeE14OHE2VDBFWDBxSyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay80NGprQXMwRzdEMFhCMjRqIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pdGVtcy5jcHAgYi9kb2MvZXhhbXBsZXMvaXRlbXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDJiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvaXRlbXMuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KKwordXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOworCitpbnQgbWFpbigpCit7CisgICAgLy8gY3JlYXRlIEpTT04gdmFsdWVzCisgICAganNvbiBqX29iamVjdCA9IHt7Im9uZSIsIDF9LCB7InR3byIsIDJ9fTsKKyAgICBqc29uIGpfYXJyYXkgPSB7MSwgMiwgNCwgOCwgMTZ9OworCisgICAgLy8gZXhhbXBsZSBmb3IgYW4gb2JqZWN0CisgICAgZm9yIChhdXRvJiB4IDogal9vYmplY3QuaXRlbXMoKSkKKyAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAia2V5OiAiIDw8IHgua2V5KCkgPDwgIiwgdmFsdWU6ICIgPDwgeC52YWx1ZSgpIDw8ICdcbic7CisgICAgfQorCisgICAgLy8gZXhhbXBsZSBmb3IgYW4gYXJyYXkKKyAgICBmb3IgKGF1dG8mIHggOiBqX2FycmF5Lml0ZW1zKCkpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImtleTogIiA8PCB4LmtleSgpIDw8ICIsIHZhbHVlOiAiIDw8IHgudmFsdWUoKSA8PCAnXG4nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pdGVtcy5saW5rIGIvZG9jL2V4YW1wbGVzL2l0ZW1zLmxpbmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9pdGVtcy5saW5rCkBAIC0wLDAgKzEgQEAKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1lYVjdpSnVHMDkzYkE1MWwiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2l0ZW1zLm91dHB1dCBiL2RvYy9leGFtcGxlcy9pdGVtcy5vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliMDlmNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9pdGVtcy5vdXRwdXQKQEAgLTAsMCArMSw3IEBACitrZXk6IG9uZSwgdmFsdWU6IDEKK2tleTogdHdvLCB2YWx1ZTogMgora2V5OiAwLCB2YWx1ZTogMQora2V5OiAxLCB2YWx1ZTogMgora2V5OiAyLCB2YWx1ZTogNAora2V5OiAzLCB2YWx1ZTogOAora2V5OiA0LCB2YWx1ZTogMTYKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pdGVyYXRvcl93cmFwcGVyLmNwcCBiL2RvYy9leGFtcGxlcy9pdGVyYXRvcl93cmFwcGVyLmNwcAppbmRleCA2MTY4N2E5Li43ZWY1YmM1IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvaXRlcmF0b3Jfd3JhcHBlci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2l0ZXJhdG9yX3dyYXBwZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9pdGVyYXRvcl93cmFwcGVyLmxpbmsgYi9kb2MvZXhhbXBsZXMvaXRlcmF0b3Jfd3JhcHBlci5saW5rCmluZGV4IDAwODdkOWEuLjQzNDAzMWIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9pdGVyYXRvcl93cmFwcGVyLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL2l0ZXJhdG9yX3dyYXBwZXIubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRlliUlZISlNVM3JzT1NvbyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9tQ2dUUTNPMFhvOGFMSG0zIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9qc29uX3BvaW50ZXIuY3BwIGIvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlci5jcHAKaW5kZXggMjNlOGU4NC4uNzViOTcxNyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlci5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlci5saW5rIGIvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlci5saW5rCmluZGV4IDNiYTQzNTUuLjk1MmJkNzQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9qc29uX3BvaW50ZXIubGluaworKysgYi9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0czeGRsdVNyQkY4WmZ5YmkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTTJ2c3V4alZxWGRPVk1sNiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyX190b19zdHJpbmcuY3BwIGIvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlcl9fdG9fc3RyaW5nLmNwcAppbmRleCA3MGI3Mjc3Li5kYTM5N2NkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyX190b19zdHJpbmcuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9qc29uX3BvaW50ZXJfX3RvX3N0cmluZy5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2pzb25fcG9pbnRlcl9fdG9fc3RyaW5nLmxpbmsgYi9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyX190b19zdHJpbmcubGluawppbmRleCBiMTE0ODEyLi4yNDRjNDgxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyX190b19zdHJpbmcubGluaworKysgYi9kb2MvZXhhbXBsZXMvanNvbl9wb2ludGVyX190b19zdHJpbmcubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvUjY3dXN2UWZoOU85a0szdSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9rem1jeTViQzh1T1JSbHNKIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9tYXhfc2l6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvbWF4X3NpemUuY3BwCmluZGV4IDgyNzNmODYuLmMyZmZjNTQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9tYXhfc2l6ZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL21heF9zaXplLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWF4X3NpemUubGluayBiL2RvYy9leGFtcGxlcy9tYXhfc2l6ZS5saW5rCmluZGV4IGQ0OWY1ZWEuLjEyMTI4MzMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9tYXhfc2l6ZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9tYXhfc2l6ZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9EaDlWeUVwMmZHQWJUa1VJIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0NxeXpEOER5M2tUZ2FXUDMiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21lcmdlX3BhdGNoLmNwcCBiL2RvYy9leGFtcGxlcy9tZXJnZV9wYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4MDRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9tZXJnZV9wYXRjaC5jcHAKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgorI2luY2x1ZGUgPGlvbWFuaXA+IC8vIGZvciBzdGQ6OnNldHcKKwordXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOworCitpbnQgbWFpbigpCit7CisgICAgLy8gdGhlIG9yaWdpbmFsIGRvY3VtZW50CisgICAganNvbiBkb2N1bWVudCA9IFIiKHsKKyAgICAgICAgICAgICAgICAidGl0bGUiOiAiR29vZGJ5ZSEiLAorICAgICAgICAgICAgICAgICJhdXRob3IiOiB7CisgICAgICAgICAgICAgICAgICAgICJnaXZlbk5hbWUiOiAiSm9obiIsCisgICAgICAgICAgICAgICAgICAgICJmYW1pbHlOYW1lIjogIkRvZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSIsCisgICAgICAgICAgICAgICAgICAgICJzYW1wbGUiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiY29udGVudCI6ICJUaGlzIHdpbGwgYmUgdW5jaGFuZ2VkIgorICAgICAgICAgICAgfSkiX2pzb247CisKKyAgICAvLyB0aGUgcGF0Y2gKKyAgICBqc29uIHBhdGNoID0gUiIoeworICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxsbyEiLAorICAgICAgICAgICAgICAgICJwaG9uZU51bWJlciI6ICIrMDEtMTIzLTQ1Ni03ODkwIiwKKyAgICAgICAgICAgICAgICAiYXV0aG9yIjogeworICAgICAgICAgICAgICAgICAgICAiZmFtaWx5TmFtZSI6IG51bGwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSIKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9KSJfanNvbjsKKworICAgIC8vIGFwcGx5IHRoZSBwYXRjaAorICAgIGRvY3VtZW50Lm1lcmdlX3BhdGNoKHBhdGNoKTsKKworICAgIC8vIG91dHB1dCBvcmlnaW5hbCBhbmQgcGF0Y2hlZCBkb2N1bWVudAorICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoNCkgPDwgZG9jdW1lbnQgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21lcmdlX3BhdGNoLmxpbmsgYi9kb2MvZXhhbXBsZXMvbWVyZ2VfcGF0Y2gubGluawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhNGVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21lcmdlX3BhdGNoLmxpbmsKQEAgLTAsMCArMSBAQAorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvZ3ZMekhVUjYzN016cE5vRCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWVyZ2VfcGF0Y2gub3V0cHV0IGIvZG9jL2V4YW1wbGVzL21lcmdlX3BhdGNoLm91dHB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFkYjdiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL21lcmdlX3BhdGNoLm91dHB1dApAQCAtMCwwICsxLDExIEBACit7CisgICAgImF1dGhvciI6IHsKKyAgICAgICAgImdpdmVuTmFtZSI6ICJKb2huIgorICAgIH0sCisgICAgImNvbnRlbnQiOiAiVGhpcyB3aWxsIGJlIHVuY2hhbmdlZCIsCisgICAgInBob25lTnVtYmVyIjogIiswMS0xMjMtNDU2LTc4OTAiLAorICAgICJ0YWdzIjogWworICAgICAgICAiZXhhbXBsZSIKKyAgICBdLAorICAgICJ0aXRsZSI6ICJIZWxsbyEiCit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWV0YS5jcHAgYi9kb2MvZXhhbXBsZXMvbWV0YS5jcHAKaW5kZXggOTE5NGJlYS4uZTgwMGI5YiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL21ldGEuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9tZXRhLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWV0YS5saW5rIGIvZG9jL2V4YW1wbGVzL21ldGEubGluawppbmRleCBmMWQ4Yzg2Li40ZGEyYjAyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWV0YS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9tZXRhLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL210bnlRR1ZqbUFvSFZ2YVAiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvMHpkbWZOUUNlNFRNdzBpSSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWV0YS5vdXRwdXQgYi9kb2MvZXhhbXBsZXMvbWV0YS5vdXRwdXQKaW5kZXggMWIzZTJhYS4uMDQ1MjkwNSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL21ldGEub3V0cHV0CisrKyBiL2RvYy9leGFtcGxlcy9tZXRhLm91dHB1dApAQCAtMTAsOCArMTAsOCBAQAogICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24iLAogICAgICJ2ZXJzaW9uIjogewogICAgICAgICAibWFqb3IiOiAzLAotICAgICAgICAibWlub3IiOiAwLAotICAgICAgICAicGF0Y2giOiAxLAotICAgICAgICAic3RyaW5nIjogIjMuMC4xIgorICAgICAgICAibWlub3IiOiAxLAorICAgICAgICAicGF0Y2giOiAwLAorICAgICAgICAic3RyaW5nIjogIjMuMS4wIgogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vYmplY3QuY3BwIGIvZG9jL2V4YW1wbGVzL29iamVjdC5jcHAKaW5kZXggNmMxMTc3NS4uNzMzYjg5YiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29iamVjdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29iamVjdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29iamVjdC5saW5rIGIvZG9jL2V4YW1wbGVzL29iamVjdC5saW5rCmluZGV4IGY4NjM4MzMuLmZiZWQyZjYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vYmplY3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvb2JqZWN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0dKcXdTOEFLSnhxNmFJZk4iPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvcHRWMnRkSWtXejI2VHNpdCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX1ZhbHVlVHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX1ZhbHVlVHlwZS5jcHAKaW5kZXggMmRlZjUyNy4uNjZmY2YzMSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19WYWx1ZVR5cGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fVmFsdWVUeXBlLmNwcApAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fVmFsdWVUeXBlLmxpbmsgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX1ZhbHVlVHlwZS5saW5rCmluZGV4IDBjMzJkNjMuLjc5OGI4ZmQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fVmFsdWVUeXBlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19WYWx1ZVR5cGUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvUGhIWWhISnJGVkRDd3hKeiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9scUh3TFI0bXU5ODgyMUpFIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZXF1YWwuY3BwIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbC5jcHAKaW5kZXggZDU0MWEyMS4uMTQyNmY0OCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbC5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbC5saW5rCmluZGV4IGFlN2MyNWEuLjZlMWNjMWMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZXF1YWwubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2FqNjRZV0xSRDIxcVpFMTgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvSlJxUEFKSVF6V21IWGVjYyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsX19udWxscHRyX3QuY3BwIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbF9fbnVsbHB0cl90LmNwcAppbmRleCBiNWQwYzY0Li5kYmIyMTAzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsX19udWxscHRyX3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZXF1YWxfX251bGxwdHJfdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19lcXVhbF9fbnVsbHB0cl90LmxpbmsgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsX19udWxscHRyX3QubGluawppbmRleCA5MGNjMTc0Li4wOTdkYTc3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsX19udWxscHRyX3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2VxdWFsX19udWxscHRyX3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTGJyWjJrR3cyMENJZU42cyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay81S1AzaW5BblhaeHZFRG02Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlci5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2dyZWF0ZXIuY3BwCmluZGV4IGE1YzRmNzguLmM2MzIzODcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ncmVhdGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2dyZWF0ZXIubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlci5saW5rCmluZGV4IDdmMDgyNzkuLjNmYzg0OGUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlci5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9yeVg1eUdFaTBGTzZqWnoyIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3lpejdvQ0hWcEZIU0FMQjEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ncmVhdGVyZXF1YWwuY3BwIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ncmVhdGVyZXF1YWwuY3BwCmluZGV4IGRhMDE0YmQuLmY4NjU5ZWUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlcmVxdWFsLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2dyZWF0ZXJlcXVhbC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ncmVhdGVyZXF1YWwubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fZ3JlYXRlcmVxdWFsLmxpbmsKaW5kZXggNTk5ZjVkNy4uNjJjZTc4YSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ncmVhdGVyZXF1YWwubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2dyZWF0ZXJlcXVhbC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9iMHFzTXNJRENyTmR1dVo3Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3lxeURJRFhXa012R2dldjgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzLmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbGVzcy5jcHAKaW5kZXggMzg2NTg0Ny4uNjQyMDlhMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2xlc3MuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbGVzcy5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzLmxpbmsKaW5kZXggMDY4OWY5OS4uNTJkYTdhZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL290R001U3RQMXg0amQ1Q1EiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvZ0hYS2tUTWNld3VEUHpkOCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2xlc3NlcXVhbC5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2xlc3NlcXVhbC5jcHAKaW5kZXggOGU5YTIxZi4uNTQzYjk1NCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzZXF1YWwuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbGVzc2VxdWFsLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2xlc3NlcXVhbC5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19sZXNzZXF1YWwubGluawppbmRleCA1NzY4MTg1Li4wYzllZGUzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX2xlc3NlcXVhbC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbGVzc2VxdWFsLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0NSVnVCVGM4Nmh4VE5INFgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvbWowUEExcU5BZng4aWdLTiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX25vdGVxdWFsLmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWwuY3BwCmluZGV4IGRlYmNkZjguLjQzZTg5NTAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWwuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWwuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWwubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWwubGluawppbmRleCBjMjNlODI2Li42NTZmZmE4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX25vdGVxdWFsLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9nNlU1N3J5WFZ1dmd3U1VCIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0dBaExoVkl4RHU0UG1EMUYiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbF9fbnVsbHB0cl90LmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWxfX251bGxwdHJfdC5jcHAKaW5kZXggOGQ3NGU3MS4uZGM3ZTZhYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbF9fbnVsbHB0cl90LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX25vdGVxdWFsX19udWxscHRyX3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fbm90ZXF1YWxfX251bGxwdHJfdC5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbF9fbnVsbHB0cl90LmxpbmsKaW5kZXggNDk4NjRkMy4uZjlhMTcwMCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbF9fbnVsbHB0cl90LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX19ub3RlcXVhbF9fbnVsbHB0cl90LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3l3QlBaUWptbGllRjdzdjAiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvS2plZlVQdWhQU3RONERwaiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX3ZhbHVlX3QuY3BwIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX192YWx1ZV90LmNwcAppbmRleCAwODc5MTBhLi5kOWFhYzc5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX3ZhbHVlX3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9fdmFsdWVfdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX192YWx1ZV90LmxpbmsgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX3ZhbHVlX3QubGluawppbmRleCA3YzIyY2Q0Li5kMmMzOGEzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX3ZhbHVlX3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfX3ZhbHVlX3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvYVVsSDVyUWVJQTAwMkFQbyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9ER05SRU4zbWtJRHExeHZzIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9kZXNlcmlhbGl6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfZGVzZXJpYWxpemUuY3BwCmluZGV4IDdhMmNmMjMuLmJmMjE0NDggMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9kZXNlcmlhbGl6ZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yX2Rlc2VyaWFsaXplLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JfZGVzZXJpYWxpemUubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9kZXNlcmlhbGl6ZS5saW5rCmluZGV4IGQ2MGU1MzAuLjcyZDczNTAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9kZXNlcmlhbGl6ZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9kZXNlcmlhbGl6ZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9xck1QSDhydjRGQnFFMlJpIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1lyVXFyVUZNRDdKSHdTUVIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX3NlcmlhbGl6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jfc2VyaWFsaXplLmNwcAppbmRleCA3ZjU1NjM4Li4wYzQ2ZjAxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jfc2VyaWFsaXplLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jfc2VyaWFsaXplLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jfc2VyaWFsaXplLmxpbmsgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jfc2VyaWFsaXplLmxpbmsKaW5kZXggZjA3ODkzNC4uNTdlZGM4YyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yX3NlcmlhbGl6ZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcl9zZXJpYWxpemUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvOWozMHJTM2x3czBpaUhQZCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay93WGNtNE9ibm9hWHc3Q1J0Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZS5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fa2V5X3R5cGUuY3BwCmluZGV4IDQzZmY4YWQuLjhkYjA4ZDAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fa2V5X3R5cGUubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZS5saW5rCmluZGV4IDY4YTdhOWMuLmMxYTUzNGIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9iWUxoMndldVRvOWprUjVWIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3Z4dDhkOHF2WW9yWFMyeXEiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0LmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZV9jb25zdC5jcHAKaW5kZXggMjMyMGU0My4uMWJkYjM0MCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fa2V5X3R5cGVfY29uc3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19rZXlfdHlwZV9jb25zdC5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0LmxpbmsKaW5kZXggNTNhMDg5Mi4uOTQ2N2NhMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0VlM0o1TjVHbjZBTm9vb3YiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvQVN5eEJPYVQ1eDhSVXQ0MCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlLmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGUuY3BwCmluZGV4IGJjOGVjYjkuLmQ2ZjNlMTUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGUubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGUubGluawppbmRleCAzZTA1Njc4Li4wMThmMGJkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX3NpemVfdHlwZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay8yMUh4Z1BEaFhFR3ZGQzZDIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0dvb0pEOWFRM2hlZk04dXIiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX3NpemVfdHlwZV9jb25zdC5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0LmNwcAppbmRleCBlYzlmYzMwLi4xYmQ4OGJjIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0LmxpbmsgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3JhcnJheV9fc2l6ZV90eXBlX2NvbnN0LmxpbmsKaW5kZXggMmViMWEzOC4uOGE5Y2QwYiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yYXJyYXlfX3NpemVfdHlwZV9jb25zdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmFycmF5X19zaXplX3R5cGVfY29uc3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvSXlTNG55dVFnOU9TOEZhRiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9LOHBlQWZvaVdicDF3U3FxIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlci5jcHAgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jqc29uX3BvaW50ZXIuY3BwCmluZGV4IGQ0MDM2NjcuLjdhMDM1M2EgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jqc29uX3BvaW50ZXIubGluayBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlci5saW5rCmluZGV4IDkyYmY5ZDcuLjkyNDY4ZDcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlci5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9yN2paaVRqZWt4QW1nNzB3Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2tTampwblhLUDRiV2Z1Q3UiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyX2NvbnN0LmNwcCBiL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlcl9jb25zdC5jcHAKaW5kZXggNTJiMmE5ZS4uYTVhNDM3YiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyX2NvbnN0LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvb3BlcmF0b3Jqc29uX3BvaW50ZXJfY29uc3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vcGVyYXRvcmpzb25fcG9pbnRlcl9jb25zdC5saW5rIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyX2NvbnN0LmxpbmsKaW5kZXggMjJhN2M1Yy4uODM2ZTc1NSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyX2NvbnN0LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL29wZXJhdG9yanNvbl9wb2ludGVyX2NvbnN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL010YUlGOWZOWTlXUFhyVUciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvTVo0U29JTGlSQzhNZXVpciI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvb3RoZXJfZXJyb3IuY3BwIGIvZG9jL2V4YW1wbGVzL290aGVyX2Vycm9yLmNwcAppbmRleCAxNmI5NjU3Li4yZTdjY2ZiIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3RoZXJfZXJyb3IuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9vdGhlcl9lcnJvci5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL290aGVyX2Vycm9yLmxpbmsgYi9kb2MvZXhhbXBsZXMvb3RoZXJfZXJyb3IubGluawppbmRleCBhOGRkODliLi5iZGIxMTc1IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvb3RoZXJfZXJyb3IubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3RoZXJfZXJyb3IubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVWNBRFdkVk1QQTlHWmJSUCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9wdGhSUjZKQWx0cUl4ajBjIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9vdXRfb2ZfcmFuZ2UuY3BwIGIvZG9jL2V4YW1wbGVzL291dF9vZl9yYW5nZS5jcHAKaW5kZXggYWRlYzc0MS4uZTcxMTY0MCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL291dF9vZl9yYW5nZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL291dF9vZl9yYW5nZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL291dF9vZl9yYW5nZS5saW5rIGIvZG9jL2V4YW1wbGVzL291dF9vZl9yYW5nZS5saW5rCmluZGV4IDNkYWE0NGUuLjc5MGVlYzYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9vdXRfb2ZfcmFuZ2UubGluaworKysgYi9kb2MvZXhhbXBsZXMvb3V0X29mX3JhbmdlLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1Zyc0tYeFgzQ3VIZXFLcTciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVWdXYjdrODdBQlN3VHVJcCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2FycmF5X19wYXJzZXJfY2FsbGJhY2tfdC5jcHAgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX2FycmF5X19wYXJzZXJfY2FsbGJhY2tfdC5jcHAKaW5kZXggMDg1N2Y5YS4uNjA4M2E5NSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3BhcnNlX19hcnJheV9fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9fYXJyYXlfX3BhcnNlcl9jYWxsYmFja190LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2FycmF5X19wYXJzZXJfY2FsbGJhY2tfdC5saW5rIGIvZG9jL2V4YW1wbGVzL3BhcnNlX19hcnJheV9fcGFyc2VyX2NhbGxiYWNrX3QubGluawppbmRleCAyYzRhNzY4Li4wMTdmOWZmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2FycmF5X19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9fYXJyYXlfX3BhcnNlcl9jYWxsYmFja190LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzEyQ01CSFg2OTR5cnQwaTkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVFNOeEhtZWdWd0xXMnBYZiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2NvbnRpZ3VvdXNjb250YWluZXJfX3BhcnNlcl9jYWxsYmFja190LmNwcCBiL2RvYy9leGFtcGxlcy9wYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCmluZGV4IDI5YjU0ODEuLmZlNTE1NjAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9wYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3QubGluayBiL2RvYy9leGFtcGxlcy9wYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3QubGluawppbmRleCAyZTdmNjJlLi4yY2M5NjU5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2NvbnRpZ3VvdXNjb250YWluZXJfX3BhcnNlcl9jYWxsYmFja190LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL3BhcnNlX19jb250aWd1b3VzY29udGFpbmVyX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9ZREJRR0tmeUpVZVBEcFJlIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2wzek5vM1lLQzJYOHlBdzkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3BhcnNlX19pc3RyZWFtX19wYXJzZXJfY2FsbGJhY2tfdC5jcHAgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190LmNwcAppbmRleCBhMjBlODFmLi45MmU2MmQ5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190LmxpbmsgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX2lzdHJlYW1fX3BhcnNlcl9jYWxsYmFja190LmxpbmsKaW5kZXggN2FmYTQ4Yi4uNjRiNzAzYSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3BhcnNlX19pc3RyZWFtX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9faXN0cmVhbV9fcGFyc2VyX2NhbGxiYWNrX3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvRGh3VFA4QXRLNVVvZUY1NSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9NZjdBNkp0dnFUMU5hN1BrIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9wYXJzZV9faXRlcmF0b3J0eXBlX19wYXJzZXJfY2FsbGJhY2tfdC5jcHAgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX2l0ZXJhdG9ydHlwZV9fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCmluZGV4IDYwNDQwMjEuLmI1MTNmZTcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wYXJzZV9faXRlcmF0b3J0eXBlX19wYXJzZXJfY2FsbGJhY2tfdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3BhcnNlX19pdGVyYXRvcnR5cGVfX3BhcnNlcl9jYWxsYmFja190LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfX2l0ZXJhdG9ydHlwZV9fcGFyc2VyX2NhbGxiYWNrX3QubGluayBiL2RvYy9leGFtcGxlcy9wYXJzZV9faXRlcmF0b3J0eXBlX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCmluZGV4IDA5M2EyZDEuLjlhZGRhMTQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wYXJzZV9faXRlcmF0b3J0eXBlX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9faXRlcmF0b3J0eXBlX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9jNEsyczdRdUZOZlhkM2o3Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL29hNkJWa0JYakc4RE5relgiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3BhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190LmNwcCBiL2RvYy9leGFtcGxlcy9wYXJzZV9fc3RyaW5nX19wYXJzZXJfY2FsbGJhY2tfdC5jcHAKaW5kZXggMzdlYTZkZi4uNGRiODJkOSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3BhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvcGFyc2VfX3N0cmluZ19fcGFyc2VyX2NhbGxiYWNrX3QuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9wYXJzZV9fc3RyaW5nX19wYXJzZXJfY2FsbGJhY2tfdC5saW5rIGIvZG9jL2V4YW1wbGVzL3BhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190LmxpbmsKaW5kZXggOTQ2NDNiYi4uOGVhYjRjZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3BhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190LmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL3BhcnNlX19zdHJpbmdfX3BhcnNlcl9jYWxsYmFja190LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0dLQUJoaWtXSlFUSGVYN3oiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvUVhkbDR5enRzM3FQZVowVSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGFyc2VfZXJyb3IuY3BwIGIvZG9jL2V4YW1wbGVzL3BhcnNlX2Vycm9yLmNwcAppbmRleCA2ODAyZTdkLi45YjI3YjU4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcGFyc2VfZXJyb3IuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9wYXJzZV9lcnJvci5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3BhcnNlX2Vycm9yLmxpbmsgYi9kb2MvZXhhbXBsZXMvcGFyc2VfZXJyb3IubGluawppbmRleCA4OWEzMWVhLi43ZTNlODY0IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcGFyc2VfZXJyb3IubGluaworKysgYi9kb2MvZXhhbXBsZXMvcGFyc2VfZXJyb3IubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvNzRzUVRhdVpzTTh0V3l1TSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9tSUtZV21pMTc0bHBndzRZIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9wYXRjaC5jcHAgYi9kb2MvZXhhbXBsZXMvcGF0Y2guY3BwCmluZGV4IGZkMGU2YmYuLmEzYzY0YTYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wYXRjaC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3BhdGNoLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcGF0Y2gubGluayBiL2RvYy9leGFtcGxlcy9wYXRjaC5saW5rCmluZGV4IDcwMzhjZGEuLjE5OTcwNjIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wYXRjaC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9wYXRjaC5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9RVnI2OHJYVFIya3p0cGJsIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzhPYk5hNmVqdzRCWFE1cUciPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3B1c2hfYmFjay5jcHAgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrLmNwcAppbmRleCA3YjBlYzQ4Li5iYmRkZjRmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrLmxpbmsgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrLmxpbmsKaW5kZXggZGMyYjUyNS4uNGVlMTViZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3B1c2hfYmFjay5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9wdXNoX2JhY2subGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvblh4MmpCQjJtZmhUdWkyeCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay8wRDVUanE2cGJNZXNzcUgxIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9wdXNoX2JhY2tfX2luaXRpYWxpemVyX2xpc3QuY3BwIGIvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdC5jcHAKaW5kZXggZDIzMWU3MS4uZTk2NjQ1ZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdC5saW5rIGIvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdC5saW5rCmluZGV4IGY2Nzk2YzIuLmYxOGU5NmYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9wdXNoX2JhY2tfX2luaXRpYWxpemVyX2xpc3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19pbml0aWFsaXplcl9saXN0LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1Brb3JkcHIwOFFPcXdRNVMiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvaFY3RnRhb0dleFMyM1pIMyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19vYmplY3RfdF9fdmFsdWUuY3BwIGIvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19fb2JqZWN0X3RfX3ZhbHVlLmNwcAppbmRleCAyNzIxNWZiLi41ZDY5NGU5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19vYmplY3RfdF9fdmFsdWUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9wdXNoX2JhY2tfX29iamVjdF90X192YWx1ZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3B1c2hfYmFja19fb2JqZWN0X3RfX3ZhbHVlLmxpbmsgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19vYmplY3RfdF9fdmFsdWUubGluawppbmRleCAzNzUzMTVlLi4zOTZmZGYyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19vYmplY3RfdF9fdmFsdWUubGluaworKysgYi9kb2MvZXhhbXBsZXMvcHVzaF9iYWNrX19vYmplY3RfdF9fdmFsdWUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvWU1QN1lxdXNBNEZWQ1hkOCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9nMkVicW9ibnlsVXZXZzZOIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9yYmVnaW4uY3BwIGIvZG9jL2V4YW1wbGVzL3JiZWdpbi5jcHAKaW5kZXggMmU5ODI0Yi4uMjM5ZjdhNiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3JiZWdpbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3JiZWdpbi5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3JiZWdpbi5saW5rIGIvZG9jL2V4YW1wbGVzL3JiZWdpbi5saW5rCmluZGV4IDM0MTc0MjEuLjhjOGM5MjQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9yYmVnaW4ubGluaworKysgYi9kb2MvZXhhbXBsZXMvcmJlZ2luLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL250SVAyZFJ6MTJkTThjQmkiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvYVJXRTJoZ1pqcllqb2FJQSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcmVuZC5jcHAgYi9kb2MvZXhhbXBsZXMvcmVuZC5jcHAKaW5kZXggMGM4MWRhMS4uYWRhZGJiZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3JlbmQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9yZW5kLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcmVuZC5saW5rIGIvZG9jL2V4YW1wbGVzL3JlbmQubGluawppbmRleCA3YzkzNjBiLi41OTZmYWY2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvcmVuZC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9yZW5kLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2J3VFBGbUdJU01VM21Cb0giPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvMU1KMDQ1Qm9XWFZ4eEJibyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc2l6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvc2l6ZS5jcHAKaW5kZXggMDdkMWI2Yy4uMjM3NTQ4MyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3NpemUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9zaXplLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc2l6ZS5saW5rIGIvZG9jL2V4YW1wbGVzL3NpemUubGluawppbmRleCA5MDQyZTA4Li43YjJmMjUwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc2l6ZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9zaXplLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2EwbFJnSHFjQnNHOWJlemoiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvT1RIZEdZRFVXQUNOUnhHYSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc3dhcF9fYXJyYXlfdC5jcHAgYi9kb2MvZXhhbXBsZXMvc3dhcF9fYXJyYXlfdC5jcHAKaW5kZXggYzgzNTU2ZS4uMjExOWRkNSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3N3YXBfX2FycmF5X3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9zd2FwX19hcnJheV90LmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc3dhcF9fYXJyYXlfdC5saW5rIGIvZG9jL2V4YW1wbGVzL3N3YXBfX2FycmF5X3QubGluawppbmRleCA3NTYyZTc4Li41MzY3MGI4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc3dhcF9fYXJyYXlfdC5saW5rCisrKyBiL2RvYy9leGFtcGxlcy9zd2FwX19hcnJheV90LmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3Zlc01HUk9YTHdPVzdrVGYiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvaUlScTYzQ1ZEbU5hdVI1dCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc3dhcF9fb2JqZWN0X3QuY3BwIGIvZG9jL2V4YW1wbGVzL3N3YXBfX29iamVjdF90LmNwcAppbmRleCBkNjc4MDFjLi4zMDFiNTU4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc3dhcF9fb2JqZWN0X3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9zd2FwX19vYmplY3RfdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3N3YXBfX29iamVjdF90LmxpbmsgYi9kb2MvZXhhbXBsZXMvc3dhcF9fb2JqZWN0X3QubGluawppbmRleCBjYzZhMThiLi4yNTZiZTg2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc3dhcF9fb2JqZWN0X3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvc3dhcF9fb2JqZWN0X3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvUG5TN2pPcTJjZ0pNd202dyI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9QYzlwWGdPTkZ0MnJiUTJ3Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9zd2FwX19yZWZlcmVuY2UuY3BwIGIvZG9jL2V4YW1wbGVzL3N3YXBfX3JlZmVyZW5jZS5jcHAKaW5kZXggNTIyMzk1MC4uMzQxODJhZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3N3YXBfX3JlZmVyZW5jZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3N3YXBfX3JlZmVyZW5jZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3N3YXBfX3JlZmVyZW5jZS5saW5rIGIvZG9jL2V4YW1wbGVzL3N3YXBfX3JlZmVyZW5jZS5saW5rCmluZGV4IDhjOTA2NzYuLjQ5MjA3ZjYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9zd2FwX19yZWZlcmVuY2UubGluaworKysgYi9kb2MvZXhhbXBsZXMvc3dhcF9fcmVmZXJlbmNlLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1hPMVY1Y25tSzE3RzI3N3oiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvMDN4QjNwR3pzTlpMRzJ5aiI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc3dhcF9fcmVmZXJlbmNlLm91dHB1dCBiL2RvYy9leGFtcGxlcy9zd2FwX19yZWZlcmVuY2Uub3V0cHV0CmluZGV4IGY1NDk1YmQuLjk2YjA3YjAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9zd2FwX19yZWZlcmVuY2Uub3V0cHV0CisrKyBiL2RvYy9leGFtcGxlcy9zd2FwX19yZWZlcmVuY2Uub3V0cHV0CkBAIC0xLDIgKzEsMiBAQAotajEgPSB7ImUiOjIuNzE4MjgxODI4NDU5MDUsInBpIjozLjE0MTU5MjY1MzU4OTc5fQorajEgPSB7ImUiOjIuNzE4MjgxODI4NDU5MDQ1LCJwaSI6My4xNDE1OTI2NTM1ODk3OTN9CiBqMiA9IFsxLDIsMyw0LDVdCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvc3dhcF9fc3RyaW5nX3QuY3BwIGIvZG9jL2V4YW1wbGVzL3N3YXBfX3N0cmluZ190LmNwcAppbmRleCBhZWVhMDI4Li5iNWQ1ODMxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc3dhcF9fc3RyaW5nX3QuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9zd2FwX19zdHJpbmdfdC5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3N3YXBfX3N0cmluZ190LmxpbmsgYi9kb2MvZXhhbXBsZXMvc3dhcF9fc3RyaW5nX3QubGluawppbmRleCAyOWMyZjlkLi5iOWZkNzViIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvc3dhcF9fc3RyaW5nX3QubGluaworKysgYi9kb2MvZXhhbXBsZXMvc3dhcF9fc3RyaW5nX3QubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvU2dHSHowZllHV1RDRndDSCI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9iZWdqeW5WY1hTdXBxeE05Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b19jYm9yLmNwcCBiL2RvYy9leGFtcGxlcy90b19jYm9yLmNwcAppbmRleCAzMzVhMzIwLi5iNDg0OWMxIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdG9fY2Jvci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3RvX2Nib3IuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b19jYm9yLmxpbmsgYi9kb2MvZXhhbXBsZXMvdG9fY2Jvci5saW5rCmluZGV4IDljOWY3YTguLjMxZjQ4MDkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90b19jYm9yLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL3RvX2Nib3IubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvemU5WG9mSDZ4QUt0SWhhMSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay80YlFTY2xYZXFqVkZZVkwzIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b19tc2dwYWNrLmNwcCBiL2RvYy9leGFtcGxlcy90b19tc2dwYWNrLmNwcAppbmRleCBkMGZkOTgxLi44YjE4YTEyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdG9fbXNncGFjay5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3RvX21zZ3BhY2suY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b19tc2dwYWNrLmxpbmsgYi9kb2MvZXhhbXBsZXMvdG9fbXNncGFjay5saW5rCmluZGV4IGFkMGM2Y2UuLmRmYzBkMzMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90b19tc2dwYWNrLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL3RvX21zZ3BhY2subGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvazhiTXBSdW1MZnNBOHlsTSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9XdlQyUTByOXZsSll5TU04Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b191Ympzb24uY3BwIGIvZG9jL2V4YW1wbGVzL3RvX3VianNvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyNWU2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90b191Ympzb24uY3BwCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KKwordXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOworCisvLyBmdW5jdGlvbiB0byBwcmludCBVQkpTT04ncyBkaWFnbm9zdGljIGZvcm1hdAordm9pZCBwcmludF9ieXRlKHVpbnQ4X3QgYnl0ZSkKK3sKKyAgICBpZiAoMzIgPCBieXRlIGFuZCBieXRlIDwgMTI4KQorICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8IChjaGFyKWJ5dGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAoaW50KWJ5dGU7CisgICAgfQorfQorCitpbnQgbWFpbigpCit7CisgICAgLy8gY3JlYXRlIGEgSlNPTiB2YWx1ZQorICAgIGpzb24gaiA9IFIiKHsiY29tcGFjdCI6IHRydWUsICJzY2hlbWEiOiBmYWxzZX0pIl9qc29uOworCisgICAgLy8gc2VyaWFsaXplIGl0IHRvIFVCSlNPTgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSBqc29uOjp0b191Ympzb24oaik7CisKKyAgICAvLyBwcmludCB0aGUgdmVjdG9yIGNvbnRlbnQKKyAgICBmb3IgKGF1dG8mIGJ5dGUgOiB2KQorICAgIHsKKyAgICAgICAgcHJpbnRfYnl0ZShieXRlKTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBudW1iZXJzCisgICAganNvbiBhcnJheSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKworICAgIC8vIHNlcmlhbGl6ZSBpdCB0byBVQkpTT04gdXNpbmcgZGVmYXVsdCByZXByZXNlbnRhdGlvbgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfYXJyYXkgPSBqc29uOjp0b191Ympzb24oYXJyYXkpOworICAgIC8vIHNlcmlhbGl6ZSBpdCB0byBVQkpTT04gdXNpbmcgc2l6ZSBvcHRpbWl6YXRpb24KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X2FycmF5X3NpemUgPSBqc29uOjp0b191Ympzb24oYXJyYXksIHRydWUpOworICAgIC8vIHNlcmlhbGl6ZSBpdCB0byBVQkpTT04gdXNpbmcgdHlwZSBvcHRpbWl6YXRpb24KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X2FycmF5X3NpemVfYW5kX3R5cGUgPSBqc29uOjp0b191Ympzb24oYXJyYXksIHRydWUsIHRydWUpOworCisgICAgLy8gcHJpbnQgdGhlIHZlY3RvciBjb250ZW50cworICAgIGZvciAoYXV0byYgYnl0ZSA6IHZfYXJyYXkpCisgICAgeworICAgICAgICBwcmludF9ieXRlKGJ5dGUpOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChhdXRvJiBieXRlIDogdl9hcnJheV9zaXplKQorICAgIHsKKyAgICAgICAgcHJpbnRfYnl0ZShieXRlKTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKworICAgIGZvciAoYXV0byYgYnl0ZSA6IHZfYXJyYXlfc2l6ZV9hbmRfdHlwZSkKKyAgICB7CisgICAgICAgIHByaW50X2J5dGUoYnl0ZSk7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdG9fdWJqc29uLmxpbmsgYi9kb2MvZXhhbXBsZXMvdG9fdWJqc29uLmxpbmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkNmZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90b191Ympzb24ubGluawpAQCAtMCwwICsxIEBACis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9qM0hFNmNPa0NtS2J4eEF0Ij48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90b191Ympzb24ub3V0cHV0IGIvZG9jL2V4YW1wbGVzL3RvX3VianNvbi5vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3OTgwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90b191Ympzb24ub3V0cHV0CkBAIC0wLDAgKzEsNCBAQAore2k3Y29tcGFjdFRpNnNjaGVtYUZ9CitbaTFpMmkzaTRpNWk2aTdpOF0KK1sjaThpMWkyaTNpNGk1aTZpN2k4CitbJGkjaTgxMjM0NTY3OApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R5cGUuY3BwIGIvZG9jL2V4YW1wbGVzL3R5cGUuY3BwCmluZGV4IDU5NzlkMDIuLjY4ZmJhM2EgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90eXBlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHlwZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R5cGUubGluayBiL2RvYy9leGFtcGxlcy90eXBlLmxpbmsKaW5kZXggYTgxZWUxMi4uZTAyN2JkMiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3R5cGUubGluaworKysgYi9kb2MvZXhhbXBsZXMvdHlwZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9McWdlQXRkSU1MU3BHemtFIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL3g5cTVCWEF1aDZhZnJrYTUiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R5cGVfZXJyb3IuY3BwIGIvZG9jL2V4YW1wbGVzL3R5cGVfZXJyb3IuY3BwCmluZGV4IDZkZjM5ZjUuLmQ0ZjE4YjEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90eXBlX2Vycm9yLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHlwZV9lcnJvci5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R5cGVfZXJyb3IubGluayBiL2RvYy9leGFtcGxlcy90eXBlX2Vycm9yLmxpbmsKaW5kZXggZmMxNjBkMC4uNjkwN2ZkNyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3R5cGVfZXJyb3IubGluaworKysgYi9kb2MvZXhhbXBsZXMvdHlwZV9lcnJvci5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9IVmZtZ2RJcTczenRmQ0hZIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rLzlZMFlIZTBjSmloam1nVHUiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R5cGVfbmFtZS5jcHAgYi9kb2MvZXhhbXBsZXMvdHlwZV9uYW1lLmNwcAppbmRleCBkY2NiZDdiLi4zMmQzNTkwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHlwZV9uYW1lLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHlwZV9uYW1lLmNwcApAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHlwZV9uYW1lLmxpbmsgYi9kb2MvZXhhbXBsZXMvdHlwZV9uYW1lLmxpbmsKaW5kZXggZGFkN2VlYi4uNDU0ZGE1MSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3R5cGVfbmFtZS5saW5rCisrKyBiL2RvYy9leGFtcGxlcy90eXBlX25hbWUubGluawpAQCAtMSArMSBAQAotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVXFEYTlhVDVmSGFLNmRQUSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9ZVDFiR0lka3RhZENQWnVTIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy91bmZsYXR0ZW4uY3BwIGIvZG9jL2V4YW1wbGVzL3VuZmxhdHRlbi5jcHAKaW5kZXggY2M2NzJiNS4uNWUzZDY1ZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3VuZmxhdHRlbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3VuZmxhdHRlbi5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3VuZmxhdHRlbi5saW5rIGIvZG9jL2V4YW1wbGVzL3VuZmxhdHRlbi5saW5rCmluZGV4IDIwNTgyYzkuLmQxM2YxNzEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy91bmZsYXR0ZW4ubGluaworKysgYi9kb2MvZXhhbXBsZXMvdW5mbGF0dGVuLmxpbmsKQEAgLTEgKzEgQEAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL2h2ajM5M1dndmpJYWlVWmUiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd2FuZGJveC5vcmcvcGVybWxpbmsvVTQ1QUdpNW5zRHRvRGYzdSI+PGI+b25saW5lPC9iPjwvYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdXBkYXRlLmNwcCBiL2RvYy9leGFtcGxlcy91cGRhdGUuY3BwCmluZGV4IDQzODNkZjcuLmI3N2MwZmUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy91cGRhdGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy91cGRhdGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy91cGRhdGUubGluayBiL2RvYy9leGFtcGxlcy91cGRhdGUubGluawppbmRleCA0NmFmOWNiLi41YWQzNjdkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdXBkYXRlLmxpbmsKKysrIGIvZG9jL2V4YW1wbGVzL3VwZGF0ZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9abUhEMnBsbTZPQXVZNnVKIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL1RHdmRZeUp0c3RhY1p4V3EiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3VwZGF0ZV9fcmFuZ2UuY3BwIGIvZG9jL2V4YW1wbGVzL3VwZGF0ZV9fcmFuZ2UuY3BwCmluZGV4IDdjNTZhYWQuLjg4NzgwZmQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy91cGRhdGVfX3JhbmdlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdXBkYXRlX19yYW5nZS5jcHAKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3VwZGF0ZV9fcmFuZ2UubGluayBiL2RvYy9leGFtcGxlcy91cGRhdGVfX3JhbmdlLmxpbmsKaW5kZXggMWU5MGY2Ni4uZDJkODVhOCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3VwZGF0ZV9fcmFuZ2UubGluaworKysgYi9kb2MvZXhhbXBsZXMvdXBkYXRlX19yYW5nZS5saW5rCkBAIC0xICsxIEBACi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93YW5kYm94Lm9yZy9wZXJtbGluay9EZzRtc3dEbVlyNGUwTTRmIj48Yj5vbmxpbmU8L2I+PC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL3dhbmRib3gub3JnL3Blcm1saW5rL0JNbGFzNjMxMnJrRTRjeHoiPjxiPm9ubGluZTwvYj48L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2ltYWdlcy9iaW5hcnkucG5nIGIvZG9jL2ltYWdlcy9iaW5hcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzlmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2JpbmFyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2luZGV4Lm1kIGIvZG9jL2luZGV4Lm1kCmluZGV4IGE3MmQ5NjUuLmEzMDI0YTkgMTAwNjQ0Ci0tLSBhL2RvYy9pbmRleC5tZAorKysgYi9kb2MvaW5kZXgubWQKQEAgLTM2LDcgKzM2LDE2IEBACiAgICAgLSBAbGluayBubG9obWFubjo6YmFzaWNfanNvbjo6b3RoZXJfZXJyb3Igb3RoZXJfZXJyb3IgQGVuZGxpbmsgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBvdGhlciBsaWJyYXJ5IGVycm9ycwogICAtIGxleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIG9wZXJhdG9ycwogICAtIHNlcmlhbGl6YXRpb24KLSAgLSBkZXNlcmlhbGl6YXRpb24KKyAgICAtIEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjpkdW1wIGR1bXAgQGVuZGxpbmsgc2VyaWFsaXplIHRvIHN0cmluZworICAgIC0gQGxpbmsgbmxvaG1hbm46OmJhc2ljX2pzb246Om9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgYmFzaWNfanNvbiAmKSBvcGVyYXRvcjw8IEBlbmRsaW5rIHNlcmlhbGl6ZSB0byBzdHJlYW0KKyAgLSBkZXNlcmlhbGl6YXRpb24gLyBwYXJzaW5nCisgICAgLSBAbGluayBubG9obWFubjo6YmFzaWNfanNvbjo6cGFyc2UgcGFyc2UgQGVuZGxpbmsgcGFyc2UgZnJvbSBzdHJpbmcKKyAgICAtIEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjpvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYsIGJhc2ljX2pzb24mKSBvcGVyYXRvcj4+IEBlbmRsaW5rIHBhcnNlIGZyb20gc3RyZWFtCisgICAgLSBAbGluayBubG9obWFubjo6YmFzaWNfanNvbjo6YWNjZXB0IGFjY2VwdCBAZW5kbGluayBjaGVjayBmb3Igc3ludGF4IGVycm9ycyB3aXRob3V0IHBhcnNpbmcKKyAgLSBbYmluYXJ5IGZvcm1hdHNdKGJpbmFyeV9mb3JtYXRzLm1kKToKKyAgICAtIENCT1I6IEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjpmcm9tX2Nib3IgZnJvbV9jYm9yIEBlbmRsaW5rIC8gQGxpbmsgbmxvaG1hbm46OmJhc2ljX2pzb246OnRvX2Nib3IgdG9fY2JvciBAZW5kbGluaworICAgIC0gTWVzc2FnZVBhY2s6IEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjpmcm9tX21zZ3BhY2sgZnJvbV9tc2dwYWNrIEBlbmRsaW5rIC8gQGxpbmsgbmxvaG1hbm46OmJhc2ljX2pzb246OnRvX21zZ3BhY2sgdG9fbXNncGFjayBAZW5kbGluaworICAgIC0gVUJKU09OOiBAbGluayBubG9obWFubjo6YmFzaWNfanNvbjo6ZnJvbV91Ympzb24gZnJvbV91Ympzb24gQGVuZGxpbmsgLyBAbGluayBubG9obWFubjo6YmFzaWNfanNvbjo6dG9fdWJqc29uIHRvX3VianNvbiBAZW5kbGluawogLSBUeXBlcwogICAtIEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjphcnJheV90IGFycmF5cyBAZW5kbGluawogICAtIEBsaW5rIG5sb2htYW5uOjpiYXNpY19qc29uOjpvYmplY3RfdCBvYmplY3RzIEBlbmRsaW5rCkBAIC0yOTAsOSArMjk5LDkgQEAKICAgPC90cj4KIDwvdGFibGU+CiAKLUBjb3B5cmlnaHQgQ29weXJpZ2h0ICZjb3B5OyAyMDEzLTIwMTcgTmllbHMgTG9obWFubi4gVGhlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFtNSVQgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkuCitAY29weXJpZ2h0IENvcHlyaWdodCAmY29weTsgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4uIFRoZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBbTUlUIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpLgogCiBAYXV0aG9yIFtOaWVscyBMb2htYW5uXShodHRwOi8vbmxvaG1hbm4ubWUpCiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uIHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgY29kZQogCi1AdmVyc2lvbiAzLjAuMQorQHZlcnNpb24gMy4xLjAKZGlmZiAtLWdpdCBhL2RvYy9qc29uLmdpZiBiL2RvYy9qc29uLmdpZgppbmRleCAyYjViNTg4Li42MDhkZjZhIDEwMDY0NAotLS0gYS9kb2MvanNvbi5naWYKKysrIGIvZG9jL2pzb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vYWRsX3NlcmlhbGl6ZXIuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9hZGxfc2VyaWFsaXplci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjOTAwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vYWRsX3NlcmlhbGl6ZXIuaHBwCkBAIC0wLDAgKzEsNDUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy9mcm9tX2pzb24uaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcD4KKworbmFtZXNwYWNlIG5sb2htYW5uCit7Cit0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CitzdHJ1Y3QgYWRsX3NlcmlhbGl6ZXIKK3sKKyAgICAvKiEKKyAgICBAYnJpZWYgY29udmVydCBhIEpTT04gdmFsdWUgdG8gYW55IHZhbHVlIHR5cGUKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgYnkgdGhlIGBnZXQoKWAgZnVuY3Rpb24gb2YgdGhlCisgICAgQHJlZiBiYXNpY19qc29uIGNsYXNzIChlaXRoZXIgZXhwbGljaXQgb3IgdmlhIGNvbnZlcnNpb24gb3BlcmF0b3JzKS4KKworICAgIEBwYXJhbVtpbl0gaiAgICAgICAgIEpTT04gdmFsdWUgdG8gcmVhZCBmcm9tCisgICAgQHBhcmFtW2luLG91dF0gdmFsICB2YWx1ZSB0byB3cml0ZSB0bworICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlPgorICAgIHN0YXRpYyB2b2lkIGZyb21fanNvbihCYXNpY0pzb25UeXBlJiYgaiwgVmFsdWVUeXBlJiB2YWwpIG5vZXhjZXB0KAorICAgICAgICBub2V4Y2VwdCg6Om5sb2htYW5uOjpmcm9tX2pzb24oc3RkOjpmb3J3YXJkPEJhc2ljSnNvblR5cGU+KGopLCB2YWwpKSkKKyAgICB7CisgICAgICAgIDo6bmxvaG1hbm46OmZyb21fanNvbihzdGQ6OmZvcndhcmQ8QmFzaWNKc29uVHlwZT4oaiksIHZhbCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbnZlcnQgYW55IHZhbHVlIHR5cGUgdG8gYSBKU09OIHZhbHVlCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIEByZWYgYmFzaWNfanNvbgorICAgIGNsYXNzLgorCisgICAgQHBhcmFtW2luLG91dF0gaiAgSlNPTiB2YWx1ZSB0byB3cml0ZSB0bworICAgIEBwYXJhbVtpbl0gdmFsICAgICB2YWx1ZSB0byByZWFkIGZyb20KKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZT4KKyAgICBzdGF0aWMgdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIFZhbHVlVHlwZSYmIHZhbCkgbm9leGNlcHQoCisgICAgICAgIG5vZXhjZXB0KDo6bmxvaG1hbm46OnRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFZhbHVlVHlwZT4odmFsKSkpKQorICAgIHsKKyAgICAgICAgOjpubG9obWFubjo6dG9fanNvbihqLCBzdGQ6OmZvcndhcmQ8VmFsdWVUeXBlPih2YWwpKTsKKyAgICB9Cit9OworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvZnJvbV9qc29uLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL2Zyb21fanNvbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhMDI4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL2Zyb21fanNvbi5ocHAKQEAgLTAsMCArMSwzMTUgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyB0cmFuc2Zvcm0KKyNpbmNsdWRlIDxhcnJheT4gLy8gYXJyYXkKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBhbmQsIG5vdAorI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4gLy8gZm9yd2FyZF9saXN0CisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGluc2VydGVyLCBmcm9udF9pbnNlcnRlciwgZW5kCisjaW5jbHVkZSA8c3RyaW5nPiAvLyBzdHJpbmcKKyNpbmNsdWRlIDx0dXBsZT4gLy8gdHVwbGUsIG1ha2VfdHVwbGUKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy8gaXNfYXJpdGhtZXRpYywgaXNfc2FtZSwgaXNfZW51bSwgdW5kZXJseWluZ190eXBlLCBpc19jb252ZXJ0aWJsZQorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIHBhaXIsIGRlY2x2YWwKKyNpbmNsdWRlIDx2YWxhcnJheT4gLy8gdmFsYXJyYXkKKworI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8gb3ZlcmxvYWRzIGZvciBiYXNpY19qc29uIHRlbXBsYXRlIHBhcmFtZXRlcnMKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIEFyaXRobWV0aWNUeXBlLAorICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19hcml0aG1ldGljPEFyaXRobWV0aWNUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgICBub3Qgc3RkOjppc19zYW1lPEFyaXRobWV0aWNUeXBlLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpib29sZWFuX3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgordm9pZCBnZXRfYXJpdGhtZXRpY192YWx1ZShjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBBcml0aG1ldGljVHlwZSYgdmFsKQoreworICAgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8dmFsdWVfdD4oaikpCisgICAgeworICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8QXJpdGhtZXRpY1R5cGU+KCpqLnRlbXBsYXRlIGdldF9wdHI8Y29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3QqPigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9pbnRlZ2VyX3QqPigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgorICAgICAgICB7CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfZmxvYXRfdCo+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzICIgKyBzdGQ6OnN0cmluZyhqLnR5cGVfbmFtZSgpKSkpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmJvb2xlYW5fdCYgYikKK3sKKyAgICBpZiAoSlNPTl9VTkxJS0VMWShub3Qgai5pc19ib29sZWFuKCkpKQorICAgIHsKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIGJvb2xlYW4sIGJ1dCBpcyAiICsgc3RkOjpzdHJpbmcoai50eXBlX25hbWUoKSkpKTsKKyAgICB9CisgICAgYiA9ICpqLnRlbXBsYXRlIGdldF9wdHI8Y29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Ym9vbGVhbl90Kj4oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190JiBzKQoreworICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBqLmlzX3N0cmluZygpKSkKKyAgICB7CisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBzdHJpbmcsIGJ1dCBpcyAiICsgc3RkOjpzdHJpbmcoai50eXBlX25hbWUoKSkpKTsKKyAgICB9CisgICAgcyA9ICpqLnRlbXBsYXRlIGdldF9wdHI8Y29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QqPigpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgordm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2Zsb2F0X3QmIHZhbCkKK3sKKyAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgordm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3QmIHZhbCkKK3sKKyAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgordm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdCYgdmFsKQoreworICAgIGdldF9hcml0aG1ldGljX3ZhbHVlKGosIHZhbCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIEVudW1UeXBlLAorICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19lbnVtPEVudW1UeXBlPjo6dmFsdWUsIGludD4gPSAwPgordm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgRW51bVR5cGUmIGUpCit7CisgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RW51bVR5cGU+Ojp0eXBlIHZhbDsKKyAgICBnZXRfYXJpdGhtZXRpY192YWx1ZShqLCB2YWwpOworICAgIGUgPSBzdGF0aWNfY2FzdDxFbnVtVHlwZT4odmFsKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmIGFycikKK3sKKyAgICBpZiAoSlNPTl9VTkxJS0VMWShub3Qgai5pc19hcnJheSgpKSkKKyAgICB7CisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwMiwgInR5cGUgbXVzdCBiZSBhcnJheSwgYnV0IGlzICIgKyBzdGQ6OnN0cmluZyhqLnR5cGVfbmFtZSgpKSkpOworICAgIH0KKyAgICBhcnIgPSAqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QqPigpOworfQorCisvLyBmb3J3YXJkX2xpc3QgZG9lc24ndCBoYXZlIGFuIGluc2VydCBtZXRob2QKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvciwKKyAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfY29udmVydGlibGU8QmFzaWNKc29uVHlwZSwgVD46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHN0ZDo6Zm9yd2FyZF9saXN0PFQsIEFsbG9jYXRvcj4mIGwpCit7CisgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGouaXNfYXJyYXkoKSkpCisgICAgeworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyAiICsgc3RkOjpzdHJpbmcoai50eXBlX25hbWUoKSkpKTsKKyAgICB9CisgICAgc3RkOjp0cmFuc2Zvcm0oai5yYmVnaW4oKSwgai5yZW5kKCksCisgICAgICAgICAgICAgICAgICAgc3RkOjpmcm9udF9pbnNlcnRlcihsKSwgW10oY29uc3QgQmFzaWNKc29uVHlwZSAmIGkpCisgICAgeworICAgICAgICByZXR1cm4gaS50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICB9KTsKK30KKworLy8gdmFsYXJyYXkgZG9lc24ndCBoYXZlIGFuIGluc2VydCBtZXRob2QKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnZlcnRpYmxlPEJhc2ljSnNvblR5cGUsIFQ+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIGZyb21fanNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBzdGQ6OnZhbGFycmF5PFQ+JiBsKQoreworICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBqLmlzX2FycmF5KCkpKQorICAgIHsKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIGFycmF5LCBidXQgaXMgIiArIHN0ZDo6c3RyaW5nKGoudHlwZV9uYW1lKCkpKSk7CisgICAgfQorICAgIGwucmVzaXplKGouc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoai5tX3ZhbHVlLmFycmF5LT5iZWdpbigpLCBqLm1fdmFsdWUuYXJyYXktPmVuZCgpLCBzdGQ6OmJlZ2luKGwpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZT4KK3ZvaWQgZnJvbV9qc29uX2FycmF5X2ltcGwoY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyLCBwcmlvcml0eV90YWc8MD4gLyp1bnVzZWQqLykKK3sKKyAgICB1c2luZyBzdGQ6OmVuZDsKKworICAgIHN0ZDo6dHJhbnNmb3JtKGouYmVnaW4oKSwgai5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omluc2VydGVyKGFyciwgZW5kKGFycikpLCBbXShjb25zdCBCYXNpY0pzb25UeXBlICYgaSkKKyAgICB7CisgICAgICAgIC8vIGdldDxCYXNpY0pzb25UeXBlPigpIHJldHVybnMgKnRoaXMsIHRoaXMgd29uJ3QgY2FsbCBhIGZyb21fanNvbgorICAgICAgICAvLyBtZXRob2Qgd2hlbiB2YWx1ZV90eXBlIGlzIEJhc2ljSnNvblR5cGUKKyAgICAgICAgcmV0dXJuIGkudGVtcGxhdGUgZ2V0PHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGU6OnZhbHVlX3R5cGU+KCk7CisgICAgfSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGU+CithdXRvIGZyb21fanNvbl9hcnJheV9pbXBsKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIENvbXBhdGlibGVBcnJheVR5cGUmIGFyciwgcHJpb3JpdHlfdGFnPDE+IC8qdW51c2VkKi8pCistPiBkZWNsdHlwZSgKKyAgICBhcnIucmVzZXJ2ZShzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZTo6c2l6ZV90eXBlPigpKSwKKyAgICB2b2lkKCkpCit7CisgICAgdXNpbmcgc3RkOjplbmQ7CisKKyAgICBhcnIucmVzZXJ2ZShqLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0oai5iZWdpbigpLCBqLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoYXJyLCBlbmQoYXJyKSksIFtdKGNvbnN0IEJhc2ljSnNvblR5cGUgJiBpKQorICAgIHsKKyAgICAgICAgLy8gZ2V0PEJhc2ljSnNvblR5cGU+KCkgcmV0dXJucyAqdGhpcywgdGhpcyB3b24ndCBjYWxsIGEgZnJvbV9qc29uCisgICAgICAgIC8vIG1ldGhvZCB3aGVuIHZhbHVlX3R5cGUgaXMgQmFzaWNKc29uVHlwZQorICAgICAgICByZXR1cm4gaS50ZW1wbGF0ZSBnZXQ8dHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZTo6dmFsdWVfdHlwZT4oKTsKKyAgICB9KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK3ZvaWQgZnJvbV9qc29uX2FycmF5X2ltcGwoY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgc3RkOjphcnJheTxULCBOPiYgYXJyLCBwcmlvcml0eV90YWc8Mj4gLyp1bnVzZWQqLykKK3sKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKQorICAgIHsKKyAgICAgICAgYXJyW2ldID0gai5hdChpKS50ZW1wbGF0ZSBnZXQ8VD4oKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2FycmF5X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlIGFuZAorICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlQXJyYXlUeXBlOjp2YWx1ZV90eXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgICBub3Qgc3RkOjppc19zYW1lPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QsIENvbXBhdGlibGVBcnJheVR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIGZyb21fanNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlQXJyYXlUeXBlJiBhcnIpCit7CisgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGouaXNfYXJyYXkoKSkpCisgICAgeworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgYXJyYXksIGJ1dCBpcyAiICsgc3RkOjpzdHJpbmcoai50eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICBmcm9tX2pzb25fYXJyYXlfaW1wbChqLCBhcnIsIHByaW9yaXR5X3RhZzwyPiB7fSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlLAorICAgICAgICAgZW5hYmxlX2lmX3Q8aXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlT2JqZWN0VHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIENvbXBhdGlibGVPYmplY3RUeXBlJiBvYmopCit7CisgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGouaXNfb2JqZWN0KCkpKQorICAgIHsKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIG9iamVjdCwgYnV0IGlzICIgKyBzdGQ6OnN0cmluZyhqLnR5cGVfbmFtZSgpKSkpOworICAgIH0KKworICAgIGF1dG8gaW5uZXJfb2JqZWN0ID0gai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90Kj4oKTsKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGU6OnZhbHVlX3R5cGU7CisgICAgc3RkOjp0cmFuc2Zvcm0oCisgICAgICAgIGlubmVyX29iamVjdC0+YmVnaW4oKSwgaW5uZXJfb2JqZWN0LT5lbmQoKSwKKyAgICAgICAgc3RkOjppbnNlcnRlcihvYmosIG9iai5iZWdpbigpKSwKKyAgICAgICAgW10odHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q6OnZhbHVlX3R5cGUgY29uc3QgJiBwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlX3R5cGUocC5maXJzdCwgcC5zZWNvbmQudGVtcGxhdGUgZ2V0PHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjptYXBwZWRfdHlwZT4oKSk7CisgICAgfSk7Cit9CisKKy8vIG92ZXJsb2FkIGZvciBhcml0aG1ldGljIHR5cGVzLCBub3QgY2hvc2VuIGZvciBiYXNpY19qc29uIHRlbXBsYXRlIGFyZ3VtZW50cworLy8gKEJvb2xlYW5UeXBlLCBldGMuLik7IG5vdGU6IElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gcHJvdmlkZSBleHBsaWNpdAorLy8gb3ZlcmxvYWRzIGZvciBib29sZWFuX3QgZXRjLiBpbiBjYXNlIG9mIGEgY3VzdG9tIEJvb2xlYW5UeXBlIHdoaWNoIGlzIG5vdAorLy8gYW4gYXJpdGhtZXRpYyB0eXBlPwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQXJpdGhtZXRpY1R5cGUsCisgICAgICAgICBlbmFibGVfaWZfdCA8CisgICAgICAgICAgICAgc3RkOjppc19hcml0aG1ldGljPEFyaXRobWV0aWNUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxBcml0aG1ldGljVHlwZSwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3Q+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICBub3Qgc3RkOjppc19zYW1lPEFyaXRobWV0aWNUeXBlLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90Pjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxBcml0aG1ldGljVHlwZSwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2Zsb2F0X3Q+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICBub3Qgc3RkOjppc19zYW1lPEFyaXRobWV0aWNUeXBlLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpib29sZWFuX3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICBpbnQ+ID0gMD4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIEFyaXRobWV0aWNUeXBlJiB2YWwpCit7CisgICAgc3dpdGNoIChzdGF0aWNfY2FzdDx2YWx1ZV90PihqKSkKKyAgICB7CisgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICB7CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxBcml0aG1ldGljVHlwZT4oKmoudGVtcGxhdGUgZ2V0X3B0cjxjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdCo+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8QXJpdGhtZXRpY1R5cGU+KCpqLnRlbXBsYXRlIGdldF9wdHI8Y29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdCo+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9mbG9hdF90Kj4oKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PEFyaXRobWV0aWNUeXBlPigqai50ZW1wbGF0ZSBnZXRfcHRyPGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmJvb2xlYW5fdCo+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAyLCAidHlwZSBtdXN0IGJlIG51bWJlciwgYnV0IGlzICIgKyBzdGQ6OnN0cmluZyhqLnR5cGVfbmFtZSgpKSkpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgordm9pZCBmcm9tX2pzb24oY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgc3RkOjpwYWlyPEExLCBBMj4mIHApCit7CisgICAgcCA9IHtqLmF0KDApLnRlbXBsYXRlIGdldDxBMT4oKSwgai5hdCgxKS50ZW1wbGF0ZSBnZXQ8QTI+KCl9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUdXBsZSwgc3RkOjpzaXplX3QuLi4gSWR4Pgordm9pZCBmcm9tX2pzb25fdHVwbGVfaW1wbChjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBUdXBsZSYgdCwgaW5kZXhfc2VxdWVuY2U8SWR4Li4uPikKK3sKKyAgICB0ID0gc3RkOjptYWtlX3R1cGxlKGouYXQoSWR4KS50ZW1wbGF0ZSBnZXQ8dHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PElkeCwgVHVwbGU+Ojp0eXBlPigpLi4uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQgZnJvbV9qc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIHN0ZDo6dHVwbGU8QXJncy4uLj4mIHQpCit7CisgICAgZnJvbV9qc29uX3R1cGxlX2ltcGwoaiwgdCwgaW5kZXhfc2VxdWVuY2VfZm9yPEFyZ3MuLi4+IHt9KTsKK30KKworc3RydWN0IGZyb21fanNvbl9mbgoreworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+CisgICAgYXV0byBjYWxsKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIFQmIHZhbCwgcHJpb3JpdHlfdGFnPDE+IC8qdW51c2VkKi8pIGNvbnN0CisgICAgbm9leGNlcHQobm9leGNlcHQoZnJvbV9qc29uKGosIHZhbCkpKQorICAgIC0+IGRlY2x0eXBlKGZyb21fanNvbihqLCB2YWwpLCB2b2lkKCkpCisgICAgeworICAgICAgICByZXR1cm4gZnJvbV9qc29uKGosIHZhbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KKyAgICB2b2lkIGNhbGwoY29uc3QgQmFzaWNKc29uVHlwZSYgLyp1bnVzZWQqLywgVCYgLyp1bnVzZWQqLywgcHJpb3JpdHlfdGFnPDA+IC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihCYXNpY0pzb25UeXBlKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBmcm9tX2pzb24oKSBtZXRob2QgaW4gVCdzIG5hbWVzcGFjZSIpOworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgIC8vIE1TVkMgZG9lcyBub3Qgc2hvdyBhIHN0YWNrdHJhY2UgZm9yIHRoZSBhYm92ZSBhc3NlcnQKKyAgICAgICAgdXNpbmcgZGVjYXllZCA9IHVuY3ZyZWZfdDxUPjsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodHlwZW5hbWUgZGVjYXllZDo6Zm9yY2VfbXN2Y19zdGFja3RyYWNlKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICJmb3JjaW5nIE1TVkMgc3RhY2t0cmFjZSB0byBzaG93IHdoaWNoIFQgd2UncmUgdGFsa2luZyBhYm91dC4iKTsKKyNlbmRpZgorICAgIH0KKworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KKyAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQmFzaWNKc29uVHlwZSYgaiwgVCYgdmFsKSBjb25zdAorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDxmcm9tX2pzb25fZm4+KCkuY2FsbChqLCB2YWwsIHByaW9yaXR5X3RhZzwxPiB7fSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhbGwoaiwgdmFsLCBwcmlvcml0eV90YWc8MT4ge30pOworICAgIH0KK307Cit9CisKKy8vLyBuYW1lc3BhY2UgdG8gaG9sZCBkZWZhdWx0IGBmcm9tX2pzb25gIGZ1bmN0aW9uCisvLy8gdG8gc2VlIHdoeSB0aGlzIGlzIHJlcXVpcmVkOgorLy8vIGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTUvbjQzODEuaHRtbAorbmFtZXNwYWNlCit7Citjb25zdGV4cHIgY29uc3QgYXV0byYgZnJvbV9qc29uID0gZGV0YWlsOjpzdGF0aWNfY29uc3Q8ZGV0YWlsOjpmcm9tX2pzb25fZm4+Ojp2YWx1ZTsKK30KK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL3RvX2NoYXJzLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL3RvX2NoYXJzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZiNjJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvdG9fY2hhcnMuaHBwCkBAIC0wLDAgKzEsMTA5NSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBvciwgYW5kLCBub3QKKyNpbmNsdWRlIDxjbWF0aD4gICAvLyBzaWduYml0LCBpc2Zpbml0ZQorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIGludE5fdCwgdWludE5fdAorI2luY2x1ZGUgPGNzdHJpbmc+IC8vIG1lbWNweSwgbWVtbW92ZQorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKworLyohCitAYnJpZWYgaW1wbGVtZW50cyB0aGUgR3Jpc3UyIGFsZ29yaXRobSBmb3IgYmluYXJ5IHRvIGRlY2ltYWwgZmxvYXRpbmctcG9pbnQKK2NvbnZlcnNpb24uCisKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSByZWZlcmVuY2UKK2ltcGxlbWVudGF0aW9uIHdoaWNoIG1heSBiZSBvYnRhaW5lZCBmcm9tCitodHRwOi8vZmxvcmlhbi5sb2l0c2NoLmNvbS9wdWJsaWNhdGlvbnMgKGJlbmNoLnRhci5neikuCisKK1RoZSBjb2RlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgQ29weXJpZ2h0IChjKSAyMDA5IEZsb3JpYW4gTG9pdHNjaC4KKworRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBzZWU6CisKK1sxXSBMb2l0c2NoLCAiUHJpbnRpbmcgRmxvYXRpbmctUG9pbnQgTnVtYmVycyBRdWlja2x5IGFuZCBBY2N1cmF0ZWx5IHdpdGgKKyAgICBJbnRlZ2VycyIsIFByb2NlZWRpbmdzIG9mIHRoZSBBQ00gU0lHUExBTiAyMDEwIENvbmZlcmVuY2Ugb24gUHJvZ3JhbW1pbmcKKyAgICBMYW5ndWFnZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uLCBQTERJIDIwMTAKK1syXSBCdXJnZXIsIER5YnZpZywgIlByaW50aW5nIEZsb2F0aW5nLVBvaW50IE51bWJlcnMgUXVpY2tseSBhbmQgQWNjdXJhdGVseSIsCisgICAgUHJvY2VlZGluZ3Mgb2YgdGhlIEFDTSBTSUdQTEFOIDE5OTYgQ29uZmVyZW5jZSBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZQorICAgIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24sIFBMREkgMTk5NgorKi8KK25hbWVzcGFjZSBkdG9hX2ltcGwKK3sKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRhcmdldCwgdHlwZW5hbWUgU291cmNlPgorVGFyZ2V0IHJlaW50ZXJwcmV0X2JpdHMoY29uc3QgU291cmNlIHNvdXJjZSkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUYXJnZXQpID09IHNpemVvZihTb3VyY2UpLCAic2l6ZSBtaXNtYXRjaCIpOworCisgICAgVGFyZ2V0IHRhcmdldDsKKyAgICBzdGQ6Om1lbWNweSgmdGFyZ2V0LCAmc291cmNlLCBzaXplb2YoU291cmNlKSk7CisgICAgcmV0dXJuIHRhcmdldDsKK30KKworc3RydWN0IGRpeWZwIC8vIGYgKiAyXmUKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrUHJlY2lzaW9uID0gNjQ7IC8vID0gcQorCisgICAgdWludDY0X3QgZjsKKyAgICBpbnQgZTsKKworICAgIGNvbnN0ZXhwciBkaXlmcCgpIG5vZXhjZXB0IDogZigwKSwgZSgwKSB7fQorICAgIGNvbnN0ZXhwciBkaXlmcCh1aW50NjRfdCBmXywgaW50IGVfKSBub2V4Y2VwdCA6IGYoZl8pLCBlKGVfKSB7fQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybnMgeCAtIHkKKyAgICBAcHJlIHguZSA9PSB5LmUgYW5kIHguZiA+PSB5LmYKKyAgICAqLworICAgIHN0YXRpYyBkaXlmcCBzdWIoY29uc3QgZGl5ZnAmIHgsIGNvbnN0IGRpeWZwJiB5KSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KHguZSA9PSB5LmUpOworICAgICAgICBhc3NlcnQoeC5mID49IHkuZik7CisKKyAgICAgICAgcmV0dXJuIGRpeWZwKHguZiAtIHkuZiwgeC5lKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyB4ICogeQorICAgIEBub3RlIFRoZSByZXN1bHQgaXMgcm91bmRlZC4gKE9ubHkgdGhlIHVwcGVyIHEgYml0cyBhcmUgcmV0dXJuZWQuKQorICAgICovCisgICAgc3RhdGljIGRpeWZwIG11bChjb25zdCBkaXlmcCYgeCwgY29uc3QgZGl5ZnAmIHkpIG5vZXhjZXB0CisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGtQcmVjaXNpb24gPT0gNjQsICJpbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgIC8vIENvbXB1dGVzOgorICAgICAgICAvLyAgZiA9IHJvdW5kKCh4LmYgKiB5LmYpIC8gMl5xKQorICAgICAgICAvLyAgZSA9IHguZSArIHkuZSArIHEKKworICAgICAgICAvLyBFbXVsYXRlIHRoZSA2NC1iaXQgKiA2NC1iaXQgbXVsdGlwbGljYXRpb246CisgICAgICAgIC8vCisgICAgICAgIC8vIHAgPSB1ICogdgorICAgICAgICAvLyAgID0gKHVfbG8gKyAyXjMyIHVfaGkpICh2X2xvICsgMl4zMiB2X2hpKQorICAgICAgICAvLyAgID0gKHVfbG8gdl9sbyAgICAgICAgICkgKyAyXjMyICgodV9sbyB2X2hpICAgICAgICAgKSArICh1X2hpIHZfbG8gICAgICAgICApKSArIDJeNjQgKHVfaGkgdl9oaSAgICAgICAgICkKKyAgICAgICAgLy8gICA9IChwMCAgICAgICAgICAgICAgICApICsgMl4zMiAoKHAxICAgICAgICAgICAgICAgICkgKyAocDIgICAgICAgICAgICAgICAgKSkgKyAyXjY0IChwMyAgICAgICAgICAgICAgICApCisgICAgICAgIC8vICAgPSAocDBfbG8gKyAyXjMyIHAwX2hpKSArIDJeMzIgKChwMV9sbyArIDJeMzIgcDFfaGkpICsgKHAyX2xvICsgMl4zMiBwMl9oaSkpICsgMl42NCAocDMgICAgICAgICAgICAgICAgKQorICAgICAgICAvLyAgID0gKHAwX2xvICAgICAgICAgICAgICkgKyAyXjMyIChwMF9oaSArIHAxX2xvICsgcDJfbG8gICAgICAgICAgICAgICAgICAgICAgKSArIDJeNjQgKHAxX2hpICsgcDJfaGkgKyBwMykKKyAgICAgICAgLy8gICA9IChwMF9sbyAgICAgICAgICAgICApICsgMl4zMiAoUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAyXjY0IChIICAgICAgICAgICAgICAgICApCisgICAgICAgIC8vICAgPSAocDBfbG8gICAgICAgICAgICAgKSArIDJeMzIgKFFfbG8gKyAyXjMyIFFfaGkgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMl42NCAoSCAgICAgICAgICAgICAgICAgKQorICAgICAgICAvLworICAgICAgICAvLyAoU2luY2UgUSBtaWdodCBiZSBsYXJnZXIgdGhhbiAyXjMyIC0gMSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICA9IChwMF9sbyArIDJeMzIgUV9sbykgKyAyXjY0IChRX2hpICsgSCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKFFfaGkgKyBIIGRvZXMgbm90IG92ZXJmbG93IGEgNjQtYml0IGludCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICA9IHBfbG8gKyAyXjY0IHBfaGkKKworICAgICAgICBjb25zdCB1aW50NjRfdCB1X2xvID0geC5mICYgMHhGRkZGRkZGRjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgdV9oaSA9IHguZiA+PiAzMjsKKyAgICAgICAgY29uc3QgdWludDY0X3Qgdl9sbyA9IHkuZiAmIDB4RkZGRkZGRkY7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHZfaGkgPSB5LmYgPj4gMzI7CisKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDAgPSB1X2xvICogdl9sbzsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDEgPSB1X2xvICogdl9oaTsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDIgPSB1X2hpICogdl9sbzsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDMgPSB1X2hpICogdl9oaTsKKworICAgICAgICBjb25zdCB1aW50NjRfdCBwMF9oaSA9IHAwID4+IDMyOworICAgICAgICBjb25zdCB1aW50NjRfdCBwMV9sbyA9IHAxICYgMHhGRkZGRkZGRjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDFfaGkgPSBwMSA+PiAzMjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDJfbG8gPSBwMiAmIDB4RkZGRkZGRkY7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHAyX2hpID0gcDIgPj4gMzI7CisKKyAgICAgICAgdWludDY0X3QgUSA9IHAwX2hpICsgcDFfbG8gKyBwMl9sbzsKKworICAgICAgICAvLyBUaGUgZnVsbCBwcm9kdWN0IG1pZ2h0IG5vdyBiZSBjb21wdXRlZCBhcworICAgICAgICAvLworICAgICAgICAvLyBwX2hpID0gcDMgKyBwMl9oaSArIHAxX2hpICsgKFEgPj4gMzIpCisgICAgICAgIC8vIHBfbG8gPSBwMF9sbyArIChRIDw8IDMyKQorICAgICAgICAvLworICAgICAgICAvLyBCdXQgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgaGVyZSwgdGhlIGZ1bGwgcF9sbyBpcyBub3QgcmVxdWlyZWQuCisgICAgICAgIC8vIEVmZmVjdGl2ZWx5IHdlIG9ubHkgbmVlZCB0byBhZGQgdGhlIGhpZ2hlc3QgYml0IGluIHBfbG8gdG8gcF9oaSAoYW5kCisgICAgICAgIC8vIFFfaGkgKyAxIGRvZXMgbm90IG92ZXJmbG93KS4KKworICAgICAgICBRICs9IHVpbnQ2NF90ezF9IDw8ICg2NCAtIDMyIC0gMSk7IC8vIHJvdW5kLCB0aWVzIHVwCisKKyAgICAgICAgY29uc3QgdWludDY0X3QgaCA9IHAzICsgcDJfaGkgKyBwMV9oaSArIChRID4+IDMyKTsKKworICAgICAgICByZXR1cm4gZGl5ZnAoaCwgeC5lICsgeS5lICsgNjQpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBub3JtYWxpemUgeCBzdWNoIHRoYXQgdGhlIHNpZ25pZmljYW5kIGlzID49IDJeKHEtMSkKKyAgICBAcHJlIHguZiAhPSAwCisgICAgKi8KKyAgICBzdGF0aWMgZGl5ZnAgbm9ybWFsaXplKGRpeWZwIHgpIG5vZXhjZXB0CisgICAgeworICAgICAgICBhc3NlcnQoeC5mICE9IDApOworCisgICAgICAgIHdoaWxlICgoeC5mID4+IDYzKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB4LmYgPDw9IDE7CisgICAgICAgICAgICB4LmUtLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBub3JtYWxpemUgeCBzdWNoIHRoYXQgdGhlIHJlc3VsdCBoYXMgdGhlIGV4cG9uZW50IEUKKyAgICBAcHJlIGUgPj0geC5lIGFuZCB0aGUgdXBwZXIgZSAtIHguZSBiaXRzIG9mIHguZiBtdXN0IGJlIHplcm8uCisgICAgKi8KKyAgICBzdGF0aWMgZGl5ZnAgbm9ybWFsaXplX3RvKGNvbnN0IGRpeWZwJiB4LCBjb25zdCBpbnQgdGFyZ2V0X2V4cG9uZW50KSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgY29uc3QgaW50IGRlbHRhID0geC5lIC0gdGFyZ2V0X2V4cG9uZW50OworCisgICAgICAgIGFzc2VydChkZWx0YSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KCgoeC5mIDw8IGRlbHRhKSA+PiBkZWx0YSkgPT0geC5mKTsKKworICAgICAgICByZXR1cm4gZGl5ZnAoeC5mIDw8IGRlbHRhLCB0YXJnZXRfZXhwb25lbnQpOworICAgIH0KK307CisKK3N0cnVjdCBib3VuZGFyaWVzCit7CisgICAgZGl5ZnAgdzsKKyAgICBkaXlmcCBtaW51czsKKyAgICBkaXlmcCBwbHVzOworfTsKKworLyohCitDb21wdXRlIHRoZSAobm9ybWFsaXplZCkgZGl5ZnAgcmVwcmVzZW50aW5nIHRoZSBpbnB1dCBudW1iZXIgJ3ZhbHVlJyBhbmQgaXRzCitib3VuZGFyaWVzLgorCitAcHJlIHZhbHVlIG11c3QgYmUgZmluaXRlIGFuZCBwb3NpdGl2ZQorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGbG9hdFR5cGU+Citib3VuZGFyaWVzIGNvbXB1dGVfYm91bmRhcmllcyhGbG9hdFR5cGUgdmFsdWUpCit7CisgICAgYXNzZXJ0KHN0ZDo6aXNmaW5pdGUodmFsdWUpKTsKKyAgICBhc3NlcnQodmFsdWUgPiAwKTsKKworICAgIC8vIENvbnZlcnQgdGhlIElFRUUgcmVwcmVzZW50YXRpb24gaW50byBhIGRpeWZwLgorICAgIC8vCisgICAgLy8gSWYgdiBpcyBkZW5vcm1hbDoKKyAgICAvLyAgICAgIHZhbHVlID0gMC5GICogMl4oMSAtIGJpYXMpID0gKCAgICAgICAgICBGKSAqIDJeKDEgLSBiaWFzIC0gKHAtMSkpCisgICAgLy8gSWYgdiBpcyBub3JtYWxpemVkOgorICAgIC8vICAgICAgdmFsdWUgPSAxLkYgKiAyXihFIC0gYmlhcykgPSAoMl4ocC0xKSArIEYpICogMl4oRSAtIGJpYXMgLSAocC0xKSkKKworICAgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+Ojppc19pZWM1NTksCisgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGR0b2Ffc2hvcnQgcmVxdWlyZXMgYW4gSUVFRS03NTQgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24iKTsKKworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrUHJlY2lzaW9uID0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHM7IC8vID0gcCAoaW5jbHVkZXMgdGhlIGhpZGRlbiBiaXQpCisgICAgY29uc3RleHByIGludCAgICAgIGtCaWFzICAgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46Om1heF9leHBvbmVudCAtIDEgKyAoa1ByZWNpc2lvbiAtIDEpOworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrTWluRXhwICAgID0gMSAtIGtCaWFzOworICAgIGNvbnN0ZXhwciB1aW50NjRfdCBrSGlkZGVuQml0ID0gdWludDY0X3R7MX0gPDwgKGtQcmVjaXNpb24gLSAxKTsgLy8gPSAyXihwLTEpCisKKyAgICB1c2luZyBiaXRzX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPCBrUHJlY2lzaW9uID09IDI0LCB1aW50MzJfdCwgdWludDY0X3QgPjo6dHlwZTsKKworICAgIGNvbnN0IHVpbnQ2NF90IGJpdHMgPSByZWludGVycHJldF9iaXRzPGJpdHNfdHlwZT4odmFsdWUpOworICAgIGNvbnN0IHVpbnQ2NF90IEUgPSBiaXRzID4+IChrUHJlY2lzaW9uIC0gMSk7CisgICAgY29uc3QgdWludDY0X3QgRiA9IGJpdHMgJiAoa0hpZGRlbkJpdCAtIDEpOworCisgICAgY29uc3QgYm9vbCBpc19kZW5vcm1hbCA9IChFID09IDApOworICAgIGNvbnN0IGRpeWZwIHYgPSBpc19kZW5vcm1hbAorICAgICAgICAgICAgICAgICAgICA/IGRpeWZwKEYsIGtNaW5FeHApCisgICAgICAgICAgICAgICAgICAgIDogZGl5ZnAoRiArIGtIaWRkZW5CaXQsIHN0YXRpY19jYXN0PGludD4oRSkgLSBrQmlhcyk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBib3VuZGFyaWVzIG0tIGFuZCBtKyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUKKyAgICAvLyB2ID0gZiAqIDJeZS4KKyAgICAvLworICAgIC8vIERldGVybWluZSB2LSBhbmQgdissIHRoZSBmbG9hdGluZy1wb2ludCBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIGlmIHYsCisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIC8vCisgICAgLy8gICAgICB2LSA9IHYgLSAyXmUgICAgICAgIGlmIGYgIT0gMl4ocC0xKSBvciBlID09IGVfbWluICAgICAgICAgICAgICAgIChBKQorICAgIC8vICAgICAgICAgPSB2IC0gMl4oZS0xKSAgICBpZiBmID09IDJeKHAtMSkgYW5kIGUgPiBlX21pbiAgICAgICAgICAgICAgICAoQikKKyAgICAvLworICAgIC8vICAgICAgdisgPSB2ICsgMl5lCisgICAgLy8KKyAgICAvLyBMZXQgbS0gPSAodi0gKyB2KSAvIDIgYW5kIG0rID0gKHYgKyB2KykgLyAyLiBBbGwgcmVhbCBudW1iZXJzIF9zdHJpY3RseV8KKyAgICAvLyBiZXR3ZWVuIG0tIGFuZCBtKyByb3VuZCB0byB2LCByZWdhcmRsZXNzIG9mIGhvdyB0aGUgaW5wdXQgcm91bmRpbmcKKyAgICAvLyBhbGdvcml0aG0gYnJlYWtzIHRpZXMuCisgICAgLy8KKyAgICAvLyAgICAgIC0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLSAgKEEpCisgICAgLy8gICAgICAgICB2LSAgICAgICAgICAgIG0tICAgICAgICAgICAgdiAgICAgICAgICAgICBtKyAgICAgICAgICAgIHYrCisgICAgLy8KKyAgICAvLyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLSAgKEIpCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIHYtICAgICBtLSAgICAgdiAgICAgICAgICAgICBtKyAgICAgICAgICAgIHYrCisKKyAgICBjb25zdCBib29sIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciA9IChGID09IDAgYW5kIEUgPiAxKTsKKyAgICBjb25zdCBkaXlmcCBtX3BsdXMgPSBkaXlmcCgyICogdi5mICsgMSwgdi5lIC0gMSk7CisgICAgY29uc3QgZGl5ZnAgbV9taW51cyA9IGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpeWZwKDQgKiB2LmYgLSAxLCB2LmUgLSAyKSAgLy8gKEIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGl5ZnAoMiAqIHYuZiAtIDEsIHYuZSAtIDEpOyAvLyAoQSkKKworICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsaXplZCB3KyA9IG0rLgorICAgIGNvbnN0IGRpeWZwIHdfcGx1cyA9IGRpeWZwOjpub3JtYWxpemUobV9wbHVzKTsKKworICAgIC8vIERldGVybWluZSB3LSA9IG0tIHN1Y2ggdGhhdCBlXyh3LSkgPSBlXyh3KykuCisgICAgY29uc3QgZGl5ZnAgd19taW51cyA9IGRpeWZwOjpub3JtYWxpemVfdG8obV9taW51cywgd19wbHVzLmUpOworCisgICAgcmV0dXJuIHtkaXlmcDo6bm9ybWFsaXplKHYpLCB3X21pbnVzLCB3X3BsdXN9OworfQorCisvLyBHaXZlbiBub3JtYWxpemVkIGRpeWZwIHcsIEdyaXN1IG5lZWRzIHRvIGZpbmQgYSAobm9ybWFsaXplZCkgY2FjaGVkCisvLyBwb3dlci1vZi10ZW4gYywgc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCBjICogdyA9IGYgKiAyXmUgbGllcworLy8gd2l0aGluIGEgY2VydGFpbiByYW5nZSBbYWxwaGEsIGdhbW1hXSAoRGVmaW5pdGlvbiAzLjIgZnJvbSBbMV0pCisvLworLy8gICAgICBhbHBoYSA8PSBlID0gZV9jICsgZV93ICsgcSA8PSBnYW1tYQorLy8KKy8vIG9yCisvLworLy8gICAgICBmX2MgKiBmX3cgKiAyXmFscGhhIDw9IGZfYyAyXihlX2MpICogZl93IDJeKGVfdykgKiAyXnEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBmX2MgKiBmX3cgKiAyXmdhbW1hCisvLworLy8gU2luY2UgYyBhbmQgdyBhcmUgbm9ybWFsaXplZCwgaS5lLiAyXihxLTEpIDw9IGYgPCAyXnEsIHRoaXMgaW1wbGllcworLy8KKy8vICAgICAgMl4ocS0xKSAqIDJeKHEtMSkgKiAyXmFscGhhIDw9IGMgKiB3ICogMl5xIDwgMl5xICogMl5xICogMl5nYW1tYQorLy8KKy8vIG9yCisvLworLy8gICAgICAyXihxIC0gMiArIGFscGhhKSA8PSBjICogdyA8IDJeKHEgKyBnYW1tYSkKKy8vCisvLyBUaGUgY2hvaWNlIG9mIChhbHBoYSxnYW1tYSkgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgYW5kIHRoZSBmb3JtIG9mCisvLyB0aGUgZGlnaXQgZ2VuZXJhdGlvbiBwcm9jZWR1cmUuIFVzaW5nIChhbHBoYSxnYW1tYSk9KC02MCwtMzIpIHdvcmtzIG91dCB3ZWxsCisvLyBpbiBwcmFjdGljZToKKy8vCisvLyBUaGUgaWRlYSBpcyB0byBjdXQgdGhlIG51bWJlciBjICogdyA9IGYgKiAyXmUgaW50byB0d28gcGFydHMsIHdoaWNoIGNhbiBiZQorLy8gcHJvY2Vzc2VkIGluZGVwZW5kZW50bHk6IEFuIGludGVncmFsIHBhcnQgcDEsIGFuZCBhIGZyYWN0aW9uYWwgcGFydCBwMjoKKy8vCisvLyAgICAgIGYgKiAyXmUgPSAoIChmIGRpdiAyXi1lKSAqIDJeLWUgKyAoZiBtb2QgMl4tZSkgKSAqIDJeZQorLy8gICAgICAgICAgICAgID0gKGYgZGl2IDJeLWUpICsgKGYgbW9kIDJeLWUpICogMl5lCisvLyAgICAgICAgICAgICAgPSBwMSArIHAyICogMl5lCisvLworLy8gVGhlIGNvbnZlcnNpb24gb2YgcDEgaW50byBkZWNpbWFsIGZvcm0gcmVxdWlyZXMgYSBzZXJpZXMgb2YgZGl2aXNpb25zIGFuZAorLy8gbW9kdWxvcyBieSAoYSBwb3dlciBvZikgMTAuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGZhc3RlciBmb3IgMzItYml0IHRoYW4gZm9yCisvLyA2NC1iaXQgaW50ZWdlcnMsIHNvIHAxIHNob3VsZCBpZGVhbGx5IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIuIFRoaXMgY2FuIGJlCisvLyBhY2hpZXZlZCBieSBjaG9vc2luZworLy8KKy8vICAgICAgLWUgPj0gMzIgICBvciAgIGUgPD0gLTMyIDo9IGdhbW1hCisvLworLy8gSW4gb3JkZXIgdG8gY29udmVydCB0aGUgZnJhY3Rpb25hbCBwYXJ0CisvLworLy8gICAgICBwMiAqIDJeZSA9IHAyIC8gMl4tZSA9IGRbLTFdIC8gMTBeMSArIGRbLTJdIC8gMTBeMiArIC4uLgorLy8KKy8vIGludG8gZGVjaW1hbCBmb3JtLCB0aGUgZnJhY3Rpb24gaXMgcmVwZWF0ZWRseSBtdWx0aXBsaWVkIGJ5IDEwIGFuZCB0aGUgZGlnaXRzCisvLyBkWy1pXSBhcmUgZXh0cmFjdGVkIGluIG9yZGVyOgorLy8KKy8vICAgICAgKDEwICogcDIpIGRpdiAyXi1lID0gZFstMV0KKy8vICAgICAgKDEwICogcDIpIG1vZCAyXi1lID0gZFstMl0gLyAxMF4xICsgLi4uCisvLworLy8gVGhlIG11bHRpcGxpY2F0aW9uIGJ5IDEwIG11c3Qgbm90IG92ZXJmbG93LiBJdCBpcyBzdWZmaWNpZW50IHRvIGNob29zZQorLy8KKy8vICAgICAgMTAgKiBwMiA8IDE2ICogcDIgPSAyXjQgKiBwMiA8PSAyXjY0LgorLy8KKy8vIFNpbmNlIHAyID0gZiBtb2QgMl4tZSA8IDJeLWUsCisvLworLy8gICAgICAtZSA8PSA2MCAgIG9yICAgZSA+PSAtNjAgOj0gYWxwaGEKKworY29uc3RleHByIGludCBrQWxwaGEgPSAtNjA7Citjb25zdGV4cHIgaW50IGtHYW1tYSA9IC0zMjsKKworc3RydWN0IGNhY2hlZF9wb3dlciAvLyBjID0gZiAqIDJeZSB+PSAxMF5rCit7CisgICAgdWludDY0X3QgZjsKKyAgICBpbnQgZTsKKyAgICBpbnQgazsKK307CisKKy8qIQorRm9yIGEgbm9ybWFsaXplZCBkaXlmcCB3ID0gZiAqIDJeZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgKG5vcm1hbGl6ZWQpIGNhY2hlZAorcG93ZXItb2YtdGVuIGMgPSBmX2MgKiAyXmVfYywgc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCB3ICogYworc2F0aXNmaWVzIChEZWZpbml0aW9uIDMuMiBmcm9tIFsxXSkKKworICAgICBhbHBoYSA8PSBlX2MgKyBlICsgcSA8PSBnYW1tYS4KKyovCitpbmxpbmUgY2FjaGVkX3Bvd2VyIGdldF9jYWNoZWRfcG93ZXJfZm9yX2JpbmFyeV9leHBvbmVudChpbnQgZSkKK3sKKyAgICAvLyBOb3cKKyAgICAvLworICAgIC8vICAgICAgYWxwaGEgPD0gZV9jICsgZSArIHEgPD0gZ2FtbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyAgICAvLyAgICAgID09PiBmX2MgKiAyXmFscGhhIDw9IGMgKiAyXmUgKiAyXnEKKyAgICAvLworICAgIC8vIGFuZCBzaW5jZSB0aGUgYydzIGFyZSBub3JtYWxpemVkLCAyXihxLTEpIDw9IGZfYywKKyAgICAvLworICAgIC8vICAgICAgPT0+IDJeKHEgLSAxICsgYWxwaGEpIDw9IGMgKiAyXihlICsgcSkKKyAgICAvLyAgICAgID09PiAyXihhbHBoYSAtIGUgLSAxKSA8PSBjCisgICAgLy8KKyAgICAvLyBJZiBjIHdlcmUgYW4gZXhha3QgcG93ZXIgb2YgdGVuLCBpLmUuIGMgPSAxMF5rLCBvbmUgbWF5IGRldGVybWluZSBrIGFzCisgICAgLy8KKyAgICAvLyAgICAgIGsgPSBjZWlsKCBsb2dfMTAoIDJeKGFscGhhIC0gZSAtIDEpICkgKQorICAgIC8vICAgICAgICA9IGNlaWwoIChhbHBoYSAtIGUgLSAxKSAqIGxvZ18xMCgyKSApCisgICAgLy8KKyAgICAvLyBGcm9tIHRoZSBwYXBlcjoKKyAgICAvLyAiSW4gdGhlb3J5IHRoZSByZXN1bHQgb2YgdGhlIHByb2NlZHVyZSBjb3VsZCBiZSB3cm9uZyBzaW5jZSBjIGlzIHJvdW5kZWQsCisgICAgLy8gIGFuZCB0aGUgY29tcHV0YXRpb24gaXRzZWxmIGlzIGFwcHJveGltYXRlZCBbLi4uXS4gSW4gcHJhY3RpY2UsIGhvd2V2ZXIsCisgICAgLy8gIHRoaXMgc2ltcGxlIGZ1bmN0aW9uIGlzIHN1ZmZpY2llbnQuIgorICAgIC8vCisgICAgLy8gRm9yIElFRUUgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIGNvbnZlcnRlZCBpbnRvCisgICAgLy8gbm9ybWFsaXplZCBkaXlmcCdzIHcgPSBmICogMl5lLCB3aXRoIHEgPSA2NCwKKyAgICAvLworICAgIC8vICAgICAgZSA+PSAtMTAyMiAgICAgIChtaW4gSUVFRSBleHBvbmVudCkKKyAgICAvLyAgICAgICAgICAgLTUyICAgICAgICAocCAtIDEpCisgICAgLy8gICAgICAgICAgIC01MiAgICAgICAgKHAgLSAxLCBwb3NzaWJseSBub3JtYWxpemUgZGVub3JtYWwgSUVFRSBudW1iZXJzKQorICAgIC8vICAgICAgICAgICAtMTEgICAgICAgIChub3JtYWxpemUgdGhlIGRpeWZwKQorICAgIC8vICAgICAgICAgPSAtMTEzNworICAgIC8vCisgICAgLy8gYW5kCisgICAgLy8KKyAgICAvLyAgICAgIGUgPD0gKzEwMjMgICAgICAobWF4IElFRUUgZXhwb25lbnQpCisgICAgLy8gICAgICAgICAgIC01MiAgICAgICAgKHAgLSAxKQorICAgIC8vICAgICAgICAgICAtMTEgICAgICAgIChub3JtYWxpemUgdGhlIGRpeWZwKQorICAgIC8vICAgICAgICAgPSA5NjAKKyAgICAvLworICAgIC8vIFRoaXMgYmluYXJ5IGV4cG9uZW50IHJhbmdlIFstMTEzNyw5NjBdIHJlc3VsdHMgaW4gYSBkZWNpbWFsIGV4cG9uZW50CisgICAgLy8gcmFuZ2UgWy0zMDcsMzI0XS4gT25lIGRvZXMgbm90IG5lZWQgdG8gc3RvcmUgYSBjYWNoZWQgcG93ZXIgZm9yIGVhY2gKKyAgICAvLyBrIGluIHRoaXMgcmFuZ2UuIEZvciBlYWNoIHN1Y2ggayBpdCBzdWZmaWNlcyB0byBmaW5kIGEgY2FjaGVkIHBvd2VyCisgICAgLy8gc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCBsaWVzIGluIFthbHBoYSxnYW1tYV0uCisgICAgLy8gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGRlY2ltYWwgZXhwb25lbnRzIG9mIGFkamFjZW50CisgICAgLy8gdGFibGUgZW50cmllcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgIC8vCisgICAgLy8gICAgICBmbG9vciggKGdhbW1hIC0gYWxwaGEpICogbG9nXzEwKDIpICkgPSA4LgorICAgIC8vCisgICAgLy8gKEEgc21hbGxlciBkaXN0YW5jZSBnYW1tYS1hbHBoYSB3b3VsZCByZXF1aXJlIGEgbGFyZ2VyIHRhYmxlLikKKworICAgIC8vIE5COgorICAgIC8vIEFjdHVhbGx5IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjLCBzdWNoIHRoYXQgLTYwIDw9IGVfYyArIGUgKyA2NCA8PSAtMzQuCisKKyAgICBjb25zdGV4cHIgaW50IGtDYWNoZWRQb3dlcnNTaXplID0gNzk7CisgICAgY29uc3RleHByIGludCBrQ2FjaGVkUG93ZXJzTWluRGVjRXhwID0gLTMwMDsKKyAgICBjb25zdGV4cHIgaW50IGtDYWNoZWRQb3dlcnNEZWNTdGVwID0gODsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgY2FjaGVkX3Bvd2VyIGtDYWNoZWRQb3dlcnNbXSA9CisgICAgeworICAgICAgICB7IDB4QUI3MEZFMTdDNzlBQzZDQSwgLTEwNjAsIC0zMDAgfSwKKyAgICAgICAgeyAweEZGNzdCMUZDQkVCQ0RDNEYsIC0xMDM0LCAtMjkyIH0sCisgICAgICAgIHsgMHhCRTU2OTFFRjQxNkJENjBDLCAtMTAwNywgLTI4NCB9LAorICAgICAgICB7IDB4OEREMDFGQUQ5MDdGRkMzQywgIC05ODAsIC0yNzYgfSwKKyAgICAgICAgeyAweEQzNTE1QzI4MzE1NTlBODMsICAtOTU0LCAtMjY4IH0sCisgICAgICAgIHsgMHg5RDcxQUM4RkFEQTZDOUI1LCAgLTkyNywgLTI2MCB9LAorICAgICAgICB7IDB4RUE5QzIyNzcyM0VFOEJDQiwgIC05MDEsIC0yNTIgfSwKKyAgICAgICAgeyAweEFFQ0M0OTkxNDA3ODUzNkQsICAtODc0LCAtMjQ0IH0sCisgICAgICAgIHsgMHg4MjNDMTI3OTVEQjZDRTU3LCAgLTg0NywgLTIzNiB9LAorICAgICAgICB7IDB4QzIxMDk0MzY0REZCNTYzNywgIC04MjEsIC0yMjggfSwKKyAgICAgICAgeyAweDkwOTZFQTZGMzg0ODk4NEYsICAtNzk0LCAtMjIwIH0sCisgICAgICAgIHsgMHhENzc0ODVDQjI1ODIzQUM3LCAgLTc2OCwgLTIxMiB9LAorICAgICAgICB7IDB4QTA4NkNGQ0Q5N0JGOTdGNCwgIC03NDEsIC0yMDQgfSwKKyAgICAgICAgeyAweEVGMzQwQTk4MTcyQUFDRTUsICAtNzE1LCAtMTk2IH0sCisgICAgICAgIHsgMHhCMjM4NjdGQjJBMzVCMjhFLCAgLTY4OCwgLTE4OCB9LAorICAgICAgICB7IDB4ODRDOEQ0REZEMkM2M0YzQiwgIC02NjEsIC0xODAgfSwKKyAgICAgICAgeyAweEM1REQ0NDI3MUFEM0NEQkEsICAtNjM1LCAtMTcyIH0sCisgICAgICAgIHsgMHg5MzZCOUZDRUJCMjVDOTk2LCAgLTYwOCwgLTE2NCB9LAorICAgICAgICB7IDB4REJBQzZDMjQ3RDYyQTU4NCwgIC01ODIsIC0xNTYgfSwKKyAgICAgICAgeyAweEEzQUI2NjU4MEQ1RkRBRjYsICAtNTU1LCAtMTQ4IH0sCisgICAgICAgIHsgMHhGM0UyRjg5M0RFQzNGMTI2LCAgLTUyOSwgLTE0MCB9LAorICAgICAgICB7IDB4QjVCNUFEQThBQUZGODBCOCwgIC01MDIsIC0xMzIgfSwKKyAgICAgICAgeyAweDg3NjI1RjA1NkM3QzRBOEIsICAtNDc1LCAtMTI0IH0sCisgICAgICAgIHsgMHhDOUJDRkY2MDM0QzEzMDUzLCAgLTQ0OSwgLTExNiB9LAorICAgICAgICB7IDB4OTY0RTg1OEM5MUJBMjY1NSwgIC00MjIsIC0xMDggfSwKKyAgICAgICAgeyAweERGRjk3NzI0NzAyOTdFQkQsICAtMzk2LCAtMTAwIH0sCisgICAgICAgIHsgMHhBNkRGQkQ5RkI4RTVCODhGLCAgLTM2OSwgIC05MiB9LAorICAgICAgICB7IDB4RjhBOTVGQ0Y4ODc0N0Q5NCwgIC0zNDMsICAtODQgfSwKKyAgICAgICAgeyAweEI5NDQ3MDkzOEZBODlCQ0YsICAtMzE2LCAgLTc2IH0sCisgICAgICAgIHsgMHg4QTA4RjBGOEJGMEYxNTZCLCAgLTI4OSwgIC02OCB9LAorICAgICAgICB7IDB4Q0RCMDI1NTU2NTMxMzFCNiwgIC0yNjMsICAtNjAgfSwKKyAgICAgICAgeyAweDk5M0ZFMkM2RDA3QjdGQUMsICAtMjM2LCAgLTUyIH0sCisgICAgICAgIHsgMHhFNDVDMTBDNDJBMkIzQjA2LCAgLTIxMCwgIC00NCB9LAorICAgICAgICB7IDB4QUEyNDI0OTk2OTczOTJEMywgIC0xODMsICAtMzYgfSwKKyAgICAgICAgeyAweEZEODdCNUYyODMwMENBMEUsICAtMTU3LCAgLTI4IH0sCisgICAgICAgIHsgMHhCQ0U1MDg2NDkyMTExQUVCLCAgLTEzMCwgIC0yMCB9LAorICAgICAgICB7IDB4OENCQ0NDMDk2RjUwODhDQywgIC0xMDMsICAtMTIgfSwKKyAgICAgICAgeyAweEQxQjcxNzU4RTIxOTY1MkMsICAgLTc3LCAgIC00IH0sCisgICAgICAgIHsgMHg5QzQwMDAwMDAwMDAwMDAwLCAgIC01MCwgICAgNCB9LAorICAgICAgICB7IDB4RThENEE1MTAwMDAwMDAwMCwgICAtMjQsICAgMTIgfSwKKyAgICAgICAgeyAweEFENzhFQkM1QUM2MjAwMDAsICAgICAzLCAgIDIwIH0sCisgICAgICAgIHsgMHg4MTNGMzk3OEY4OTQwOTg0LCAgICAzMCwgICAyOCB9LAorICAgICAgICB7IDB4QzA5N0NFN0JDOTA3MTVCMywgICAgNTYsICAgMzYgfSwKKyAgICAgICAgeyAweDhGN0UzMkNFN0JFQTVDNzAsICAgIDgzLCAgIDQ0IH0sCisgICAgICAgIHsgMHhENUQyMzhBNEFCRTk4MDY4LCAgIDEwOSwgICA1MiB9LAorICAgICAgICB7IDB4OUY0RjI3MjYxNzlBMjI0NSwgICAxMzYsICAgNjAgfSwKKyAgICAgICAgeyAweEVENjNBMjMxRDRDNEZCMjcsICAgMTYyLCAgIDY4IH0sCisgICAgICAgIHsgMHhCMERFNjUzODhDQzhBREE4LCAgIDE4OSwgICA3NiB9LAorICAgICAgICB7IDB4ODNDNzA4OEUxQUFCNjVEQiwgICAyMTYsICAgODQgfSwKKyAgICAgICAgeyAweEM0NUQxREY5NDI3MTFEOUEsICAgMjQyLCAgIDkyIH0sCisgICAgICAgIHsgMHg5MjRENjkyQ0E2MUJFNzU4LCAgIDI2OSwgIDEwMCB9LAorICAgICAgICB7IDB4REEwMUVFNjQxQTcwOERFQSwgICAyOTUsICAxMDggfSwKKyAgICAgICAgeyAweEEyNkRBMzk5OUFFRjc3NEEsICAgMzIyLCAgMTE2IH0sCisgICAgICAgIHsgMHhGMjA5Nzg3QkI0N0Q2Qjg1LCAgIDM0OCwgIDEyNCB9LAorICAgICAgICB7IDB4QjQ1NEU0QTE3OUREMTg3NywgICAzNzUsICAxMzIgfSwKKyAgICAgICAgeyAweDg2NUI4NjkyNUI5QkM1QzIsICAgNDAyLCAgMTQwIH0sCisgICAgICAgIHsgMHhDODM1NTNDNUM4OTY1RDNELCAgIDQyOCwgIDE0OCB9LAorICAgICAgICB7IDB4OTUyQUI0NUNGQTk3QTBCMywgICA0NTUsICAxNTYgfSwKKyAgICAgICAgeyAweERFNDY5RkJEOTlBMDVGRTMsICAgNDgxLCAgMTY0IH0sCisgICAgICAgIHsgMHhBNTlCQzIzNERCMzk4QzI1LCAgIDUwOCwgIDE3MiB9LAorICAgICAgICB7IDB4RjZDNjlBNzJBMzk4OUY1QywgICA1MzQsICAxODAgfSwKKyAgICAgICAgeyAweEI3RENCRjUzNTRFOUJFQ0UsICAgNTYxLCAgMTg4IH0sCisgICAgICAgIHsgMHg4OEZDRjMxN0YyMjI0MUUyLCAgIDU4OCwgIDE5NiB9LAorICAgICAgICB7IDB4Q0MyMENFOUJEMzVDNzhBNSwgICA2MTQsICAyMDQgfSwKKyAgICAgICAgeyAweDk4MTY1QUYzN0IyMTUzREYsICAgNjQxLCAgMjEyIH0sCisgICAgICAgIHsgMHhFMkEwQjVEQzk3MUYzMDNBLCAgIDY2NywgIDIyMCB9LAorICAgICAgICB7IDB4QThEOUQxNTM1Q0UzQjM5NiwgICA2OTQsICAyMjggfSwKKyAgICAgICAgeyAweEZCOUI3Q0Q5QTRBNzQ0M0MsICAgNzIwLCAgMjM2IH0sCisgICAgICAgIHsgMHhCQjc2NEM0Q0E3QTQ0NDEwLCAgIDc0NywgIDI0NCB9LAorICAgICAgICB7IDB4OEJBQjhFRUZCNjQwOUMxQSwgICA3NzQsICAyNTIgfSwKKyAgICAgICAgeyAweEQwMUZFRjEwQTY1Nzg0MkMsICAgODAwLCAgMjYwIH0sCisgICAgICAgIHsgMHg5QjEwQTRFNUU5OTEzMTI5LCAgIDgyNywgIDI2OCB9LAorICAgICAgICB7IDB4RTcxMDlCRkJBMTlDMEM5RCwgICA4NTMsICAyNzYgfSwKKyAgICAgICAgeyAweEFDMjgyMEQ5NjIzQkY0MjksICAgODgwLCAgMjg0IH0sCisgICAgICAgIHsgMHg4MDQ0NEI1RTdBQTdDRjg1LCAgIDkwNywgIDI5MiB9LAorICAgICAgICB7IDB4QkYyMUU0NDAwM0FDREQyRCwgICA5MzMsICAzMDAgfSwKKyAgICAgICAgeyAweDhFNjc5QzJGNUU0NEZGOEYsICAgOTYwLCAgMzA4IH0sCisgICAgICAgIHsgMHhENDMzMTc5RDlDOENCODQxLCAgIDk4NiwgIDMxNiB9LAorICAgICAgICB7IDB4OUUxOURCOTJCNEUzMUJBOSwgIDEwMTMsICAzMjQgfSwKKyAgICB9OworCisgICAgLy8gVGhpcyBjb21wdXRhdGlvbiBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdHMgZm9yIGsgYXMKKyAgICAvLyAgICAgIGsgPSBjZWlsKChrQWxwaGEgLSBlIC0gMSkgKiAwLjMwMTAyOTk5NTY2Mzk4MTE0KQorICAgIC8vIGZvciB8ZXwgPD0gMTUwMCwgYnV0IGRvZXNuJ3QgcmVxdWlyZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zLgorICAgIC8vIE5COiBsb2dfMTAoMikgfj0gNzg5MTMgLyAyXjE4CisgICAgYXNzZXJ0KGUgPj0gLTE1MDApOworICAgIGFzc2VydChlIDw9ICAxNTAwKTsKKyAgICBjb25zdCBpbnQgZiA9IGtBbHBoYSAtIGUgLSAxOworICAgIGNvbnN0IGludCBrID0gKGYgKiA3ODkxMykgLyAoMSA8PCAxOCkgKyAoZiA+IDApOworCisgICAgY29uc3QgaW50IGluZGV4ID0gKC1rQ2FjaGVkUG93ZXJzTWluRGVjRXhwICsgayArIChrQ2FjaGVkUG93ZXJzRGVjU3RlcCAtIDEpKSAvIGtDYWNoZWRQb3dlcnNEZWNTdGVwOworICAgIGFzc2VydChpbmRleCA+PSAwKTsKKyAgICBhc3NlcnQoaW5kZXggPCBrQ2FjaGVkUG93ZXJzU2l6ZSk7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4oa0NhY2hlZFBvd2Vyc1NpemUpOyAvLyBGaXggd2FybmluZy4KKworICAgIGNvbnN0IGNhY2hlZF9wb3dlciBjYWNoZWQgPSBrQ2FjaGVkUG93ZXJzW2luZGV4XTsKKyAgICBhc3NlcnQoa0FscGhhIDw9IGNhY2hlZC5lICsgZSArIDY0KTsKKyAgICBhc3NlcnQoa0dhbW1hID49IGNhY2hlZC5lICsgZSArIDY0KTsKKworICAgIHJldHVybiBjYWNoZWQ7Cit9CisKKy8qIQorRm9yIG4gIT0gMCwgcmV0dXJucyBrLCBzdWNoIHRoYXQgcG93MTAgOj0gMTBeKGstMSkgPD0gbiA8IDEwXmsuCitGb3IgbiA9PSAwLCByZXR1cm5zIDEgYW5kIHNldHMgcG93MTAgOj0gMS4KKyovCitpbmxpbmUgaW50IGZpbmRfbGFyZ2VzdF9wb3cxMChjb25zdCB1aW50MzJfdCBuLCB1aW50MzJfdCYgcG93MTApCit7CisgICAgLy8gTENPVl9FWENMX1NUQVJUCisgICAgaWYgKG4gPj0gMTAwMDAwMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDAwMDAwMDsKKyAgICAgICAgcmV0dXJuIDEwOworICAgIH0KKyAgICAvLyBMQ09WX0VYQ0xfU1RPUAorICAgIGVsc2UgaWYgKG4gPj0gMTAwMDAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDAwMDA7CisgICAgICAgIHJldHVybiAgOTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDAwMDA7CisgICAgICAgIHJldHVybiAgODsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDAwOworICAgICAgICByZXR1cm4gIDc7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPj0gMTAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDA7CisgICAgICAgIHJldHVybiAgNjsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDA7CisgICAgICAgIHJldHVybiAgNTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwOworICAgICAgICByZXR1cm4gIDQ7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPj0gMTAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDA7CisgICAgICAgIHJldHVybiAgMzsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTA7CisgICAgICAgIHJldHVybiAgMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIGdyaXN1Ml9yb3VuZChjaGFyKiBidWYsIGludCBsZW4sIHVpbnQ2NF90IGRpc3QsIHVpbnQ2NF90IGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJlc3QsIHVpbnQ2NF90IHRlbl9rKQoreworICAgIGFzc2VydChsZW4gPj0gMSk7CisgICAgYXNzZXJ0KGRpc3QgPD0gZGVsdGEpOworICAgIGFzc2VydChyZXN0IDw9IGRlbHRhKTsKKyAgICBhc3NlcnQodGVuX2sgPiAwKTsKKworICAgIC8vICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWx0YSAtLS0tPgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIGRpc3QgLS0tLS0tLS0tPgorICAgIC8vIC0tLS0tLS0tLS0tLS0tWy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tXS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgICBNLSAgICAgICAgICAgICAgICAgdyAgICAgICAgICAgICAgICAgICBNKworICAgIC8vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuX2sKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLT4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIHJlc3QgLS0tLT4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLVstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLV0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgICAgVgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBidWYgKiAxMF5rCisgICAgLy8KKyAgICAvLyB0ZW5fayByZXByZXNlbnRzIGEgdW5pdC1pbi10aGUtbGFzdC1wbGFjZSBpbiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbgorICAgIC8vIHN0b3JlZCBpbiBidWYuCisgICAgLy8gRGVjcmVtZW50IGJ1ZiBieSB0ZW5fayB3aGlsZSB0aGlzIHRha2VzIGJ1ZiBjbG9zZXIgdG8gdy4KKworICAgIC8vIFRoZSB0ZXN0cyBhcmUgd3JpdHRlbiBpbiB0aGlzIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93IGluIHVuc2lnbmVkCisgICAgLy8gaW50ZWdlciBhcml0aG1ldGljLgorCisgICAgd2hpbGUgKHJlc3QgPCBkaXN0CisgICAgICAgICAgICBhbmQgZGVsdGEgLSByZXN0ID49IHRlbl9rCisgICAgICAgICAgICBhbmQgKHJlc3QgKyB0ZW5fayA8IGRpc3Qgb3IgZGlzdCAtIHJlc3QgPiByZXN0ICsgdGVuX2sgLSBkaXN0KSkKKyAgICB7CisgICAgICAgIGFzc2VydChidWZbbGVuIC0gMV0gIT0gJzAnKTsKKyAgICAgICAgYnVmW2xlbiAtIDFdLS07CisgICAgICAgIHJlc3QgKz0gdGVuX2s7CisgICAgfQorfQorCisvKiEKK0dlbmVyYXRlcyBWID0gYnVmZmVyICogMTBeZGVjaW1hbF9leHBvbmVudCwgc3VjaCB0aGF0IE0tIDw9IFYgPD0gTSsuCitNLSBhbmQgTSsgbXVzdCBiZSBub3JtYWxpemVkIGFuZCBzaGFyZSB0aGUgc2FtZSBleHBvbmVudCAtNjAgPD0gZSA8PSAtMzIuCisqLworaW5saW5lIHZvaWQgZ3Jpc3UyX2RpZ2l0X2dlbihjaGFyKiBidWZmZXIsIGludCYgbGVuZ3RoLCBpbnQmIGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpeWZwIE1fbWludXMsIGRpeWZwIHcsIGRpeWZwIE1fcGx1cykKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KGtBbHBoYSA+PSAtNjAsICJpbnRlcm5hbCBlcnJvciIpOworICAgIHN0YXRpY19hc3NlcnQoa0dhbW1hIDw9IC0zMiwgImludGVybmFsIGVycm9yIik7CisKKyAgICAvLyBHZW5lcmF0ZXMgdGhlIGRpZ2l0cyAoYW5kIHRoZSBleHBvbmVudCkgb2YgYSBkZWNpbWFsIGZsb2F0aW5nLXBvaW50CisgICAgLy8gbnVtYmVyIFYgPSBidWZmZXIgKiAxMF5kZWNpbWFsX2V4cG9uZW50IGluIHRoZSByYW5nZSBbTS0sIE0rXS4gVGhlIGRpeWZwJ3MKKyAgICAvLyB3LCBNLSBhbmQgTSsgc2hhcmUgdGhlIHNhbWUgZXhwb25lbnQgZSwgd2hpY2ggc2F0aXNmaWVzIGFscGhhIDw9IGUgPD0gZ2FtbWEuCisgICAgLy8KKyAgICAvLyAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVsdGEgLS0tLT4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSBkaXN0IC0tLS0tLS0tLT4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLVstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLV0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgTS0gICAgICAgICAgICAgICAgIHcgICAgICAgICAgICAgICAgICAgTSsKKyAgICAvLworICAgIC8vIEdyaXN1MiBnZW5lcmF0ZXMgdGhlIGRpZ2l0cyBvZiBNKyBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHN0b3BzIGFzIHNvb24gYXMKKyAgICAvLyBWIGlzIGluIFtNLSxNK10uCisKKyAgICBhc3NlcnQoTV9wbHVzLmUgPj0ga0FscGhhKTsKKyAgICBhc3NlcnQoTV9wbHVzLmUgPD0ga0dhbW1hKTsKKworICAgIHVpbnQ2NF90IGRlbHRhID0gZGl5ZnA6OnN1YihNX3BsdXMsIE1fbWludXMpLmY7IC8vIChzaWduaWZpY2FuZCBvZiAoTSsgLSBNLSksIGltcGxpY2l0IGV4cG9uZW50IGlzIGUpCisgICAgdWludDY0X3QgZGlzdCAgPSBkaXlmcDo6c3ViKE1fcGx1cywgdyAgICAgICkuZjsgLy8gKHNpZ25pZmljYW5kIG9mIChNKyAtIHcgKSwgaW1wbGljaXQgZXhwb25lbnQgaXMgZSkKKworICAgIC8vIFNwbGl0IE0rID0gZiAqIDJeZSBpbnRvIHR3byBwYXJ0cyBwMSBhbmQgcDIgKG5vdGU6IGUgPCAwKToKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBmICogMl5lCisgICAgLy8gICAgICAgICA9ICgoZiBkaXYgMl4tZSkgKiAyXi1lICsgKGYgbW9kIDJeLWUpKSAqIDJeZQorICAgIC8vICAgICAgICAgPSAoKHAxICAgICAgICApICogMl4tZSArIChwMiAgICAgICAgKSkgKiAyXmUKKyAgICAvLyAgICAgICAgID0gcDEgKyBwMiAqIDJeZQorCisgICAgY29uc3QgZGl5ZnAgb25lKHVpbnQ2NF90ezF9IDw8IC1NX3BsdXMuZSwgTV9wbHVzLmUpOworCisgICAgdWludDMyX3QgcDEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTV9wbHVzLmYgPj4gLW9uZS5lKTsgLy8gcDEgPSBmIGRpdiAyXi1lIChTaW5jZSAtZSA+PSAzMiwgcDEgZml0cyBpbnRvIGEgMzItYml0IGludC4pCisgICAgdWludDY0X3QgcDIgPSBNX3BsdXMuZiAmIChvbmUuZiAtIDEpOyAgICAgICAgICAgICAgICAgICAgLy8gcDIgPSBmIG1vZCAyXi1lCisKKyAgICAvLyAxKQorICAgIC8vCisgICAgLy8gR2VuZXJhdGUgdGhlIGRpZ2l0cyBvZiB0aGUgaW50ZWdyYWwgcGFydCBwMSA9IGRbbi0xXS4uLmRbMV1kWzBdCisKKyAgICBhc3NlcnQocDEgPiAwKTsKKworICAgIHVpbnQzMl90IHBvdzEwOworICAgIGNvbnN0IGludCBrID0gZmluZF9sYXJnZXN0X3BvdzEwKHAxLCBwb3cxMCk7CisKKyAgICAvLyAgICAgIDEwXihrLTEpIDw9IHAxIDwgMTBeaywgcG93MTAgPSAxMF4oay0xKQorICAgIC8vCisgICAgLy8gICAgICBwMSA9IChwMSBkaXYgMTBeKGstMSkpICogMTBeKGstMSkgKyAocDEgbW9kIDEwXihrLTEpKQorICAgIC8vICAgICAgICAgPSAoZFtrLTFdICAgICAgICAgKSAqIDEwXihrLTEpICsgKHAxIG1vZCAxMF4oay0xKSkKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcDIgKiAyXmUKKyAgICAvLyAgICAgICAgID0gZFtrLTFdICogMTBeKGstMSkgKyAocDEgbW9kIDEwXihrLTEpKSAgICAgICAgICArIHAyICogMl5lCisgICAgLy8gICAgICAgICA9IGRbay0xXSAqIDEwXihrLTEpICsgKChwMSBtb2QgMTBeKGstMSkpICogMl4tZSArIHAyKSAqIDJeZQorICAgIC8vICAgICAgICAgPSBkW2stMV0gKiAxMF4oay0xKSArICggICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCkgKiAyXmUKKyAgICAvLworICAgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgZGlnaXRzIGRbbl0gb2YgcDEgZnJvbSBsZWZ0IHRvIHJpZ2h0IChuID0gay0xLC4uLiwwKQorICAgIC8vCisgICAgLy8gICAgICBwMSA9IGRbay0xXS4uLmRbbl0gKiAxMF5uICsgZFtuLTFdLi4uZFswXQorICAgIC8vCisgICAgLy8gYnV0IHN0b3AgYXMgc29vbiBhcworICAgIC8vCisgICAgLy8gICAgICByZXN0ICogMl5lID0gKGRbbi0xXS4uLmRbMF0gKiAyXi1lICsgcDIpICogMl5lIDw9IGRlbHRhICogMl5lCisKKyAgICBpbnQgbiA9IGs7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgLy8gSW52YXJpYW50czoKKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXm4gKyAocDEgKyBwMiAqIDJeZSkgICAgKGJ1ZmZlciA9IDAgZm9yIG4gPSBrKQorICAgICAgICAvLyAgICAgIHBvdzEwID0gMTBeKG4tMSkgPD0gcDEgPCAxMF5uCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQgPSBwMSAvIHBvdzEwOyAgLy8gZCA9IHAxIGRpdiAxMF4obi0xKQorICAgICAgICBjb25zdCB1aW50MzJfdCByID0gcDEgJSBwb3cxMDsgIC8vIHIgPSBwMSBtb2QgMTBeKG4tMSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXm4gKyAoZCAqIDEwXihuLTEpICsgcikgKyBwMiAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gKGJ1ZmZlciAqIDEwICsgZCkgKiAxMF4obi0xKSArIChyICsgcDIgKiAyXmUpCisgICAgICAgIC8vCisgICAgICAgIGFzc2VydChkIDw9IDkpOworICAgICAgICBidWZmZXJbbGVuZ3RoKytdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgZCk7IC8vIGJ1ZmZlciA6PSBidWZmZXIgKiAxMCArIGQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXihuLTEpICsgKHIgKyBwMiAqIDJeZSkKKyAgICAgICAgLy8KKyAgICAgICAgcDEgPSByOworICAgICAgICBuLS07CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF5uICsgKHAxICsgcDIgKiAyXmUpCisgICAgICAgIC8vICAgICAgcG93MTAgPSAxMF5uCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gTm93IGNoZWNrIGlmIGVub3VnaCBkaWdpdHMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KKyAgICAgICAgLy8gQ29tcHV0ZQorICAgICAgICAvLworICAgICAgICAvLyAgICAgIHAxICsgcDIgKiAyXmUgPSAocDEgKiAyXi1lICsgcDIpICogMl5lID0gcmVzdCAqIDJeZQorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOgorICAgICAgICAvLyBTaW5jZSByZXN0IGFuZCBkZWx0YSBzaGFyZSB0aGUgc2FtZSBleHBvbmVudCBlLCBpdCBzdWZmaWNlcyB0bworICAgICAgICAvLyBjb21wYXJlIHRoZSBzaWduaWZpY2FuZHMuCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlc3QgPSAodWludDY0X3R7cDF9IDw8IC1vbmUuZSkgKyBwMjsKKyAgICAgICAgaWYgKHJlc3QgPD0gZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFYgPSBidWZmZXIgKiAxMF5uLCB3aXRoIE0tIDw9IFYgPD0gTSsuCisKKyAgICAgICAgICAgIGRlY2ltYWxfZXhwb25lbnQgKz0gbjsKKworICAgICAgICAgICAgLy8gV2UgbWF5IG5vdyBqdXN0IHN0b3AuIEJ1dCBpbnN0ZWFkIGxvb2sgaWYgdGhlIGJ1ZmZlciBjb3VsZCBiZQorICAgICAgICAgICAgLy8gZGVjcmVtZW50ZWQgdG8gYnJpbmcgViBjbG9zZXIgdG8gdy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBwb3cxMCA9IDEwXm4gaXMgbm93IDEgdWxwIGluIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIFYuCisgICAgICAgICAgICAvLyBUaGUgcm91bmRpbmcgcHJvY2VkdXJlIHdvcmtzIHdpdGggZGl5ZnAncyB3aXRoIGFuIGltcGxpY2l0CisgICAgICAgICAgICAvLyBleHBvbmVudCBvZiBlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgMTBebiA9ICgxMF5uICogMl4tZSkgKiAyXmUgPSB1bHAgKiAyXmUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCB0ZW5fbiA9IHVpbnQ2NF90e3BvdzEwfSA8PCAtb25lLmU7CisgICAgICAgICAgICBncmlzdTJfcm91bmQoYnVmZmVyLCBsZW5ndGgsIGRpc3QsIGRlbHRhLCByZXN0LCB0ZW5fbik7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBvdzEwIC89IDEwOworICAgICAgICAvLworICAgICAgICAvLyAgICAgIHBvdzEwID0gMTBeKG4tMSkgPD0gcDEgPCAxMF5uCisgICAgICAgIC8vIEludmFyaWFudHMgcmVzdG9yZWQuCisgICAgfQorCisgICAgLy8gMikKKyAgICAvLworICAgIC8vIFRoZSBkaWdpdHMgb2YgdGhlIGludGVncmFsIHBhcnQgaGF2ZSBiZWVuIGdlbmVyYXRlZDoKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBkW2stMV0uLi5kWzFdZFswXSArIHAyICogMl5lCisgICAgLy8gICAgICAgICA9IGJ1ZmZlciAgICAgICAgICAgICsgcDIgKiAyXmUKKyAgICAvLworICAgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgZGlnaXRzIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnQgcDIgKiAyXmUuCisgICAgLy8KKyAgICAvLyBOb3RlOgorICAgIC8vIE5vIGRlY2ltYWwgcG9pbnQgaXMgZ2VuZXJhdGVkOiB0aGUgZXhwb25lbnQgaXMgYWRqdXN0ZWQgaW5zdGVhZC4KKyAgICAvLworICAgIC8vIHAyIGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIGZyYWN0aW9uCisgICAgLy8KKyAgICAvLyAgICAgIHAyICogMl5lCisgICAgLy8gICAgICAgICAgPSBwMiAvIDJeLWUKKyAgICAvLyAgICAgICAgICA9IGRbLTFdIC8gMTBeMSArIGRbLTJdIC8gMTBeMiArIC4uLgorICAgIC8vCisgICAgLy8gTm93IGdlbmVyYXRlIHRoZSBkaWdpdHMgZFstbV0gb2YgcDEgZnJvbSBsZWZ0IHRvIHJpZ2h0IChtID0gMSwyLC4uLikKKyAgICAvLworICAgIC8vICAgICAgcDIgKiAyXmUgPSBkWy0xXWRbLTJdLi4uZFstbV0gKiAxMF4tbQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICsgMTBeLW0gKiAoZFstbS0xXSAvIDEwXjEgKyBkWy1tLTJdIC8gMTBeMiArIC4uLikKKyAgICAvLworICAgIC8vIHVzaW5nCisgICAgLy8KKyAgICAvLyAgICAgIDEwXm0gKiBwMiA9ICgoMTBebSAqIHAyKSBkaXYgMl4tZSkgKiAyXi1lICsgKCgxMF5tICogcDIpIG1vZCAyXi1lKQorICAgIC8vICAgICAgICAgICAgICAgID0gKCAgICAgICAgICAgICAgICAgICBkKSAqIDJeLWUgKyAoICAgICAgICAgICAgICAgICAgIHIpCisgICAgLy8KKyAgICAvLyBvcgorICAgIC8vICAgICAgMTBebSAqIHAyICogMl5lID0gZCArIHIgKiAyXmUKKyAgICAvLworICAgIC8vIGkuZS4KKyAgICAvLworICAgIC8vICAgICAgTSsgPSBidWZmZXIgKyBwMiAqIDJeZQorICAgIC8vICAgICAgICAgPSBidWZmZXIgKyAxMF4tbSAqIChkICsgciAqIDJeZSkKKyAgICAvLyAgICAgICAgID0gKGJ1ZmZlciAqIDEwXm0gKyBkKSAqIDEwXi1tICsgMTBeLW0gKiByICogMl5lCisgICAgLy8KKyAgICAvLyBhbmQgc3RvcCBhcyBzb29uIGFzIDEwXi1tICogciAqIDJeZSA8PSBkZWx0YSAqIDJeZQorCisgICAgYXNzZXJ0KHAyID4gZGVsdGEpOworCisgICAgaW50IG0gPSAwOworICAgIGZvciAoOzspCisgICAgeworICAgICAgICAvLyBJbnZhcmlhbnQ6CisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKGRbLW0tMV0gLyAxMCArIGRbLW0tMl0gLyAxMF4yICsgLi4uKSAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqIChwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKiAyXmUKKyAgICAgICAgLy8gICAgICAgICA9IGJ1ZmZlciAqIDEwXi1tICsgMTBeLW0gKiAoMS8xMCAqICgxMCAqIHAyKSAgICAgICAgICAgICAgICAgICApICogMl5lCisgICAgICAgIC8vICAgICAgICAgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKDEvMTAgKiAoKDEwKnAyIGRpdiAyXi1lKSAqIDJeLWUgKyAoMTAqcDIgbW9kIDJeLWUpKSAqIDJeZQorICAgICAgICAvLworICAgICAgICBhc3NlcnQocDIgPD0gVUlOVDY0X01BWCAvIDEwKTsKKyAgICAgICAgcDIgKj0gMTA7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGQgPSBwMiA+PiAtb25lLmU7ICAgICAvLyBkID0gKDEwICogcDIpIGRpdiAyXi1lCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHIgPSBwMiAmIChvbmUuZiAtIDEpOyAvLyByID0gKDEwICogcDIpIG1vZCAyXi1lCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKDEvMTAgKiAoZCAqIDJeLWUgKyByKSAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqICgxLzEwICogKGQgKyByICogMl5lKSkKKyAgICAgICAgLy8gICAgICAgICA9IChidWZmZXIgKiAxMCArIGQpICogMTBeKC1tLTEpICsgMTBeKC1tLTEpICogciAqIDJeZQorICAgICAgICAvLworICAgICAgICBhc3NlcnQoZCA8PSA5KTsKKyAgICAgICAgYnVmZmVyW2xlbmd0aCsrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIGQpOyAvLyBidWZmZXIgOj0gYnVmZmVyICogMTAgKyBkCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4oLW0tMSkgKyAxMF4oLW0tMSkgKiByICogMl5lCisgICAgICAgIC8vCisgICAgICAgIHAyID0gcjsKKyAgICAgICAgbSsrOworICAgICAgICAvLworICAgICAgICAvLyAgICAgIE0rID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqIHAyICogMl5lCisgICAgICAgIC8vIEludmFyaWFudCByZXN0b3JlZC4KKworICAgICAgICAvLyBDaGVjayBpZiBlbm91Z2ggZGlnaXRzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgMTBeLW0gKiBwMiAqIDJeZSA8PSBkZWx0YSAqIDJeZQorICAgICAgICAvLyAgICAgICAgICAgICAgcDIgKiAyXmUgPD0gMTBebSAqIGRlbHRhICogMl5lCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBwMiA8PSAxMF5tICogZGVsdGEKKyAgICAgICAgZGVsdGEgKj0gMTA7CisgICAgICAgIGRpc3QgICo9IDEwOworICAgICAgICBpZiAocDIgPD0gZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gViA9IGJ1ZmZlciAqIDEwXi1tLCB3aXRoIE0tIDw9IFYgPD0gTSsuCisKKyAgICBkZWNpbWFsX2V4cG9uZW50IC09IG07CisKKyAgICAvLyAxIHVscCBpbiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBpcyBub3cgMTBeLW0uCisgICAgLy8gU2luY2UgZGVsdGEgYW5kIGRpc3QgYXJlIG5vdyBzY2FsZWQgYnkgMTBebSwgd2UgbmVlZCB0byBkbyB0aGUKKyAgICAvLyBzYW1lIHdpdGggdWxwIGluIG9yZGVyIHRvIGtlZXAgdGhlIHVuaXRzIGluIHN5bmMuCisgICAgLy8KKyAgICAvLyAgICAgIDEwXm0gKiAxMF4tbSA9IDEgPSAyXi1lICogMl5lID0gdGVuX20gKiAyXmUKKyAgICAvLworICAgIGNvbnN0IHVpbnQ2NF90IHRlbl9tID0gb25lLmY7CisgICAgZ3Jpc3UyX3JvdW5kKGJ1ZmZlciwgbGVuZ3RoLCBkaXN0LCBkZWx0YSwgcDIsIHRlbl9tKTsKKworICAgIC8vIEJ5IGNvbnN0cnVjdGlvbiB0aGlzIGFsZ29yaXRobSBnZW5lcmF0ZXMgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIGRlY2ltYWwKKyAgICAvLyBudW1iZXIgKExvaXRzY2gsIFRoZW9yZW0gNi4yKSB3aGljaCByb3VuZHMgYmFjayB0byB3LgorICAgIC8vIEZvciBhbiBpbnB1dCBudW1iZXIgb2YgcHJlY2lzaW9uIHAsIGF0IGxlYXN0CisgICAgLy8KKyAgICAvLyAgICAgIE4gPSAxICsgY2VpbChwICogbG9nXzEwKDIpKQorICAgIC8vCisgICAgLy8gZGVjaW1hbCBkaWdpdHMgYXJlIHN1ZmZpY2llbnQgdG8gaWRlbnRpZnkgYWxsIGJpbmFyeSBmbG9hdGluZy1wb2ludAorICAgIC8vIG51bWJlcnMgKE1hdHVsYSwgIkluLWFuZC1PdXQgY29udmVyc2lvbnMiKS4KKyAgICAvLyBUaGlzIGltcGxpZXMgdGhhdCB0aGUgYWxnb3JpdGhtIGRvZXMgbm90IHByb2R1Y2UgbW9yZSB0aGFuIE4gZGVjaW1hbAorICAgIC8vIGRpZ2l0cy4KKyAgICAvLworICAgIC8vICAgICAgTiA9IDE3IGZvciBwID0gNTMgKElFRUUgZG91YmxlIHByZWNpc2lvbikKKyAgICAvLyAgICAgIE4gPSA5ICBmb3IgcCA9IDI0IChJRUVFIHNpbmdsZSBwcmVjaXNpb24pCit9CisKKy8qIQordiA9IGJ1ZiAqIDEwXmRlY2ltYWxfZXhwb25lbnQKK2xlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cykKK1RoZSBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2gsIGkuZS4gPj0gbWF4X2RpZ2l0czEwLgorKi8KK2lubGluZSB2b2lkIGdyaXN1MihjaGFyKiBidWYsIGludCYgbGVuLCBpbnQmIGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgZGl5ZnAgbV9taW51cywgZGl5ZnAgdiwgZGl5ZnAgbV9wbHVzKQoreworICAgIGFzc2VydChtX3BsdXMuZSA9PSBtX21pbnVzLmUpOworICAgIGFzc2VydChtX3BsdXMuZSA9PSB2LmUpOworCisgICAgLy8gIC0tLS0tLS0tKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKS0tLS0tLS0tICAgIChBKQorICAgIC8vICAgICAgICAgIG0tICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgIG0rCisgICAgLy8KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0oLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pLS0tLS0tLS0gICAgKEIpCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgbS0gICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgbSsKKyAgICAvLworICAgIC8vIEZpcnN0IHNjYWxlIHYgKGFuZCBtLSBhbmQgbSspIHN1Y2ggdGhhdCB0aGUgZXhwb25lbnQgaXMgaW4gdGhlIHJhbmdlCisgICAgLy8gW2FscGhhLCBnYW1tYV0uCisKKyAgICBjb25zdCBjYWNoZWRfcG93ZXIgY2FjaGVkID0gZ2V0X2NhY2hlZF9wb3dlcl9mb3JfYmluYXJ5X2V4cG9uZW50KG1fcGx1cy5lKTsKKworICAgIGNvbnN0IGRpeWZwIGNfbWludXNfayhjYWNoZWQuZiwgY2FjaGVkLmUpOyAvLyA9IGMgfj0gMTBeLWsKKworICAgIC8vIFRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdHMgaXMgPSB2LmUgKyBjX21pbnVzX2suZSArIHEgYW5kIGlzIGluIHRoZSByYW5nZSBbYWxwaGEsZ2FtbWFdCisgICAgY29uc3QgZGl5ZnAgdyAgICAgICA9IGRpeWZwOjptdWwodiwgICAgICAgY19taW51c19rKTsKKyAgICBjb25zdCBkaXlmcCB3X21pbnVzID0gZGl5ZnA6Om11bChtX21pbnVzLCBjX21pbnVzX2spOworICAgIGNvbnN0IGRpeWZwIHdfcGx1cyAgPSBkaXlmcDo6bXVsKG1fcGx1cywgIGNfbWludXNfayk7CisKKyAgICAvLyAgLS0tLSgtLS0rLS0tKS0tLS0tLS0tLS0tLS0tLSgtLS0rLS0tKS0tLS0tLS0tLS0tLS0tLSgtLS0rLS0tKS0tLS0KKyAgICAvLyAgICAgICAgICB3LSAgICAgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgICAgICB3KworICAgIC8vICAgICAgICAgID0gYyptLSAgICAgICAgICAgICAgICAgID0gYyp2ICAgICAgICAgICAgICAgICAgID0gYyptKworICAgIC8vCisgICAgLy8gZGl5ZnA6Om11bCByb3VuZHMgaXRzIHJlc3VsdCBhbmQgY19taW51c19rIGlzIGFwcHJveGltYXRlZCB0b28uIHcsIHctIGFuZAorICAgIC8vIHcrIGFyZSBub3cgb2ZmIGJ5IGEgc21hbGwgYW1vdW50LgorICAgIC8vIEluIGZhY3Q6CisgICAgLy8KKyAgICAvLyAgICAgIHcgLSB2ICogMTBeayA8IDEgdWxwCisgICAgLy8KKyAgICAvLyBUbyBhY2NvdW50IGZvciB0aGlzIGluYWNjdXJhY3ksIGFkZCByZXNwLiBzdWJ0cmFjdCAxIHVscC4KKyAgICAvLworICAgIC8vICAtLS0tLS0tLSstLS1bLS0tLS0tLS0tLS0tLS0tKC0tLSstLS0pLS0tLS0tLS0tLS0tLS0tXS0tLSstLS0tLS0tLQorICAgIC8vICAgICAgICAgIHctICBNLSAgICAgICAgICAgICAgICAgIHcgICAgICAgICAgICAgICAgICAgTSsgIHcrCisgICAgLy8KKyAgICAvLyBOb3cgYW55IG51bWJlciBpbiBbTS0sIE0rXSAoYm91bmRzIGluY2x1ZGVkKSB3aWxsIHJvdW5kIHRvIHcgd2hlbiBpbnB1dCwKKyAgICAvLyByZWdhcmRsZXNzIG9mIGhvdyB0aGUgaW5wdXQgcm91bmRpbmcgYWxnb3JpdGhtIGJyZWFrcyB0aWVzLgorICAgIC8vCisgICAgLy8gQW5kIGRpZ2l0X2dlbiBnZW5lcmF0ZXMgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIHN1Y2ggbnVtYmVyIGluIFtNLSwgTStdLgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCBHcmlzdTIgYWx3YXlzIGdlbmVyYXRlcyB0aGUgc2hvcnRlc3QKKyAgICAvLyBwb3NzaWJsZSBudW1iZXIgaW4gdGhlIGludGVydmFsIChtLSwgbSspLgorICAgIGNvbnN0IGRpeWZwIE1fbWludXMod19taW51cy5mICsgMSwgd19taW51cy5lKTsKKyAgICBjb25zdCBkaXlmcCBNX3BsdXMgKHdfcGx1cy5mICAtIDEsIHdfcGx1cy5lICk7CisKKyAgICBkZWNpbWFsX2V4cG9uZW50ID0gLWNhY2hlZC5rOyAvLyA9IC0oLWspID0gaworCisgICAgZ3Jpc3UyX2RpZ2l0X2dlbihidWYsIGxlbiwgZGVjaW1hbF9leHBvbmVudCwgTV9taW51cywgdywgTV9wbHVzKTsKK30KKworLyohCit2ID0gYnVmICogMTBeZGVjaW1hbF9leHBvbmVudAorbGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciAobnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzKQorVGhlIGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCwgaS5lLiA+PSBtYXhfZGlnaXRzMTAuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEZsb2F0VHlwZT4KK3ZvaWQgZ3Jpc3UyKGNoYXIqIGJ1ZiwgaW50JiBsZW4sIGludCYgZGVjaW1hbF9leHBvbmVudCwgRmxvYXRUeXBlIHZhbHVlKQoreworICAgIHN0YXRpY19hc3NlcnQoZGl5ZnA6OmtQcmVjaXNpb24gPj0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHMgKyAzLAorICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yOiBub3QgZW5vdWdoIHByZWNpc2lvbiIpOworCisgICAgYXNzZXJ0KHN0ZDo6aXNmaW5pdGUodmFsdWUpKTsKKyAgICBhc3NlcnQodmFsdWUgPiAwKTsKKworICAgIC8vIElmIHRoZSBuZWlnaGJvcnMgKGFuZCBib3VuZGFyaWVzKSBvZiAndmFsdWUnIGFyZSBhbHdheXMgY29tcHV0ZWQgZm9yIGRvdWJsZS1wcmVjaXNpb24KKyAgICAvLyBudW1iZXJzLCBhbGwgZmxvYXQncyBjYW4gYmUgcmVjb3ZlcmVkIHVzaW5nIHN0cnRvZCAoYW5kIHN0cnRvZikuIEhvd2V2ZXIsIHRoZSByZXN1bHRpbmcKKyAgICAvLyBkZWNpbWFsIHJlcHJlc2VudGF0aW9ucyBhcmUgbm90IGV4YWN0bHkgInNob3J0Ii4KKyAgICAvLworICAgIC8vIFRoZSBkb2N1bWVudGF0aW9uIGZvciAnc3RkOjp0b19jaGFycycgKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxpdHkvdG9fY2hhcnMpCisgICAgLy8gc2F5cyAidmFsdWUgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGFzIGlmIGJ5IHN0ZDo6c3ByaW50ZiBpbiB0aGUgZGVmYXVsdCAoIkMiKSBsb2NhbGUiCisgICAgLy8gYW5kIHNpbmNlIHNwcmludGYgcHJvbW90ZXMgZmxvYXQncyB0byBkb3VibGUncywgSSB0aGluayB0aGlzIGlzIGV4YWN0bHkgd2hhdCAnc3RkOjp0b19jaGFycycKKyAgICAvLyBkb2VzLgorICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJ3N0ZDo6dG9fY2hhcnMnIHJlcXVpcmVzIHRoYXQgInBhcnNpbmcgdGhlCisgICAgLy8gcmVwcmVzZW50YXRpb24gdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgc3RkOjpmcm9tX2NoYXJzIGZ1bmN0aW9uIHJlY292ZXJzIHZhbHVlIGV4YWN0bHkiLiBUaGF0CisgICAgLy8gaW5kaWNhdGVzIHRoYXQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHNob3VsZCBiZSByZWNvdmVyZWQgdXNpbmcKKyAgICAvLyAnc3RkOjpzdHJ0b2YnLgorICAgIC8vCisgICAgLy8gTkI6IElmIHRoZSBuZWlnaGJvcnMgYXJlIGNvbXB1dGVkIGZvciBzaW5nbGUtcHJlY2lzaW9uIG51bWJlcnMsIHRoZXJlIGlzIGEgc2luZ2xlIGZsb2F0CisgICAgLy8gICAgICg3LjAzODUzMDdlLTI2Zikgd2hpY2ggY2FuJ3QgYmUgcmVjb3ZlcmVkIHVzaW5nIHN0cnRvZC4gVGhlIHJlc3VsdGluZyBkb3VibGUgcHJlY2lzaW9uCisgICAgLy8gICAgIHZhbHVlIGlzIG9mZiBieSAxIHVscC4KKyNpZiAwCisgICAgY29uc3QgYm91bmRhcmllcyB3ID0gY29tcHV0ZV9ib3VuZGFyaWVzKHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKTsKKyNlbHNlCisgICAgY29uc3QgYm91bmRhcmllcyB3ID0gY29tcHV0ZV9ib3VuZGFyaWVzKHZhbHVlKTsKKyNlbmRpZgorCisgICAgZ3Jpc3UyKGJ1ZiwgbGVuLCBkZWNpbWFsX2V4cG9uZW50LCB3Lm1pbnVzLCB3LncsIHcucGx1cyk7Cit9CisKKy8qIQorQGJyaWVmIGFwcGVuZHMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGUgdG8gYnVmCitAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIGV4cG9uZW50LgorQHByZSAtMTAwMCA8IGUgPCAxMDAwCisqLworaW5saW5lIGNoYXIqIGFwcGVuZF9leHBvbmVudChjaGFyKiBidWYsIGludCBlKQoreworICAgIGFzc2VydChlID4gLTEwMDApOworICAgIGFzc2VydChlIDwgIDEwMDApOworCisgICAgaWYgKGUgPCAwKQorICAgIHsKKyAgICAgICAgZSA9IC1lOworICAgICAgICAqYnVmKysgPSAnLSc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpidWYrKyA9ICcrJzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBrID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGUpOworICAgIGlmIChrIDwgMTApCisgICAgeworICAgICAgICAvLyBBbHdheXMgcHJpbnQgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuCisgICAgICAgIC8vIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmludGYoIiVnIikuCisgICAgICAgICpidWYrKyA9ICcwJzsKKyAgICAgICAgKmJ1ZisrID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgayk7CisgICAgfQorICAgIGVsc2UgaWYgKGsgPCAxMDApCisgICAgeworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrIC8gMTApOworICAgICAgICBrICU9IDEwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmJ1ZisrID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgayAvIDEwMCk7CisgICAgICAgIGsgJT0gMTAwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrIC8gMTApOworICAgICAgICBrICU9IDEwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCisvKiEKK0BicmllZiBwcmV0dGlmeSB2ID0gYnVmICogMTBeZGVjaW1hbF9leHBvbmVudAorCitJZiB2IGlzIGluIHRoZSByYW5nZSBbMTBebWluX2V4cCwgMTBebWF4X2V4cCkgaXQgd2lsbCBiZSBwcmludGVkIGluIGZpeGVkLXBvaW50Citub3RhdGlvbi4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgcHJpbnRlZCBpbiBleHBvbmVudGlhbCBub3RhdGlvbi4KKworQHByZSBtaW5fZXhwIDwgMAorQHByZSBtYXhfZXhwID4gMAorKi8KK2lubGluZSBjaGFyKiBmb3JtYXRfYnVmZmVyKGNoYXIqIGJ1ZiwgaW50IGxlbiwgaW50IGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX2V4cCwgaW50IG1heF9leHApCit7CisgICAgYXNzZXJ0KG1pbl9leHAgPCAwKTsKKyAgICBhc3NlcnQobWF4X2V4cCA+IDApOworCisgICAgY29uc3QgaW50IGsgPSBsZW47CisgICAgY29uc3QgaW50IG4gPSBsZW4gKyBkZWNpbWFsX2V4cG9uZW50OworCisgICAgLy8gdiA9IGJ1ZiAqIDEwXihuLWspCisgICAgLy8gayBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cykKKyAgICAvLyBuIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVjaW1hbCBwb2ludCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKworICAgIGlmIChrIDw9IG4gYW5kIG4gPD0gbWF4X2V4cCkKKyAgICB7CisgICAgICAgIC8vIGRpZ2l0c1swMDBdCisgICAgICAgIC8vIGxlbiA8PSBtYXhfZXhwICsgMgorCisgICAgICAgIHN0ZDo6bWVtc2V0KGJ1ZiArIGssICcwJywgc3RhdGljX2Nhc3Q8c2l6ZV90PihuIC0gaykpOworICAgICAgICAvLyBNYWtlIGl0IGxvb2sgbGlrZSBhIGZsb2F0aW5nLXBvaW50IG51bWJlciAoIzM2MiwgIzM3OCkKKyAgICAgICAgYnVmW24gKyAwXSA9ICcuJzsKKyAgICAgICAgYnVmW24gKyAxXSA9ICcwJzsKKyAgICAgICAgcmV0dXJuIGJ1ZiArIChuICsgMik7CisgICAgfQorCisgICAgaWYgKDAgPCBuIGFuZCBuIDw9IG1heF9leHApCisgICAgeworICAgICAgICAvLyBkaWcuaXRzCisgICAgICAgIC8vIGxlbiA8PSBtYXhfZGlnaXRzMTAgKyAxCisKKyAgICAgICAgYXNzZXJ0KGsgPiBuKTsKKworICAgICAgICBzdGQ6Om1lbW1vdmUoYnVmICsgKG4gKyAxKSwgYnVmICsgbiwgc3RhdGljX2Nhc3Q8c2l6ZV90PihrIC0gbikpOworICAgICAgICBidWZbbl0gPSAnLic7CisgICAgICAgIHJldHVybiBidWYgKyAoayArIDEpOworICAgIH0KKworICAgIGlmIChtaW5fZXhwIDwgbiBhbmQgbiA8PSAwKQorICAgIHsKKyAgICAgICAgLy8gMC5bMDAwXWRpZ2l0cworICAgICAgICAvLyBsZW4gPD0gMiArICgtbWluX2V4cCAtIDEpICsgbWF4X2RpZ2l0czEwCisKKyAgICAgICAgc3RkOjptZW1tb3ZlKGJ1ZiArICgyICsgLW4pLCBidWYsIHN0YXRpY19jYXN0PHNpemVfdD4oaykpOworICAgICAgICBidWZbMF0gPSAnMCc7CisgICAgICAgIGJ1ZlsxXSA9ICcuJzsKKyAgICAgICAgc3RkOjptZW1zZXQoYnVmICsgMiwgJzAnLCBzdGF0aWNfY2FzdDxzaXplX3Q+KC1uKSk7CisgICAgICAgIHJldHVybiBidWYgKyAoMiArICgtbikgKyBrKTsKKyAgICB9CisKKyAgICBpZiAoayA9PSAxKQorICAgIHsKKyAgICAgICAgLy8gZEUrMTIzCisgICAgICAgIC8vIGxlbiA8PSAxICsgNQorCisgICAgICAgIGJ1ZiArPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBkLmlnaXRzRSsxMjMKKyAgICAgICAgLy8gbGVuIDw9IG1heF9kaWdpdHMxMCArIDEgKyA1CisKKyAgICAgICAgc3RkOjptZW1tb3ZlKGJ1ZiArIDIsIGJ1ZiArIDEsIHN0YXRpY19jYXN0PHNpemVfdD4oayAtIDEpKTsKKyAgICAgICAgYnVmWzFdID0gJy4nOworICAgICAgICBidWYgKz0gMSArIGs7CisgICAgfQorCisgICAgKmJ1ZisrID0gJ2UnOworICAgIHJldHVybiBhcHBlbmRfZXhwb25lbnQoYnVmLCBuIC0gMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGR0b2FfaW1wbAorCisvKiEKK0BicmllZiBnZW5lcmF0ZXMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdmFsdWUgaW4gW2ZpcnN0LCBsYXN0KS4KKworVGhlIGZvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gaXMgc2ltaWxhciB0byBwcmludGYncyAlZworZm9ybWF0LiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHBhc3QtdGhlLWVuZCBvZiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KKworQG5vdGUgVGhlIGlucHV0IG51bWJlciBtdXN0IGJlIGZpbml0ZSwgaS5lLiBOYU4ncyBhbmQgSW5mJ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCitAbm90ZSBUaGUgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoLgorQG5vdGUgVGhlIHJlc3VsdCBpcyBOT1QgbnVsbC10ZXJtaW5hdGVkLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGbG9hdFR5cGU+CitjaGFyKiB0b19jaGFycyhjaGFyKiBmaXJzdCwgY2hhciogbGFzdCwgRmxvYXRUeXBlIHZhbHVlKQoreworICAgIHN0YXRpY19jYXN0PHZvaWQ+KGxhc3QpOyAvLyBtYXliZSB1bnVzZWQgLSBmaXggd2FybmluZworICAgIGFzc2VydChzdGQ6OmlzZmluaXRlKHZhbHVlKSk7CisKKyAgICAvLyBVc2Ugc2lnbmJpdCh2YWx1ZSkgaW5zdGVhZCBvZiAodmFsdWUgPCAwKSBzaW5jZSBzaWduYml0IHdvcmtzIGZvciAtMC4KKyAgICBpZiAoc3RkOjpzaWduYml0KHZhbHVlKSkKKyAgICB7CisgICAgICAgIHZhbHVlID0gLXZhbHVlOworICAgICAgICAqZmlyc3QrKyA9ICctJzsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gMCkgLy8gKy0wCisgICAgeworICAgICAgICAqZmlyc3QrKyA9ICcwJzsKKyAgICAgICAgLy8gTWFrZSBpdCBsb29rIGxpa2UgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgKCMzNjIsICMzNzgpCisgICAgICAgICpmaXJzdCsrID0gJy4nOworICAgICAgICAqZmlyc3QrKyA9ICcwJzsKKyAgICAgICAgcmV0dXJuIGZpcnN0OworICAgIH0KKworICAgIGFzc2VydChsYXN0IC0gZmlyc3QgPj0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgLy8gQ29tcHV0ZSB2ID0gYnVmZmVyICogMTBeZGVjaW1hbF9leHBvbmVudC4KKyAgICAvLyBUaGUgZGVjaW1hbCBkaWdpdHMgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyLCB3aGljaCBuZWVkcyB0byBiZSBpbnRlcnByZXRlZAorICAgIC8vIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAvLyBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpLmUuIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMuCisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IGRlY2ltYWxfZXhwb25lbnQgPSAwOworICAgIGR0b2FfaW1wbDo6Z3Jpc3UyKGZpcnN0LCBsZW4sIGRlY2ltYWxfZXhwb25lbnQsIHZhbHVlKTsKKworICAgIGFzc2VydChsZW4gPD0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgLy8gRm9ybWF0IHRoZSBidWZmZXIgbGlrZSBwcmludGYoIiUuKmciLCBwcmVjLCB2YWx1ZSkKKyAgICBjb25zdGV4cHIgaW50IGtNaW5FeHAgPSAtNDsKKyAgICAvLyBVc2UgZGlnaXRzMTAgaGVyZSB0byBpbmNyZWFzZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAyLgorICAgIGNvbnN0ZXhwciBpbnQga01heEV4cCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6ZGlnaXRzMTA7CisKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IGtNYXhFeHAgKyAyKTsKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IDIgKyAoLWtNaW5FeHAgLSAxKSArIHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6bWF4X2RpZ2l0czEwICsgNik7CisKKyAgICByZXR1cm4gZHRvYV9pbXBsOjpmb3JtYXRfYnVmZmVyKGZpcnN0LCBsZW4sIGRlY2ltYWxfZXhwb25lbnQsIGtNaW5FeHAsIGtNYXhFeHApOworfQorCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIG5sb2htYW5uCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL3RvX2pzb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmJjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcApAQCAtMCwwICsxLDMzOCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBvciwgYW5kLCBub3QKKyNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gYmVnaW4sIGVuZAorI2luY2x1ZGUgPHR1cGxlPiAvLyB0dXBsZSwgZ2V0CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGlzX3NhbWUsIGlzX2NvbnN0cnVjdGlibGUsIGlzX2Zsb2F0aW5nX3BvaW50LCBpc19lbnVtLCB1bmRlcmx5aW5nX3R5cGUKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBtb3ZlLCBmb3J3YXJkLCBkZWNsdmFsLCBwYWlyCisjaW5jbHVkZSA8dmFsYXJyYXk+IC8vIHZhbGFycmF5CisjaW5jbHVkZSA8dmVjdG9yPiAvLyB2ZWN0b3IKKworI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjb25zdHJ1Y3RvcnMgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTx2YWx1ZV90PiBzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I7CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90Ojpib29sZWFuPgoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmJvb2xlYW5fdCBiKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90Ojpib29sZWFuOworICAgICAgICBqLm1fdmFsdWUgPSBiOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6c3RyaW5nPgoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190JiBzKQorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpzdHJpbmc7CisgICAgICAgIGoubV92YWx1ZSA9IHM7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190JiYgcykKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6c3RyaW5nOworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUocyk7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfZmxvYXQ+Cit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2Zsb2F0X3QgdmFsKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ7CisgICAgICAgIGoubV92YWx1ZSA9IHZhbDsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZD4KK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdCB2YWwpIG5vZXhjZXB0CisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDsKKyAgICAgICAgai5tX3ZhbHVlID0gdmFsOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI+Cit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdCB2YWwpIG5vZXhjZXB0CisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOworICAgICAgICBqLm1fdmFsdWUgPSB2YWw7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT4KK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90JiBhcnIpCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUgPSBhcnI7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmJiBhcnIpCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUoYXJyKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZSwKKyAgICAgICAgICAgICBlbmFibGVfaWZfdDxub3Qgc3RkOjppc19zYW1lPENvbXBhdGlibGVBcnJheVR5cGUsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyKQorICAgIHsKKyAgICAgICAgdXNpbmcgc3RkOjpiZWdpbjsKKyAgICAgICAgdXNpbmcgc3RkOjplbmQ7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZS5hcnJheSA9IGoudGVtcGxhdGUgY3JlYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3Q+KGJlZ2luKGFyciksIGVuZChhcnIpKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGFycikKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUuYXJyYXktPnJlc2VydmUoYXJyLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYm9vbCB4IDogYXJyKQorICAgICAgICB7CisgICAgICAgICAgICBqLm1fdmFsdWUuYXJyYXktPnB1c2hfYmFjayh4KTsKKyAgICAgICAgfQorICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBULAorICAgICAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfY29udmVydGlibGU8VCwgQmFzaWNKc29uVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2YWxhcnJheTxUPiYgYXJyKQorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgai5tX3ZhbHVlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZS5hcnJheS0+cmVzaXplKGFyci5zaXplKCkpOworICAgICAgICBzdGQ6OmNvcHkoc3RkOjpiZWdpbihhcnIpLCBzdGQ6OmVuZChhcnIpLCBqLm1fdmFsdWUuYXJyYXktPmJlZ2luKCkpOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6b2JqZWN0PgoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90JiBvYmopCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgai5tX3ZhbHVlID0gb2JqOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCYmIG9iaikKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUob2JqKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGUsCisgICAgICAgICAgICAgZW5hYmxlX2lmX3Q8bm90IHN0ZDo6aXNfc2FtZTxDb21wYXRpYmxlT2JqZWN0VHlwZSwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IENvbXBhdGlibGVPYmplY3RUeXBlJiBvYmopCisgICAgeworICAgICAgICB1c2luZyBzdGQ6OmJlZ2luOworICAgICAgICB1c2luZyBzdGQ6OmVuZDsKKworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgai5tX3ZhbHVlLm9iamVjdCA9IGoudGVtcGxhdGUgY3JlYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90PihiZWdpbihvYmopLCBlbmQob2JqKSk7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKKy8vLy8vLy8vLy8vLy8KKy8vIHRvX2pzb24gLy8KKy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVCwKKyAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpib29sZWFuX3Q+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVCBiKSBub2V4Y2VwdAoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmJvb2xlYW4+Ojpjb25zdHJ1Y3QoaiwgYik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVTdHJpbmcsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QsIENvbXBhdGlibGVTdHJpbmc+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZVN0cmluZyYgcykKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpzdHJpbmc+Ojpjb25zdHJ1Y3Qoaiwgcyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QmJiBzKQoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OnN0cmluZz46OmNvbnN0cnVjdChqLCBzdGQ6Om1vdmUocykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBGbG9hdFR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PEZsb2F0VHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBGbG9hdFR5cGUgdmFsKSBub2V4Y2VwdAoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9mbG9hdD46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfZmxvYXRfdD4odmFsKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJVbnNpZ25lZFR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdCwgQ29tcGF0aWJsZU51bWJlclVuc2lnbmVkVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlTnVtYmVyVW5zaWduZWRUeXBlIHZhbCkgbm9leGNlcHQKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3Q+KHZhbCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90LCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlIHZhbCkgbm9leGNlcHQKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfaW50ZWdlcj46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90Pih2YWwpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgRW51bVR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2VudW08RW51bVR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgRW51bVR5cGUgZSkgbm9leGNlcHQKK3sKKyAgICB1c2luZyB1bmRlcmx5aW5nX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtVHlwZT46OnR5cGU7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8dW5kZXJseWluZ190eXBlPihlKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGUpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2FycmF5X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlIG9yCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdCwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyKQoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmFycmF5Pjo6Y29uc3RydWN0KGosIGFycik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIEJhc2ljSnNvblR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgc3RkOjp2YWxhcnJheTxUPiBhcnIpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKGFycikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgordm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmJiBhcnIpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKGFycikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlT2JqZWN0VHlwZSwKKyAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZU9iamVjdFR5cGUmIG9iaikKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ojpjb25zdHJ1Y3Qoaiwgb2JqKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCYmIG9iaikKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKG9iaikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLAorICAgICAgICAgZW5hYmxlX2lmX3Q8bm90IHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzdHJpbmdfdCwgVCAoJilbTl0+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVCAoJmFycilbTl0pCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnBhaXI8QXJncy4uLj4mIHApCit7CisgICAgaiA9IHtwLmZpcnN0LCBwLnNlY29uZH07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFR1cGxlLCBzdGQ6OnNpemVfdC4uLiBJZHg+Cit2b2lkIHRvX2pzb25fdHVwbGVfaW1wbChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBUdXBsZSYgdCwgaW5kZXhfc2VxdWVuY2U8SWR4Li4uPikKK3sKKyAgICBqID0ge3N0ZDo6Z2V0PElkeD4odCkuLi59OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZS4uLiBBcmdzPgordm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mIHQpCit7CisgICAgdG9fanNvbl90dXBsZV9pbXBsKGosIHQsIGluZGV4X3NlcXVlbmNlX2ZvcjxBcmdzLi4uPiB7fSk7Cit9CisKK3N0cnVjdCB0b19qc29uX2ZuCit7CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KKyAgICBhdXRvIGNhbGwoQmFzaWNKc29uVHlwZSYgaiwgVCYmIHZhbCwgcHJpb3JpdHlfdGFnPDE+IC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0KG5vZXhjZXB0KHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpKSkKKyAgICAtPiBkZWNsdHlwZSh0b19qc29uKGosIHN0ZDo6Zm9yd2FyZDxUPih2YWwpKSwgdm9pZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjYWxsKEJhc2ljSnNvblR5cGUmIC8qdW51c2VkKi8sIFQmJiAvKnVudXNlZCovLCBwcmlvcml0eV90YWc8MD4gLyp1bnVzZWQqLykgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEJhc2ljSnNvblR5cGUpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIHRvX2pzb24oKSBtZXRob2QgaW4gVCdzIG5hbWVzcGFjZSIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgLy8gTVNWQyBkb2VzIG5vdCBzaG93IGEgc3RhY2t0cmFjZSBmb3IgdGhlIGFib3ZlIGFzc2VydAorICAgICAgICB1c2luZyBkZWNheWVkID0gdW5jdnJlZl90PFQ+OworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih0eXBlbmFtZSBkZWNheWVkOjpmb3JjZV9tc3ZjX3N0YWNrdHJhY2UpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgImZvcmNpbmcgTVNWQyBzdGFja3RyYWNlIHRvIHNob3cgd2hpY2ggVCB3ZSdyZSB0YWxraW5nIGFib3V0LiIpOworI2VuZGlmCisgICAgfQorCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgorICAgIHZvaWQgb3BlcmF0b3IoKShCYXNpY0pzb25UeXBlJiBqLCBUJiYgdmFsKSBjb25zdAorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDx0b19qc29uX2ZuPigpLmNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSk7CisgICAgfQorfTsKK30KKworLy8vIG5hbWVzcGFjZSB0byBob2xkIGRlZmF1bHQgYHRvX2pzb25gIGZ1bmN0aW9uCituYW1lc3BhY2UKK3sKK2NvbnN0ZXhwciBjb25zdCBhdXRvJiB0b19qc29uID0gZGV0YWlsOjpzdGF0aWNfY29uc3Q8ZGV0YWlsOjp0b19qc29uX2ZuPjo6dmFsdWU7Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2V4Y2VwdGlvbnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjQyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcApAQCAtMCwwICsxLDMyOSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxleGNlcHRpb24+IC8vIGV4Y2VwdGlvbgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4gLy8gcnVudGltZV9lcnJvcgorI2luY2x1ZGUgPHN0cmluZz4gLy8gdG9fc3RyaW5nCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLworLy8gZXhjZXB0aW9ucyAvLworLy8vLy8vLy8vLy8vLy8vLworCisvKiEKK0BicmllZiBnZW5lcmFsIGV4Y2VwdGlvbiBvZiB0aGUgQHJlZiBiYXNpY19qc29uIGNsYXNzCisKK1RoaXMgY2xhc3MgaXMgYW4gZXh0ZW5zaW9uIG9mIGBzdGQ6OmV4Y2VwdGlvbmAgb2JqZWN0cyB3aXRoIGEgbWVtYmVyIEBhIGlkIGZvcgorZXhjZXB0aW9uIGlkcy4gSXQgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZQorQHJlZiBiYXNpY19qc29uIGNsYXNzLiBUaGlzIGNsYXNzIGNhbiBoZW5jZSBiZSB1c2VkIGFzICJ3aWxkY2FyZCIgdG8gY2F0Y2gKK2V4Y2VwdGlvbnMuCisKK1N1YmNsYXNzZXM6CistIEByZWYgcGFyc2VfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBhIHBhcnNlIGVycm9yCistIEByZWYgaW52YWxpZF9pdGVyYXRvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGVycm9ycyB3aXRoIGl0ZXJhdG9ycworLSBAcmVmIHR5cGVfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBleGVjdXRpbmcgYSBtZW1iZXIgZnVuY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgYSB3cm9uZyB0eXBlCistIEByZWYgb3V0X29mX3JhbmdlIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgYWNjZXNzIG91dCBvZiB0aGUgZGVmaW5lZCByYW5nZQorLSBAcmVmIG90aGVyX2Vycm9yIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgb3RoZXIgbGlicmFyeSBlcnJvcnMKKworQGludGVybmFsCitAbm90ZSBUbyBoYXZlIG5vdGhyb3ctY29weS1jb25zdHJ1Y3RpYmxlIGV4Y2VwdGlvbnMsIHdlIGludGVybmFsbHkgdXNlCisgICAgICBgc3RkOjpydW50aW1lX2Vycm9yYCB3aGljaCBjYW4gY29wZSB3aXRoIGFyYml0cmFyeS1sZW5ndGggZXJyb3IgbWVzc2FnZXMuCisgICAgICBJbnRlcm1lZGlhdGUgc3RyaW5ncyBhcmUgYnVpbHQgd2l0aCBzdGF0aWMgZnVuY3Rpb25zIGFuZCB0aGVuIHBhc3NlZCB0bworICAgICAgdGhlIGFjdHVhbCBjb25zdHJ1Y3Rvci4KK0BlbmRpbnRlcm5hbAorCitAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhcmJpdHJhcnkgbGlicmFyeSBleGNlcHRpb25zIGNhbiBiZQorY2F1Z2h0LixleGNlcHRpb259CisKK0BzaW5jZSB2ZXJzaW9uIDMuMC4wCisqLworY2xhc3MgZXhjZXB0aW9uIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCit7CisgIHB1YmxpYzoKKyAgICAvLy8gcmV0dXJucyB0aGUgZXhwbGFuYXRvcnkgc3RyaW5nCisgICAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gbS53aGF0KCk7CisgICAgfQorCisgICAgLy8vIHRoZSBpZCBvZiB0aGUgZXhjZXB0aW9uCisgICAgY29uc3QgaW50IGlkOworCisgIHByb3RlY3RlZDoKKyAgICBleGNlcHRpb24oaW50IGlkXywgY29uc3QgY2hhciogd2hhdF9hcmcpIDogaWQoaWRfKSwgbSh3aGF0X2FyZykge30KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmFtZSwgaW50IGlkXykKKyAgICB7CisgICAgICAgIHJldHVybiAiW2pzb24uZXhjZXB0aW9uLiIgKyBlbmFtZSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKGlkXykgKyAiXSAiOworICAgIH0KKworICBwcml2YXRlOgorICAgIC8vLyBhbiBleGNlcHRpb24gb2JqZWN0IGFzIHN0b3JhZ2UgZm9yIGVycm9yIG1lc3NhZ2VzCisgICAgc3RkOjpydW50aW1lX2Vycm9yIG07Cit9OworCisvKiEKK0BicmllZiBleGNlcHRpb24gaW5kaWNhdGluZyBhIHBhcnNlIGVycm9yCisKK1RoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgbGlicmFyeSB3aGVuIGEgcGFyc2UgZXJyb3Igb2NjdXJzLiBQYXJzZSBlcnJvcnMKK2NhbiBvY2N1ciBkdXJpbmcgdGhlIGRlc2VyaWFsaXphdGlvbiBvZiBKU09OIHRleHQsIENCT1IsIE1lc3NhZ2VQYWNrLCBhcyB3ZWxsCithcyB3aGVuIHVzaW5nIEpTT04gUGF0Y2guCisKK01lbWJlciBAYSBieXRlIGhvbGRzIHRoZSBieXRlIGluZGV4IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyIGluIHRoZSBpbnB1dAorZmlsZS4KKworRXhjZXB0aW9ucyBoYXZlIGlkcyAxeHguCisKK25hbWUgLyBpZCAgICAgICAgICAgICAgICAgICAgICB8IGV4YW1wbGUgbWVzc2FnZSB8IGRlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDEgfCBwYXJzZSBlcnJvciBhdCAyOiB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dDsgZXhwZWN0ZWQgc3RyaW5nIGxpdGVyYWwgfCBUaGlzIGVycm9yIGluZGljYXRlcyBhIHN5bnRheCBlcnJvciB3aGlsZSBkZXNlcmlhbGl6aW5nIGEgSlNPTiB0ZXh0LiBUaGUgZXJyb3IgbWVzc2FnZSBkZXNjcmliZXMgdGhhdCBhbiB1bmV4cGVjdGVkIHRva2VuIChjaGFyYWN0ZXIpIHdhcyBlbmNvdW50ZXJlZCwgYW5kIHRoZSBtZW1iZXIgQGEgYnl0ZSBpbmRpY2F0ZXMgdGhlIGVycm9yIHBvc2l0aW9uLgoranNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTAyIHwgcGFyc2UgZXJyb3IgYXQgMTQ6IG1pc3Npbmcgb3Igd3JvbmcgbG93IHN1cnJvZ2F0ZSB8IEpTT04gdXNlcyB0aGUgYFx1eHh4eGAgZm9ybWF0IHRvIGRlc2NyaWJlIFVuaWNvZGUgY2hhcmFjdGVycy4gQ29kZSBwb2ludHMgYWJvdmUgYWJvdmUgMHhGRkZGIGFyZSBzcGxpdCBpbnRvIHR3byBgXHV4eHh4YCBlbnRyaWVzICgic3Vycm9nYXRlIHBhaXJzIikuIFRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgdGhlIHN1cnJvZ2F0ZSBwYWlyIGlzIGluY29tcGxldGUgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjb2RlIHBvaW50LgoranNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTAzIHwgcGFyc2UgZXJyb3I6IGNvZGUgcG9pbnRzIGFib3ZlIDB4MTBGRkZGIGFyZSBpbnZhbGlkIHwgVW5pY29kZSBzdXBwb3J0cyBjb2RlIHBvaW50cyB1cCB0byAweDEwRkZGRi4gQ29kZSBwb2ludHMgYWJvdmUgMHgxMEZGRkYgYXJlIGludmFsaWQuCitqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDQgfCBwYXJzZSBlcnJvcjogSlNPTiBwYXRjaCBtdXN0IGJlIGFuIGFycmF5IG9mIG9iamVjdHMgfCBbUkZDIDY5MDJdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAyKSByZXF1aXJlcyBhIEpTT04gUGF0Y2ggZG9jdW1lbnQgdG8gYmUgYSBKU09OIGRvY3VtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBvYmplY3RzLgoranNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTA1IHwgcGFyc2UgZXJyb3I6IG9wZXJhdGlvbiBtdXN0IGhhdmUgc3RyaW5nIG1lbWJlciAnb3AnIHwgQW4gb3BlcmF0aW9uIG9mIGEgSlNPTiBQYXRjaCBkb2N1bWVudCBtdXN0IGNvbnRhaW4gZXhhY3RseSBvbmUgIm9wIiBtZW1iZXIsIHdob3NlIHZhbHVlIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIEl0cyB2YWx1ZSBtdXN0IGJlIG9uZSBvZiAiYWRkIiwgInJlbW92ZSIsICJyZXBsYWNlIiwgIm1vdmUiLCAiY29weSIsIG9yICJ0ZXN0Ijsgb3RoZXIgdmFsdWVzIGFyZSBlcnJvcnMuCitqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDYgfCBwYXJzZSBlcnJvcjogYXJyYXkgaW5kZXggJzAxJyBtdXN0IG5vdCBiZWdpbiB3aXRoICcwJyB8IEFuIGFycmF5IGluZGV4IGluIGEgSlNPTiBQb2ludGVyIChbUkZDIDY5MDFdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxKSkgbWF5IGJlIGAwYCBvciBhbnkgbnVtYmVyIHdpdGhvdXQgYSBsZWFkaW5nIGAwYC4KK2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwNyB8IHBhcnNlIGVycm9yOiBKU09OIHBvaW50ZXIgbXVzdCBiZSBlbXB0eSBvciBiZWdpbiB3aXRoICcvJyAtIHdhczogJ2ZvbycgfCBBIEpTT04gUG9pbnRlciBtdXN0IGJlIGEgVW5pY29kZSBzdHJpbmcgY29udGFpbmluZyBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSByZWZlcmVuY2UgdG9rZW5zLCBlYWNoIHByZWZpeGVkIGJ5IGEgYC9gIGNoYXJhY3Rlci4KK2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjEwOCB8IHBhcnNlIGVycm9yOiBlc2NhcGUgY2hhcmFjdGVyICd+JyBtdXN0IGJlIGZvbGxvd2VkIHdpdGggJzAnIG9yICcxJyB8IEluIGEgSlNPTiBQb2ludGVyLCBvbmx5IGB+MGAgYW5kIGB+MWAgYXJlIHZhbGlkIGVzY2FwZSBzZXF1ZW5jZXMuCitqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMDkgfCBwYXJzZSBlcnJvcjogYXJyYXkgaW5kZXggJ29uZScgaXMgbm90IGEgbnVtYmVyIHwgQSBKU09OIFBvaW50ZXIgYXJyYXkgaW5kZXggbXVzdCBiZSBhIG51bWJlci4KK2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMCB8IHBhcnNlIGVycm9yIGF0IDE6IGNhbm5vdCByZWFkIDIgYnl0ZXMgZnJvbSB2ZWN0b3IgfCBXaGVuIHBhcnNpbmcgQ0JPUiBvciBNZXNzYWdlUGFjaywgdGhlIGJ5dGUgdmVjdG9yIGVuZHMgYmVmb3JlIHRoZSBjb21wbGV0ZSB2YWx1ZSBoYXMgYmVlbiByZWFkLgoranNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEyIHwgcGFyc2UgZXJyb3IgYXQgMTogZXJyb3IgcmVhZGluZyBDQk9SOyBsYXN0IGJ5dGU6IDB4RjggfCBOb3QgYWxsIHR5cGVzIG9mIENCT1Igb3IgTWVzc2FnZVBhY2sgYXJlIHN1cHBvcnRlZC4gVGhpcyBleGNlcHRpb24gb2NjdXJzIGlmIGFuIHVuc3VwcG9ydGVkIGJ5dGUgd2FzIHJlYWQuCitqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTMgfCBwYXJzZSBlcnJvciBhdCAyOiBleHBlY3RlZCBhIENCT1Igc3RyaW5nOyBsYXN0IGJ5dGU6IDB4OTggfCBXaGlsZSBwYXJzaW5nIGEgbWFwIGtleSwgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIHN0cmluZyBoYXMgYmVlbiByZWFkLgorCitAbm90ZSBGb3IgYW4gaW5wdXQgd2l0aCBuIGJ5dGVzLCAxIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBuKzEKKyAgICAgIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlIG9yIHRoZSBlbmQgb2YgZmlsZS4gVGhpcyBhbHNvCisgICAgICBob2xkcyB0cnVlIHdoZW4gcmVhZGluZyBhIGJ5dGUgdmVjdG9yIChDQk9SIG9yIE1lc3NhZ2VQYWNrKS4KKworQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgYSBgcGFyc2VfZXJyb3JgIGV4Y2VwdGlvbiBjYW4gYmUKK2NhdWdodC4scGFyc2VfZXJyb3J9CisKK0BzYSBAcmVmIGV4Y2VwdGlvbiBmb3IgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGxpYnJhcnkgZXhjZXB0aW9ucworQHNhIEByZWYgaW52YWxpZF9pdGVyYXRvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGVycm9ycyB3aXRoIGl0ZXJhdG9ycworQHNhIEByZWYgdHlwZV9lcnJvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGV4ZWN1dGluZyBhIG1lbWJlciBmdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgIGEgd3JvbmcgdHlwZQorQHNhIEByZWYgb3V0X29mX3JhbmdlIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgYWNjZXNzIG91dCBvZiB0aGUgZGVmaW5lZCByYW5nZQorQHNhIEByZWYgb3RoZXJfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBvdGhlciBsaWJyYXJ5IGVycm9ycworCitAc2luY2UgdmVyc2lvbiAzLjAuMAorKi8KK2NsYXNzIHBhcnNlX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbgoreworICBwdWJsaWM6CisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIHBhcnNlIGVycm9yIGV4Y2VwdGlvbgorICAgIEBwYXJhbVtpbl0gaWRfICAgICAgIHRoZSBpZCBvZiB0aGUgZXhjZXB0aW9uCisgICAgQHBhcmFtW2luXSBieXRlXyAgICAgdGhlIGJ5dGUgaW5kZXggd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkIChvciAwIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkKQorICAgIEBwYXJhbVtpbl0gd2hhdF9hcmcgIHRoZSBleHBsYW5hdG9yeSBzdHJpbmcKKyAgICBAcmV0dXJuIHBhcnNlX2Vycm9yIG9iamVjdAorICAgICovCisgICAgc3RhdGljIHBhcnNlX2Vycm9yIGNyZWF0ZShpbnQgaWRfLCBzdGQ6OnNpemVfdCBieXRlXywgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKQorICAgIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdyA9IGV4Y2VwdGlvbjo6bmFtZSgicGFyc2VfZXJyb3IiLCBpZF8pICsgInBhcnNlIGVycm9yIiArCisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZV8gIT0gMCA/ICgiIGF0ICIgKyBzdGQ6OnRvX3N0cmluZyhieXRlXykpIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB3aGF0X2FyZzsKKyAgICAgICAgcmV0dXJuIHBhcnNlX2Vycm9yKGlkXywgYnl0ZV8sIHcuY19zdHIoKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGJ5dGUgaW5kZXggb2YgdGhlIHBhcnNlIGVycm9yCisKKyAgICBUaGUgYnl0ZSBpbmRleCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgZmlsZS4KKworICAgIEBub3RlIEZvciBhbiBpbnB1dCB3aXRoIG4gYnl0ZXMsIDEgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kCisgICAgICAgICAgbisxIGlzIHRoZSBpbmRleCBvZiB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlIG9yIHRoZSBlbmQgb2YgZmlsZS4KKyAgICAgICAgICBUaGlzIGFsc28gaG9sZHMgdHJ1ZSB3aGVuIHJlYWRpbmcgYSBieXRlIHZlY3RvciAoQ0JPUiBvciBNZXNzYWdlUGFjaykuCisgICAgKi8KKyAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlOworCisgIHByaXZhdGU6CisgICAgcGFyc2VfZXJyb3IoaW50IGlkXywgc3RkOjpzaXplX3QgYnl0ZV8sIGNvbnN0IGNoYXIqIHdoYXRfYXJnKQorICAgICAgICA6IGV4Y2VwdGlvbihpZF8sIHdoYXRfYXJnKSwgYnl0ZShieXRlXykge30KK307CisKKy8qIQorQGJyaWVmIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGVycm9ycyB3aXRoIGl0ZXJhdG9ycworCitUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgaXRlcmF0b3JzIHBhc3NlZCB0byBhIGxpYnJhcnkgZnVuY3Rpb24gZG8gbm90IG1hdGNoCit0aGUgZXhwZWN0ZWQgc2VtYW50aWNzLgorCitFeGNlcHRpb25zIGhhdmUgaWRzIDJ4eC4KKworbmFtZSAvIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlIG1lc3NhZ2UgfCBkZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMSB8IGl0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUgfCBUaGUgaXRlcmF0b3JzIHBhc3NlZCB0byBjb25zdHJ1Y3RvciBAcmVmIGJhc2ljX2pzb24oSW5wdXRJVCBmaXJzdCwgSW5wdXRJVCBsYXN0KSBhcmUgbm90IGNvbXBhdGlibGUsIG1lYW5pbmcgdGhleSBkbyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4gVGhlcmVmb3JlLCB0aGUgcmFuZ2UgKEBhIGZpcnN0LCBAYSBsYXN0KSBpcyBpbnZhbGlkLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDIgfCBpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSB8IEluIGFuIGVyYXNlIG9yIGluc2VydCBmdW5jdGlvbiwgdGhlIHBhc3NlZCBpdGVyYXRvciBAYSBwb3MgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBKU09OIHZhbHVlIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gSXQgaGVuY2UgZG9lcyBub3QgZGVmaW5lIGEgdmFsaWQgcG9zaXRpb24gZm9yIHRoZSBkZWxldGlvbi9pbnNlcnRpb24uCitqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwMyB8IGl0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUgfCBFaXRoZXIgaXRlcmF0b3IgcGFzc2VkIHRvIGZ1bmN0aW9uIEByZWYgZXJhc2UoSXRlcmF0b3JUeXBlIGZpcnN0LCBJdGVyYXRvclR5cGUgbGFzdCkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBKU09OIHZhbHVlIGZyb20gd2hpY2ggdmFsdWVzIHNoYWxsIGJlIGVyYXNlZC4gSXQgaGVuY2UgZG9lcyBub3QgZGVmaW5lIGEgdmFsaWQgcmFuZ2UgdG8gZGVsZXRlIHZhbHVlcyBmcm9tLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDQgfCBpdGVyYXRvcnMgb3V0IG9mIHJhbmdlIHwgV2hlbiBhbiBpdGVyYXRvciByYW5nZSBmb3IgYSBwcmltaXRpdmUgdHlwZSAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpIGlzIHBhc3NlZCB0byBhIGNvbnN0cnVjdG9yIG9yIGFuIGVyYXNlIGZ1bmN0aW9uLCB0aGlzIHJhbmdlIGhhcyB0byBiZSBleGFjdGx5IChAcmVmIGJlZ2luKCksIEByZWYgZW5kKCkpLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoZSBzaW5nbGUgc3RvcmVkIHZhbHVlIGlzIGV4cHJlc3NlZC4gQWxsIG90aGVyIHJhbmdlcyBhcmUgaW52YWxpZC4KK2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjA1IHwgaXRlcmF0b3Igb3V0IG9mIHJhbmdlIHwgV2hlbiBhbiBpdGVyYXRvciBmb3IgYSBwcmltaXRpdmUgdHlwZSAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpIGlzIHBhc3NlZCB0byBhbiBlcmFzZSBmdW5jdGlvbiwgdGhlIGl0ZXJhdG9yIGhhcyB0byBiZSB0aGUgQHJlZiBiZWdpbigpIGl0ZXJhdG9yLCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHdheSB0byBhZGRyZXNzIHRoZSBzdG9yZWQgdmFsdWUuIEFsbCBvdGhlciBpdGVyYXRvcnMgYXJlIGludmFsaWQuCitqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNiB8IGNhbm5vdCBjb25zdHJ1Y3Qgd2l0aCBpdGVyYXRvcnMgZnJvbSBudWxsIHwgVGhlIGl0ZXJhdG9ycyBwYXNzZWQgdG8gY29uc3RydWN0b3IgQHJlZiBiYXNpY19qc29uKElucHV0SVQgZmlyc3QsIElucHV0SVQgbGFzdCkgYmVsb25nIHRvIGEgSlNPTiBudWxsIHZhbHVlIGFuZCBoZW5jZSB0byBub3QgZGVmaW5lIGEgdmFsaWQgcmFuZ2UuCitqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwNyB8IGNhbm5vdCB1c2Uga2V5KCkgZm9yIG5vbi1vYmplY3QgaXRlcmF0b3JzIHwgVGhlIGtleSgpIG1lbWJlciBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIG9uIGl0ZXJhdG9ycyBiZWxvbmdpbmcgdG8gYSBKU09OIG9iamVjdCwgYmVjYXVzZSBvdGhlciB0eXBlcyBkbyBub3QgaGF2ZSBhIGNvbmNlcHQgb2YgYSBrZXkuCitqc29uLmV4Y2VwdGlvbi5pbnZhbGlkX2l0ZXJhdG9yLjIwOCB8IGNhbm5vdCB1c2Ugb3BlcmF0b3JbXSBmb3Igb2JqZWN0IGl0ZXJhdG9ycyB8IFRoZSBvcGVyYXRvcltdIHRvIHNwZWNpZnkgYSBjb25jcmV0ZSBvZmZzZXQgY2Fubm90IGJlIHVzZWQgb24gaXRlcmF0b3JzIGJlbG9uZ2luZyB0byBhIEpTT04gb2JqZWN0LCBiZWNhdXNlIEpTT04gb2JqZWN0cyBhcmUgdW5vcmRlcmVkLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMDkgfCBjYW5ub3QgdXNlIG9mZnNldHMgd2l0aCBvYmplY3QgaXRlcmF0b3JzIHwgVGhlIG9mZnNldCBvcGVyYXRvcnMgKCssIC0sICs9LCAtPSkgY2Fubm90IGJlIHVzZWQgb24gaXRlcmF0b3JzIGJlbG9uZ2luZyB0byBhIEpTT04gb2JqZWN0LCBiZWNhdXNlIEpTT04gb2JqZWN0cyBhcmUgdW5vcmRlcmVkLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTAgfCBpdGVyYXRvcnMgZG8gbm90IGZpdCB8IFRoZSBpdGVyYXRvciByYW5nZSBwYXNzZWQgdG8gdGhlIGluc2VydCBmdW5jdGlvbiBhcmUgbm90IGNvbXBhdGlibGUsIG1lYW5pbmcgdGhleSBkbyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4gVGhlcmVmb3JlLCB0aGUgcmFuZ2UgKEBhIGZpcnN0LCBAYSBsYXN0KSBpcyBpbnZhbGlkLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTEgfCBwYXNzZWQgaXRlcmF0b3JzIG1heSBub3QgYmVsb25nIHRvIGNvbnRhaW5lciB8IFRoZSBpdGVyYXRvciByYW5nZSBwYXNzZWQgdG8gdGhlIGluc2VydCBmdW5jdGlvbiBtdXN0IG5vdCBiZSBhIHN1YnJhbmdlIG9mIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IHRvLgoranNvbi5leGNlcHRpb24uaW52YWxpZF9pdGVyYXRvci4yMTIgfCBjYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGNvbnRhaW5lcnMgfCBXaGVuIHR3byBpdGVyYXRvcnMgYXJlIGNvbXBhcmVkLCB0aGV5IG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGNvbnRhaW5lci4KK2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjEzIHwgY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyB8IFRoZSBvcmRlciBvZiBvYmplY3QgaXRlcmF0b3JzIGNhbm5vdCBiZSBjb21wYXJlZCwgYmVjYXVzZSBKU09OIG9iamVjdHMgYXJlIHVub3JkZXJlZC4KK2pzb24uZXhjZXB0aW9uLmludmFsaWRfaXRlcmF0b3IuMjE0IHwgY2Fubm90IGdldCB2YWx1ZSB8IENhbm5vdCBnZXQgdmFsdWUgZm9yIGl0ZXJhdG9yOiBFaXRoZXIgdGhlIGl0ZXJhdG9yIGJlbG9uZ3MgdG8gYSBudWxsIHZhbHVlIG9yIGl0IGlzIGFuIGl0ZXJhdG9yIHRvIGEgcHJpbWl0aXZlIHR5cGUgKG51bWJlciwgYm9vbGVhbiwgb3Igc3RyaW5nKSwgYnV0IHRoZSBpdGVyYXRvciBpcyBkaWZmZXJlbnQgdG8gQHJlZiBiZWdpbigpLgorCitAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhbiBgaW52YWxpZF9pdGVyYXRvcmAgZXhjZXB0aW9uIGNhbiBiZQorY2F1Z2h0LixpbnZhbGlkX2l0ZXJhdG9yfQorCitAc2EgQHJlZiBleGNlcHRpb24gZm9yIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBsaWJyYXJ5IGV4Y2VwdGlvbnMKK0BzYSBAcmVmIHBhcnNlX2Vycm9yIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgYSBwYXJzZSBlcnJvcgorQHNhIEByZWYgdHlwZV9lcnJvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGV4ZWN1dGluZyBhIG1lbWJlciBmdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgIGEgd3JvbmcgdHlwZQorQHNhIEByZWYgb3V0X29mX3JhbmdlIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgYWNjZXNzIG91dCBvZiB0aGUgZGVmaW5lZCByYW5nZQorQHNhIEByZWYgb3RoZXJfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBvdGhlciBsaWJyYXJ5IGVycm9ycworCitAc2luY2UgdmVyc2lvbiAzLjAuMAorKi8KK2NsYXNzIGludmFsaWRfaXRlcmF0b3IgOiBwdWJsaWMgZXhjZXB0aW9uCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgaW52YWxpZF9pdGVyYXRvciBjcmVhdGUoaW50IGlkXywgY29uc3Qgc3RkOjpzdHJpbmcmIHdoYXRfYXJnKQorICAgIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdyA9IGV4Y2VwdGlvbjo6bmFtZSgiaW52YWxpZF9pdGVyYXRvciIsIGlkXykgKyB3aGF0X2FyZzsKKyAgICAgICAgcmV0dXJuIGludmFsaWRfaXRlcmF0b3IoaWRfLCB3LmNfc3RyKCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIGludmFsaWRfaXRlcmF0b3IoaW50IGlkXywgY29uc3QgY2hhciogd2hhdF9hcmcpCisgICAgICAgIDogZXhjZXB0aW9uKGlkXywgd2hhdF9hcmcpIHt9Cit9OworCisvKiEKK0BicmllZiBleGNlcHRpb24gaW5kaWNhdGluZyBleGVjdXRpbmcgYSBtZW1iZXIgZnVuY3Rpb24gd2l0aCBhIHdyb25nIHR5cGUKKworVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIGNhc2Ugb2YgYSB0eXBlIGVycm9yOyB0aGF0IGlzLCBhIGxpYnJhcnkgZnVuY3Rpb24gaXMKK2V4ZWN1dGVkIG9uIGEgSlNPTiB2YWx1ZSB3aG9zZSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBzZW1hbnRpY3MuCisKK0V4Y2VwdGlvbnMgaGF2ZSBpZHMgM3h4LgorCituYW1lIC8gaWQgICAgICAgICAgICAgICAgICAgICB8IGV4YW1wbGUgbWVzc2FnZSB8IGRlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzAxIHwgY2Fubm90IGNyZWF0ZSBvYmplY3QgZnJvbSBpbml0aWFsaXplciBsaXN0IHwgVG8gY3JlYXRlIGFuIG9iamVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QsIHRoZSBpbml0aWFsaXplciBsaXN0IG11c3QgY29uc2lzdCBvbmx5IG9mIGEgbGlzdCBvZiBwYWlycyB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEgc3RyaW5nLiBXaGVuIHRoaXMgY29uc3RyYWludCBpcyB2aW9sYXRlZCwgYW4gYXJyYXkgaXMgY3JlYXRlZCBpbnN0ZWFkLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDIgfCB0eXBlIG11c3QgYmUgb2JqZWN0LCBidXQgaXMgYXJyYXkgfCBEdXJpbmcgaW1wbGljaXQgb3IgZXhwbGljaXQgdmFsdWUgY29udmVyc2lvbiwgdGhlIEpTT04gdHlwZSBtdXN0IGJlIGNvbXBhdGlibGUgdG8gdGhlIHRhcmdldCB0eXBlLiBGb3IgaW5zdGFuY2UsIGEgSlNPTiBzdHJpbmcgY2FuIG9ubHkgYmUgY29udmVydGVkIGludG8gc3RyaW5nIHR5cGVzLCBidXQgbm90IGludG8gbnVtYmVycyBvciBib29sZWFuIHR5cGVzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDMgfCBpbmNvbXBhdGlibGUgUmVmZXJlbmNlVHlwZSBmb3IgZ2V0X3JlZiwgYWN0dWFsIHR5cGUgaXMgb2JqZWN0IHwgVG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gYSB2YWx1ZSBzdG9yZWQgaW4gYSBAcmVmIGJhc2ljX2pzb24gb2JqZWN0IHdpdGggQHJlZiBnZXRfcmVmLCB0aGUgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlIHR5cGUuIEZvciBpbnN0YW5jZSwgZm9yIGEgSlNPTiBhcnJheSwgdGhlIEBhIFJlZmVyZW5jZVR5cGUgbXVzdCBiZSBAcmVmIGFycmF5X3QmLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDQgfCBjYW5ub3QgdXNlIGF0KCkgd2l0aCBzdHJpbmcgfCBUaGUgQHJlZiBhdCgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KK2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA1IHwgY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggc3RyaW5nIHwgVGhlIEByZWYgb3BlcmF0b3JbXSBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciBjZXJ0YWluIEpTT04gdHlwZXMuCitqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMwNiB8IGNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIHZhbHVlKCkgbWVtYmVyIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDcgfCBjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBzdHJpbmcgfCBUaGUgQHJlZiBlcmFzZSgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KK2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzA4IHwgY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIHB1c2hfYmFjaygpIGFuZCBAcmVmIG9wZXJhdG9yKz0gbWVtYmVyIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMDkgfCBjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggfCBUaGUgQHJlZiBpbnNlcnQoKSBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGZvciBjZXJ0YWluIEpTT04gdHlwZXMuCitqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxMCB8IGNhbm5vdCB1c2Ugc3dhcCgpIHdpdGggbnVtYmVyIHwgVGhlIEByZWYgc3dhcCgpIG1lbWJlciBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGNlcnRhaW4gSlNPTiB0eXBlcy4KK2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzExIHwgY2Fubm90IHVzZSBlbXBsYWNlX2JhY2soKSB3aXRoIHN0cmluZyB8IFRoZSBAcmVmIGVtcGxhY2VfYmFjaygpIG1lbWJlciBmdW5jdGlvbiBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTIgfCBjYW5ub3QgdXNlIHVwZGF0ZSgpIHdpdGggc3RyaW5nIHwgVGhlIEByZWYgdXBkYXRlKCkgbWVtYmVyIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBleGVjdXRlZCBmb3IgY2VydGFpbiBKU09OIHR5cGVzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTMgfCBpbnZhbGlkIHZhbHVlIHRvIHVuZmxhdHRlbiB8IFRoZSBAcmVmIHVuZmxhdHRlbiBmdW5jdGlvbiBjb252ZXJ0cyBhbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBQb2ludGVycyBiYWNrIGludG8gYW4gYXJiaXRyYXJ5IG5lc3RlZCBKU09OIHZhbHVlLiBUaGUgSlNPTiBQb2ludGVycyBtdXN0IG5vdCBvdmVybGFwLCBiZWNhdXNlIHRoZW4gdGhlIHJlc3VsdGluZyB2YWx1ZSB3b3VsZCBub3QgYmUgd2VsbCBkZWZpbmVkLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTQgfCBvbmx5IG9iamVjdHMgY2FuIGJlIHVuZmxhdHRlbmVkIHwgVGhlIEByZWYgdW5mbGF0dGVuIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBKU09OIFBvaW50ZXJzLgoranNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTUgfCB2YWx1ZXMgaW4gb2JqZWN0IG11c3QgYmUgcHJpbWl0aXZlIHwgVGhlIEByZWYgdW5mbGF0dGVuIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBKU09OIFBvaW50ZXJzIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHByaW1pdGl2ZS4KK2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzE2IHwgaW52YWxpZCBVVEYtOCBieXRlIGF0IGluZGV4IDEwOiAweDdFIHwgVGhlIEByZWYgZHVtcCBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggVVRGLTggZW5jb2RlZCBzdHJpbmdzOyB0aGF0IGlzLCBpZiB5b3UgYXNzaWduIGEgYHN0ZDo6c3RyaW5nYCB0byBhIEpTT04gdmFsdWUsIG1ha2Ugc3VyZSBpdCBpcyBVVEYtOCBlbmNvZGVkLiB8CisKK0BsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IGEgYHR5cGVfZXJyb3JgIGV4Y2VwdGlvbiBjYW4gYmUKK2NhdWdodC4sdHlwZV9lcnJvcn0KKworQHNhIEByZWYgZXhjZXB0aW9uIGZvciB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgbGlicmFyeSBleGNlcHRpb25zCitAc2EgQHJlZiBwYXJzZV9lcnJvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGEgcGFyc2UgZXJyb3IKK0BzYSBAcmVmIGludmFsaWRfaXRlcmF0b3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBlcnJvcnMgd2l0aCBpdGVyYXRvcnMKK0BzYSBAcmVmIG91dF9vZl9yYW5nZSBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGFjY2VzcyBvdXQgb2YgdGhlIGRlZmluZWQgcmFuZ2UKK0BzYSBAcmVmIG90aGVyX2Vycm9yIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgb3RoZXIgbGlicmFyeSBlcnJvcnMKKworQHNpbmNlIHZlcnNpb24gMy4wLjAKKyovCitjbGFzcyB0eXBlX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbgoreworICBwdWJsaWM6CisgICAgc3RhdGljIHR5cGVfZXJyb3IgY3JlYXRlKGludCBpZF8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB3aGF0X2FyZykKKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHcgPSBleGNlcHRpb246Om5hbWUoInR5cGVfZXJyb3IiLCBpZF8pICsgd2hhdF9hcmc7CisgICAgICAgIHJldHVybiB0eXBlX2Vycm9yKGlkXywgdy5jX3N0cigpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB0eXBlX2Vycm9yKGludCBpZF8sIGNvbnN0IGNoYXIqIHdoYXRfYXJnKSA6IGV4Y2VwdGlvbihpZF8sIHdoYXRfYXJnKSB7fQorfTsKKworLyohCitAYnJpZWYgZXhjZXB0aW9uIGluZGljYXRpbmcgYWNjZXNzIG91dCBvZiB0aGUgZGVmaW5lZCByYW5nZQorCitUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gY2FzZSBhIGxpYnJhcnkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGFuIGlucHV0CitwYXJhbWV0ZXIgdGhhdCBleGNlZWRzIHRoZSBleHBlY3RlZCByYW5nZSwgZm9yIGluc3RhbmNlIGluIGNhc2Ugb2YgYXJyYXkKK2luZGljZXMgb3Igbm9uZXhpc3Rpbmcgb2JqZWN0IGtleXMuCisKK0V4Y2VwdGlvbnMgaGF2ZSBpZHMgNHh4LgorCituYW1lIC8gaWQgICAgICAgICAgICAgICAgICAgICAgIHwgZXhhbXBsZSBtZXNzYWdlIHwgZGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxIHwgYXJyYXkgaW5kZXggMyBpcyBvdXQgb2YgcmFuZ2UgfCBUaGUgcHJvdmlkZWQgYXJyYXkgaW5kZXggQGEgaSBpcyBsYXJnZXIgdGhhbiBAYSBzaXplLTEuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAyIHwgYXJyYXkgaW5kZXggJy0nICgzKSBpcyBvdXQgb2YgcmFuZ2UgfCBUaGUgc3BlY2lhbCBhcnJheSBpbmRleCBgLWAgaW4gYSBKU09OIFBvaW50ZXIgbmV2ZXIgZGVzY3JpYmVzIGEgdmFsaWQgZWxlbWVudCBvZiB0aGUgYXJyYXksIGJ1dCB0aGUgaW5kZXggcGFzdCB0aGUgZW5kLiBUaGF0IGlzLCBpdCBjYW4gb25seSBiZSB1c2VkIHRvIGFkZCBlbGVtZW50cyBhdCB0aGlzIHBvc2l0aW9uLCBidXQgbm90IHRvIHJlYWQgaXQuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAzIHwga2V5ICdmb28nIG5vdCBmb3VuZCB8IFRoZSBwcm92aWRlZCBrZXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgSlNPTiBvYmplY3QuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA0IHwgdW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJ2ZvbycgfCBBIHJlZmVyZW5jZSB0b2tlbiBpbiBhIEpTT04gUG9pbnRlciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA1IHwgSlNPTiBwb2ludGVyIGhhcyBubyBwYXJlbnQgfCBUaGUgSlNPTiBQYXRjaCBvcGVyYXRpb25zICdyZW1vdmUnIGFuZCAnYWRkJyBjYW4gbm90IGJlIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgSlNPTiB2YWx1ZS4KK2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDYgfCBudW1iZXIgb3ZlcmZsb3cgcGFyc2luZyAnMTBFMTAwMCcgfCBBIHBhcnNlZCBudW1iZXIgY291bGQgbm90IGJlIHN0b3JlZCBhcyB3aXRob3V0IGNoYW5naW5nIGl0IHRvIE5hTiBvciBJTkYuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA3IHwgbnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICc5MjIzMzcyMDM2ODU0Nzc1ODA4JyB8IFVCSlNPTiBvbmx5IHN1cHBvcnRzIGludGVnZXJzIG51bWJlcnMgdXAgdG8gOTIyMzM3MjAzNjg1NDc3NTgwNy4gfAorCitAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhbiBgb3V0X29mX3JhbmdlYCBleGNlcHRpb24gY2FuIGJlCitjYXVnaHQuLG91dF9vZl9yYW5nZX0KKworQHNhIEByZWYgZXhjZXB0aW9uIGZvciB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgbGlicmFyeSBleGNlcHRpb25zCitAc2EgQHJlZiBwYXJzZV9lcnJvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGEgcGFyc2UgZXJyb3IKK0BzYSBAcmVmIGludmFsaWRfaXRlcmF0b3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBlcnJvcnMgd2l0aCBpdGVyYXRvcnMKK0BzYSBAcmVmIHR5cGVfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBleGVjdXRpbmcgYSBtZW1iZXIgZnVuY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICBhIHdyb25nIHR5cGUKK0BzYSBAcmVmIG90aGVyX2Vycm9yIGZvciBleGNlcHRpb25zIGluZGljYXRpbmcgb3RoZXIgbGlicmFyeSBlcnJvcnMKKworQHNpbmNlIHZlcnNpb24gMy4wLjAKKyovCitjbGFzcyBvdXRfb2ZfcmFuZ2UgOiBwdWJsaWMgZXhjZXB0aW9uCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgb3V0X29mX3JhbmdlIGNyZWF0ZShpbnQgaWRfLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpCisgICAgeworICAgICAgICBzdGQ6OnN0cmluZyB3ID0gZXhjZXB0aW9uOjpuYW1lKCJvdXRfb2ZfcmFuZ2UiLCBpZF8pICsgd2hhdF9hcmc7CisgICAgICAgIHJldHVybiBvdXRfb2ZfcmFuZ2UoaWRfLCB3LmNfc3RyKCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIG91dF9vZl9yYW5nZShpbnQgaWRfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykgOiBleGNlcHRpb24oaWRfLCB3aGF0X2FyZykge30KK307CisKKy8qIQorQGJyaWVmIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIG90aGVyIGxpYnJhcnkgZXJyb3JzCisKK1RoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpbiBjYXNlIG9mIGVycm9ycyB0aGF0IGNhbm5vdCBiZSBjbGFzc2lmaWVkIHdpdGggdGhlCitvdGhlciBleGNlcHRpb24gdHlwZXMuCisKK0V4Y2VwdGlvbnMgaGF2ZSBpZHMgNXh4LgorCituYW1lIC8gaWQgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlIG1lc3NhZ2UgfCBkZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoranNvbi5leGNlcHRpb24ub3RoZXJfZXJyb3IuNTAxIHwgdW5zdWNjZXNzZnVsOiB7Im9wIjoidGVzdCIsInBhdGgiOiIvYmF6IiwgInZhbHVlIjoiYmFyIn0gfCBBIEpTT04gUGF0Y2ggb3BlcmF0aW9uICd0ZXN0JyBmYWlsZWQuIFRoZSB1bnN1Y2Nlc3NmdWwgb3BlcmF0aW9uIGlzIGFsc28gcHJpbnRlZC4KKworQHNhIEByZWYgZXhjZXB0aW9uIGZvciB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgbGlicmFyeSBleGNlcHRpb25zCitAc2EgQHJlZiBwYXJzZV9lcnJvciBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGEgcGFyc2UgZXJyb3IKK0BzYSBAcmVmIGludmFsaWRfaXRlcmF0b3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBlcnJvcnMgd2l0aCBpdGVyYXRvcnMKK0BzYSBAcmVmIHR5cGVfZXJyb3IgZm9yIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBleGVjdXRpbmcgYSBtZW1iZXIgZnVuY3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICBhIHdyb25nIHR5cGUKK0BzYSBAcmVmIG91dF9vZl9yYW5nZSBmb3IgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIGFjY2VzcyBvdXQgb2YgdGhlIGRlZmluZWQgcmFuZ2UKKworQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgYW4gYG90aGVyX2Vycm9yYCBleGNlcHRpb24gY2FuIGJlCitjYXVnaHQuLG90aGVyX2Vycm9yfQorCitAc2luY2UgdmVyc2lvbiAzLjAuMAorKi8KK2NsYXNzIG90aGVyX2Vycm9yIDogcHVibGljIGV4Y2VwdGlvbgoreworICBwdWJsaWM6CisgICAgc3RhdGljIG90aGVyX2Vycm9yIGNyZWF0ZShpbnQgaWRfLCBjb25zdCBzdGQ6OnN0cmluZyYgd2hhdF9hcmcpCisgICAgeworICAgICAgICBzdGQ6OnN0cmluZyB3ID0gZXhjZXB0aW9uOjpuYW1lKCJvdGhlcl9lcnJvciIsIGlkXykgKyB3aGF0X2FyZzsKKyAgICAgICAgcmV0dXJuIG90aGVyX2Vycm9yKGlkXywgdy5jX3N0cigpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBvdGhlcl9lcnJvcihpbnQgaWRfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykgOiBleGNlcHRpb24oaWRfLCB3aGF0X2FyZykge30KK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9iaW5hcnlfcmVhZGVyLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2lucHV0L2JpbmFyeV9yZWFkZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzQyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9iaW5hcnlfcmVhZGVyLmhwcApAQCAtMCwwICsxLDEzNjEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBnZW5lcmF0ZV9uCisjaW5jbHVkZSA8YXJyYXk+IC8vIGFycmF5CisjaW5jbHVkZSA8Y2Fzc2VydD4gLy8gYXNzZXJ0CisjaW5jbHVkZSA8Y21hdGg+IC8vIGxkZXhwCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gc2l6ZV90CisjaW5jbHVkZSA8Y3N0ZGludD4gLy8gdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCB1aW50NjRfdAorI2luY2x1ZGUgPGNzdHJpbmc+IC8vIG1lbWNweQorI2luY2x1ZGUgPGlvbWFuaXA+IC8vIHNldHcsIHNldGZpbGwKKyNpbmNsdWRlIDxpb3M+IC8vIGhleAorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBiYWNrX2luc2VydGVyCisjaW5jbHVkZSA8bGltaXRzPiAvLyBudW1lcmljX2xpbWl0cworI2luY2x1ZGUgPHNzdHJlYW0+IC8vIHN0cmluZ3N0cmVhbQorI2luY2x1ZGUgPHN0cmluZz4gLy8gY2hhcl90cmFpdHMsIHN0cmluZworI2luY2x1ZGUgPHV0aWxpdHk+IC8vIG1ha2VfcGFpciwgbW92ZQorCisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2lucHV0X2FkYXB0ZXJzLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21hY3JvX3Njb3BlLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYmluYXJ5IHJlYWRlciAvLworLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiEKK0BicmllZiBkZXNlcmlhbGl6YXRpb24gb2YgQ0JPUiBhbmQgTWVzc2FnZVBhY2sgdmFsdWVzCisqLwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK2NsYXNzIGJpbmFyeV9yZWFkZXIKK3sKKyAgICB1c2luZyBudW1iZXJfaW50ZWdlcl90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdDsKKyAgICB1c2luZyBudW1iZXJfdW5zaWduZWRfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl91bnNpZ25lZF90OworICAgIHVzaW5nIHN0cmluZ190ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3Q7CisKKyAgcHVibGljOgorICAgIC8qIQorICAgIEBicmllZiBjcmVhdGUgYSBiaW5hcnkgcmVhZGVyCisKKyAgICBAcGFyYW1baW5dIGFkYXB0ZXIgIGlucHV0IGFkYXB0ZXIgdG8gcmVhZCBmcm9tCisgICAgKi8KKyAgICBleHBsaWNpdCBiaW5hcnlfcmVhZGVyKGlucHV0X2FkYXB0ZXJfdCBhZGFwdGVyKSA6IGlhKHN0ZDo6bW92ZShhZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGFzc2VydChpYSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBDQk9SIGlucHV0CisKKyAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGlucHV0IHRvIGJlIGNvbnN1bWVkIGNvbXBsZXRlZAorICAgIEByZXR1cm4gSlNPTiB2YWx1ZSBjcmVhdGVkIGZyb20gQ0JPUiBpbnB1dAorCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBlbmRlZCB1bmV4cGVjdGVkbHkgb3IgdGhlIGVuZCBvZiBmaWxlIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlYWNoZWQgd2hlbiBAYSBzdHJpY3Qgd2FzIHNldCB0byB0cnVlCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMiBpZiB1bnN1cHBvcnRlZCBieXRlIHdhcyByZWFkCisgICAgKi8KKyAgICBCYXNpY0pzb25UeXBlIHBhcnNlX2Nib3IoY29uc3QgYm9vbCBzdHJpY3QpCisgICAgeworICAgICAgICBjb25zdCBhdXRvIHJlcyA9IHBhcnNlX2Nib3JfaW50ZXJuYWwoKTsKKyAgICAgICAgaWYgKHN0cmljdCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICBleHBlY3RfZW9mKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIE1lc3NhZ2VQYWNrIGlucHV0CisKKyAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGlucHV0IHRvIGJlIGNvbnN1bWVkIGNvbXBsZXRlZAorICAgIEByZXR1cm4gSlNPTiB2YWx1ZSBjcmVhdGVkIGZyb20gTWVzc2FnZVBhY2sgaW5wdXQKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5IG9yIHRoZSBlbmQgb2YgZmlsZSB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWFjaGVkIHdoZW4gQGEgc3RyaWN0IHdhcyBzZXQgdG8gdHJ1ZQorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgYnl0ZSB3YXMgcmVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV9tc2dwYWNrKGNvbnN0IGJvb2wgc3RyaWN0KQorICAgIHsKKyAgICAgICAgY29uc3QgYXV0byByZXMgPSBwYXJzZV9tc2dwYWNrX2ludGVybmFsKCk7CisgICAgICAgIGlmIChzdHJpY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgZXhwZWN0X2VvZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBVQkpTT04gaW5wdXQKKworICAgIEBwYXJhbVtpbl0gc3RyaWN0ICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgaW5wdXQgdG8gYmUgY29uc3VtZWQgY29tcGxldGVkCisgICAgQHJldHVybiBKU09OIHZhbHVlIGNyZWF0ZWQgZnJvbSBVQkpTT04gaW5wdXQKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5IG9yIHRoZSBlbmQgb2YgZmlsZSB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWFjaGVkIHdoZW4gQGEgc3RyaWN0IHdhcyBzZXQgdG8gdHJ1ZQorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgYnl0ZSB3YXMgcmVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV91Ympzb24oY29uc3QgYm9vbCBzdHJpY3QpCisgICAgeworICAgICAgICBjb25zdCBhdXRvIHJlcyA9IHBhcnNlX3VianNvbl9pbnRlcm5hbCgpOworICAgICAgICBpZiAoc3RyaWN0KQorICAgICAgICB7CisgICAgICAgICAgICBnZXRfaWdub3JlX25vb3AoKTsKKyAgICAgICAgICAgIGV4cGVjdF9lb2YoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXRlcm1pbmUgc3lzdGVtIGJ5dGUgb3JkZXIKKworICAgIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiBzeXN0ZW0ncyBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4KKworICAgIEBub3RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTAwMTMyOC8yNjYzNzgKKyAgICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBsaXR0bGVfZW5kaWFuZXNzKGludCBudW0gPSAxKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuICgqcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bSkgPT0gMSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyohCisgICAgQHBhcmFtW2luXSBnZXRfY2hhciAgd2hldGhlciBhIG5ldyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICh0cnVlLCBkZWZhdWx0KSBvciB3aGV0aGVyIHRoZSBsYXN0IHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW5zdGVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV9jYm9yX2ludGVybmFsKGNvbnN0IGJvb2wgZ2V0X2NoYXIgPSB0cnVlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChnZXRfY2hhciA/IGdldCgpIDogY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRU9GCisgICAgICAgICAgICBjYXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOgorICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTAsIGNoYXJzX3JlYWQsICJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpKTsKKworICAgICAgICAgICAgLy8gSW50ZWdlciAweDAwLi4weDE3ICgwLi4yMykKKyAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgIGNhc2UgMHgwNjoKKyAgICAgICAgICAgIGNhc2UgMHgwNzoKKyAgICAgICAgICAgIGNhc2UgMHgwODoKKyAgICAgICAgICAgIGNhc2UgMHgwOToKKyAgICAgICAgICAgIGNhc2UgMHgwQToKKyAgICAgICAgICAgIGNhc2UgMHgwQjoKKyAgICAgICAgICAgIGNhc2UgMHgwQzoKKyAgICAgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICAgIGNhc2UgMHgwRToKKyAgICAgICAgICAgIGNhc2UgMHgwRjoKKyAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgIGNhc2UgMHgxMToKKyAgICAgICAgICAgIGNhc2UgMHgxMjoKKyAgICAgICAgICAgIGNhc2UgMHgxMzoKKyAgICAgICAgICAgIGNhc2UgMHgxNDoKKyAgICAgICAgICAgIGNhc2UgMHgxNToKKyAgICAgICAgICAgIGNhc2UgMHgxNjoKKyAgICAgICAgICAgIGNhc2UgMHgxNzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bnVtYmVyX3Vuc2lnbmVkX3Q+KGN1cnJlbnQpOworCisgICAgICAgICAgICBjYXNlIDB4MTg6IC8vIFVuc2lnbmVkIGludGVnZXIgKG9uZS1ieXRlIHVpbnQ4X3QgZm9sbG93cykKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50OF90PigpOworCisgICAgICAgICAgICBjYXNlIDB4MTk6IC8vIFVuc2lnbmVkIGludGVnZXIgKHR3by1ieXRlIHVpbnQxNl90IGZvbGxvd3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDE2X3Q+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHgxQTogLy8gVW5zaWduZWQgaW50ZWdlciAoZm91ci1ieXRlIHVpbnQzMl90IGZvbGxvd3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDMyX3Q+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHgxQjogLy8gVW5zaWduZWQgaW50ZWdlciAoZWlnaHQtYnl0ZSB1aW50NjRfdCBmb2xsb3dzKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPHVpbnQ2NF90PigpOworCisgICAgICAgICAgICAvLyBOZWdhdGl2ZSBpbnRlZ2VyIC0xLTB4MDAuLi0xLTB4MTcgKC0xLi4tMjQpCisgICAgICAgICAgICBjYXNlIDB4MjA6CisgICAgICAgICAgICBjYXNlIDB4MjE6CisgICAgICAgICAgICBjYXNlIDB4MjI6CisgICAgICAgICAgICBjYXNlIDB4MjM6CisgICAgICAgICAgICBjYXNlIDB4MjQ6CisgICAgICAgICAgICBjYXNlIDB4MjU6CisgICAgICAgICAgICBjYXNlIDB4MjY6CisgICAgICAgICAgICBjYXNlIDB4Mjc6CisgICAgICAgICAgICBjYXNlIDB4Mjg6CisgICAgICAgICAgICBjYXNlIDB4Mjk6CisgICAgICAgICAgICBjYXNlIDB4MkE6CisgICAgICAgICAgICBjYXNlIDB4MkI6CisgICAgICAgICAgICBjYXNlIDB4MkM6CisgICAgICAgICAgICBjYXNlIDB4MkQ6CisgICAgICAgICAgICBjYXNlIDB4MkU6CisgICAgICAgICAgICBjYXNlIDB4MkY6CisgICAgICAgICAgICBjYXNlIDB4MzA6CisgICAgICAgICAgICBjYXNlIDB4MzE6CisgICAgICAgICAgICBjYXNlIDB4MzI6CisgICAgICAgICAgICBjYXNlIDB4MzM6CisgICAgICAgICAgICBjYXNlIDB4MzQ6CisgICAgICAgICAgICBjYXNlIDB4MzU6CisgICAgICAgICAgICBjYXNlIDB4MzY6CisgICAgICAgICAgICBjYXNlIDB4Mzc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDhfdD4oMHgyMCAtIDEgLSBjdXJyZW50KTsKKworICAgICAgICAgICAgY2FzZSAweDM4OiAvLyBOZWdhdGl2ZSBpbnRlZ2VyIChvbmUtYnl0ZSB1aW50OF90IGZvbGxvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PG51bWJlcl9pbnRlZ2VyX3Q+KC0xKSAtIGdldF9udW1iZXI8dWludDhfdD4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDM5OiAvLyBOZWdhdGl2ZSBpbnRlZ2VyIC0xLW4gKHR3by1ieXRlIHVpbnQxNl90IGZvbGxvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PG51bWJlcl9pbnRlZ2VyX3Q+KC0xKSAtIGdldF9udW1iZXI8dWludDE2X3Q+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHgzQTogLy8gTmVnYXRpdmUgaW50ZWdlciAtMS1uIChmb3VyLWJ5dGUgdWludDMyX3QgZm9sbG93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bnVtYmVyX2ludGVnZXJfdD4oLTEpIC0gZ2V0X251bWJlcjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDNCOiAvLyBOZWdhdGl2ZSBpbnRlZ2VyIC0xLW4gKGVpZ2h0LWJ5dGUgdWludDY0X3QgZm9sbG93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bnVtYmVyX2ludGVnZXJfdD4oLTEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bnVtYmVyX2ludGVnZXJfdD4oZ2V0X251bWJlcjx1aW50NjRfdD4oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVURi04IHN0cmluZyAoMHgwMC4uMHgxNyBieXRlcyBmb2xsb3cpCisgICAgICAgICAgICBjYXNlIDB4NjA6CisgICAgICAgICAgICBjYXNlIDB4NjE6CisgICAgICAgICAgICBjYXNlIDB4NjI6CisgICAgICAgICAgICBjYXNlIDB4NjM6CisgICAgICAgICAgICBjYXNlIDB4NjQ6CisgICAgICAgICAgICBjYXNlIDB4NjU6CisgICAgICAgICAgICBjYXNlIDB4NjY6CisgICAgICAgICAgICBjYXNlIDB4Njc6CisgICAgICAgICAgICBjYXNlIDB4Njg6CisgICAgICAgICAgICBjYXNlIDB4Njk6CisgICAgICAgICAgICBjYXNlIDB4NkE6CisgICAgICAgICAgICBjYXNlIDB4NkI6CisgICAgICAgICAgICBjYXNlIDB4NkM6CisgICAgICAgICAgICBjYXNlIDB4NkQ6CisgICAgICAgICAgICBjYXNlIDB4NkU6CisgICAgICAgICAgICBjYXNlIDB4NkY6CisgICAgICAgICAgICBjYXNlIDB4NzA6CisgICAgICAgICAgICBjYXNlIDB4NzE6CisgICAgICAgICAgICBjYXNlIDB4NzI6CisgICAgICAgICAgICBjYXNlIDB4NzM6CisgICAgICAgICAgICBjYXNlIDB4NzQ6CisgICAgICAgICAgICBjYXNlIDB4NzU6CisgICAgICAgICAgICBjYXNlIDB4NzY6CisgICAgICAgICAgICBjYXNlIDB4Nzc6CisgICAgICAgICAgICBjYXNlIDB4Nzg6IC8vIFVURi04IHN0cmluZyAob25lLWJ5dGUgdWludDhfdCBmb3IgbiBmb2xsb3dzKQorICAgICAgICAgICAgY2FzZSAweDc5OiAvLyBVVEYtOCBzdHJpbmcgKHR3by1ieXRlIHVpbnQxNl90IGZvciBuIGZvbGxvdykKKyAgICAgICAgICAgIGNhc2UgMHg3QTogLy8gVVRGLTggc3RyaW5nIChmb3VyLWJ5dGUgdWludDMyX3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgY2FzZSAweDdCOiAvLyBVVEYtOCBzdHJpbmcgKGVpZ2h0LWJ5dGUgdWludDY0X3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgY2FzZSAweDdGOiAvLyBVVEYtOCBzdHJpbmcgKGluZGVmaW5pdGUgbGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfY2Jvcl9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXJyYXkgKDB4MDAuLjB4MTcgZGF0YSBpdGVtcyBmb2xsb3cpCisgICAgICAgICAgICBjYXNlIDB4ODA6CisgICAgICAgICAgICBjYXNlIDB4ODE6CisgICAgICAgICAgICBjYXNlIDB4ODI6CisgICAgICAgICAgICBjYXNlIDB4ODM6CisgICAgICAgICAgICBjYXNlIDB4ODQ6CisgICAgICAgICAgICBjYXNlIDB4ODU6CisgICAgICAgICAgICBjYXNlIDB4ODY6CisgICAgICAgICAgICBjYXNlIDB4ODc6CisgICAgICAgICAgICBjYXNlIDB4ODg6CisgICAgICAgICAgICBjYXNlIDB4ODk6CisgICAgICAgICAgICBjYXNlIDB4OEE6CisgICAgICAgICAgICBjYXNlIDB4OEI6CisgICAgICAgICAgICBjYXNlIDB4OEM6CisgICAgICAgICAgICBjYXNlIDB4OEQ6CisgICAgICAgICAgICBjYXNlIDB4OEU6CisgICAgICAgICAgICBjYXNlIDB4OEY6CisgICAgICAgICAgICBjYXNlIDB4OTA6CisgICAgICAgICAgICBjYXNlIDB4OTE6CisgICAgICAgICAgICBjYXNlIDB4OTI6CisgICAgICAgICAgICBjYXNlIDB4OTM6CisgICAgICAgICAgICBjYXNlIDB4OTQ6CisgICAgICAgICAgICBjYXNlIDB4OTU6CisgICAgICAgICAgICBjYXNlIDB4OTY6CisgICAgICAgICAgICBjYXNlIDB4OTc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9jYm9yX2FycmF5KGN1cnJlbnQgJiAweDFGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDk4OiAvLyBhcnJheSAob25lLWJ5dGUgdWludDhfdCBmb3IgbiBmb2xsb3dzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfY2Jvcl9hcnJheShnZXRfbnVtYmVyPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4OTk6IC8vIGFycmF5ICh0d28tYnl0ZSB1aW50MTZfdCBmb3IgbiBmb2xsb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9jYm9yX2FycmF5KGdldF9udW1iZXI8dWludDE2X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4OUE6IC8vIGFycmF5IChmb3VyLWJ5dGUgdWludDMyX3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfY2Jvcl9hcnJheShnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDlCOiAvLyBhcnJheSAoZWlnaHQtYnl0ZSB1aW50NjRfdCBmb3IgbiBmb2xsb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9jYm9yX2FycmF5KGdldF9udW1iZXI8dWludDY0X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4OUY6IC8vIGFycmF5IChpbmRlZmluaXRlIGxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgICAgIHdoaWxlIChnZXQoKSAhPSAweEZGKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV9jYm9yX2ludGVybmFsKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1hcCAoMHgwMC4uMHgxNyBwYWlycyBvZiBkYXRhIGl0ZW1zIGZvbGxvdykKKyAgICAgICAgICAgIGNhc2UgMHhBMDoKKyAgICAgICAgICAgIGNhc2UgMHhBMToKKyAgICAgICAgICAgIGNhc2UgMHhBMjoKKyAgICAgICAgICAgIGNhc2UgMHhBMzoKKyAgICAgICAgICAgIGNhc2UgMHhBNDoKKyAgICAgICAgICAgIGNhc2UgMHhBNToKKyAgICAgICAgICAgIGNhc2UgMHhBNjoKKyAgICAgICAgICAgIGNhc2UgMHhBNzoKKyAgICAgICAgICAgIGNhc2UgMHhBODoKKyAgICAgICAgICAgIGNhc2UgMHhBOToKKyAgICAgICAgICAgIGNhc2UgMHhBQToKKyAgICAgICAgICAgIGNhc2UgMHhBQjoKKyAgICAgICAgICAgIGNhc2UgMHhBQzoKKyAgICAgICAgICAgIGNhc2UgMHhBRDoKKyAgICAgICAgICAgIGNhc2UgMHhBRToKKyAgICAgICAgICAgIGNhc2UgMHhBRjoKKyAgICAgICAgICAgIGNhc2UgMHhCMDoKKyAgICAgICAgICAgIGNhc2UgMHhCMToKKyAgICAgICAgICAgIGNhc2UgMHhCMjoKKyAgICAgICAgICAgIGNhc2UgMHhCMzoKKyAgICAgICAgICAgIGNhc2UgMHhCNDoKKyAgICAgICAgICAgIGNhc2UgMHhCNToKKyAgICAgICAgICAgIGNhc2UgMHhCNjoKKyAgICAgICAgICAgIGNhc2UgMHhCNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X2Nib3Jfb2JqZWN0KGN1cnJlbnQgJiAweDFGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweEI4OiAvLyBtYXAgKG9uZS1ieXRlIHVpbnQ4X3QgZm9yIG4gZm9sbG93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X2Nib3Jfb2JqZWN0KGdldF9udW1iZXI8dWludDhfdD4oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhCOTogLy8gbWFwICh0d28tYnl0ZSB1aW50MTZfdCBmb3IgbiBmb2xsb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9jYm9yX29iamVjdChnZXRfbnVtYmVyPHVpbnQxNl90PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweEJBOiAvLyBtYXAgKGZvdXItYnl0ZSB1aW50MzJfdCBmb3IgbiBmb2xsb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9jYm9yX29iamVjdChnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweEJCOiAvLyBtYXAgKGVpZ2h0LWJ5dGUgdWludDY0X3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfY2Jvcl9vYmplY3QoZ2V0X251bWJlcjx1aW50NjRfdD4oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhCRjogLy8gbWFwIChpbmRlZmluaXRlIGxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2V0KCkgIT0gMHhGRikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X2Nib3Jfc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcGFyc2VfY2Jvcl9pbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4RjQ6IC8vIGZhbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4RjU6IC8vIHRydWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweEY2OiAvLyBudWxsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlX3Q6Om51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhGOTogLy8gSGFsZi1QcmVjaXNpb24gRmxvYXQgKHR3by1ieXRlIElFRUUgNzU0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBieXRlMSA9IGdldCgpOworICAgICAgICAgICAgICAgIHVuZXhwZWN0X2VvZigpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBieXRlMiA9IGdldCgpOworICAgICAgICAgICAgICAgIHVuZXhwZWN0X2VvZigpOworCisgICAgICAgICAgICAgICAgLy8gY29kZSBmcm9tIFJGQyA3MDQ5LCBBcHBlbmRpeCBELCBGaWd1cmUgMzoKKyAgICAgICAgICAgICAgICAvLyBBcyBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHdlcmUgb25seSBhZGRlZAorICAgICAgICAgICAgICAgIC8vIHRvIElFRUUgNzU0IGluIDIwMDgsIHRvZGF5J3MgcHJvZ3JhbW1pbmcgcGxhdGZvcm1zIG9mdGVuCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgb25seSBoYXZlIGxpbWl0ZWQgc3VwcG9ydCBmb3IgdGhlbS4gSXQgaXMgdmVyeQorICAgICAgICAgICAgICAgIC8vIGVhc3kgdG8gaW5jbHVkZSBhdCBsZWFzdCBkZWNvZGluZyBzdXBwb3J0IGZvciB0aGVtIGV2ZW4KKyAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHN1Y2ggc3VwcG9ydC4gQW4gZXhhbXBsZSBvZiBhIHNtYWxsIGRlY29kZXIgZm9yCisgICAgICAgICAgICAgICAgLy8gaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbiB0aGUgQyBsYW5ndWFnZQorICAgICAgICAgICAgICAgIC8vIGlzIHNob3duIGluIEZpZy4gMy4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGFsZiA9IChieXRlMSA8PCA4KSArIGJ5dGUyOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBleHAgPSAoaGFsZiA+PiAxMCkgJiAweDFGOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYW50ID0gaGFsZiAmIDB4M0ZGOworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgICAgICAgICAgaWYgKGV4cCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gc3RkOjpsZGV4cChtYW50LCAtMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHAgIT0gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSBzdGQ6OmxkZXhwKG1hbnQgKyAxMDI0LCBleHAgLSAyNSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IChtYW50ID09IDApID8gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIChoYWxmICYgMHg4MDAwKSAhPSAwID8gLXZhbCA6IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweEZBOiAvLyBTaW5nbGUtUHJlY2lzaW9uIEZsb2F0IChmb3VyLWJ5dGUgSUVFRSA3NTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8ZmxvYXQ+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhGQjogLy8gRG91YmxlLVByZWNpc2lvbiBGbG9hdCAoZWlnaHQtYnl0ZSBJRUVFIDc1NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxkb3VibGU+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGFueXRoaW5nIGVsc2UgKDB4RkYgaXMgaGFuZGxlZCBpbnNpZGUgdGhlIG90aGVyIHR5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCBjdXJyZW50OworICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTIsIGNoYXJzX3JlYWQsICJlcnJvciByZWFkaW5nIENCT1I7IGxhc3QgYnl0ZTogMHgiICsgc3Muc3RyKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEJhc2ljSnNvblR5cGUgcGFyc2VfbXNncGFja19pbnRlcm5hbCgpCisgICAgeworICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFT0YKKyAgICAgICAgICAgIGNhc2Ugc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCk6CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMCwgY2hhcnNfcmVhZCwgInVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IikpOworCisgICAgICAgICAgICAvLyBwb3NpdGl2ZSBmaXhpbnQKKyAgICAgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgIGNhc2UgMHgwNjoKKyAgICAgICAgICAgIGNhc2UgMHgwNzoKKyAgICAgICAgICAgIGNhc2UgMHgwODoKKyAgICAgICAgICAgIGNhc2UgMHgwOToKKyAgICAgICAgICAgIGNhc2UgMHgwQToKKyAgICAgICAgICAgIGNhc2UgMHgwQjoKKyAgICAgICAgICAgIGNhc2UgMHgwQzoKKyAgICAgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICAgIGNhc2UgMHgwRToKKyAgICAgICAgICAgIGNhc2UgMHgwRjoKKyAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgIGNhc2UgMHgxMToKKyAgICAgICAgICAgIGNhc2UgMHgxMjoKKyAgICAgICAgICAgIGNhc2UgMHgxMzoKKyAgICAgICAgICAgIGNhc2UgMHgxNDoKKyAgICAgICAgICAgIGNhc2UgMHgxNToKKyAgICAgICAgICAgIGNhc2UgMHgxNjoKKyAgICAgICAgICAgIGNhc2UgMHgxNzoKKyAgICAgICAgICAgIGNhc2UgMHgxODoKKyAgICAgICAgICAgIGNhc2UgMHgxOToKKyAgICAgICAgICAgIGNhc2UgMHgxQToKKyAgICAgICAgICAgIGNhc2UgMHgxQjoKKyAgICAgICAgICAgIGNhc2UgMHgxQzoKKyAgICAgICAgICAgIGNhc2UgMHgxRDoKKyAgICAgICAgICAgIGNhc2UgMHgxRToKKyAgICAgICAgICAgIGNhc2UgMHgxRjoKKyAgICAgICAgICAgIGNhc2UgMHgyMDoKKyAgICAgICAgICAgIGNhc2UgMHgyMToKKyAgICAgICAgICAgIGNhc2UgMHgyMjoKKyAgICAgICAgICAgIGNhc2UgMHgyMzoKKyAgICAgICAgICAgIGNhc2UgMHgyNDoKKyAgICAgICAgICAgIGNhc2UgMHgyNToKKyAgICAgICAgICAgIGNhc2UgMHgyNjoKKyAgICAgICAgICAgIGNhc2UgMHgyNzoKKyAgICAgICAgICAgIGNhc2UgMHgyODoKKyAgICAgICAgICAgIGNhc2UgMHgyOToKKyAgICAgICAgICAgIGNhc2UgMHgyQToKKyAgICAgICAgICAgIGNhc2UgMHgyQjoKKyAgICAgICAgICAgIGNhc2UgMHgyQzoKKyAgICAgICAgICAgIGNhc2UgMHgyRDoKKyAgICAgICAgICAgIGNhc2UgMHgyRToKKyAgICAgICAgICAgIGNhc2UgMHgyRjoKKyAgICAgICAgICAgIGNhc2UgMHgzMDoKKyAgICAgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgIGNhc2UgMHgzMjoKKyAgICAgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgICAgIGNhc2UgMHgzNDoKKyAgICAgICAgICAgIGNhc2UgMHgzNToKKyAgICAgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgICAgIGNhc2UgMHgzNzoKKyAgICAgICAgICAgIGNhc2UgMHgzODoKKyAgICAgICAgICAgIGNhc2UgMHgzOToKKyAgICAgICAgICAgIGNhc2UgMHgzQToKKyAgICAgICAgICAgIGNhc2UgMHgzQjoKKyAgICAgICAgICAgIGNhc2UgMHgzQzoKKyAgICAgICAgICAgIGNhc2UgMHgzRDoKKyAgICAgICAgICAgIGNhc2UgMHgzRToKKyAgICAgICAgICAgIGNhc2UgMHgzRjoKKyAgICAgICAgICAgIGNhc2UgMHg0MDoKKyAgICAgICAgICAgIGNhc2UgMHg0MToKKyAgICAgICAgICAgIGNhc2UgMHg0MjoKKyAgICAgICAgICAgIGNhc2UgMHg0MzoKKyAgICAgICAgICAgIGNhc2UgMHg0NDoKKyAgICAgICAgICAgIGNhc2UgMHg0NToKKyAgICAgICAgICAgIGNhc2UgMHg0NjoKKyAgICAgICAgICAgIGNhc2UgMHg0NzoKKyAgICAgICAgICAgIGNhc2UgMHg0ODoKKyAgICAgICAgICAgIGNhc2UgMHg0OToKKyAgICAgICAgICAgIGNhc2UgMHg0QToKKyAgICAgICAgICAgIGNhc2UgMHg0QjoKKyAgICAgICAgICAgIGNhc2UgMHg0QzoKKyAgICAgICAgICAgIGNhc2UgMHg0RDoKKyAgICAgICAgICAgIGNhc2UgMHg0RToKKyAgICAgICAgICAgIGNhc2UgMHg0RjoKKyAgICAgICAgICAgIGNhc2UgMHg1MDoKKyAgICAgICAgICAgIGNhc2UgMHg1MToKKyAgICAgICAgICAgIGNhc2UgMHg1MjoKKyAgICAgICAgICAgIGNhc2UgMHg1MzoKKyAgICAgICAgICAgIGNhc2UgMHg1NDoKKyAgICAgICAgICAgIGNhc2UgMHg1NToKKyAgICAgICAgICAgIGNhc2UgMHg1NjoKKyAgICAgICAgICAgIGNhc2UgMHg1NzoKKyAgICAgICAgICAgIGNhc2UgMHg1ODoKKyAgICAgICAgICAgIGNhc2UgMHg1OToKKyAgICAgICAgICAgIGNhc2UgMHg1QToKKyAgICAgICAgICAgIGNhc2UgMHg1QjoKKyAgICAgICAgICAgIGNhc2UgMHg1QzoKKyAgICAgICAgICAgIGNhc2UgMHg1RDoKKyAgICAgICAgICAgIGNhc2UgMHg1RToKKyAgICAgICAgICAgIGNhc2UgMHg1RjoKKyAgICAgICAgICAgIGNhc2UgMHg2MDoKKyAgICAgICAgICAgIGNhc2UgMHg2MToKKyAgICAgICAgICAgIGNhc2UgMHg2MjoKKyAgICAgICAgICAgIGNhc2UgMHg2MzoKKyAgICAgICAgICAgIGNhc2UgMHg2NDoKKyAgICAgICAgICAgIGNhc2UgMHg2NToKKyAgICAgICAgICAgIGNhc2UgMHg2NjoKKyAgICAgICAgICAgIGNhc2UgMHg2NzoKKyAgICAgICAgICAgIGNhc2UgMHg2ODoKKyAgICAgICAgICAgIGNhc2UgMHg2OToKKyAgICAgICAgICAgIGNhc2UgMHg2QToKKyAgICAgICAgICAgIGNhc2UgMHg2QjoKKyAgICAgICAgICAgIGNhc2UgMHg2QzoKKyAgICAgICAgICAgIGNhc2UgMHg2RDoKKyAgICAgICAgICAgIGNhc2UgMHg2RToKKyAgICAgICAgICAgIGNhc2UgMHg2RjoKKyAgICAgICAgICAgIGNhc2UgMHg3MDoKKyAgICAgICAgICAgIGNhc2UgMHg3MToKKyAgICAgICAgICAgIGNhc2UgMHg3MjoKKyAgICAgICAgICAgIGNhc2UgMHg3MzoKKyAgICAgICAgICAgIGNhc2UgMHg3NDoKKyAgICAgICAgICAgIGNhc2UgMHg3NToKKyAgICAgICAgICAgIGNhc2UgMHg3NjoKKyAgICAgICAgICAgIGNhc2UgMHg3NzoKKyAgICAgICAgICAgIGNhc2UgMHg3ODoKKyAgICAgICAgICAgIGNhc2UgMHg3OToKKyAgICAgICAgICAgIGNhc2UgMHg3QToKKyAgICAgICAgICAgIGNhc2UgMHg3QjoKKyAgICAgICAgICAgIGNhc2UgMHg3QzoKKyAgICAgICAgICAgIGNhc2UgMHg3RDoKKyAgICAgICAgICAgIGNhc2UgMHg3RToKKyAgICAgICAgICAgIGNhc2UgMHg3RjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bnVtYmVyX3Vuc2lnbmVkX3Q+KGN1cnJlbnQpOworCisgICAgICAgICAgICAvLyBmaXhtYXAKKyAgICAgICAgICAgIGNhc2UgMHg4MDoKKyAgICAgICAgICAgIGNhc2UgMHg4MToKKyAgICAgICAgICAgIGNhc2UgMHg4MjoKKyAgICAgICAgICAgIGNhc2UgMHg4MzoKKyAgICAgICAgICAgIGNhc2UgMHg4NDoKKyAgICAgICAgICAgIGNhc2UgMHg4NToKKyAgICAgICAgICAgIGNhc2UgMHg4NjoKKyAgICAgICAgICAgIGNhc2UgMHg4NzoKKyAgICAgICAgICAgIGNhc2UgMHg4ODoKKyAgICAgICAgICAgIGNhc2UgMHg4OToKKyAgICAgICAgICAgIGNhc2UgMHg4QToKKyAgICAgICAgICAgIGNhc2UgMHg4QjoKKyAgICAgICAgICAgIGNhc2UgMHg4QzoKKyAgICAgICAgICAgIGNhc2UgMHg4RDoKKyAgICAgICAgICAgIGNhc2UgMHg4RToKKyAgICAgICAgICAgIGNhc2UgMHg4RjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X21zZ3BhY2tfb2JqZWN0KGN1cnJlbnQgJiAweDBGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZml4YXJyYXkKKyAgICAgICAgICAgIGNhc2UgMHg5MDoKKyAgICAgICAgICAgIGNhc2UgMHg5MToKKyAgICAgICAgICAgIGNhc2UgMHg5MjoKKyAgICAgICAgICAgIGNhc2UgMHg5MzoKKyAgICAgICAgICAgIGNhc2UgMHg5NDoKKyAgICAgICAgICAgIGNhc2UgMHg5NToKKyAgICAgICAgICAgIGNhc2UgMHg5NjoKKyAgICAgICAgICAgIGNhc2UgMHg5NzoKKyAgICAgICAgICAgIGNhc2UgMHg5ODoKKyAgICAgICAgICAgIGNhc2UgMHg5OToKKyAgICAgICAgICAgIGNhc2UgMHg5QToKKyAgICAgICAgICAgIGNhc2UgMHg5QjoKKyAgICAgICAgICAgIGNhc2UgMHg5QzoKKyAgICAgICAgICAgIGNhc2UgMHg5RDoKKyAgICAgICAgICAgIGNhc2UgMHg5RToKKyAgICAgICAgICAgIGNhc2UgMHg5RjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X21zZ3BhY2tfYXJyYXkoY3VycmVudCAmIDB4MEYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaXhzdHIKKyAgICAgICAgICAgIGNhc2UgMHhBMDoKKyAgICAgICAgICAgIGNhc2UgMHhBMToKKyAgICAgICAgICAgIGNhc2UgMHhBMjoKKyAgICAgICAgICAgIGNhc2UgMHhBMzoKKyAgICAgICAgICAgIGNhc2UgMHhBNDoKKyAgICAgICAgICAgIGNhc2UgMHhBNToKKyAgICAgICAgICAgIGNhc2UgMHhBNjoKKyAgICAgICAgICAgIGNhc2UgMHhBNzoKKyAgICAgICAgICAgIGNhc2UgMHhBODoKKyAgICAgICAgICAgIGNhc2UgMHhBOToKKyAgICAgICAgICAgIGNhc2UgMHhBQToKKyAgICAgICAgICAgIGNhc2UgMHhBQjoKKyAgICAgICAgICAgIGNhc2UgMHhBQzoKKyAgICAgICAgICAgIGNhc2UgMHhBRDoKKyAgICAgICAgICAgIGNhc2UgMHhBRToKKyAgICAgICAgICAgIGNhc2UgMHhBRjoKKyAgICAgICAgICAgIGNhc2UgMHhCMDoKKyAgICAgICAgICAgIGNhc2UgMHhCMToKKyAgICAgICAgICAgIGNhc2UgMHhCMjoKKyAgICAgICAgICAgIGNhc2UgMHhCMzoKKyAgICAgICAgICAgIGNhc2UgMHhCNDoKKyAgICAgICAgICAgIGNhc2UgMHhCNToKKyAgICAgICAgICAgIGNhc2UgMHhCNjoKKyAgICAgICAgICAgIGNhc2UgMHhCNzoKKyAgICAgICAgICAgIGNhc2UgMHhCODoKKyAgICAgICAgICAgIGNhc2UgMHhCOToKKyAgICAgICAgICAgIGNhc2UgMHhCQToKKyAgICAgICAgICAgIGNhc2UgMHhCQjoKKyAgICAgICAgICAgIGNhc2UgMHhCQzoKKyAgICAgICAgICAgIGNhc2UgMHhCRDoKKyAgICAgICAgICAgIGNhc2UgMHhCRToKKyAgICAgICAgICAgIGNhc2UgMHhCRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X21zZ3BhY2tfc3RyaW5nKCk7CisKKyAgICAgICAgICAgIGNhc2UgMHhDMDogLy8gbmlsCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlX3Q6Om51bGw7CisKKyAgICAgICAgICAgIGNhc2UgMHhDMjogLy8gZmFsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGNhc2UgMHhDMzogLy8gdHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBjYXNlIDB4Q0E6IC8vIGZsb2F0IDMyCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8ZmxvYXQ+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHhDQjogLy8gZmxvYXQgNjQKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxkb3VibGU+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHhDQzogLy8gdWludCA4CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDhfdD4oKTsKKworICAgICAgICAgICAgY2FzZSAweENEOiAvLyB1aW50IDE2CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8dWludDE2X3Q+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHhDRTogLy8gdWludCAzMgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPHVpbnQzMl90PigpOworCisgICAgICAgICAgICBjYXNlIDB4Q0Y6IC8vIHVpbnQgNjQKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjx1aW50NjRfdD4oKTsKKworICAgICAgICAgICAgY2FzZSAweEQwOiAvLyBpbnQgOAorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGludDhfdD4oKTsKKworICAgICAgICAgICAgY2FzZSAweEQxOiAvLyBpbnQgMTYKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQxNl90PigpOworCisgICAgICAgICAgICBjYXNlIDB4RDI6IC8vIGludCAzMgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGludDMyX3Q+KCk7CisKKyAgICAgICAgICAgIGNhc2UgMHhEMzogLy8gaW50IDY0CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8aW50NjRfdD4oKTsKKworICAgICAgICAgICAgY2FzZSAweEQ5OiAvLyBzdHIgOAorICAgICAgICAgICAgY2FzZSAweERBOiAvLyBzdHIgMTYKKyAgICAgICAgICAgIGNhc2UgMHhEQjogLy8gc3RyIDMyCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9tc2dwYWNrX3N0cmluZygpOworCisgICAgICAgICAgICBjYXNlIDB4REM6IC8vIGFycmF5IDE2CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9tc2dwYWNrX2FycmF5KGdldF9udW1iZXI8dWludDE2X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4REQ6IC8vIGFycmF5IDMyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9tc2dwYWNrX2FycmF5KGdldF9udW1iZXI8dWludDMyX3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4REU6IC8vIG1hcCAxNgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbXNncGFja19vYmplY3QoZ2V0X251bWJlcjx1aW50MTZfdD4oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhERjogLy8gbWFwIDMyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9tc2dwYWNrX29iamVjdChnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcG9zaXRpdmUgZml4aW50CisgICAgICAgICAgICBjYXNlIDB4RTA6CisgICAgICAgICAgICBjYXNlIDB4RTE6CisgICAgICAgICAgICBjYXNlIDB4RTI6CisgICAgICAgICAgICBjYXNlIDB4RTM6CisgICAgICAgICAgICBjYXNlIDB4RTQ6CisgICAgICAgICAgICBjYXNlIDB4RTU6CisgICAgICAgICAgICBjYXNlIDB4RTY6CisgICAgICAgICAgICBjYXNlIDB4RTc6CisgICAgICAgICAgICBjYXNlIDB4RTg6CisgICAgICAgICAgICBjYXNlIDB4RTk6CisgICAgICAgICAgICBjYXNlIDB4RUE6CisgICAgICAgICAgICBjYXNlIDB4RUI6CisgICAgICAgICAgICBjYXNlIDB4RUM6CisgICAgICAgICAgICBjYXNlIDB4RUQ6CisgICAgICAgICAgICBjYXNlIDB4RUU6CisgICAgICAgICAgICBjYXNlIDB4RUY6CisgICAgICAgICAgICBjYXNlIDB4RjA6CisgICAgICAgICAgICBjYXNlIDB4RjE6CisgICAgICAgICAgICBjYXNlIDB4RjI6CisgICAgICAgICAgICBjYXNlIDB4RjM6CisgICAgICAgICAgICBjYXNlIDB4RjQ6CisgICAgICAgICAgICBjYXNlIDB4RjU6CisgICAgICAgICAgICBjYXNlIDB4RjY6CisgICAgICAgICAgICBjYXNlIDB4Rjc6CisgICAgICAgICAgICBjYXNlIDB4Rjg6CisgICAgICAgICAgICBjYXNlIDB4Rjk6CisgICAgICAgICAgICBjYXNlIDB4RkE6CisgICAgICAgICAgICBjYXNlIDB4RkI6CisgICAgICAgICAgICBjYXNlIDB4RkM6CisgICAgICAgICAgICBjYXNlIDB4RkQ6CisgICAgICAgICAgICBjYXNlIDB4RkU6CisgICAgICAgICAgICBjYXNlIDB4RkY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDhfdD4oY3VycmVudCk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGFueXRoaW5nIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXggPDwgY3VycmVudDsKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTEyLCBjaGFyc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgcmVhZGluZyBNZXNzYWdlUGFjazsgbGFzdCBieXRlOiAweCIgKyBzcy5zdHIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQHBhcmFtW2luXSBnZXRfY2hhciAgd2hldGhlciBhIG5ldyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICh0cnVlLCBkZWZhdWx0KSBvciB3aGV0aGVyIHRoZSBsYXN0IHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW5zdGVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV91Ympzb25faW50ZXJuYWwoY29uc3QgYm9vbCBnZXRfY2hhciA9IHRydWUpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0X3VianNvbl92YWx1ZShnZXRfY2hhciA/IGdldF9pZ25vcmVfbm9vcCgpIDogY3VycmVudCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGdldCBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dAorCisgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSB1c2VkIGlucHV0IGFkYXB0ZXIuIEl0IGRvZXMKKyAgICBub3QgdGhyb3cgaW4gY2FzZSB0aGUgaW5wdXQgcmVhY2hlZCBFT0YsIGJ1dCByZXR1cm5zIGEgLSd2ZSB2YWx1ZWQKKyAgICBgc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKClgIGluIHRoYXQgY2FzZS4KKworICAgIEByZXR1cm4gY2hhcmFjdGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQKKyAgICAqLworICAgIGludCBnZXQoKQorICAgIHsKKyAgICAgICAgKytjaGFyc19yZWFkOworICAgICAgICByZXR1cm4gKGN1cnJlbnQgPSBpYS0+Z2V0X2NoYXJhY3RlcigpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAcmV0dXJuIGNoYXJhY3RlciByZWFkIGZyb20gdGhlIGlucHV0IGFmdGVyIGlnbm9yaW5nIGFsbCAnTicgZW50cmllcworICAgICovCisgICAgaW50IGdldF9pZ25vcmVfbm9vcCgpCisgICAgeworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY3VycmVudCA9PSAnTicpOworCisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKworICAgIC8qCisgICAgQGJyaWVmIHJlYWQgYSBudW1iZXIgZnJvbSB0aGUgaW5wdXQKKworICAgIEB0cGFyYW0gTnVtYmVyVHlwZSB0aGUgdHlwZSBvZiB0aGUgbnVtYmVyCisKKyAgICBAcmV0dXJuIG51bWJlciBvZiB0eXBlIEBhIE51bWJlclR5cGUKKworICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gcmVzcGVjdCB0aGUgc3lzdGVtJ3MgZW5kaWFuZXNzLCBiZWNhdXNlCisgICAgICAgICAgYnl0ZXMgaW4gQ0JPUiBhbmQgTWVzc2FnZVBhY2sgYXJlIHN0b3JlZCBpbiBuZXR3b3JrIG9yZGVyIChiaWcKKyAgICAgICAgICBlbmRpYW4pIGFuZCB0aGVyZWZvcmUgbmVlZCByZW9yZGVyaW5nIG9uIGxpdHRsZSBlbmRpYW4gc3lzdGVtcy4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgaGFzIGxlc3MgdGhhbiBgc2l6ZW9mKE51bWJlclR5cGUpYCBieXRlcworICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4gTnVtYmVyVHlwZSBnZXRfbnVtYmVyKCkKKyAgICB7CisgICAgICAgIC8vIHN0ZXAgMTogcmVhZCBpbnB1dCBpbnRvIGFycmF5IHdpdGggc3lzdGVtJ3MgYnl0ZSBvcmRlcgorICAgICAgICBzdGQ6OmFycmF5PHVpbnQ4X3QsIHNpemVvZihOdW1iZXJUeXBlKT4gdmVjOworICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKE51bWJlclR5cGUpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CisKKyAgICAgICAgICAgIC8vIHJldmVyc2UgYnl0ZSBvcmRlciBwcmlvciB0byBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKGlzX2xpdHRsZV9lbmRpYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVjW3NpemVvZihOdW1iZXJUeXBlKSAtIGkgLSAxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cnJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlY1tpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGN1cnJlbnQpOyAvLyBMQ09WX0VYQ0xfTElORQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RlcCAyOiBjb252ZXJ0IGFycmF5IGludG8gbnVtYmVyIG9mIHR5cGUgVCBhbmQgcmV0dXJuCisgICAgICAgIE51bWJlclR5cGUgcmVzdWx0OworICAgICAgICBzdGQ6Om1lbWNweSgmcmVzdWx0LCB2ZWMuZGF0YSgpLCBzaXplb2YoTnVtYmVyVHlwZSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjcmVhdGUgYSBzdHJpbmcgYnkgcmVhZGluZyBjaGFyYWN0ZXJzIGZyb20gdGhlIGlucHV0CisKKyAgICBAcGFyYW1baW5dIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCisgICAgQG5vdGUgV2UgY2FuIG5vdCByZXNlcnZlIEBhIGxlbiBieXRlcyBmb3IgdGhlIHJlc3VsdCwgYmVjYXVzZSBAYSBsZW4KKyAgICAgICAgICBtYXkgYmUgdG9vIGxhcmdlLiBVc3VhbGx5LCBAcmVmIHVuZXhwZWN0X2VvZigpIGRldGVjdHMgdGhlIGVuZCBvZgorICAgICAgICAgIHRoZSBpbnB1dCBiZWZvcmUgd2UgcnVuIG91dCBvZiBzdHJpbmcgbWVtb3J5LgorCisgICAgQHJldHVybiBzdHJpbmcgY3JlYXRlZCBieSByZWFkaW5nIEBhIGxlbiBieXRlcworCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBoYXMgbGVzcyB0aGFuIEBhIGxlbiBieXRlcworICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgICBzdHJpbmdfdCBnZXRfc3RyaW5nKGNvbnN0IE51bWJlclR5cGUgbGVuKQorICAgIHsKKyAgICAgICAgc3RyaW5nX3QgcmVzdWx0OworICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHJlc3VsdCksIGxlbiwgW3RoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICB1bmV4cGVjdF9lb2YoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPihjdXJyZW50KTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJlYWRzIGEgQ0JPUiBzdHJpbmcKKworICAgIFRoaXMgZnVuY3Rpb24gZmlyc3QgcmVhZHMgc3RhcnRpbmcgYnl0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZAorICAgIHN0cmluZyBsZW5ndGggYW5kIHRoZW4gY29waWVzIHRoaXMgbnVtYmVyIG9mIGJ5dGVzIGludG8gYSBzdHJpbmcuCisgICAgQWRkaXRpb25hbGx5LCBDQk9SJ3Mgc3RyaW5ncyB3aXRoIGluZGVmaW5pdGUgbGVuZ3RocyBhcmUgc3VwcG9ydGVkLgorCisgICAgQHJldHVybiBzdHJpbmcKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEzIGlmIGFuIHVuZXhwZWN0ZWQgYnl0ZSBpcyByZWFkCisgICAgKi8KKyAgICBzdHJpbmdfdCBnZXRfY2Jvcl9zdHJpbmcoKQorICAgIHsKKyAgICAgICAgdW5leHBlY3RfZW9mKCk7CisKKyAgICAgICAgc3dpdGNoIChjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVVEYtOCBzdHJpbmcgKDB4MDAuLjB4MTcgYnl0ZXMgZm9sbG93KQorICAgICAgICAgICAgY2FzZSAweDYwOgorICAgICAgICAgICAgY2FzZSAweDYxOgorICAgICAgICAgICAgY2FzZSAweDYyOgorICAgICAgICAgICAgY2FzZSAweDYzOgorICAgICAgICAgICAgY2FzZSAweDY0OgorICAgICAgICAgICAgY2FzZSAweDY1OgorICAgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgY2FzZSAweDY3OgorICAgICAgICAgICAgY2FzZSAweDY4OgorICAgICAgICAgICAgY2FzZSAweDY5OgorICAgICAgICAgICAgY2FzZSAweDZBOgorICAgICAgICAgICAgY2FzZSAweDZCOgorICAgICAgICAgICAgY2FzZSAweDZDOgorICAgICAgICAgICAgY2FzZSAweDZEOgorICAgICAgICAgICAgY2FzZSAweDZFOgorICAgICAgICAgICAgY2FzZSAweDZGOgorICAgICAgICAgICAgY2FzZSAweDcwOgorICAgICAgICAgICAgY2FzZSAweDcxOgorICAgICAgICAgICAgY2FzZSAweDcyOgorICAgICAgICAgICAgY2FzZSAweDczOgorICAgICAgICAgICAgY2FzZSAweDc0OgorICAgICAgICAgICAgY2FzZSAweDc1OgorICAgICAgICAgICAgY2FzZSAweDc2OgorICAgICAgICAgICAgY2FzZSAweDc3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGN1cnJlbnQgJiAweDFGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDc4OiAvLyBVVEYtOCBzdHJpbmcgKG9uZS1ieXRlIHVpbnQ4X3QgZm9yIG4gZm9sbG93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4Nzk6IC8vIFVURi04IHN0cmluZyAodHdvLWJ5dGUgdWludDE2X3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8dWludDE2X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4N0E6IC8vIFVURi04IHN0cmluZyAoZm91ci1ieXRlIHVpbnQzMl90IGZvciBuIGZvbGxvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPHVpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAweDdCOiAvLyBVVEYtOCBzdHJpbmcgKGVpZ2h0LWJ5dGUgdWludDY0X3QgZm9yIG4gZm9sbG93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8dWludDY0X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4N0Y6IC8vIFVURi04IHN0cmluZyAoaW5kZWZpbml0ZSBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIHdoaWxlIChnZXQoKSAhPSAweEZGKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oY3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCBjdXJyZW50OworICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsICJleHBlY3RlZCBhIENCT1Igc3RyaW5nOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOdW1iZXJUeXBlPgorICAgIEJhc2ljSnNvblR5cGUgZ2V0X2Nib3JfYXJyYXkoY29uc3QgTnVtYmVyVHlwZSBsZW4pCisgICAgeworICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKCpyZXN1bHQubV92YWx1ZS5hcnJheSksIGxlbiwgW3RoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2Nib3JfaW50ZXJuYWwoKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgICBCYXNpY0pzb25UeXBlIGdldF9jYm9yX29iamVjdChjb25zdCBOdW1iZXJUeXBlIGxlbikKKyAgICB7CisgICAgICAgIEJhc2ljSnNvblR5cGUgcmVzdWx0ID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjppbnNlcnRlcigqcmVzdWx0Lm1fdmFsdWUub2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5vYmplY3QtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgW3RoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICBhdXRvIGtleSA9IGdldF9jYm9yX3N0cmluZygpOworICAgICAgICAgICAgYXV0byB2YWwgPSBwYXJzZV9jYm9yX2ludGVybmFsKCk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc3RkOjptb3ZlKGtleSksIHN0ZDo6bW92ZSh2YWwpKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJlYWRzIGEgTWVzc2FnZVBhY2sgc3RyaW5nCisKKyAgICBUaGlzIGZ1bmN0aW9uIGZpcnN0IHJlYWRzIHN0YXJ0aW5nIGJ5dGVzIHRvIGRldGVybWluZSB0aGUgZXhwZWN0ZWQKKyAgICBzdHJpbmcgbGVuZ3RoIGFuZCB0aGVuIGNvcGllcyB0aGlzIG51bWJlciBvZiBieXRlcyBpbnRvIGEgc3RyaW5nLgorCisgICAgQHJldHVybiBzdHJpbmcKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEzIGlmIGFuIHVuZXhwZWN0ZWQgYnl0ZSBpcyByZWFkCisgICAgKi8KKyAgICBzdHJpbmdfdCBnZXRfbXNncGFja19zdHJpbmcoKQorICAgIHsKKyAgICAgICAgdW5leHBlY3RfZW9mKCk7CisKKyAgICAgICAgc3dpdGNoIChjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmaXhzdHIKKyAgICAgICAgICAgIGNhc2UgMHhBMDoKKyAgICAgICAgICAgIGNhc2UgMHhBMToKKyAgICAgICAgICAgIGNhc2UgMHhBMjoKKyAgICAgICAgICAgIGNhc2UgMHhBMzoKKyAgICAgICAgICAgIGNhc2UgMHhBNDoKKyAgICAgICAgICAgIGNhc2UgMHhBNToKKyAgICAgICAgICAgIGNhc2UgMHhBNjoKKyAgICAgICAgICAgIGNhc2UgMHhBNzoKKyAgICAgICAgICAgIGNhc2UgMHhBODoKKyAgICAgICAgICAgIGNhc2UgMHhBOToKKyAgICAgICAgICAgIGNhc2UgMHhBQToKKyAgICAgICAgICAgIGNhc2UgMHhBQjoKKyAgICAgICAgICAgIGNhc2UgMHhBQzoKKyAgICAgICAgICAgIGNhc2UgMHhBRDoKKyAgICAgICAgICAgIGNhc2UgMHhBRToKKyAgICAgICAgICAgIGNhc2UgMHhBRjoKKyAgICAgICAgICAgIGNhc2UgMHhCMDoKKyAgICAgICAgICAgIGNhc2UgMHhCMToKKyAgICAgICAgICAgIGNhc2UgMHhCMjoKKyAgICAgICAgICAgIGNhc2UgMHhCMzoKKyAgICAgICAgICAgIGNhc2UgMHhCNDoKKyAgICAgICAgICAgIGNhc2UgMHhCNToKKyAgICAgICAgICAgIGNhc2UgMHhCNjoKKyAgICAgICAgICAgIGNhc2UgMHhCNzoKKyAgICAgICAgICAgIGNhc2UgMHhCODoKKyAgICAgICAgICAgIGNhc2UgMHhCOToKKyAgICAgICAgICAgIGNhc2UgMHhCQToKKyAgICAgICAgICAgIGNhc2UgMHhCQjoKKyAgICAgICAgICAgIGNhc2UgMHhCQzoKKyAgICAgICAgICAgIGNhc2UgMHhCRDoKKyAgICAgICAgICAgIGNhc2UgMHhCRToKKyAgICAgICAgICAgIGNhc2UgMHhCRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhjdXJyZW50ICYgMHgxRik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgMHhEOTogLy8gc3RyIDgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4REE6IC8vIHN0ciAxNgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8dWludDE2X3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDB4REI6IC8vIHN0ciAzMgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8dWludDMyX3Q+KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCBjdXJyZW50OworICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIE1lc3NhZ2VQYWNrIHN0cmluZzsgbGFzdCBieXRlOiAweCIgKyBzcy5zdHIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgICBCYXNpY0pzb25UeXBlIGdldF9tc2dwYWNrX2FycmF5KGNvbnN0IE51bWJlclR5cGUgbGVuKQorICAgIHsKKyAgICAgICAgQmFzaWNKc29uVHlwZSByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6YmFja19pbnNlcnRlcigqcmVzdWx0Lm1fdmFsdWUuYXJyYXkpLCBsZW4sIFt0aGlzXSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZV9tc2dwYWNrX2ludGVybmFsKCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE51bWJlclR5cGU+CisgICAgQmFzaWNKc29uVHlwZSBnZXRfbXNncGFja19vYmplY3QoY29uc3QgTnVtYmVyVHlwZSBsZW4pCisgICAgeworICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6aW5zZXJ0ZXIoKnJlc3VsdC5tX3ZhbHVlLm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUub2JqZWN0LT5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIFt0aGlzXSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfbXNncGFja19zdHJpbmcoKTsKKyAgICAgICAgICAgIGF1dG8gdmFsID0gcGFyc2VfbXNncGFja19pbnRlcm5hbCgpOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZWFkcyBhIFVCSlNPTiBzdHJpbmcKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgZWl0aGVyIGNhbGxlZCBhZnRlciByZWFkaW5nIHRoZSAnUycgYnl0ZSBleHBsaWNpdGx5CisgICAgaW5kaWNhdGluZyBhIHN0cmluZywgb3IgaW4gY2FzZSBvZiBhbiBvYmplY3Qga2V5IHdoZXJlIHRoZSAnUycgYnl0ZSBjYW4gYmUKKyAgICBsZWZ0IG91dC4KKworICAgIEBwYXJhbVtpbl0gZ2V0X2NoYXIgIHdoZXRoZXIgYSBuZXcgY2hhcmFjdGVyIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAodHJ1ZSwgZGVmYXVsdCkgb3Igd2hldGhlciB0aGUgbGFzdCByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGluc3RlYWQKKworICAgIEByZXR1cm4gc3RyaW5nCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGVuZGVkCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMyBpZiBhbiB1bmV4cGVjdGVkIGJ5dGUgaXMgcmVhZAorICAgICovCisgICAgc3RyaW5nX3QgZ2V0X3VianNvbl9zdHJpbmcoY29uc3QgYm9vbCBnZXRfY2hhciA9IHRydWUpCisgICAgeworICAgICAgICBpZiAoZ2V0X2NoYXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCgpOyAgLy8gVE9ETzogbWF5IHdlIGlnbm9yZSBOIGhlcmU/CisgICAgICAgIH0KKworICAgICAgICB1bmV4cGVjdF9lb2YoKTsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8dWludDhfdD4oKSk7CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPGludDhfdD4oKSk7CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPGludDE2X3Q+KCkpOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9zdHJpbmcoZ2V0X251bWJlcjxpbnQzMl90PigpKTsKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8aW50NjRfdD4oKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCBjdXJyZW50OworICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIFVCSlNPTiBzdHJpbmc7IGxhc3QgYnl0ZTogMHgiICsgc3Muc3RyKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXRlcm1pbmUgdGhlIHR5cGUgYW5kIHNpemUgZm9yIGEgY29udGFpbmVyCisKKyAgICBJbiB0aGUgb3B0aW1pemVkIFVCSlNPTiBmb3JtYXQsIGEgdHlwZSBhbmQgYSBzaXplIGNhbiBiZSBwcm92aWRlZCB0byBhbGxvdworICAgIGZvciBhIG1vcmUgY29tcGFjdCByZXByZXNlbnRhdGlvbi4KKworICAgIEByZXR1cm4gcGFpciBvZiB0aGUgc2l6ZSBhbmQgdGhlIHR5cGUKKyAgICAqLworICAgIHN0ZDo6cGFpcjxzdGQ6OnNpemVfdCwgaW50PiBnZXRfdWJqc29uX3NpemVfdHlwZSgpCisgICAgeworICAgICAgICBzdGQ6OnNpemVfdCBzeiA9IHN0cmluZ190OjpucG9zOworICAgICAgICBpbnQgdGMgPSAwOworCisgICAgICAgIGdldF9pZ25vcmVfbm9vcCgpOworCisgICAgICAgIGlmIChjdXJyZW50ID09ICckJykKKyAgICAgICAgeworICAgICAgICAgICAgdGMgPSBnZXQoKTsgIC8vIG11c3Qgbm90IGlnbm9yZSAnTicsIGJlY2F1c2UgJ04nIG1heWJlIHRoZSB0eXBlCisgICAgICAgICAgICB1bmV4cGVjdF9lb2YoKTsKKworICAgICAgICAgICAgZ2V0X2lnbm9yZV9ub29wKCk7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSAnIycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMiwgY2hhcnNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICcjJyBhZnRlciBVQkpTT04gdHlwZSBpbmZvcm1hdGlvbjsgbGFzdCBieXRlOiAweCIgKyBzcy5zdHIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ogPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09ICcjJykKKyAgICAgICAgeworICAgICAgICAgICAgc3ogPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzeiwgdGMpOworICAgIH0KKworICAgIEJhc2ljSnNvblR5cGUgZ2V0X3VianNvbl92YWx1ZShjb25zdCBpbnQgcHJlZml4KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwcmVmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2Ugc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCk6ICAvLyBFT0YKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTEwLCBjaGFyc19yZWFkLCAidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7CisKKyAgICAgICAgICAgIGNhc2UgJ1QnOiAgLy8gdHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnRic6ICAvLyBmYWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgY2FzZSAnWic6ICAvLyBudWxsCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPHVpbnQ4X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQ4X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQxNl90PigpOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGludDY0X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxmbG9hdD4oKTsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGRvdWJsZT4oKTsKKworICAgICAgICAgICAgY2FzZSAnQyc6ICAvLyBjaGFyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CisgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY3VycmVudCA+IDEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSBhZnRlciAnQycgbXVzdCBiZSBpbiByYW5nZSAweDAwLi4weDdGOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdfdCgxLCBzdGF0aWNfY2FzdDxjaGFyPihjdXJyZW50KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ1MnOiAgLy8gc3RyaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF91Ympzb25fc3RyaW5nKCk7CisKKyAgICAgICAgICAgIGNhc2UgJ1snOiAgLy8gYXJyYXkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3VianNvbl9hcnJheSgpOworCisgICAgICAgICAgICBjYXNlICd7JzogIC8vIG9iamVjdAorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfdWJqc29uX29iamVjdCgpOworCisgICAgICAgICAgICBkZWZhdWx0OiAvLyBhbnl0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMiwgY2hhcnNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHJlYWRpbmcgVUJKU09OOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCYXNpY0pzb25UeXBlIGdldF91Ympzb25fYXJyYXkoKQorICAgIHsKKyAgICAgICAgQmFzaWNKc29uVHlwZSByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgY29uc3QgYXV0byBzaXplX2FuZF90eXBlID0gZ2V0X3VianNvbl9zaXplX3R5cGUoKTsKKworICAgICAgICBpZiAoc2l6ZV9hbmRfdHlwZS5maXJzdCAhPSBzdHJpbmdfdDo6bnBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9ICdOJykKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6YmFja19pbnNlcnRlcigqcmVzdWx0Lm1fdmFsdWUuYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXMsIHNpemVfYW5kX3R5cGVdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRfdWJqc29uX3ZhbHVlKHNpemVfYW5kX3R5cGUuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKCpyZXN1bHQubV92YWx1ZS5hcnJheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfYW5kX3R5cGUuZmlyc3QsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VfdWJqc29uX2ludGVybmFsKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAnXScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV91Ympzb25faW50ZXJuYWwoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBnZXRfaWdub3JlX25vb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQmFzaWNKc29uVHlwZSBnZXRfdWJqc29uX29iamVjdCgpCisgICAgeworICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgY29uc3QgYXV0byBzaXplX2FuZF90eXBlID0gZ2V0X3VianNvbl9zaXplX3R5cGUoKTsKKworICAgICAgICBpZiAoc2l6ZV9hbmRfdHlwZS5maXJzdCAhPSBzdHJpbmdfdDo6bnBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6aW5zZXJ0ZXIoKnJlc3VsdC5tX3ZhbHVlLm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5vYmplY3QtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXMsIHNpemVfYW5kX3R5cGVdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X3VianNvbl9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWwgPSBnZXRfdWJqc29uX3ZhbHVlKHNpemVfYW5kX3R5cGUuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6aW5zZXJ0ZXIoKnJlc3VsdC5tX3ZhbHVlLm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5vYmplY3QtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXNdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X3VianNvbl9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWwgPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAnfScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfdWJqc29uX3N0cmluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0W3N0ZDo6bW92ZShrZXkpXSA9IHBhcnNlX3VianNvbl9pbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIGdldF9pZ25vcmVfbm9vcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgdGhyb3cgaWYgZW5kIG9mIGlucHV0IGlzIG5vdCByZWFjaGVkCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBub3QgZW5kZWQKKyAgICAqLworICAgIHZvaWQgZXhwZWN0X2VvZigpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjdXJyZW50ICE9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMCwgY2hhcnNfcmVhZCwgImV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZnRocm93IGlmIGVuZCBvZiBpbnB1dCBpcyByZWFjaGVkCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBlbmRlZAorICAgICovCisgICAgdm9pZCB1bmV4cGVjdF9lb2YoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY3VycmVudCA9PSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTAsIGNoYXJzX3JlYWQsICJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8vLyBpbnB1dCBhZGFwdGVyCisgICAgaW5wdXRfYWRhcHRlcl90IGlhID0gbnVsbHB0cjsKKworICAgIC8vLyB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKyAgICBpbnQgY3VycmVudCA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOworCisgICAgLy8vIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkCisgICAgc3RkOjpzaXplX3QgY2hhcnNfcmVhZCA9IDA7CisKKyAgICAvLy8gd2hldGhlciB3ZSBjYW4gYXNzdW1lIGxpdHRsZSBlbmRpYW5lc3MKKyAgICBjb25zdCBib29sIGlzX2xpdHRsZV9lbmRpYW4gPSBsaXR0bGVfZW5kaWFuZXNzKCk7Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaW5wdXQvaW5wdXRfYWRhcHRlcnMuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaW5wdXQvaW5wdXRfYWRhcHRlcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjY5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9pbnB1dF9hZGFwdGVycy5ocHAKQEAgLTAsMCArMSwyNjIgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBtaW4KKyNpbmNsdWRlIDxhcnJheT4gLy8gYXJyYXkKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxjc3RkZGVmPiAvLyBzaXplX3QKKyNpbmNsdWRlIDxjc3RyaW5nPiAvLyBzdHJsZW4KKyNpbmNsdWRlIDxpb3M+IC8vIHN0cmVhbXNpemUsIHN0cmVhbW9mZiwgc3RyZWFtcG9zCisjaW5jbHVkZSA8aXN0cmVhbT4gLy8gaXN0cmVhbQorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBiZWdpbiwgZW5kLCBpdGVyYXRvcl90cmFpdHMsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBkaXN0YW5jZSwgbmV4dAorI2luY2x1ZGUgPG1lbW9yeT4gLy8gc2hhcmVkX3B0ciwgbWFrZV9zaGFyZWQsIGFkZHJlc3NvZgorI2luY2x1ZGUgPG51bWVyaWM+IC8vIGFjY3VtdWxhdGUKKyNpbmNsdWRlIDxzdHJpbmc+IC8vIHN0cmluZywgY2hhcl90cmFpdHMKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy8gZW5hYmxlX2lmLCBpc19iYXNlX29mLCBpc19wb2ludGVyLCBpc19pbnRlZ3JhbCwgcmVtb3ZlX3BvaW50ZXIKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBwYWlyLCBkZWNsdmFsCisKKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBpbnB1dCBhZGFwdGVycyAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyohCitAYnJpZWYgYWJzdHJhY3QgaW5wdXQgYWRhcHRlciBpbnRlcmZhY2UKKworUHJvZHVjZXMgYSBzdHJlYW0gb2Ygc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgY2hhcmFjdGVycyBmcm9tIGEKK3N0ZDo6aXN0cmVhbSwgYSBidWZmZXIsIG9yIHNvbWUgb3RoZXIgaW5wdXQgdHlwZS4gIEFjY2VwdHMgdGhlIHJldHVybiBvZiBleGFjdGx5CitvbmUgbm9uLUVPRiBjaGFyYWN0ZXIgZm9yIGZ1dHVyZSBpbnB1dC4gIFRoZSBpbnRfdHlwZSBjaGFyYWN0ZXJzIHJldHVybmVkCitjb25zaXN0IG9mIGFsbCB2YWxpZCBjaGFyIHZhbHVlcyBhcyBwb3NpdGl2ZSB2YWx1ZXMgKHR5cGljYWxseSB1bnNpZ25lZCBjaGFyKSwKK3BsdXMgYW4gRU9GIHZhbHVlIG91dHNpZGUgdGhhdCByYW5nZSwgc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24KK3N0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpLiAgVGhpcyB2YWx1ZSBpcyB0eXBpY2FsbHkgLTEsIGJ1dCBjb3VsZCBiZSBhbnkKK2FyYml0cmFyeSB2YWx1ZSB3aGljaCBpcyBub3QgYSB2YWxpZCBjaGFyIHZhbHVlLgorKi8KK3N0cnVjdCBpbnB1dF9hZGFwdGVyX3Byb3RvY29sCit7CisgICAgLy8vIGdldCBhIGNoYXJhY3RlciBbMCwyNTVdIG9yIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpLgorICAgIHZpcnR1YWwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgZ2V0X2NoYXJhY3RlcigpID0gMDsKKyAgICAvLy8gcmVzdG9yZSB0aGUgbGFzdCBub24tZW9mKCkgY2hhcmFjdGVyIHRvIGlucHV0CisgICAgdmlydHVhbCB2b2lkIHVuZ2V0X2NoYXJhY3RlcigpID0gMDsKKyAgICB2aXJ0dWFsIH5pbnB1dF9hZGFwdGVyX3Byb3RvY29sKCkgPSBkZWZhdWx0OworfTsKKworLy8vIGEgdHlwZSB0byBzaW1wbGlmeSBpbnRlcmZhY2VzCit1c2luZyBpbnB1dF9hZGFwdGVyX3QgPSBzdGQ6OnNoYXJlZF9wdHI8aW5wdXRfYWRhcHRlcl9wcm90b2NvbD47CisKKy8qIQorSW5wdXQgYWRhcHRlciBmb3IgYSAoY2FjaGluZykgaXN0cmVhbS4gSWdub3JlcyBhIFVGVCBCeXRlIE9yZGVyIE1hcmsgYXQKK2JlZ2lubmluZyBvZiBpbnB1dC4gRG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdW5kZXJseWluZyBzdGQ6OnN0cmVhbWJ1ZgoraW4gbWlkLWlucHV0LiBNYWludGFpbnMgdW5kZXJseWluZyBzdGQ6OmlzdHJlYW0gYW5kIHN0ZDo6c3RyZWFtYnVmIHRvIHN1cHBvcnQKK3N1YnNlcXVlbnQgdXNlIG9mIHN0YW5kYXJkIHN0ZDo6aXN0cmVhbSBvcGVyYXRpb25zIHRvIHByb2Nlc3MgYW55IGlucHV0CitjaGFyYWN0ZXJzIGZvbGxvd2luZyB0aG9zZSB1c2VkIGluIHBhcnNpbmcgdGhlIEpTT04gaW5wdXQuICBDbGVhcnMgdGhlCitzdGQ6OmlzdHJlYW0gZmxhZ3M7IGFueSBpbnB1dCBlcnJvcnMgKGUuZy4sIEVPRikgd2lsbCBiZSBkZXRlY3RlZCBieSB0aGUgZmlyc3QKK3N1YnNlcXVlbnQgY2FsbCBmb3IgaW5wdXQgZnJvbSB0aGUgc3RkOjppc3RyZWFtLgorKi8KK2NsYXNzIGlucHV0X3N0cmVhbV9hZGFwdGVyIDogcHVibGljIGlucHV0X2FkYXB0ZXJfcHJvdG9jb2wKK3sKKyAgcHVibGljOgorICAgIH5pbnB1dF9zdHJlYW1fYWRhcHRlcigpIG92ZXJyaWRlCisgICAgeworICAgICAgICAvLyBjbGVhciBzdHJlYW0gZmxhZ3M7IHdlIHVzZSB1bmRlcmx5aW5nIHN0cmVhbWJ1ZiBJL08sIGRvIG5vdAorICAgICAgICAvLyBtYWludGFpbiBpZnN0cmVhbSBmbGFncworICAgICAgICBpcy5jbGVhcigpOworICAgIH0KKworICAgIGV4cGxpY2l0IGlucHV0X3N0cmVhbV9hZGFwdGVyKHN0ZDo6aXN0cmVhbSYgaSkKKyAgICAgICAgOiBpcyhpKSwgc2IoKmkucmRidWYoKSkKKyAgICB7CisgICAgICAgIC8vIHNraXAgYnl0ZSBvcmRlciBtYXJrCisgICAgICAgIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGM7CisgICAgICAgIGlmICgoYyA9IGdldF9jaGFyYWN0ZXIoKSkgPT0gMHhFRikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjID0gZ2V0X2NoYXJhY3RlcigpKSA9PSAweEJCKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYyA9IGdldF9jaGFyYWN0ZXIoKSkgPT0gMHhCRikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIEJPTQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjICE9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXMudW5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXMucHV0YmFjaygnXHhCQicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyAhPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpcy51bmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMucHV0YmFjaygnXHhFRicpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgIT0gc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlzLnVuZ2V0KCk7IC8vIG5vIGJ5dGUgb3JkZXIgbWFyazsgcHJvY2VzcyBhcyB1c3VhbAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGVsZXRlIGJlY2F1c2Ugb2YgcG9pbnRlciBtZW1iZXJzCisgICAgaW5wdXRfc3RyZWFtX2FkYXB0ZXIoY29uc3QgaW5wdXRfc3RyZWFtX2FkYXB0ZXImKSA9IGRlbGV0ZTsKKyAgICBpbnB1dF9zdHJlYW1fYWRhcHRlciYgb3BlcmF0b3I9KGlucHV0X3N0cmVhbV9hZGFwdGVyJikgPSBkZWxldGU7CisKKyAgICAvLyBzdGQ6OmlzdHJlYW0vc3RkOjpzdHJlYW1idWYgdXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OnRvX2ludF90eXBlLCB0bworICAgIC8vIGVuc3VyZSB0aGF0IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpIGFuZCB0aGUgY2hhcmFjdGVyIDB4RkYgZG8gbm90CisgICAgLy8gZW5kIHVwIGFzIHRoZSBzYW1lIHZhbHVlLCBlZy4gMHhGRkZGRkZGRi4KKyAgICBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBnZXRfY2hhcmFjdGVyKCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBzYi5zYnVtcGMoKTsKKyAgICB9CisKKyAgICB2b2lkIHVuZ2V0X2NoYXJhY3RlcigpIG92ZXJyaWRlCisgICAgeworICAgICAgICBzYi5zdW5nZXRjKCk7ICAvLyBpcy51bmdldCgpIGF2b2lkZWQgZm9yIHBlcmZvcm1hbmNlCisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8vIHRoZSBhc3NvY2lhdGVkIGlucHV0IHN0cmVhbQorICAgIHN0ZDo6aXN0cmVhbSYgaXM7CisgICAgc3RkOjpzdHJlYW1idWYmIHNiOworfTsKKworLy8vIGlucHV0IGFkYXB0ZXIgZm9yIGJ1ZmZlciBpbnB1dAorY2xhc3MgaW5wdXRfYnVmZmVyX2FkYXB0ZXIgOiBwdWJsaWMgaW5wdXRfYWRhcHRlcl9wcm90b2NvbAoreworICBwdWJsaWM6CisgICAgaW5wdXRfYnVmZmVyX2FkYXB0ZXIoY29uc3QgY2hhciogYiwgY29uc3Qgc3RkOjpzaXplX3QgbCkKKyAgICAgICAgOiBjdXJzb3IoYiksIGxpbWl0KGIgKyBsKSwgc3RhcnQoYikKKyAgICB7CisgICAgICAgIC8vIHNraXAgYnl0ZSBvcmRlciBtYXJrCisgICAgICAgIGlmIChsID49IDMgYW5kIGJbMF0gPT0gJ1x4RUYnIGFuZCBiWzFdID09ICdceEJCJyBhbmQgYlsyXSA9PSAnXHhCRicpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnNvciArPSAzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGVsZXRlIGJlY2F1c2Ugb2YgcG9pbnRlciBtZW1iZXJzCisgICAgaW5wdXRfYnVmZmVyX2FkYXB0ZXIoY29uc3QgaW5wdXRfYnVmZmVyX2FkYXB0ZXImKSA9IGRlbGV0ZTsKKyAgICBpbnB1dF9idWZmZXJfYWRhcHRlciYgb3BlcmF0b3I9KGlucHV0X2J1ZmZlcl9hZGFwdGVyJikgPSBkZWxldGU7CisKKyAgICBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+OjppbnRfdHlwZSBnZXRfY2hhcmFjdGVyKCkgbm9leGNlcHQgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIGlmIChKU09OX0xJS0VMWShjdXJzb3IgPCBsaW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojp0b19pbnRfdHlwZSgqKGN1cnNvcisrKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCk7CisgICAgfQorCisgICAgdm9pZCB1bmdldF9jaGFyYWN0ZXIoKSBub2V4Y2VwdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGN1cnNvciA+IHN0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLS1jdXJzb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKyAgICBjb25zdCBjaGFyKiBjdXJzb3I7CisgICAgLy8vIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAgICBjb25zdCBjaGFyKiBsaW1pdDsKKyAgICAvLy8gcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgY29uc3QgY2hhciogc3RhcnQ7Cit9OworCitjbGFzcyBpbnB1dF9hZGFwdGVyCit7CisgIHB1YmxpYzoKKyAgICAvLyBuYXRpdmUgc3VwcG9ydAorCisgICAgLy8vIGlucHV0IGFkYXB0ZXIgZm9yIGlucHV0IHN0cmVhbQorICAgIGlucHV0X2FkYXB0ZXIoc3RkOjppc3RyZWFtJiBpKQorICAgICAgICA6IGlhKHN0ZDo6bWFrZV9zaGFyZWQ8aW5wdXRfc3RyZWFtX2FkYXB0ZXI+KGkpKSB7fQorCisgICAgLy8vIGlucHV0IGFkYXB0ZXIgZm9yIGlucHV0IHN0cmVhbQorICAgIGlucHV0X2FkYXB0ZXIoc3RkOjppc3RyZWFtJiYgaSkKKyAgICAgICAgOiBpYShzdGQ6Om1ha2Vfc2hhcmVkPGlucHV0X3N0cmVhbV9hZGFwdGVyPihpKSkge30KKworICAgIC8vLyBpbnB1dCBhZGFwdGVyIGZvciBidWZmZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVCwKKyAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPENoYXJUPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxDaGFyVD46OnR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8Q2hhclQ+Ojp0eXBlKSA9PSAxLAorICAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMD4KKyAgICBpbnB1dF9hZGFwdGVyKENoYXJUIGIsIHN0ZDo6c2l6ZV90IGwpCisgICAgICAgIDogaWEoc3RkOjptYWtlX3NoYXJlZDxpbnB1dF9idWZmZXJfYWRhcHRlcj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYiksIGwpKSB7fQorCisgICAgLy8gZGVyaXZlZCBzdXBwb3J0CisKKyAgICAvLy8gaW5wdXQgYWRhcHRlciBmb3Igc3RyaW5nIGxpdGVyYWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVCwKKyAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPENoYXJUPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxDaGFyVD46OnR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8Q2hhclQ+Ojp0eXBlKSA9PSAxLAorICAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMD4KKyAgICBpbnB1dF9hZGFwdGVyKENoYXJUIGIpCisgICAgICAgIDogaW5wdXRfYWRhcHRlcihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RybGVuKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGIpKSkge30KKworICAgIC8vLyBpbnB1dCBhZGFwdGVyIGZvciBpdGVyYXRvciByYW5nZSB3aXRoIGNvbnRpZ3VvdXMgc3RvcmFnZQorICAgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHlwZSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yVHlwZT46Oml0ZXJhdG9yX2NhdGVnb3J5LCBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwPgorICAgIGlucHV0X2FkYXB0ZXIoSXRlcmF0b3JUeXBlIGZpcnN0LCBJdGVyYXRvclR5cGUgbGFzdCkKKyAgICB7CisgICAgICAgIC8vIGFzc2VydGlvbiB0byBjaGVjayB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBpcyBpbmRlZWQgY29udGlndW91cywKKyAgICAgICAgLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM1MDA4ODQyLzI2NjM3OCBmb3IgbW9yZSBkaXNjdXNzaW9uCisgICAgICAgIGFzc2VydChzdGQ6OmFjY3VtdWxhdGUoCisgICAgICAgICAgICAgICAgICAgZmlyc3QsIGxhc3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KHRydWUsIDApLAorICAgICAgICAgICAgICAgICAgIFsmZmlyc3RdKHN0ZDo6cGFpcjxib29sLCBpbnQ+IHJlcywgZGVjbHR5cGUoKmZpcnN0KSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcy5maXJzdCAmPSAodmFsID09ICooc3RkOjpuZXh0KHN0ZDo6YWRkcmVzc29mKCpmaXJzdCksIHJlcy5zZWNvbmQrKykpKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0pLmZpcnN0KTsKKworICAgICAgICAvLyBhc3NlcnRpb24gdG8gY2hlY2sgdGhhdCBlYWNoIGVsZW1lbnQgaXMgMSBieXRlIGxvbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHNpemVvZih0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvclR5cGU+Ojp2YWx1ZV90eXBlKSA9PSAxLAorICAgICAgICAgICAgImVhY2ggZWxlbWVudCBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UgbXVzdCBoYXZlIHRoZSBzaXplIG9mIDEgYnl0ZSIpOworCisgICAgICAgIGNvbnN0IGF1dG8gbGVuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KSk7CisgICAgICAgIGlmIChKU09OX0xJS0VMWShsZW4gPiAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQ6IHVzZSB0aGUgYWRkcmVzcyBvZiBmaXJzdAorICAgICAgICAgICAgaWEgPSBzdGQ6Om1ha2Vfc2hhcmVkPGlucHV0X2J1ZmZlcl9hZGFwdGVyPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmKCpmaXJzdCkpLCBsZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhlIGFkZHJlc3Mgb2YgZmlyc3QgY2Fubm90IGJlIHVzZWQ6IHVzZSBudWxscHRyCisgICAgICAgICAgICBpYSA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW5wdXRfYnVmZmVyX2FkYXB0ZXI+KG51bGxwdHIsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gaW5wdXQgYWRhcHRlciBmb3IgYXJyYXkKKyAgICB0ZW1wbGF0ZTxjbGFzcyBULCBzdGQ6OnNpemVfdCBOPgorICAgIGlucHV0X2FkYXB0ZXIoVCAoJmFycmF5KVtOXSkKKyAgICAgICAgOiBpbnB1dF9hZGFwdGVyKHN0ZDo6YmVnaW4oYXJyYXkpLCBzdGQ6OmVuZChhcnJheSkpIHt9CisKKyAgICAvLy8gaW5wdXQgYWRhcHRlciBmb3IgY29udGlndW91cyBjb250YWluZXIKKyAgICB0ZW1wbGF0ZTxjbGFzcyBDb250aWd1b3VzQ29udGFpbmVyLCB0eXBlbmFtZQorICAgICAgICAgICAgIHN0ZDo6ZW5hYmxlX2lmPG5vdCBzdGQ6OmlzX3BvaW50ZXI8Q29udGlndW91c0NvbnRhaW5lcj46OnZhbHVlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxkZWNsdHlwZShzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxDb250aWd1b3VzQ29udGFpbmVyIGNvbnN0PigpKSk+OjppdGVyYXRvcl9jYXRlZ29yeT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwPgorICAgIGlucHV0X2FkYXB0ZXIoY29uc3QgQ29udGlndW91c0NvbnRhaW5lciYgYykKKyAgICAgICAgOiBpbnB1dF9hZGFwdGVyKHN0ZDo6YmVnaW4oYyksIHN0ZDo6ZW5kKGMpKSB7fQorCisgICAgb3BlcmF0b3IgaW5wdXRfYWRhcHRlcl90KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpYTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gdGhlIGFjdHVhbCBhZGFwdGVyCisgICAgaW5wdXRfYWRhcHRlcl90IGlhID0gbnVsbHB0cjsKK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9sZXhlci5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9sZXhlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwMDE2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2lucHV0L2xleGVyLmhwcApAQCAtMCwwICsxLDEyNzcgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2xvY2FsZT4gLy8gbG9jYWxlY29udgorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGNzdGRsaWI+IC8vIHN0cnRvZiwgc3RydG9kLCBzdHJ0b2xkLCBzdHJ0b2xsLCBzdHJ0b3VsbAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+IC8vIGluaXRpYWxpemVyX2xpc3QKKyNpbmNsdWRlIDxpb3M+IC8vIGhleCwgdXBwZXJjYXNlCisjaW5jbHVkZSA8aW9tYW5pcD4gLy8gc2V0dywgc2V0ZmlsbAorI2luY2x1ZGUgPHNzdHJlYW0+IC8vIHN0cmluZ3N0cmVhbQorI2luY2x1ZGUgPHN0cmluZz4gLy8gY2hhcl90cmFpdHMsIHN0cmluZworI2luY2x1ZGUgPHZlY3Rvcj4gLy8gdmVjdG9yCisKKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pbnB1dC9pbnB1dF9hZGFwdGVycy5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8KKy8vIGxleGVyIC8vCisvLy8vLy8vLy8vLworCisvKiEKK0BicmllZiBsZXhpY2FsIGFuYWx5c2lzCisKK1RoaXMgY2xhc3Mgb3JnYW5pemVzIHRoZSBsZXhpY2FsIGFuYWx5c2lzIGR1cmluZyBKU09OIGRlc2VyaWFsaXphdGlvbi4KKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorY2xhc3MgbGV4ZXIKK3sKKyAgICB1c2luZyBudW1iZXJfaW50ZWdlcl90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdDsKKyAgICB1c2luZyBudW1iZXJfdW5zaWduZWRfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl91bnNpZ25lZF90OworICAgIHVzaW5nIG51bWJlcl9mbG9hdF90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2Zsb2F0X3Q7CisKKyAgcHVibGljOgorICAgIC8vLyB0b2tlbiB0eXBlcyBmb3IgdGhlIHBhcnNlcgorICAgIGVudW0gY2xhc3MgdG9rZW5fdHlwZQorICAgIHsKKyAgICAgICAgdW5pbml0aWFsaXplZCwgICAgLy8vPCBpbmRpY2F0aW5nIHRoZSBzY2FubmVyIGlzIHVuaW5pdGlhbGl6ZWQKKyAgICAgICAgbGl0ZXJhbF90cnVlLCAgICAgLy8vPCB0aGUgYHRydWVgIGxpdGVyYWwKKyAgICAgICAgbGl0ZXJhbF9mYWxzZSwgICAgLy8vPCB0aGUgYGZhbHNlYCBsaXRlcmFsCisgICAgICAgIGxpdGVyYWxfbnVsbCwgICAgIC8vLzwgdGhlIGBudWxsYCBsaXRlcmFsCisgICAgICAgIHZhbHVlX3N0cmluZywgICAgIC8vLzwgYSBzdHJpbmcgLS0gdXNlIGdldF9zdHJpbmcoKSBmb3IgYWN0dWFsIHZhbHVlCisgICAgICAgIHZhbHVlX3Vuc2lnbmVkLCAgIC8vLzwgYW4gdW5zaWduZWQgaW50ZWdlciAtLSB1c2UgZ2V0X251bWJlcl91bnNpZ25lZCgpIGZvciBhY3R1YWwgdmFsdWUKKyAgICAgICAgdmFsdWVfaW50ZWdlciwgICAgLy8vPCBhIHNpZ25lZCBpbnRlZ2VyIC0tIHVzZSBnZXRfbnVtYmVyX2ludGVnZXIoKSBmb3IgYWN0dWFsIHZhbHVlCisgICAgICAgIHZhbHVlX2Zsb2F0LCAgICAgIC8vLzwgYW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIC0tIHVzZSBnZXRfbnVtYmVyX2Zsb2F0KCkgZm9yIGFjdHVhbCB2YWx1ZQorICAgICAgICBiZWdpbl9hcnJheSwgICAgICAvLy88IHRoZSBjaGFyYWN0ZXIgZm9yIGFycmF5IGJlZ2luIGBbYAorICAgICAgICBiZWdpbl9vYmplY3QsICAgICAvLy88IHRoZSBjaGFyYWN0ZXIgZm9yIG9iamVjdCBiZWdpbiBge2AKKyAgICAgICAgZW5kX2FycmF5LCAgICAgICAgLy8vPCB0aGUgY2hhcmFjdGVyIGZvciBhcnJheSBlbmQgYF1gCisgICAgICAgIGVuZF9vYmplY3QsICAgICAgIC8vLzwgdGhlIGNoYXJhY3RlciBmb3Igb2JqZWN0IGVuZCBgfWAKKyAgICAgICAgbmFtZV9zZXBhcmF0b3IsICAgLy8vPCB0aGUgbmFtZSBzZXBhcmF0b3IgYDpgCisgICAgICAgIHZhbHVlX3NlcGFyYXRvciwgIC8vLzwgdGhlIHZhbHVlIHNlcGFyYXRvciBgLGAKKyAgICAgICAgcGFyc2VfZXJyb3IsICAgICAgLy8vPCBpbmRpY2F0aW5nIGEgcGFyc2UgZXJyb3IKKyAgICAgICAgZW5kX29mX2lucHV0LCAgICAgLy8vPCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlcgorICAgICAgICBsaXRlcmFsX29yX3ZhbHVlICAvLy88IGEgbGl0ZXJhbCBvciB0aGUgYmVnaW4gb2YgYSB2YWx1ZSAob25seSBmb3IgZGlhZ25vc3RpY3MpCisgICAgfTsKKworICAgIC8vLyByZXR1cm4gbmFtZSBvZiB2YWx1ZXMgb2YgdHlwZSB0b2tlbl90eXBlIChvbmx5IHVzZWQgZm9yIGVycm9ycykKKyAgICBzdGF0aWMgY29uc3QgY2hhciogdG9rZW5fdHlwZV9uYW1lKGNvbnN0IHRva2VuX3R5cGUgdCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHN3aXRjaCAodCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp1bmluaXRpYWxpemVkOgorICAgICAgICAgICAgICAgIHJldHVybiAiPHVuaW5pdGlhbGl6ZWQ+IjsKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6bGl0ZXJhbF90cnVlOgorICAgICAgICAgICAgICAgIHJldHVybiAidHJ1ZSBsaXRlcmFsIjsKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6bGl0ZXJhbF9mYWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhbHNlIGxpdGVyYWwiOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpsaXRlcmFsX251bGw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIGxpdGVyYWwiOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmcgbGl0ZXJhbCI7CisgICAgICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDoKKyAgICAgICAgICAgIGNhc2UgbGV4ZXI6OnRva2VuX3R5cGU6OnZhbHVlX2ludGVnZXI6CisgICAgICAgICAgICBjYXNlIGxleGVyOjp0b2tlbl90eXBlOjp2YWx1ZV9mbG9hdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciBsaXRlcmFsIjsKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6YmVnaW5fYXJyYXk6CisgICAgICAgICAgICAgICAgcmV0dXJuICInWyciOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpiZWdpbl9vYmplY3Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICIneyciOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjplbmRfYXJyYXk6CisgICAgICAgICAgICAgICAgcmV0dXJuICInXSciOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjplbmRfb2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAiJ30nIjsKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6bmFtZV9zZXBhcmF0b3I6CisgICAgICAgICAgICAgICAgcmV0dXJuICInOiciOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV9zZXBhcmF0b3I6CisgICAgICAgICAgICAgICAgcmV0dXJuICInLCciOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxwYXJzZSBlcnJvcj4iOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjplbmRfb2ZfaW5wdXQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmQgb2YgaW5wdXQiOworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpsaXRlcmFsX29yX3ZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiAiJ1snLCAneycsIG9yIGEgbGl0ZXJhbCI7CisgICAgICAgICAgICBkZWZhdWx0OiAvLyBjYXRjaCBub24tZW51bSB2YWx1ZXMKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gdG9rZW4iOyAvLyBMQ09WX0VYQ0xfTElORQorICAgICAgICB9CisgICAgfQorCisgICAgZXhwbGljaXQgbGV4ZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyX3QgYWRhcHRlcikKKyAgICAgICAgOiBpYShzdGQ6Om1vdmUoYWRhcHRlcikpLCBkZWNpbWFsX3BvaW50X2NoYXIoZ2V0X2RlY2ltYWxfcG9pbnQoKSkge30KKworICAgIC8vIGRlbGV0ZSBiZWNhdXNlIG9mIHBvaW50ZXIgbWVtYmVycworICAgIGxleGVyKGNvbnN0IGxleGVyJikgPSBkZWxldGU7CisgICAgbGV4ZXImIG9wZXJhdG9yPShsZXhlciYpID0gZGVsZXRlOworCisgIHByaXZhdGU6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gbG9jYWxlcworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vIHJldHVybiB0aGUgbG9jYWxlLWRlcGVuZGVudCBkZWNpbWFsIHBvaW50CisgICAgc3RhdGljIGNoYXIgZ2V0X2RlY2ltYWxfcG9pbnQoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgY29uc3QgYXV0byBsb2MgPSBsb2NhbGVjb252KCk7CisgICAgICAgIGFzc2VydChsb2MgIT0gbnVsbHB0cik7CisgICAgICAgIHJldHVybiAobG9jLT5kZWNpbWFsX3BvaW50ID09IG51bGxwdHIpID8gJy4nIDogKihsb2MtPmRlY2ltYWxfcG9pbnQpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIHNjYW4gZnVuY3Rpb25zCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKiEKKyAgICBAYnJpZWYgZ2V0IGNvZGVwb2ludCBmcm9tIDQgaGV4IGNoYXJhY3RlcnMgZm9sbG93aW5nIGBcdWAKKworICAgIEZvciBpbnB1dCAiXHUgYzEgYzIgYzMgYzQiIHRoZSBjb2RlcG9pbnQgaXM6CisgICAgICAoYzEgKiAweDEwMDApICsgKGMyICogMHgwMTAwKSArIChjMyAqIDB4MDAxMCkgKyBjNAorICAgID0gKGMxIDw8IDEyKSArIChjMiA8PCA4KSArIChjMyA8PCA0KSArIChjNCA8PCAwKQorCisgICAgRnVydGhlcm1vcmUsIHRoZSBwb3NzaWJsZSBjaGFyYWN0ZXJzICcwJy4uJzknLCAnQScuLidGJywgYW5kICdhJy4uJ2YnCisgICAgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGludGVnZXJzIDB4MC4uMHg5LCAweEEuLjB4RiwgMHhBLi4weEYsIHJlc3AuIFRoZQorICAgIGNvbnZlcnNpb24gaXMgZG9uZSBieSBzdWJ0cmFjdGluZyB0aGUgb2Zmc2V0ICgweDMwLCAweDM3LCBhbmQgMHg1NykKKyAgICBiZXR3ZWVuIHRoZSBBU0NJSSB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyIGFuZCB0aGUgZGVzaXJlZCBpbnRlZ2VyIHZhbHVlLgorCisgICAgQHJldHVybiBjb2RlcG9pbnQgKDB4MDAwMC4uMHhGRkZGKSBvciAtMSBpbiBjYXNlIG9mIGFuIGVycm9yIChlLmcuIEVPRiBvcgorICAgICAgICAgICAgbm9uLWhleCBjaGFyYWN0ZXIpCisgICAgKi8KKyAgICBpbnQgZ2V0X2NvZGVwb2ludCgpCisgICAgeworICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgYWZ0ZXIgcmVhZGluZyBgXHVgCisgICAgICAgIGFzc2VydChjdXJyZW50ID09ICd1Jyk7CisgICAgICAgIGludCBjb2RlcG9pbnQgPSAwOworCisgICAgICAgIGNvbnN0IGF1dG8gZmFjdG9ycyA9IHsgMTIsIDgsIDQsIDAgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIGZhY3RvciA6IGZhY3RvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCgpOworCisgICAgICAgICAgICBpZiAoY3VycmVudCA+PSAnMCcgYW5kIGN1cnJlbnQgPD0gJzknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvZGVwb2ludCArPSAoKGN1cnJlbnQgLSAweDMwKSA8PCBmYWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA+PSAnQScgYW5kIGN1cnJlbnQgPD0gJ0YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvZGVwb2ludCArPSAoKGN1cnJlbnQgLSAweDM3KSA8PCBmYWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA+PSAnYScgYW5kIGN1cnJlbnQgPD0gJ2YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvZGVwb2ludCArPSAoKGN1cnJlbnQgLSAweDU3KSA8PCBmYWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCgweDAwMDAgPD0gY29kZXBvaW50IGFuZCBjb2RlcG9pbnQgPD0gMHhGRkZGKTsKKyAgICAgICAgcmV0dXJuIGNvZGVwb2ludDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY2hlY2sgaWYgdGhlIG5leHQgYnl0ZShzKSBhcmUgaW5zaWRlIGEgZ2l2ZW4gcmFuZ2UKKworICAgIEFkZHMgdGhlIGN1cnJlbnQgYnl0ZSBhbmQsIGZvciBlYWNoIHBhc3NlZCByYW5nZSwgcmVhZHMgYSBuZXcgYnl0ZSBhbmQKKyAgICBjaGVja3MgaWYgaXQgaXMgaW5zaWRlIHRoZSByYW5nZS4gSWYgYSB2aW9sYXRpb24gd2FzIGRldGVjdGVkLCBzZXQgdXAgYW4KKyAgICBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gZmFsc2UuIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuCisKKyAgICBAcGFyYW1baW5dIHJhbmdlcyAgbGlzdCBvZiBpbnRlZ2VyczsgaW50ZXJwcmV0ZWQgYXMgbGlzdCBvZiBwYWlycyBvZgorICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kLCByZXNwZWN0aXZlbHkKKworICAgIEBwcmUgVGhlIHBhc3NlZCBsaXN0IEBhIHJhbmdlcyBtdXN0IGhhdmUgMiwgNCwgb3IgNiBlbGVtZW50czsgdGhhdCBpcywKKyAgICAgICAgIDEsIDIsIG9yIDMgcGFpcnMuIFRoaXMgcHJlY29uZGl0aW9uIGlzIGVuZm9yY2VkIGJ5IGFuIGFzc2VydGlvbi4KKworICAgIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiBubyByYW5nZSB2aW9sYXRpb24gd2FzIGRldGVjdGVkCisgICAgKi8KKyAgICBib29sIG5leHRfYnl0ZV9pbl9yYW5nZShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50PiByYW5nZXMpCisgICAgeworICAgICAgICBhc3NlcnQocmFuZ2VzLnNpemUoKSA9PSAyIG9yIHJhbmdlcy5zaXplKCkgPT0gNCBvciByYW5nZXMuc2l6ZSgpID09IDYpOworICAgICAgICBhZGQoY3VycmVudCk7CisKKyAgICAgICAgZm9yIChhdXRvIHJhbmdlID0gcmFuZ2VzLmJlZ2luKCk7IHJhbmdlICE9IHJhbmdlcy5lbmQoKTsgKytyYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoKnJhbmdlIDw9IGN1cnJlbnQgYW5kIGN1cnJlbnQgPD0gKigrK3JhbmdlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGlsbC1mb3JtZWQgVVRGLTggYnl0ZSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHNjYW4gYSBzdHJpbmcgbGl0ZXJhbAorCisgICAgVGhpcyBmdW5jdGlvbiBzY2FucyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gU2VjdC4gNyBvZiBSRkMgNzE1OS4gV2hpbGUKKyAgICBzY2FubmluZywgYnl0ZXMgYXJlIGVzY2FwZWQgYW5kIGNvcGllZCBpbnRvIGJ1ZmZlciB0b2tlbl9idWZmZXIuIFRoZW4gdGhlCisgICAgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHksIHRva2VuX2J1ZmZlciBpcyAqbm90KiBudWxsLXRlcm1pbmF0ZWQgKGFzIGl0CisgICAgbWF5IGNvbnRhaW4gXDAgYnl0ZXMpLCBhbmQgdG9rZW5fYnVmZmVyLnNpemUoKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgIHN0cmluZy4KKworICAgIEByZXR1cm4gdG9rZW5fdHlwZTo6dmFsdWVfc3RyaW5nIGlmIHN0cmluZyBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgc2Nhbm5lZCwKKyAgICAgICAgICAgIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yIG90aGVyd2lzZQorCisgICAgQG5vdGUgSW4gY2FzZSBvZiBlcnJvcnMsIHZhcmlhYmxlIGVycm9yX21lc3NhZ2UgY29udGFpbnMgYSB0ZXh0dWFsCisgICAgICAgICAgZGVzY3JpcHRpb24uCisgICAgKi8KKyAgICB0b2tlbl90eXBlIHNjYW5fc3RyaW5nKCkKKyAgICB7CisgICAgICAgIC8vIHJlc2V0IHRva2VuX2J1ZmZlciAoaWdub3JlIG9wZW5pbmcgcXVvdGUpCisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgLy8gd2UgZW50ZXJlZCB0aGUgZnVuY3Rpb24gYnkgcmVhZGluZyBhbiBvcGVuIHF1b3RlCisgICAgICAgIGFzc2VydChjdXJyZW50ID09ICdcIicpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHN3aXRjaCAoZ2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGZpbGUgd2hpbGUgcGFyc2luZyBzdHJpbmcKKyAgICAgICAgICAgICAgICBjYXNlIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogbWlzc2luZyBjbG9zaW5nIHF1b3RlIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgcXVvdGUKKyAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6dmFsdWVfc3RyaW5nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGVzY2FwZXMKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdW90YXRpb24gbWFyaworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXCInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2Ugc29saWR1cworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbGlkdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnLycpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3NwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoJ1xiJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtIGZlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXGYnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgZmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKCdcbicpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmlhZ2UgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoJ1xyJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgnXHQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pY29kZSBlc2NhcGVzCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZXBvaW50MSA9IGdldF9jb2RlcG9pbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZXBvaW50ID0gY29kZXBvaW50MTsgLy8gc3RhcnQgd2l0aCBjb2RlcG9pbnQxCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjb2RlcG9pbnQxID09IC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6ICdcXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXggZGlnaXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvZGUgcG9pbnQgaXMgYSBoaWdoIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgweEQ4MDAgPD0gY29kZXBvaW50MSBhbmQgY29kZXBvaW50MSA8PSAweERCRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3QgbmV4dCBcdXh4eHggZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKGdldCgpID09ICdcXCcgYW5kIGdldCgpID09ICd1JykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2RlcG9pbnQyID0gZ2V0X2NvZGVwb2ludCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjb2RlcG9pbnQyID09IC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiAnXFx1JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4IGRpZ2l0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjb2RlcG9pbnQyIGlzIGEgbG93IHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKDB4REMwMCA8PSBjb2RlcG9pbnQyIGFuZCBjb2RlcG9pbnQyIDw9IDB4REZGRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZ2ggc3Vycm9nYXRlIG9jY3VwaWVzIHRoZSBtb3N0IHNpZ25pZmljYW50IDIyIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGVwb2ludDEgPDwgMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvdyBzdXJyb2dhdGUgb2NjdXBpZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDE1IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2RlcG9pbnQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIHN0aWxsIHRoZSAweEQ4MDAsIDB4REMwMCBhbmQgMHgxMDAwMCBub2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgdG8gc3VidHJhY3Qgd2l0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDB4RDgwMCA8PCAxMCkgKyBEQzAwIC0gMHgxMDAwMCA9IDB4MzVGREMwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDB4MzVGREMwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBzdXJyb2dhdGUgVStEQzAwLi5VK0RGRkYgbXVzdCBiZSBmb2xsb3dlZCBieSBVK0RDMDAuLlUrREZGRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogc3Vycm9nYXRlIFUrREMwMC4uVStERkZGIG11c3QgYmUgZm9sbG93ZWQgYnkgVStEQzAwLi5VK0RGRkYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKDB4REMwMCA8PSBjb2RlcG9pbnQxIGFuZCBjb2RlcG9pbnQxIDw9IDB4REZGRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IHN1cnJvZ2F0ZSBVK0RDMDAuLlUrREZGRiBtdXN0IGZvbGxvdyBVK0Q4MDAuLlUrREJGRiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQgb2YgdGhlIGFib3ZlIGNhbGN1bGF0aW9uIHlpZWxkcyBhIHByb3BlciBjb2RlcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMHgwMCA8PSBjb2RlcG9pbnQgYW5kIGNvZGVwb2ludCA8PSAweDEwRkZGRik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgY29kZXBvaW50IGludG8gYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50IDwgMHg4MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEtYnl0ZSBjaGFyYWN0ZXJzOiAweHh4eHh4eCAoQVNDSUkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChjb2RlcG9pbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3RkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLWJ5dGUgY2hhcmFjdGVyczogMTEweHh4eHggMTB4eHh4eHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKDB4QzAgfCAoY29kZXBvaW50ID4+IDYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHhGRkZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy1ieXRlIGNoYXJhY3RlcnM6IDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweEUwIHwgKGNvZGVwb2ludCA+PiAxMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHg4MCB8IChjb2RlcG9pbnQgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQtYnl0ZSBjaGFyYWN0ZXJzOiAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoMHhGMCB8IChjb2RlcG9pbnQgPj4gMTgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkKDB4ODAgfCAoKGNvZGVwb2ludCA+PiAxMikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweDgwIHwgKChjb2RlcG9pbnQgPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCgweDgwIHwgKGNvZGVwb2ludCAmIDB4M0YpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgY2hhcmFjdGVycyBhZnRlciBlc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIHN0cmluZzogZm9yYmlkZGVuIGNoYXJhY3RlciBhZnRlciBiYWNrc2xhc2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgICAgIGNhc2UgMHgwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDg6CisgICAgICAgICAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgICAgIGNhc2UgMHgwQToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MEI6CisgICAgICAgICAgICAgICAgY2FzZSAweDBDOgorICAgICAgICAgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MEU6CisgICAgICAgICAgICAgICAgY2FzZSAweDBGOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTE6CisgICAgICAgICAgICAgICAgY2FzZSAweDEyOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6CisgICAgICAgICAgICAgICAgY2FzZSAweDE1OgorICAgICAgICAgICAgICAgIGNhc2UgMHgxNjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTc6CisgICAgICAgICAgICAgICAgY2FzZSAweDE4OgorICAgICAgICAgICAgICAgIGNhc2UgMHgxOToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MUE6CisgICAgICAgICAgICAgICAgY2FzZSAweDFCOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxQzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MUQ6CisgICAgICAgICAgICAgICAgY2FzZSAweDFFOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxRjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBzdHJpbmc6IGNvbnRyb2wgY2hhcmFjdGVyIG11c3QgYmUgZXNjYXBlZCI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBVKzAwMjAuLlUrMDA3RiAoZXhjZXB0IFUrMDAyMiAocXVvdGUpIGFuZCBVKzAwNUMgKGJhY2tzcGFjZSkpCisgICAgICAgICAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgICAgIGNhc2UgMHgyMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjM6CisgICAgICAgICAgICAgICAgY2FzZSAweDI0OgorICAgICAgICAgICAgICAgIGNhc2UgMHgyNToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjY6CisgICAgICAgICAgICAgICAgY2FzZSAweDI3OgorICAgICAgICAgICAgICAgIGNhc2UgMHgyODoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Mjk6CisgICAgICAgICAgICAgICAgY2FzZSAweDJBOgorICAgICAgICAgICAgICAgIGNhc2UgMHgyQjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MkM6CisgICAgICAgICAgICAgICAgY2FzZSAweDJEOgorICAgICAgICAgICAgICAgIGNhc2UgMHgyRToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MkY6CisgICAgICAgICAgICAgICAgY2FzZSAweDMwOgorICAgICAgICAgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4MzI6CisgICAgICAgICAgICAgICAgY2FzZSAweDMzOgorICAgICAgICAgICAgICAgIGNhc2UgMHgzNDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MzU6CisgICAgICAgICAgICAgICAgY2FzZSAweDM2OgorICAgICAgICAgICAgICAgIGNhc2UgMHgzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Mzg6CisgICAgICAgICAgICAgICAgY2FzZSAweDM5OgorICAgICAgICAgICAgICAgIGNhc2UgMHgzQToKKyAgICAgICAgICAgICAgICBjYXNlIDB4M0I6CisgICAgICAgICAgICAgICAgY2FzZSAweDNDOgorICAgICAgICAgICAgICAgIGNhc2UgMHgzRDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4M0U6CisgICAgICAgICAgICAgICAgY2FzZSAweDNGOgorICAgICAgICAgICAgICAgIGNhc2UgMHg0MDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDE6CisgICAgICAgICAgICAgICAgY2FzZSAweDQyOgorICAgICAgICAgICAgICAgIGNhc2UgMHg0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDQ6CisgICAgICAgICAgICAgICAgY2FzZSAweDQ1OgorICAgICAgICAgICAgICAgIGNhc2UgMHg0NjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDc6CisgICAgICAgICAgICAgICAgY2FzZSAweDQ4OgorICAgICAgICAgICAgICAgIGNhc2UgMHg0OToKKyAgICAgICAgICAgICAgICBjYXNlIDB4NEE6CisgICAgICAgICAgICAgICAgY2FzZSAweDRCOgorICAgICAgICAgICAgICAgIGNhc2UgMHg0QzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NEQ6CisgICAgICAgICAgICAgICAgY2FzZSAweDRFOgorICAgICAgICAgICAgICAgIGNhc2UgMHg0RjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NTA6CisgICAgICAgICAgICAgICAgY2FzZSAweDUxOgorICAgICAgICAgICAgICAgIGNhc2UgMHg1MjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NTM6CisgICAgICAgICAgICAgICAgY2FzZSAweDU0OgorICAgICAgICAgICAgICAgIGNhc2UgMHg1NToKKyAgICAgICAgICAgICAgICBjYXNlIDB4NTY6CisgICAgICAgICAgICAgICAgY2FzZSAweDU3OgorICAgICAgICAgICAgICAgIGNhc2UgMHg1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NTk6CisgICAgICAgICAgICAgICAgY2FzZSAweDVBOgorICAgICAgICAgICAgICAgIGNhc2UgMHg1QjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NUQ6CisgICAgICAgICAgICAgICAgY2FzZSAweDVFOgorICAgICAgICAgICAgICAgIGNhc2UgMHg1RjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NjA6CisgICAgICAgICAgICAgICAgY2FzZSAweDYxOgorICAgICAgICAgICAgICAgIGNhc2UgMHg2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NjM6CisgICAgICAgICAgICAgICAgY2FzZSAweDY0OgorICAgICAgICAgICAgICAgIGNhc2UgMHg2NToKKyAgICAgICAgICAgICAgICBjYXNlIDB4NjY6CisgICAgICAgICAgICAgICAgY2FzZSAweDY3OgorICAgICAgICAgICAgICAgIGNhc2UgMHg2ODoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Njk6CisgICAgICAgICAgICAgICAgY2FzZSAweDZBOgorICAgICAgICAgICAgICAgIGNhc2UgMHg2QjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NkM6CisgICAgICAgICAgICAgICAgY2FzZSAweDZEOgorICAgICAgICAgICAgICAgIGNhc2UgMHg2RToKKyAgICAgICAgICAgICAgICBjYXNlIDB4NkY6CisgICAgICAgICAgICAgICAgY2FzZSAweDcwOgorICAgICAgICAgICAgICAgIGNhc2UgMHg3MToKKyAgICAgICAgICAgICAgICBjYXNlIDB4NzI6CisgICAgICAgICAgICAgICAgY2FzZSAweDczOgorICAgICAgICAgICAgICAgIGNhc2UgMHg3NDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4NzU6CisgICAgICAgICAgICAgICAgY2FzZSAweDc2OgorICAgICAgICAgICAgICAgIGNhc2UgMHg3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Nzg6CisgICAgICAgICAgICAgICAgY2FzZSAweDc5OgorICAgICAgICAgICAgICAgIGNhc2UgMHg3QToKKyAgICAgICAgICAgICAgICBjYXNlIDB4N0I6CisgICAgICAgICAgICAgICAgY2FzZSAweDdDOgorICAgICAgICAgICAgICAgIGNhc2UgMHg3RDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4N0U6CisgICAgICAgICAgICAgICAgY2FzZSAweDdGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBVKzAwODAuLlUrMDdGRjogYnl0ZXMgQzIuLkRGIDgwLi5CRgorICAgICAgICAgICAgICAgIGNhc2UgMHhDMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4QzM6CisgICAgICAgICAgICAgICAgY2FzZSAweEM0OgorICAgICAgICAgICAgICAgIGNhc2UgMHhDNToKKyAgICAgICAgICAgICAgICBjYXNlIDB4QzY6CisgICAgICAgICAgICAgICAgY2FzZSAweEM3OgorICAgICAgICAgICAgICAgIGNhc2UgMHhDODoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Qzk6CisgICAgICAgICAgICAgICAgY2FzZSAweENBOgorICAgICAgICAgICAgICAgIGNhc2UgMHhDQjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4Q0M6CisgICAgICAgICAgICAgICAgY2FzZSAweENEOgorICAgICAgICAgICAgICAgIGNhc2UgMHhDRToKKyAgICAgICAgICAgICAgICBjYXNlIDB4Q0Y6CisgICAgICAgICAgICAgICAgY2FzZSAweEQwOgorICAgICAgICAgICAgICAgIGNhc2UgMHhEMToKKyAgICAgICAgICAgICAgICBjYXNlIDB4RDI6CisgICAgICAgICAgICAgICAgY2FzZSAweEQzOgorICAgICAgICAgICAgICAgIGNhc2UgMHhENDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RDU6CisgICAgICAgICAgICAgICAgY2FzZSAweEQ2OgorICAgICAgICAgICAgICAgIGNhc2UgMHhENzoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RDg6CisgICAgICAgICAgICAgICAgY2FzZSAweEQ5OgorICAgICAgICAgICAgICAgIGNhc2UgMHhEQToKKyAgICAgICAgICAgICAgICBjYXNlIDB4REI6CisgICAgICAgICAgICAgICAgY2FzZSAweERDOgorICAgICAgICAgICAgICAgIGNhc2UgMHhERDoKKyAgICAgICAgICAgICAgICBjYXNlIDB4REU6CisgICAgICAgICAgICAgICAgY2FzZSAweERGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IG5leHRfYnl0ZV9pbl9yYW5nZSh7MHg4MCwgMHhCRn0pKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFUrMDgwMC4uVSswRkZGOiBieXRlcyBFMCBBMC4uQkYgODAuLkJGCisgICAgICAgICAgICAgICAgY2FzZSAweEUwOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IChuZXh0X2J5dGVfaW5fcmFuZ2UoezB4QTAsIDB4QkYsIDB4ODAsIDB4QkZ9KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVSsxMDAwLi5VK0NGRkY6IGJ5dGVzIEUxLi5FQyA4MC4uQkYgODAuLkJGCisgICAgICAgICAgICAgICAgLy8gVStFMDAwLi5VK0ZGRkY6IGJ5dGVzIEVFLi5FRiA4MC4uQkYgODAuLkJGCisgICAgICAgICAgICAgICAgY2FzZSAweEUxOgorICAgICAgICAgICAgICAgIGNhc2UgMHhFMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RTM6CisgICAgICAgICAgICAgICAgY2FzZSAweEU0OgorICAgICAgICAgICAgICAgIGNhc2UgMHhFNToKKyAgICAgICAgICAgICAgICBjYXNlIDB4RTY6CisgICAgICAgICAgICAgICAgY2FzZSAweEU3OgorICAgICAgICAgICAgICAgIGNhc2UgMHhFODoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RTk6CisgICAgICAgICAgICAgICAgY2FzZSAweEVBOgorICAgICAgICAgICAgICAgIGNhc2UgMHhFQjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RUM6CisgICAgICAgICAgICAgICAgY2FzZSAweEVFOgorICAgICAgICAgICAgICAgIGNhc2UgMHhFRjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCAobmV4dF9ieXRlX2luX3JhbmdlKHsweDgwLCAweEJGLCAweDgwLCAweEJGfSkpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFUrRDAwMC4uVStEN0ZGOiBieXRlcyBFRCA4MC4uOUYgODAuLkJGCisgICAgICAgICAgICAgICAgY2FzZSAweEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IChuZXh0X2J5dGVfaW5fcmFuZ2UoezB4ODAsIDB4OUYsIDB4ODAsIDB4QkZ9KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVSsxMDAwMC4uVSszRkZGRiBGMCA5MC4uQkYgODAuLkJGIDgwLi5CRgorICAgICAgICAgICAgICAgIGNhc2UgMHhGMDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCAobmV4dF9ieXRlX2luX3JhbmdlKHsweDkwLCAweEJGLCAweDgwLCAweEJGLCAweDgwLCAweEJGfSkpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFUrNDAwMDAuLlUrRkZGRkYgRjEuLkYzIDgwLi5CRiA4MC4uQkYgODAuLkJGCisgICAgICAgICAgICAgICAgY2FzZSAweEYxOgorICAgICAgICAgICAgICAgIGNhc2UgMHhGMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4RjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgKG5leHRfYnl0ZV9pbl9yYW5nZSh7MHg4MCwgMHhCRiwgMHg4MCwgMHhCRiwgMHg4MCwgMHhCRn0pKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBVKzEwMDAwMC4uVSsxMEZGRkYgRjQgODAuLjhGIDgwLi5CRiA4MC4uQkYKKyAgICAgICAgICAgICAgICBjYXNlIDB4RjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgKG5leHRfYnl0ZV9pbl9yYW5nZSh7MHg4MCwgMHg4RiwgMHg4MCwgMHhCRiwgMHg4MCwgMHhCRn0pKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZW1haW5pbmcgYnl0ZXMgKDgwLi5DMSBhbmQgRjUuLkZGKSBhcmUgaWxsLWZvcm1lZAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgc3RyaW5nOiBpbGwtZm9ybWVkIFVURi04IGJ5dGUiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc3RydG9mKGZsb2F0JiBmLCBjb25zdCBjaGFyKiBzdHIsIGNoYXIqKiBlbmRwdHIpIG5vZXhjZXB0CisgICAgeworICAgICAgICBmID0gc3RkOjpzdHJ0b2Yoc3RyLCBlbmRwdHIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHN0cnRvZihkb3VibGUmIGYsIGNvbnN0IGNoYXIqIHN0ciwgY2hhcioqIGVuZHB0cikgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGYgPSBzdGQ6OnN0cnRvZChzdHIsIGVuZHB0cik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc3RydG9mKGxvbmcgZG91YmxlJiBmLCBjb25zdCBjaGFyKiBzdHIsIGNoYXIqKiBlbmRwdHIpIG5vZXhjZXB0CisgICAgeworICAgICAgICBmID0gc3RkOjpzdHJ0b2xkKHN0ciwgZW5kcHRyKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgc2NhbiBhIG51bWJlciBsaXRlcmFsCisKKyAgICBUaGlzIGZ1bmN0aW9uIHNjYW5zIGEgc3RyaW5nIGFjY29yZGluZyB0byBTZWN0LiA2IG9mIFJGQyA3MTU5LgorCisgICAgVGhlIGZ1bmN0aW9uIGlzIHJlYWxpemVkIHdpdGggYSBkZXRlcm1pbmlzdGljIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGRlcml2ZWQKKyAgICBmcm9tIHRoZSBncmFtbWFyIGRlc2NyaWJlZCBpbiBSRkMgNzE1OS4gU3RhcnRpbmcgaW4gc3RhdGUgImluaXQiLCB0aGUKKyAgICBpbnB1dCBpcyByZWFkIGFuZCB1c2VkIHRvIGRldGVybWluZWQgdGhlIG5leHQgc3RhdGUuIE9ubHkgc3RhdGUgImRvbmUiCisgICAgYWNjZXB0cyB0aGUgbnVtYmVyLiBTdGF0ZSAiZXJyb3IiIGlzIGEgdHJhcCBzdGF0ZSB0byBtb2RlbCBlcnJvcnMuIEluIHRoZQorICAgIHRhYmxlIGJlbG93LCAiYW55dGhpbmciIG1lYW5zIGFueSBjaGFyYWN0ZXIgYnV0IHRoZSBvbmVzIGxpc3RlZCBiZWZvcmUuCisKKyAgICBzdGF0ZSAgICB8IDAgICAgICAgIHwgMS05ICAgICAgfCBlIEUgICAgICB8ICsgICAgICAgfCAtICAgICAgIHwgLiAgICAgICAgfCBhbnl0aGluZworICAgIC0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0KKyAgICBpbml0ICAgICB8IHplcm8gICAgIHwgYW55MSAgICAgfCBbZXJyb3JdICB8IFtlcnJvcl0gfCBtaW51cyAgIHwgW2Vycm9yXSAgfCBbZXJyb3JdCisgICAgbWludXMgICAgfCB6ZXJvICAgICB8IGFueTEgICAgIHwgW2Vycm9yXSAgfCBbZXJyb3JdIHwgW2Vycm9yXSB8IFtlcnJvcl0gIHwgW2Vycm9yXQorICAgIHplcm8gICAgIHwgZG9uZSAgICAgfCBkb25lICAgICB8IGV4cG9uZW50IHwgZG9uZSAgICB8IGRvbmUgICAgfCBkZWNpbWFsMSB8IGRvbmUKKyAgICBhbnkxICAgICB8IGFueTEgICAgIHwgYW55MSAgICAgfCBleHBvbmVudCB8IGRvbmUgICAgfCBkb25lICAgIHwgZGVjaW1hbDEgfCBkb25lCisgICAgZGVjaW1hbDEgfCBkZWNpbWFsMiB8IFtlcnJvcl0gIHwgW2Vycm9yXSAgfCBbZXJyb3JdIHwgW2Vycm9yXSB8IFtlcnJvcl0gIHwgW2Vycm9yXQorICAgIGRlY2ltYWwyIHwgZGVjaW1hbDIgfCBkZWNpbWFsMiB8IGV4cG9uZW50IHwgZG9uZSAgICB8IGRvbmUgICAgfCBkb25lICAgICB8IGRvbmUKKyAgICBleHBvbmVudCB8IGFueTIgICAgIHwgYW55MiAgICAgfCBbZXJyb3JdICB8IHNpZ24gICAgfCBzaWduICAgIHwgW2Vycm9yXSAgfCBbZXJyb3JdCisgICAgc2lnbiAgICAgfCBhbnkyICAgICB8IGFueTIgICAgIHwgW2Vycm9yXSAgfCBbZXJyb3JdIHwgW2Vycm9yXSB8IFtlcnJvcl0gIHwgW2Vycm9yXQorICAgIGFueTIgICAgIHwgYW55MiAgICAgfCBhbnkyICAgICB8IGRvbmUgICAgIHwgZG9uZSAgICB8IGRvbmUgICAgfCBkb25lICAgICB8IGRvbmUKKworICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGlzIHJlYWxpemVkIHdpdGggb25lIGxhYmVsIHBlciBzdGF0ZSAocHJlZml4ZWQgd2l0aAorICAgICJzY2FuX251bWJlcl8iKSBhbmQgYGdvdG9gIHN0YXRlbWVudHMgYmV0d2VlbiB0aGVtLiBUaGUgc3RhdGUgbWFjaGluZQorICAgIGNvbnRhaW5zIGN5Y2xlcywgYnV0IGFueSBjeWNsZSBjYW4gYmUgbGVmdCB3aGVuIEVPRiBpcyByZWFkLiBUaGVyZWZvcmUsCisgICAgdGhlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gdGVybWluYXRlLgorCisgICAgRHVyaW5nIHNjYW5uaW5nLCB0aGUgcmVhZCBieXRlcyBhcmUgc3RvcmVkIGluIHRva2VuX2J1ZmZlci4gVGhpcyBzdHJpbmcgaXMKKyAgICB0aGVuIGNvbnZlcnRlZCB0byBhIHNpZ25lZCBpbnRlZ2VyLCBhbiB1bnNpZ25lZCBpbnRlZ2VyLCBvciBhCisgICAgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorCisgICAgQHJldHVybiB0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZCwgdG9rZW5fdHlwZTo6dmFsdWVfaW50ZWdlciwgb3IKKyAgICAgICAgICAgIHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0IGlmIG51bWJlciBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgc2Nhbm5lZCwKKyAgICAgICAgICAgIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yIG90aGVyd2lzZQorCisgICAgQG5vdGUgVGhlIHNjYW5uZXIgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGN1cnJlbnQgbG9jYWxlLiBJbnRlcm5hbGx5LCB0aGUKKyAgICAgICAgICBsb2NhbGUncyBkZWNpbWFsIHBvaW50IGlzIHVzZWQgaW5zdGVhZCBvZiBgLmAgdG8gd29yayB3aXRoIHRoZQorICAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgY29udmVydGVycy4KKyAgICAqLworICAgIHRva2VuX3R5cGUgc2Nhbl9udW1iZXIoKQorICAgIHsKKyAgICAgICAgLy8gcmVzZXQgdG9rZW5fYnVmZmVyIHRvIHN0b3JlIHRoZSBudW1iZXIncyBieXRlcworICAgICAgICByZXNldCgpOworCisgICAgICAgIC8vIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgbnVtYmVyOyBpbml0aWFsbHkgc2V0IHRvIHVuc2lnbmVkOyB3aWxsIGJlCisgICAgICAgIC8vIGNoYW5nZWQgaWYgbWludXMgc2lnbiwgZGVjaW1hbCBwb2ludCBvciBleHBvbmVudCBpcyByZWFkCisgICAgICAgIHRva2VuX3R5cGUgbnVtYmVyX3R5cGUgPSB0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDsKKworICAgICAgICAvLyBzdGF0ZSAoaW5pdCk6IHdlIGp1c3QgZm91bmQgb3V0IHdlIG5lZWQgdG8gc2NhbiBhIG51bWJlcgorICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX21pbnVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl96ZXJvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfYW55MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcmVqZWN0ZWQgb3V0c2lkZSBzY2FuX251bWJlcigpCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gTENPVl9FWENMX0xJTkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCitzY2FuX251bWJlcl9taW51czoKKyAgICAgICAgLy8gc3RhdGU6IHdlIGp1c3QgcGFyc2VkIGEgbGVhZGluZyBtaW51cyBzaWduCisgICAgICAgIG51bWJlcl90eXBlID0gdG9rZW5fdHlwZTo6dmFsdWVfaW50ZWdlcjsKKyAgICAgICAgc3dpdGNoIChnZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfemVybzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2FueTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICJpbnZhbGlkIG51bWJlcjsgZXhwZWN0ZWQgZGlnaXQgYWZ0ZXIgJy0nIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworc2Nhbl9udW1iZXJfemVybzoKKyAgICAgICAgLy8gc3RhdGU6IHdlIGp1c3QgcGFyc2UgYSB6ZXJvIChtYXliZSB3aXRoIGEgbGVhZGluZyBtaW51cyBzaWduKQorICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoZGVjaW1hbF9wb2ludF9jaGFyKTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2RlY2ltYWwxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2V4cG9uZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZG9uZTsKKyAgICAgICAgfQorCitzY2FuX251bWJlcl9hbnkxOgorICAgICAgICAvLyBzdGF0ZTogd2UganVzdCBwYXJzZWQgYSBudW1iZXIgMC05IChtYXliZSB3aXRoIGEgbGVhZGluZyBtaW51cyBzaWduKQorICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9hbnkxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoZGVjaW1hbF9wb2ludF9jaGFyKTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2RlY2ltYWwxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2V4cG9uZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZG9uZTsKKyAgICAgICAgfQorCitzY2FuX251bWJlcl9kZWNpbWFsMToKKyAgICAgICAgLy8gc3RhdGU6IHdlIGp1c3QgcGFyc2VkIGEgZGVjaW1hbCBwb2ludAorICAgICAgICBudW1iZXJfdHlwZSA9IHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OworICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9kZWNpbWFsMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgbnVtYmVyOyBleHBlY3RlZCBkaWdpdCBhZnRlciAnLiciOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCitzY2FuX251bWJlcl9kZWNpbWFsMjoKKyAgICAgICAgLy8gd2UganVzdCBwYXJzZWQgYXQgbGVhc3Qgb25lIG51bWJlciBhZnRlciBhIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgc3dpdGNoIChnZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZGVjaW1hbDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZXhwb25lbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9kb25lOworICAgICAgICB9CisKK3NjYW5fbnVtYmVyX2V4cG9uZW50OgorICAgICAgICAvLyB3ZSBqdXN0IHBhcnNlZCBhbiBleHBvbmVudAorICAgICAgICBudW1iZXJfdHlwZSA9IHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OworICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX3NpZ247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIHNjYW5fbnVtYmVyX2FueTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG51bWJlcjsgZXhwZWN0ZWQgJysnLCAnLScsIG9yIGRpZ2l0IGFmdGVyIGV4cG9uZW50IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6cGFyc2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworc2Nhbl9udW1iZXJfc2lnbjoKKyAgICAgICAgLy8gd2UganVzdCBwYXJzZWQgYW4gZXhwb25lbnQgc2lnbgorICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9hbnkyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiaW52YWxpZCBudW1iZXI7IGV4cGVjdGVkIGRpZ2l0IGFmdGVyIGV4cG9uZW50IHNpZ24iOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCitzY2FuX251bWJlcl9hbnkyOgorICAgICAgICAvLyB3ZSBqdXN0IHBhcnNlZCBhIG51bWJlciBhZnRlciB0aGUgZXhwb25lbnQgb3IgZXhwb25lbnQgc2lnbgorICAgICAgICBzd2l0Y2ggKGdldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgZ290byBzY2FuX251bWJlcl9hbnkyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gc2Nhbl9udW1iZXJfZG9uZTsKKyAgICAgICAgfQorCitzY2FuX251bWJlcl9kb25lOgorICAgICAgICAvLyB1bmdldCB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBudW1iZXIgKHdlIG9ubHkgcmVhZCBpdCB0byBrbm93IHRoYXQKKyAgICAgICAgLy8gd2UgYXJlIGRvbmUgc2Nhbm5pbmcgYSBudW1iZXIpCisgICAgICAgIHVuZ2V0KCk7CisKKyAgICAgICAgY2hhciogZW5kcHRyID0gbnVsbHB0cjsKKyAgICAgICAgZXJybm8gPSAwOworCisgICAgICAgIC8vIHRyeSB0byBwYXJzZSBpbnRlZ2VycyBmaXJzdCBhbmQgZmFsbCBiYWNrIHRvIGZsb2F0cworICAgICAgICBpZiAobnVtYmVyX3R5cGUgPT0gdG9rZW5fdHlwZTo6dmFsdWVfdW5zaWduZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8geCA9IHN0ZDo6c3RydG91bGwodG9rZW5fYnVmZmVyLmRhdGEoKSwgJmVuZHB0ciwgMTApOworCisgICAgICAgICAgICAvLyB3ZSBjaGVja2VkIHRoZSBudW1iZXIgZm9ybWF0IGJlZm9yZQorICAgICAgICAgICAgYXNzZXJ0KGVuZHB0ciA9PSB0b2tlbl9idWZmZXIuZGF0YSgpICsgdG9rZW5fYnVmZmVyLnNpemUoKSk7CisKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlX3Vuc2lnbmVkID0gc3RhdGljX2Nhc3Q8bnVtYmVyX3Vuc2lnbmVkX3Q+KHgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZV91bnNpZ25lZCA9PSB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX3Vuc2lnbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudW1iZXJfdHlwZSA9PSB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBhdXRvIHggPSBzdGQ6OnN0cnRvbGwodG9rZW5fYnVmZmVyLmRhdGEoKSwgJmVuZHB0ciwgMTApOworCisgICAgICAgICAgICAvLyB3ZSBjaGVja2VkIHRoZSBudW1iZXIgZm9ybWF0IGJlZm9yZQorICAgICAgICAgICAgYXNzZXJ0KGVuZHB0ciA9PSB0b2tlbl9idWZmZXIuZGF0YSgpICsgdG9rZW5fYnVmZmVyLnNpemUoKSk7CisKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlX2ludGVnZXIgPSBzdGF0aWNfY2FzdDxudW1iZXJfaW50ZWdlcl90Pih4KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVfaW50ZWdlciA9PSB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX2ludGVnZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBjb2RlIGlzIHJlYWNoZWQgaWYgd2UgcGFyc2UgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3IgaWYgYW4KKyAgICAgICAgLy8gaW50ZWdlciBjb252ZXJzaW9uIGFib3ZlIGZhaWxlZAorICAgICAgICBzdHJ0b2YodmFsdWVfZmxvYXQsIHRva2VuX2J1ZmZlci5kYXRhKCksICZlbmRwdHIpOworCisgICAgICAgIC8vIHdlIGNoZWNrZWQgdGhlIG51bWJlciBmb3JtYXQgYmVmb3JlCisgICAgICAgIGFzc2VydChlbmRwdHIgPT0gdG9rZW5fYnVmZmVyLmRhdGEoKSArIHRva2VuX2J1ZmZlci5zaXplKCkpOworCisgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjp2YWx1ZV9mbG9hdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAcGFyYW1baW5dIGxpdGVyYWxfdGV4dCAgdGhlIGxpdGVyYWwgdGV4dCB0byBleHBlY3QKKyAgICBAcGFyYW1baW5dIGxlbmd0aCAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcGFzc2VkIGxpdGVyYWwgdGV4dAorICAgIEBwYXJhbVtpbl0gcmV0dXJuX3R5cGUgICB0aGUgdG9rZW4gdHlwZSB0byByZXR1cm4gb24gc3VjY2VzcworICAgICovCisgICAgdG9rZW5fdHlwZSBzY2FuX2xpdGVyYWwoY29uc3QgY2hhciogbGl0ZXJhbF90ZXh0LCBjb25zdCBzdGQ6OnNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZSByZXR1cm5fdHlwZSkKKyAgICB7CisgICAgICAgIGFzc2VydChjdXJyZW50ID09IGxpdGVyYWxfdGV4dFswXSk7CisgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZ2V0KCkgIT0gbGl0ZXJhbF90ZXh0W2ldKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgbGl0ZXJhbCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5fdHlwZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpbnB1dCBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gcmVzZXQgdG9rZW5fYnVmZmVyOyBjdXJyZW50IGNoYXJhY3RlciBpcyBiZWdpbm5pbmcgb2YgdG9rZW4KKyAgICB2b2lkIHJlc2V0KCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHRva2VuX2J1ZmZlci5jbGVhcigpOworICAgICAgICB0b2tlbl9zdHJpbmcuY2xlYXIoKTsKKyAgICAgICAgdG9rZW5fc3RyaW5nLnB1c2hfYmFjayhzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojp0b19jaGFyX3R5cGUoY3VycmVudCkpOworICAgIH0KKworICAgIC8qCisgICAgQGJyaWVmIGdldCBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dAorCisgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSB1c2VkIGlucHV0IGFkYXB0ZXIuIEl0IGRvZXMKKyAgICBub3QgdGhyb3cgaW4gY2FzZSB0aGUgaW5wdXQgcmVhY2hlZCBFT0YsIGJ1dCByZXR1cm5zIGEKKyAgICBgc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKClgIGluIHRoYXQgY2FzZS4gIFN0b3JlcyB0aGUgc2Nhbm5lZCBjaGFyYWN0ZXJzCisgICAgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcy4KKworICAgIEByZXR1cm4gY2hhcmFjdGVyIHJlYWQgZnJvbSB0aGUgaW5wdXQKKyAgICAqLworICAgIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGdldCgpCisgICAgeworICAgICAgICArK2NoYXJzX3JlYWQ7CisgICAgICAgIGN1cnJlbnQgPSBpYS0+Z2V0X2NoYXJhY3RlcigpOworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoY3VycmVudCAhPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuX3N0cmluZy5wdXNoX2JhY2soc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6dG9fY2hhcl90eXBlKGN1cnJlbnQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisKKyAgICAvLy8gdW5nZXQgY3VycmVudCBjaGFyYWN0ZXIgKHJldHVybiBpdCBhZ2FpbiBvbiBuZXh0IGdldCkKKyAgICB2b2lkIHVuZ2V0KCkKKyAgICB7CisgICAgICAgIC0tY2hhcnNfcmVhZDsKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGN1cnJlbnQgIT0gc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpYS0+dW5nZXRfY2hhcmFjdGVyKCk7CisgICAgICAgICAgICBhc3NlcnQodG9rZW5fc3RyaW5nLnNpemUoKSAhPSAwKTsKKyAgICAgICAgICAgIHRva2VuX3N0cmluZy5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGFkZCBhIGNoYXJhY3RlciB0byB0b2tlbl9idWZmZXIKKyAgICB2b2lkIGFkZChpbnQgYykKKyAgICB7CisgICAgICAgIHRva2VuX2J1ZmZlci5wdXNoX2JhY2soc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6dG9fY2hhcl90eXBlKGMpKTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIHZhbHVlIGdldHRlcnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyByZXR1cm4gaW50ZWdlciB2YWx1ZQorICAgIGNvbnN0ZXhwciBudW1iZXJfaW50ZWdlcl90IGdldF9udW1iZXJfaW50ZWdlcigpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWVfaW50ZWdlcjsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJuIHVuc2lnbmVkIGludGVnZXIgdmFsdWUKKyAgICBjb25zdGV4cHIgbnVtYmVyX3Vuc2lnbmVkX3QgZ2V0X251bWJlcl91bnNpZ25lZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWVfdW5zaWduZWQ7CisgICAgfQorCisgICAgLy8vIHJldHVybiBmbG9hdGluZy1wb2ludCB2YWx1ZQorICAgIGNvbnN0ZXhwciBudW1iZXJfZmxvYXRfdCBnZXRfbnVtYmVyX2Zsb2F0KCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZV9mbG9hdDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJuIGN1cnJlbnQgc3RyaW5nIHZhbHVlIChpbXBsaWNpdGx5IHJlc2V0cyB0aGUgdG9rZW47IHVzZWZ1bCBvbmx5IG9uY2UpCisgICAgc3RkOjpzdHJpbmcgbW92ZV9zdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZSh0b2tlbl9idWZmZXIpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGRpYWdub3N0aWNzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gcmV0dXJuIHBvc2l0aW9uIG9mIGxhc3QgcmVhZCB0b2tlbgorICAgIGNvbnN0ZXhwciBzdGQ6OnNpemVfdCBnZXRfcG9zaXRpb24oKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNoYXJzX3JlYWQ7CisgICAgfQorCisgICAgLy8vIHJldHVybiB0aGUgbGFzdCByZWFkIHRva2VuIChmb3IgZXJyb3JzIG9ubHkpLiAgV2lsbCBuZXZlciBjb250YWluIEVPRgorICAgIC8vLyAoYW4gYXJiaXRyYXJ5IHZhbHVlIHRoYXQgaXMgbm90IGEgdmFsaWQgY2hhciB2YWx1ZSwgb2Z0ZW4gLTEpLCBiZWNhdXNlCisgICAgLy8vIDI1NSBtYXkgbGVnaXRpbWF0ZWx5IG9jY3VyLiAgTWF5IGNvbnRhaW4gTlVMLCB3aGljaCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICBzdGQ6OnN0cmluZyBnZXRfdG9rZW5fc3RyaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIGVzY2FwZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gYyA6IHRva2VuX3N0cmluZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCdceDAwJyA8PSBjIGFuZCBjIDw9ICdceDFGJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBlc2NhcGUgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgc3MgPDwgIjxVKyIgPDwgc3RkOjpzZXR3KDQpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCisgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgc3RhdGljX2Nhc3Q8aW50PihjKSA8PCAiPiI7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNzLnN0cigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGFkZCBjaGFyYWN0ZXIgYXMgaXMKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJuIHN5bnRheCBlcnJvciBtZXNzYWdlCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIqIGdldF9lcnJvcl9tZXNzYWdlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvcl9tZXNzYWdlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGFjdHVhbCBzY2FubmVyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICB0b2tlbl90eXBlIHNjYW4oKQorICAgIHsKKyAgICAgICAgLy8gcmVhZCBuZXh0IGNoYXJhY3RlciBhbmQgaWdub3JlIHdoaXRlc3BhY2UKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgPT0gJyAnIG9yIGN1cnJlbnQgPT0gJ1x0JyBvciBjdXJyZW50ID09ICdcbicgb3IgY3VycmVudCA9PSAnXHInKTsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHN0cnVjdHVyYWwgY2hhcmFjdGVycworICAgICAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OmJlZ2luX2FycmF5OworICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OmVuZF9hcnJheTsKKyAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpiZWdpbl9vYmplY3Q7CisgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6ZW5kX29iamVjdDsKKyAgICAgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjpuYW1lX3NlcGFyYXRvcjsKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbl90eXBlOjp2YWx1ZV9zZXBhcmF0b3I7CisKKyAgICAgICAgICAgIC8vIGxpdGVyYWxzCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Nhbl9saXRlcmFsKCJ0cnVlIiwgNCwgdG9rZW5fdHlwZTo6bGl0ZXJhbF90cnVlKTsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHJldHVybiBzY2FuX2xpdGVyYWwoImZhbHNlIiwgNSwgdG9rZW5fdHlwZTo6bGl0ZXJhbF9mYWxzZSk7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Nhbl9saXRlcmFsKCJudWxsIiwgNCwgdG9rZW5fdHlwZTo6bGl0ZXJhbF9udWxsKTsKKworICAgICAgICAgICAgLy8gc3RyaW5nCisgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNjYW5fc3RyaW5nKCk7CisKKyAgICAgICAgICAgIC8vIG51bWJlcgorICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Nhbl9udW1iZXIoKTsKKworICAgICAgICAgICAgLy8gZW5kIG9mIGlucHV0ICh0aGUgbnVsbCBieXRlIGlzIG5lZWRlZCB3aGVuIHBhcnNpbmcgZnJvbQorICAgICAgICAgICAgLy8gc3RyaW5nIGxpdGVyYWxzKQorICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgY2FzZSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fdHlwZTo6ZW5kX29mX2lucHV0OworCisgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gImludmFsaWQgbGl0ZXJhbCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnBhcnNlX2Vycm9yOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8vIGlucHV0IGFkYXB0ZXIKKyAgICBkZXRhaWw6OmlucHV0X2FkYXB0ZXJfdCBpYSA9IG51bGxwdHI7CisKKyAgICAvLy8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgY3VycmVudCA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpOworCisgICAgLy8vIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkCisgICAgc3RkOjpzaXplX3QgY2hhcnNfcmVhZCA9IDA7CisKKyAgICAvLy8gcmF3IGlucHV0IHRva2VuIHN0cmluZyAoZm9yIGVycm9yIG1lc3NhZ2VzKQorICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHRva2VuX3N0cmluZyB7fTsKKworICAgIC8vLyBidWZmZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCB0b2tlbnMgKG51bWJlcnMsIHN0cmluZ3MpCisgICAgc3RkOjpzdHJpbmcgdG9rZW5fYnVmZmVyIHt9OworCisgICAgLy8vIGEgZGVzY3JpcHRpb24gb2Ygb2NjdXJyZWQgbGV4ZXIgZXJyb3JzCisgICAgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSA9ICIiOworCisgICAgLy8gbnVtYmVyIHZhbHVlcworICAgIG51bWJlcl9pbnRlZ2VyX3QgdmFsdWVfaW50ZWdlciA9IDA7CisgICAgbnVtYmVyX3Vuc2lnbmVkX3QgdmFsdWVfdW5zaWduZWQgPSAwOworICAgIG51bWJlcl9mbG9hdF90IHZhbHVlX2Zsb2F0ID0gMDsKKworICAgIC8vLyB0aGUgZGVjaW1hbCBwb2ludAorICAgIGNvbnN0IGNoYXIgZGVjaW1hbF9wb2ludF9jaGFyID0gJy4nOworfTsKK30KK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2lucHV0L3BhcnNlci5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9wYXJzZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTg1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pbnB1dC9wYXJzZXIuaHBwCkBAIC0wLDAgKzEsNTg5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGFzc2VydAorI2luY2x1ZGUgPGNtYXRoPiAvLyBpc2Zpbml0ZQorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIHVpbnQ4X3QKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBmdW5jdGlvbgorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nCisjaW5jbHVkZSA8dXRpbGl0eT4gLy8gbW92ZQorCisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2V4Y2VwdGlvbnMuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2lucHV0X2FkYXB0ZXJzLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvbGV4ZXIuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisvLy8vLy8vLy8vLy8KKy8vIHBhcnNlciAvLworLy8vLy8vLy8vLy8vCisKKy8qIQorQGJyaWVmIHN5bnRheCBhbmFseXNpcworCitUaGlzIGNsYXNzIGltcGxlbWVudHMgYSByZWN1cnNpdmUgZGVjZW50IHBhcnNlci4KKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorY2xhc3MgcGFyc2VyCit7CisgICAgdXNpbmcgbnVtYmVyX2ludGVnZXJfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9pbnRlZ2VyX3Q7CisgICAgdXNpbmcgbnVtYmVyX3Vuc2lnbmVkX3QgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdDsKKyAgICB1c2luZyBudW1iZXJfZmxvYXRfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9mbG9hdF90OworICAgIHVzaW5nIGxleGVyX3QgPSBsZXhlcjxCYXNpY0pzb25UeXBlPjsKKyAgICB1c2luZyB0b2tlbl90eXBlID0gdHlwZW5hbWUgbGV4ZXJfdDo6dG9rZW5fdHlwZTsKKworICBwdWJsaWM6CisgICAgZW51bSBjbGFzcyBwYXJzZV9ldmVudF90IDogdWludDhfdAorICAgIHsKKyAgICAgICAgLy8vIHRoZSBwYXJzZXIgcmVhZCBge2AgYW5kIHN0YXJ0ZWQgdG8gcHJvY2VzcyBhIEpTT04gb2JqZWN0CisgICAgICAgIG9iamVjdF9zdGFydCwKKyAgICAgICAgLy8vIHRoZSBwYXJzZXIgcmVhZCBgfWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIG9iamVjdAorICAgICAgICBvYmplY3RfZW5kLAorICAgICAgICAvLy8gdGhlIHBhcnNlciByZWFkIGBbYCBhbmQgc3RhcnRlZCB0byBwcm9jZXNzIGEgSlNPTiBhcnJheQorICAgICAgICBhcnJheV9zdGFydCwKKyAgICAgICAgLy8vIHRoZSBwYXJzZXIgcmVhZCBgXWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIGFycmF5CisgICAgICAgIGFycmF5X2VuZCwKKyAgICAgICAgLy8vIHRoZSBwYXJzZXIgcmVhZCBhIGtleSBvZiBhIHZhbHVlIGluIGFuIG9iamVjdAorICAgICAgICBrZXksCisgICAgICAgIC8vLyB0aGUgcGFyc2VyIGZpbmlzaGVkIHJlYWRpbmcgYSBKU09OIHZhbHVlCisgICAgICAgIHZhbHVlCisgICAgfTsKKworICAgIHVzaW5nIHBhcnNlcl9jYWxsYmFja190ID0KKyAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGludCBkZXB0aCwgcGFyc2VfZXZlbnRfdCBldmVudCwgQmFzaWNKc29uVHlwZSYgcGFyc2VkKT47CisKKyAgICAvLy8gYSBwYXJzZXIgcmVhZGluZyBmcm9tIGFuIGlucHV0IGFkYXB0ZXIKKyAgICBleHBsaWNpdCBwYXJzZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyX3QgYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyX2NhbGxiYWNrX3QgY2IgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGFsbG93X2V4Y2VwdGlvbnNfID0gdHJ1ZSkKKyAgICAgICAgOiBjYWxsYmFjayhjYiksIG1fbGV4ZXIoYWRhcHRlciksIGFsbG93X2V4Y2VwdGlvbnMoYWxsb3dfZXhjZXB0aW9uc18pCisgICAge30KKworICAgIC8qIQorICAgIEBicmllZiBwdWJsaWMgcGFyc2VyIGludGVyZmFjZQorCisgICAgQHBhcmFtW2luXSBzdHJpY3QgICAgICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgbGFzdCB0b2tlbiB0byBiZSBFT0YKKyAgICBAcGFyYW1baW4sb3V0XSByZXN1bHQgIHBhcnNlZCBKU09OIHZhbHVlCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAxIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCB0b2tlbgorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDIgaWYgdG9fdW5pY29kZSBmYWlscyBvciBzdXJyb2dhdGUgZXJyb3IKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAzIGlmIHRvX3VuaWNvZGUgZmFpbHMKKyAgICAqLworICAgIHZvaWQgcGFyc2UoY29uc3QgYm9vbCBzdHJpY3QsIEJhc2ljSnNvblR5cGUmIHJlc3VsdCkKKyAgICB7CisgICAgICAgIC8vIHJlYWQgZmlyc3QgdG9rZW4KKyAgICAgICAgZ2V0X3Rva2VuKCk7CisKKyAgICAgICAgcGFyc2VfaW50ZXJuYWwodHJ1ZSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LmFzc2VydF9pbnZhcmlhbnQoKTsKKworICAgICAgICAvLyBpbiBzdHJpY3QgbW9kZSwgaW5wdXQgbXVzdCBiZSBjb21wbGV0ZWx5IHJlYWQKKyAgICAgICAgaWYgKHN0cmljdCkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICBleHBlY3QodG9rZW5fdHlwZTo6ZW5kX29mX2lucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluIGNhc2Ugb2YgYW4gZXJyb3IsIHJldHVybiBkaXNjYXJkZWQgdmFsdWUKKyAgICAgICAgaWYgKGVycm9yZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlX3Q6OmRpc2NhcmRlZDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCB0b3AtbGV2ZWwgdmFsdWUgdG8gbnVsbCBpZiBpdCB3YXMgZGlzY2FyZGVkIGJ5IHRoZSBjYWxsYmFjaworICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICBpZiAocmVzdWx0LmlzX2Rpc2NhcmRlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHB1YmxpYyBhY2NlcHQgaW50ZXJmYWNlCisKKyAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGxhc3QgdG9rZW4gdG8gYmUgRU9GCisgICAgQHJldHVybiB3aGV0aGVyIHRoZSBpbnB1dCBpcyBhIHByb3BlciBKU09OIHRleHQKKyAgICAqLworICAgIGJvb2wgYWNjZXB0KGNvbnN0IGJvb2wgc3RyaWN0ID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIHJlYWQgZmlyc3QgdG9rZW4KKyAgICAgICAgZ2V0X3Rva2VuKCk7CisKKyAgICAgICAgaWYgKG5vdCBhY2NlcHRfaW50ZXJuYWwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RyaWN0ID0+IGxhc3QgdG9rZW4gbXVzdCBiZSBFT0YKKyAgICAgICAgcmV0dXJuIG5vdCBzdHJpY3Qgb3IgKGdldF90b2tlbigpID09IHRva2VuX3R5cGU6OmVuZF9vZl9pbnB1dCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyohCisgICAgQGJyaWVmIHRoZSBhY3R1YWwgcGFyc2VyCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMSBpbiBjYXNlIG9mIGFuIHVuZXhwZWN0ZWQgdG9rZW4KKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAyIGlmIHRvX3VuaWNvZGUgZmFpbHMgb3Igc3Vycm9nYXRlIGVycm9yCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMyBpZiB0b191bmljb2RlIGZhaWxzCisgICAgKi8KKyAgICB2b2lkIHBhcnNlX2ludGVybmFsKGJvb2wga2VlcCwgQmFzaWNKc29uVHlwZSYgcmVzdWx0KQorICAgIHsKKyAgICAgICAgLy8gbmV2ZXIgcGFyc2UgYWZ0ZXIgYSBwYXJzZSBlcnJvciB3YXMgZGV0ZWN0ZWQKKyAgICAgICAgYXNzZXJ0KG5vdCBlcnJvcmVkKTsKKworICAgICAgICAvLyBzdGFydCB3aXRoIGEgZGlzY2FyZGVkIHZhbHVlCisgICAgICAgIGlmIChub3QgcmVzdWx0LmlzX2Rpc2NhcmRlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5kZXN0cm95KHJlc3VsdC5tX3R5cGUpOworICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OmRpc2NhcmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobGFzdF90b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpiZWdpbl9vYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtlZXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtlZXAgPSBjYWxsYmFjayhkZXB0aCsrLCBwYXJzZV9ldmVudF90OjpvYmplY3Rfc3RhcnQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobm90IGNhbGxiYWNrIG9yIGtlZXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0IHJlc3VsdCB0byBvYmplY3QgdG8gY29wZSB3aXRoIHt9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSB2YWx1ZV90OjpvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKworICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgfSAtPiB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IHRva2VuX3R5cGU6OmVuZF9vYmplY3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2VlcCBhbmQgY2FsbGJhY2sgYW5kIG5vdCBjYWxsYmFjaygtLWRlcHRoLCBwYXJzZV9ldmVudF90OjpvYmplY3RfZW5kLCByZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5kZXN0cm95KHJlc3VsdC5tX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OmRpc2NhcmRlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXk7CisgICAgICAgICAgICAgICAgQmFzaWNKc29uVHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGtleQorICAgICAgICAgICAgICAgICAgICBpZiAobm90IGV4cGVjdCh0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga2V5ID0gbV9sZXhlci5tb3ZlX3N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGJvb2wga2VlcF90YWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtlZXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0pzb25UeXBlIGsoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX3RhZyA9IGNhbGxiYWNrKGRlcHRoLCBwYXJzZV9ldmVudF90OjprZXksIGspOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBfdGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHNlcGFyYXRvciAoOikKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgZXhwZWN0KHRva2VuX3R5cGU6Om5hbWVfc2VwYXJhdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGFkZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUubV92YWx1ZS5kZXN0cm95KHZhbHVlLm1fdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlLm1fdHlwZSA9IHZhbHVlX3Q6OmRpc2NhcmRlZDsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfaW50ZXJuYWwoa2VlcCwgdmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKGVycm9yZWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoa2VlcCBhbmQga2VlcF90YWcgYW5kIG5vdCB2YWx1ZS5pc19kaXNjYXJkZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUub2JqZWN0LT5lbXBsYWNlKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hIC0+IG5leHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IHRva2VuX3R5cGU6OnZhbHVlX3NlcGFyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgfQorICAgICAgICAgICAgICAgICAgICBpZiAobm90IGV4cGVjdCh0b2tlbl90eXBlOjplbmRfb2JqZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChrZWVwIGFuZCBjYWxsYmFjayBhbmQgbm90IGNhbGxiYWNrKC0tZGVwdGgsIHBhcnNlX2V2ZW50X3Q6Om9iamVjdF9lbmQsIHJlc3VsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5kZXN0cm95KHJlc3VsdC5tX3R5cGUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6ZGlzY2FyZGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpiZWdpbl9hcnJheToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoa2VlcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAga2VlcCA9IGNhbGxiYWNrKGRlcHRoKyssIHBhcnNlX2V2ZW50X3Q6OmFycmF5X3N0YXJ0LCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBjYWxsYmFjayBvciBrZWVwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNldCByZXN1bHQgdG8gYXJyYXkgdG8gY29wZSB3aXRoIFtdCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhZCBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisKKyAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIF0gLT4gd2UgYXJlIGRvbmUKKyAgICAgICAgICAgICAgICBpZiAobGFzdF90b2tlbiA9PSB0b2tlbl90eXBlOjplbmRfYXJyYXkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgYW5kIG5vdCBjYWxsYmFjaygtLWRlcHRoLCBwYXJzZV9ldmVudF90OjphcnJheV9lbmQsIHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlLmRlc3Ryb3kocmVzdWx0Lm1fdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6ZGlzY2FyZGVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHBhcnNlIHZhbHVlcworICAgICAgICAgICAgICAgIEJhc2ljSnNvblR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZS5tX3ZhbHVlLmRlc3Ryb3kodmFsdWUubV90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUubV90eXBlID0gdmFsdWVfdDo6ZGlzY2FyZGVkOworICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnRlcm5hbChrZWVwLCB2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZXJyb3JlZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChrZWVwIGFuZCBub3QgdmFsdWUuaXNfZGlzY2FyZGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlLmFycmF5LT5wdXNoX2JhY2soc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjb21tYSAtPiBuZXh0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGdldF90b2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90b2tlbiA9PSB0b2tlbl90eXBlOjp2YWx1ZV9zZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF90b2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIF0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBleHBlY3QodG9rZW5fdHlwZTo6ZW5kX2FycmF5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChrZWVwIGFuZCBjYWxsYmFjayBhbmQgbm90IGNhbGxiYWNrKC0tZGVwdGgsIHBhcnNlX2V2ZW50X3Q6OmFycmF5X2VuZCwgcmVzdWx0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlLmRlc3Ryb3kocmVzdWx0Lm1fdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tX3R5cGUgPSB2YWx1ZV90OjpkaXNjYXJkZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmxpdGVyYWxfbnVsbDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6bnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OnN0cmluZzsKKyAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZSA9IG1fbGV4ZXIubW92ZV9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpsaXRlcmFsX3RydWU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OmJvb2xlYW47CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmxpdGVyYWxfZmFsc2U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdHlwZSA9IHZhbHVlX3Q6OmJvb2xlYW47CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOworICAgICAgICAgICAgICAgIHJlc3VsdC5tX3ZhbHVlID0gbV9sZXhlci5nZXRfbnVtYmVyX3Vuc2lnbmVkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6dmFsdWVfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBtX2xleGVyLmdldF9udW1iZXJfaW50ZWdlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1fdmFsdWUgPSBtX2xleGVyLmdldF9udW1iZXJfZmxvYXQoKTsKKworICAgICAgICAgICAgICAgIC8vIHRocm93IGluIGNhc2Ugb2YgaW5maW5pdHkgb3IgTkFOCisgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IHN0ZDo6aXNmaW5pdGUocmVzdWx0Lm1fdmFsdWUubnVtYmVyX2Zsb2F0KSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dfZXhjZXB0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDYsICJudW1iZXIgb3ZlcmZsb3cgcGFyc2luZyAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGV4ZXIuZ2V0X3Rva2VuX3N0cmluZygpICsgIiciKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRva2VuX3R5cGU6OnVuaW5pdGlhbGl6ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB1c2luZyAidW5pbml0aWFsaXplZCIgdG8gYXZvaWQgImV4cGVjdGVkIiBtZXNzYWdlCisgICAgICAgICAgICAgICAgaWYgKG5vdCBleHBlY3QodG9rZW5fdHlwZTo6dW5pbml0aWFsaXplZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBMQ09WX0VYQ0xfTElORQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuIHdhcyB1bmV4cGVjdGVkOyB3ZSBleHBlY3RlZCBhIHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKG5vdCBleHBlY3QodG9rZW5fdHlwZTo6bGl0ZXJhbF9vcl92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBMQ09WX0VYQ0xfTElORQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGtlZXAgYW5kIGNhbGxiYWNrIGFuZCBub3QgY2FsbGJhY2soZGVwdGgsIHBhcnNlX2V2ZW50X3Q6OnZhbHVlLCByZXN1bHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQubV90eXBlID0gdmFsdWVfdDo6ZGlzY2FyZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHRoZSBhY3R1YWwgYWNjZXB0b3IKKworICAgIEBpbnZhcmlhbnQgMS4gVGhlIGxhc3QgdG9rZW4gaXMgbm90IHlldCBwcm9jZXNzZWQuIFRoZXJlZm9yZSwgdGhlIGNhbGxlcgorICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbiBtdXN0IG1ha2Ugc3VyZSBhIHRva2VuIGhhcyBiZWVuIHJlYWQuCisgICAgICAgICAgICAgICAyLiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlIGxhc3QgdG9rZW4gaXMgcHJvY2Vzc2VkLgorICAgICAgICAgICAgICAgICAgVGhhdCBpcywgdGhlIGxhc3QgcmVhZCBjaGFyYWN0ZXIgd2FzIGFscmVhZHkgY29uc2lkZXJlZC4KKworICAgIFRoaXMgaW52YXJpYW50IG1ha2VzIHN1cmUgdGhhdCBubyB0b2tlbiBuZWVkcyB0byBiZSAidW5wdXQiLgorICAgICovCisgICAgYm9vbCBhY2NlcHRfaW50ZXJuYWwoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChsYXN0X3Rva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmJlZ2luX29iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyByZWFkIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKworICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgfSAtPiB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IHRva2VuX3R5cGU6OmVuZF9vYmplY3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIGtleQorICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF90b2tlbiAhPSB0b2tlbl90eXBlOjp2YWx1ZV9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHNlcGFyYXRvciAoOikKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuICE9IHRva2VuX3R5cGU6Om5hbWVfc2VwYXJhdG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBhY2NlcHRfaW50ZXJuYWwoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tbWEgLT4gbmV4dCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfdG9rZW4gPT0gdG9rZW5fdHlwZTo6dmFsdWVfc2VwYXJhdG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2luZyB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobGFzdF90b2tlbiA9PSB0b2tlbl90eXBlOjplbmRfb2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6YmVnaW5fYXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVhZCBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisKKyAgICAgICAgICAgICAgICAvLyBjbG9zaW5nIF0gLT4gd2UgYXJlIGRvbmUKKyAgICAgICAgICAgICAgICBpZiAobGFzdF90b2tlbiA9PSB0b2tlbl90eXBlOjplbmRfYXJyYXkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgYWNjZXB0X2ludGVybmFsKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hIC0+IG5leHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3Rva2VuID09IHRva2VuX3R5cGU6OnZhbHVlX3NlcGFyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcgXQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGxhc3RfdG9rZW4gPT0gdG9rZW5fdHlwZTo6ZW5kX2FycmF5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6dmFsdWVfZmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVqZWN0IGluZmluaXR5IG9yIE5BTgorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmlzZmluaXRlKG1fbGV4ZXIuZ2V0X251bWJlcl9mbG9hdCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpsaXRlcmFsX2ZhbHNlOgorICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjpsaXRlcmFsX251bGw6CisgICAgICAgICAgICBjYXNlIHRva2VuX3R5cGU6OmxpdGVyYWxfdHJ1ZToKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6dmFsdWVfaW50ZWdlcjoKKyAgICAgICAgICAgIGNhc2UgdG9rZW5fdHlwZTo6dmFsdWVfc3RyaW5nOgorICAgICAgICAgICAgY2FzZSB0b2tlbl90eXBlOjp2YWx1ZV91bnNpZ25lZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgZGVmYXVsdDogLy8gdGhlIGxhc3QgdG9rZW4gd2FzIHVuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gZ2V0IG5leHQgdG9rZW4gZnJvbSBsZXhlcgorICAgIHRva2VuX3R5cGUgZ2V0X3Rva2VuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAobGFzdF90b2tlbiA9IG1fbGV4ZXIuc2NhbigpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAxIGlmIGV4cGVjdGVkIHRva2VuIGRpZCBub3Qgb2NjdXIKKyAgICAqLworICAgIGJvb2wgZXhwZWN0KHRva2VuX3R5cGUgdCkKKyAgICB7CisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHQgIT0gbGFzdF90b2tlbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9yZWQgPSB0cnVlOworICAgICAgICAgICAgZXhwZWN0ZWQgPSB0OworICAgICAgICAgICAgaWYgKGFsbG93X2V4Y2VwdGlvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3dfZXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgW1tub3JldHVybl1dIHZvaWQgdGhyb3dfZXhjZXB0aW9uKCkgY29uc3QKKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX21zZyA9ICJzeW50YXggZXJyb3IgLSAiOworICAgICAgICBpZiAobGFzdF90b2tlbiA9PSB0b2tlbl90eXBlOjpwYXJzZV9lcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JfbXNnICs9IHN0ZDo6c3RyaW5nKG1fbGV4ZXIuZ2V0X2Vycm9yX21lc3NhZ2UoKSkgKyAiOyBsYXN0IHJlYWQ6ICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2xleGVyLmdldF90b2tlbl9zdHJpbmcoKSArICInIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9yX21zZyArPSAidW5leHBlY3RlZCAiICsgc3RkOjpzdHJpbmcobGV4ZXJfdDo6dG9rZW5fdHlwZV9uYW1lKGxhc3RfdG9rZW4pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHBlY3RlZCAhPSB0b2tlbl90eXBlOjp1bmluaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIjsgZXhwZWN0ZWQgIiArIHN0ZDo6c3RyaW5nKGxleGVyX3Q6OnRva2VuX3R5cGVfbmFtZShleHBlY3RlZCkpOworICAgICAgICB9CisKKyAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwMSwgbV9sZXhlci5nZXRfcG9zaXRpb24oKSwgZXJyb3JfbXNnKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLy8vIGN1cnJlbnQgbGV2ZWwgb2YgcmVjdXJzaW9uCisgICAgaW50IGRlcHRoID0gMDsKKyAgICAvLy8gY2FsbGJhY2sgZnVuY3Rpb24KKyAgICBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7CisgICAgLy8vIHRoZSB0eXBlIG9mIHRoZSBsYXN0IHJlYWQgdG9rZW4KKyAgICB0b2tlbl90eXBlIGxhc3RfdG9rZW4gPSB0b2tlbl90eXBlOjp1bmluaXRpYWxpemVkOworICAgIC8vLyB0aGUgbGV4ZXIKKyAgICBsZXhlcl90IG1fbGV4ZXI7CisgICAgLy8vIHdoZXRoZXIgYSBzeW50YXggZXJyb3Igb2NjdXJyZWQKKyAgICBib29sIGVycm9yZWQgPSBmYWxzZTsKKyAgICAvLy8gcG9zc2libGUgcmVhc29uIGZvciB0aGUgc3ludGF4IGVycm9yCisgICAgdG9rZW5fdHlwZSBleHBlY3RlZCA9IHRva2VuX3R5cGU6OnVuaW5pdGlhbGl6ZWQ7CisgICAgLy8vIHdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbiBjYXNlIG9mIGVycm9ycworICAgIGNvbnN0IGJvb2wgYWxsb3dfZXhjZXB0aW9ucyA9IHRydWU7Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2ludGVybmFsX2l0ZXJhdG9yLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9pbnRlcm5hbF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliOGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9pbnRlcm5hbF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwyNSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL3ByaW1pdGl2ZV9pdGVyYXRvci5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLyohCitAYnJpZWYgYW4gaXRlcmF0b3IgdmFsdWUKKworQG5vdGUgVGhpcyBzdHJ1Y3R1cmUgY291bGQgZWFzaWx5IGJlIGEgdW5pb24sIGJ1dCBNU1ZDIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdwordW5pb25zIG1lbWJlcnMgd2l0aCBjb21wbGV4IGNvbnN0cnVjdG9ycywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uL3B1bGwvMTA1LgorKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+IHN0cnVjdCBpbnRlcm5hbF9pdGVyYXRvcgoreworICAgIC8vLyBpdGVyYXRvciBmb3IgSlNPTiBvYmplY3RzCisgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q6Oml0ZXJhdG9yIG9iamVjdF9pdGVyYXRvciB7fTsKKyAgICAvLy8gaXRlcmF0b3IgZm9yIEpTT04gYXJyYXlzCisgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdDo6aXRlcmF0b3IgYXJyYXlfaXRlcmF0b3Ige307CisgICAgLy8vIGdlbmVyaWMgaXRlcmF0b3IgZm9yIGFsbCBvdGhlciB0eXBlcworICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IHByaW1pdGl2ZV9pdGVyYXRvciB7fTsKK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcl9pbXBsLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9pdGVyX2ltcGwuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWRlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcl9pbXBsLmhwcApAQCAtMCwwICsxLDYxNCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBub3QKKyNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gaXRlcmF0b3IsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgYWR2YW5jZSwgbmV4dAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBjb25kaXRpb25hbCwgaXNfY29uc3QsIHJlbW92ZV9jb25zdAorCisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2V4Y2VwdGlvbnMuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaW50ZXJuYWxfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvcHJpbWl0aXZlX2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8gZm9yd2FyZCBkZWNsYXJlLCB0byBiZSBhYmxlIHRvIGZyaWVuZCBpdCBsYXRlciBvbgordGVtcGxhdGU8dHlwZW5hbWUgSXRlcmF0b3JUeXBlPiBjbGFzcyBpdGVyYXRpb25fcHJveHk7CisKKy8qIQorQGJyaWVmIGEgdGVtcGxhdGUgZm9yIGEgYmlkaXJlY3Rpb25hbCBpdGVyYXRvciBmb3IgdGhlIEByZWYgYmFzaWNfanNvbiBjbGFzcworCitUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBib3RoIGl0ZXJhdG9ycyAoaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yKSBmb3IgdGhlCitAcmVmIGJhc2ljX2pzb24gY2xhc3MuCisKK0Bub3RlIEFuIGl0ZXJhdG9yIGlzIGNhbGxlZCAqaW5pdGlhbGl6ZWQqIHdoZW4gYSBwb2ludGVyIHRvIGEgSlNPTiB2YWx1ZSBoYXMKKyAgICAgIGJlZW4gc2V0IChlLmcuLCBieSBhIGNvbnN0cnVjdG9yIG9yIGEgY29weSBhc3NpZ25tZW50KS4gSWYgdGhlIGl0ZXJhdG9yIGlzCisgICAgICBkZWZhdWx0LWNvbnN0cnVjdGVkLCBpdCBpcyAqdW5pbml0aWFsaXplZCogYW5kIG1vc3QgbWV0aG9kcyBhcmUgdW5kZWZpbmVkLgorICAgICAgKipUaGUgbGlicmFyeSB1c2VzIGFzc2VydGlvbnMgdG8gZGV0ZWN0IGNhbGxzIG9uIHVuaW5pdGlhbGl6ZWQgaXRlcmF0b3JzLioqCisKK0ByZXF1aXJlbWVudCBUaGUgY2xhc3Mgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgY29uY2VwdCByZXF1aXJlbWVudHM6CistCitbQmlkaXJlY3Rpb25hbEl0ZXJhdG9yXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0JpZGlyZWN0aW9uYWxJdGVyYXRvcik6CisgIFRoZSBpdGVyYXRvciB0aGF0IGNhbiBiZSBtb3ZlZCBjYW4gYmUgbW92ZWQgaW4gYm90aCBkaXJlY3Rpb25zIChpLmUuCisgIGluY3JlbWVudGVkIGFuZCBkZWNyZW1lbnRlZCkuCisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wLCBzaW1wbGlmaWVkIGluIHZlcnNpb24gMi4wLjksIGNoYW5nZSB0byBiaWRpcmVjdGlvbmFsCisgICAgICAgaXRlcmF0b3JzIGluIHZlcnNpb24gMy4wLjAgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbi9pc3N1ZXMvNTkzKQorKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CitjbGFzcyBpdGVyX2ltcGwKK3sKKyAgICAvLy8gYWxsb3cgYmFzaWNfanNvbiB0byBhY2Nlc3MgcHJpdmF0ZSBtZW1iZXJzCisgICAgZnJpZW5kIGl0ZXJfaW1wbDx0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHN0ZDo6aXNfY29uc3Q8QmFzaWNKc29uVHlwZT46OnZhbHVlLCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxCYXNpY0pzb25UeXBlPjo6dHlwZSwgY29uc3QgQmFzaWNKc29uVHlwZT46OnR5cGU+OworICAgIGZyaWVuZCBCYXNpY0pzb25UeXBlOworICAgIGZyaWVuZCBpdGVyYXRpb25fcHJveHk8aXRlcl9pbXBsPjsKKworICAgIHVzaW5nIG9iamVjdF90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q7CisgICAgdXNpbmcgYXJyYXlfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3Q7CisgICAgLy8gbWFrZSBzdXJlIEJhc2ljSnNvblR5cGUgaXMgYmFzaWNfanNvbiBvciBjb25zdCBiYXNpY19qc29uCisgICAgc3RhdGljX2Fzc2VydChpc19iYXNpY19qc29uPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PEJhc2ljSnNvblR5cGU+Ojp0eXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiaXRlcl9pbXBsIG9ubHkgYWNjZXB0cyAoY29uc3QpIGJhc2ljX2pzb24iKTsKKworICBwdWJsaWM6CisKKyAgICAvLy8gVGhlIHN0ZDo6aXRlcmF0b3IgY2xhc3MgdGVtcGxhdGUgKHVzZWQgYXMgYSBiYXNlIGNsYXNzIHRvIHByb3ZpZGUgdHlwZWRlZnMpIGlzIGRlcHJlY2F0ZWQgaW4gQysrMTcuCisgICAgLy8vIFRoZSBDKysgU3RhbmRhcmQgaGFzIG5ldmVyIHJlcXVpcmVkIHVzZXItZGVmaW5lZCBpdGVyYXRvcnMgdG8gZGVyaXZlIGZyb20gc3RkOjppdGVyYXRvci4KKyAgICAvLy8gQSB1c2VyLWRlZmluZWQgaXRlcmF0b3Igc2hvdWxkIHByb3ZpZGUgcHVibGljbHkgYWNjZXNzaWJsZSB0eXBlZGVmcyBuYW1lZAorICAgIC8vLyBpdGVyYXRvcl9jYXRlZ29yeSwgdmFsdWVfdHlwZSwgZGlmZmVyZW5jZV90eXBlLCBwb2ludGVyLCBhbmQgcmVmZXJlbmNlLgorICAgIC8vLyBOb3RlIHRoYXQgdmFsdWVfdHlwZSBpcyByZXF1aXJlZCB0byBiZSBub24tY29uc3QsIGV2ZW4gZm9yIGNvbnN0YW50IGl0ZXJhdG9ycy4KKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc7CisKKyAgICAvLy8gdGhlIHR5cGUgb2YgdGhlIHZhbHVlcyB3aGVuIHRoZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWQKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6dmFsdWVfdHlwZTsKKyAgICAvLy8gYSB0eXBlIHRvIHJlcHJlc2VudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGl0ZXJhdG9ycworICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmRpZmZlcmVuY2VfdHlwZTsKKyAgICAvLy8gZGVmaW5lcyBhIHBvaW50ZXIgdG8gdGhlIHR5cGUgaXRlcmF0ZWQgb3ZlciAodmFsdWVfdHlwZSkKKyAgICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX2NvbnN0PEJhc2ljSnNvblR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpjb25zdF9wb2ludGVyLAorICAgICAgICAgIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnBvaW50ZXI+Ojp0eXBlOworICAgIC8vLyBkZWZpbmVzIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGl0ZXJhdGVkIG92ZXIgKHZhbHVlX3R5cGUpCisgICAgdXNpbmcgcmVmZXJlbmNlID0KKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdGQ6OmlzX2NvbnN0PEJhc2ljSnNvblR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Y29uc3RfcmVmZXJlbmNlLAorICAgICAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpyZWZlcmVuY2U+Ojp0eXBlOworCisgICAgLy8vIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICBpdGVyX2ltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29uc3RydWN0b3IgZm9yIGEgZ2l2ZW4gSlNPTiBpbnN0YW5jZQorICAgIEBwYXJhbVtpbl0gb2JqZWN0ICBwb2ludGVyIHRvIGEgSlNPTiBvYmplY3QgZm9yIHRoaXMgaXRlcmF0b3IKKyAgICBAcHJlIG9iamVjdCAhPSBudWxscHRyCisgICAgQHBvc3QgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIGV4cGxpY2l0IGl0ZXJfaW1wbChwb2ludGVyIG9iamVjdCkgbm9leGNlcHQgOiBtX29iamVjdChvYmplY3QpCisgICAgeworICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgc3dpdGNoIChtX29iamVjdC0+bV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2l0Lm9iamVjdF9pdGVyYXRvciA9IHR5cGVuYW1lIG9iamVjdF90OjppdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXQuYXJyYXlfaXRlcmF0b3IgPSB0eXBlbmFtZSBhcnJheV90OjppdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yID0gcHJpbWl0aXZlX2l0ZXJhdG9yX3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBub3RlIFRoZSBjb252ZW50aW9uYWwgY29weSBjb25zdHJ1Y3RvciBhbmQgY29weSBhc3NpZ25tZW50IGFyZSBpbXBsaWNpdGx5CisgICAgICAgICAgZGVmaW5lZC4gQ29tYmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnZlcnRpbmcgY29uc3RydWN0b3IgYW5kCisgICAgICAgICAgYXNzaWdubWVudCwgdGhleSBzdXBwb3J0OiAoMSkgY29weSBmcm9tIGl0ZXJhdG9yIHRvIGl0ZXJhdG9yLCAoMikKKyAgICAgICAgICBjb3B5IGZyb20gY29uc3QgaXRlcmF0b3IgdG8gY29uc3QgaXRlcmF0b3IsIGFuZCAoMykgY29udmVyc2lvbiBmcm9tCisgICAgICAgICAgaXRlcmF0b3IgdG8gY29uc3QgaXRlcmF0b3IuIEhvd2V2ZXIgY29udmVyc2lvbiBmcm9tIGNvbnN0IGl0ZXJhdG9yCisgICAgICAgICAgdG8gaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuCisgICAgKi8KKworICAgIC8qIQorICAgIEBicmllZiBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yCisgICAgQHBhcmFtW2luXSBvdGhlciAgbm9uLWNvbnN0IGl0ZXJhdG9yIHRvIGNvcHkgZnJvbQorICAgIEBub3RlIEl0IGlzIG5vdCBjaGVja2VkIHdoZXRoZXIgQGEgb3RoZXIgaXMgaW5pdGlhbGl6ZWQuCisgICAgKi8KKyAgICBpdGVyX2ltcGwoY29uc3QgaXRlcl9pbXBsPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PEJhc2ljSnNvblR5cGU+Ojp0eXBlPiYgb3RoZXIpIG5vZXhjZXB0CisgICAgICAgIDogbV9vYmplY3Qob3RoZXIubV9vYmplY3QpLCBtX2l0KG90aGVyLm1faXQpIHt9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29udmVydGluZyBhc3NpZ25tZW50CisgICAgQHBhcmFtW2luLG91dF0gb3RoZXIgIG5vbi1jb25zdCBpdGVyYXRvciB0byBjb3B5IGZyb20KKyAgICBAcmV0dXJuIGNvbnN0L25vbi1jb25zdCBpdGVyYXRvcgorICAgIEBub3RlIEl0IGlzIG5vdCBjaGVja2VkIHdoZXRoZXIgQGEgb3RoZXIgaXMgaW5pdGlhbGl6ZWQuCisgICAgKi8KKyAgICBpdGVyX2ltcGwmIG9wZXJhdG9yPShjb25zdCBpdGVyX2ltcGw8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8QmFzaWNKc29uVHlwZT46OnR5cGU+JiBvdGhlcikgbm9leGNlcHQKKyAgICB7CisgICAgICAgIG1fb2JqZWN0ID0gb3RoZXIubV9vYmplY3Q7CisgICAgICAgIG1faXQgPSBvdGhlci5tX2l0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyohCisgICAgQGJyaWVmIHNldCB0aGUgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IHZhbHVlCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgdm9pZCBzZXRfYmVnaW4oKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdC5vYmplY3RfaXRlcmF0b3IgPSBtX29iamVjdC0+bV92YWx1ZS5vYmplY3QtPmJlZ2luKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdC5hcnJheV9pdGVyYXRvciA9IG1fb2JqZWN0LT5tX3ZhbHVlLmFycmF5LT5iZWdpbigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHRvIGVuZCBzbyBiZWdpbigpPT1lbmQoKSBpcyB0cnVlOiBudWxsIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgbV9pdC5wcmltaXRpdmVfaXRlcmF0b3Iuc2V0X2VuZCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLnNldF9iZWdpbigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHNldCB0aGUgaXRlcmF0b3IgcGFzdCB0aGUgbGFzdCB2YWx1ZQorICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIHZvaWQgc2V0X2VuZCgpIG5vZXhjZXB0CisgICAgeworICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgc3dpdGNoIChtX29iamVjdC0+bV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2l0Lm9iamVjdF9pdGVyYXRvciA9IG1fb2JqZWN0LT5tX3ZhbHVlLm9iamVjdC0+ZW5kKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pdC5hcnJheV9pdGVyYXRvciA9IG1fb2JqZWN0LT5tX3ZhbHVlLmFycmF5LT5lbmQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5zZXRfZW5kKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgcHVibGljOgorICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlIGl0ZXJhdG9yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgc3dpdGNoIChtX29iamVjdC0+bV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQobV9pdC5vYmplY3RfaXRlcmF0b3IgIT0gbV9vYmplY3QtPm1fdmFsdWUub2JqZWN0LT5lbmQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faXQub2JqZWN0X2l0ZXJhdG9yLT5zZWNvbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG1faXQuYXJyYXlfaXRlcmF0b3IgIT0gbV9vYmplY3QtPm1fdmFsdWUuYXJyYXktPmVuZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKm1faXQuYXJyYXlfaXRlcmF0b3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMTQsICJjYW5ub3QgZ2V0IHZhbHVlIikpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWShtX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5pc19iZWdpbigpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqbV9vYmplY3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjE0LCAiY2Fubm90IGdldCB2YWx1ZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXJlZmVyZW5jZSB0aGUgaXRlcmF0b3IKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG1faXQub2JqZWN0X2l0ZXJhdG9yICE9IG1fb2JqZWN0LT5tX3ZhbHVlLm9iamVjdC0+ZW5kKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAmKG1faXQub2JqZWN0X2l0ZXJhdG9yLT5zZWNvbmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydChtX2l0LmFycmF5X2l0ZXJhdG9yICE9IG1fb2JqZWN0LT5tX3ZhbHVlLmFycmF5LT5lbmQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICYqbV9pdC5hcnJheV9pdGVyYXRvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkobV9pdC5wcmltaXRpdmVfaXRlcmF0b3IuaXNfYmVnaW4oKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9vYmplY3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjE0LCAiY2Fubm90IGdldCB2YWx1ZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBwb3N0LWluY3JlbWVudCAoaXQrKykKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBpdGVyX2ltcGwgY29uc3Qgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOworICAgICAgICArKygqdGhpcyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHByZS1pbmNyZW1lbnQgKCsraXQpCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgaXRlcl9pbXBsJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICAgIGFzc2VydChtX29iamVjdCAhPSBudWxscHRyKTsKKworICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6YWR2YW5jZShtX2l0Lm9iamVjdF9pdGVyYXRvciwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjphZHZhbmNlKG1faXQuYXJyYXlfaXRlcmF0b3IsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbV9pdC5wcmltaXRpdmVfaXRlcmF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHBvc3QtZGVjcmVtZW50IChpdC0tKQorICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIGl0ZXJfaW1wbCBjb25zdCBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gKnRoaXM7CisgICAgICAgIC0tKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcHJlLWRlY3JlbWVudCAoLS1pdCkKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBpdGVyX2ltcGwmIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjphZHZhbmNlKG1faXQub2JqZWN0X2l0ZXJhdG9yLCAtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjphZHZhbmNlKG1faXQuYXJyYXlfaXRlcmF0b3IsIC0xKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAtLW1faXQucHJpbWl0aXZlX2l0ZXJhdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiAgY29tcGFyaXNvbjogZXF1YWwKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIGlmIG9iamVjdHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhlIGNvbXBhcmlzb24gaXMgdW5kZWZpbmVkCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG1fb2JqZWN0ICE9IG90aGVyLm1fb2JqZWN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjEyLCAiY2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBjb250YWluZXJzIikpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIChtX2l0Lm9iamVjdF9pdGVyYXRvciA9PSBvdGhlci5tX2l0Lm9iamVjdF9pdGVyYXRvcik7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgcmV0dXJuIChtX2l0LmFycmF5X2l0ZXJhdG9yID09IG90aGVyLm1faXQuYXJyYXlfaXRlcmF0b3IpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAobV9pdC5wcmltaXRpdmVfaXRlcmF0b3IgPT0gb3RoZXIubV9pdC5wcmltaXRpdmVfaXRlcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBjb21wYXJpc29uOiBub3QgZXF1YWwKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBub3Qgb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBjb21wYXJpc29uOiBzbWFsbGVyCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIGlmIG9iamVjdHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhlIGNvbXBhcmlzb24gaXMgdW5kZWZpbmVkCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG1fb2JqZWN0ICE9IG90aGVyLm1fb2JqZWN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjEyLCAiY2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBjb250YWluZXJzIikpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIHN3aXRjaCAobV9vYmplY3QtPm1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjEzLCAiY2Fubm90IGNvbXBhcmUgb3JkZXIgb2Ygb2JqZWN0IGl0ZXJhdG9ycyIpKTsKKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1faXQuYXJyYXlfaXRlcmF0b3IgPCBvdGhlci5tX2l0LmFycmF5X2l0ZXJhdG9yKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yIDwgb3RoZXIubV9pdC5wcmltaXRpdmVfaXRlcmF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBjb21wYXJpc29uOiBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBub3Qgb3RoZXIub3BlcmF0b3IgPCAoKnRoaXMpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiAgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBub3Qgb3BlcmF0b3I8PShvdGhlcik7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBub3Qgb3BlcmF0b3I8KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgIGFkZCB0byBpdGVyYXRvcgorICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIGl0ZXJfaW1wbCYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgaSkKKyAgICB7CisgICAgICAgIGFzc2VydChtX29iamVjdCAhPSBudWxscHRyKTsKKworICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwOSwgImNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKSk7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjphZHZhbmNlKG1faXQuYXJyYXlfaXRlcmF0b3IsIGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXQucHJpbWl0aXZlX2l0ZXJhdG9yICs9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBzdWJ0cmFjdCBmcm9tIGl0ZXJhdG9yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgaXRlcl9pbXBsJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdG9yKz0oLWkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiAgYWRkIHRvIGl0ZXJhdG9yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgaXRlcl9pbXBsIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgaSkgY29uc3QKKyAgICB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gKnRoaXM7CisgICAgICAgIHJlc3VsdCArPSBpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiAgYWRkaXRpb24gb2YgZGlzdGFuY2UgYW5kIGl0ZXJhdG9yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgZnJpZW5kIGl0ZXJfaW1wbCBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGksIGNvbnN0IGl0ZXJfaW1wbCYgaXQpCisgICAgeworICAgICAgICBhdXRvIHJlc3VsdCA9IGl0OworICAgICAgICByZXN1bHQgKz0gaTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgIHN1YnRyYWN0IGZyb20gaXRlcmF0b3IKKyAgICBAcHJlIFRoZSBpdGVyYXRvciBpcyBpbml0aWFsaXplZDsgaS5lLiBgbV9vYmplY3QgIT0gbnVsbHB0cmAuCisgICAgKi8KKyAgICBpdGVyX2ltcGwgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgcmVzdWx0IC09IGk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICByZXR1cm4gZGlmZmVyZW5jZQorICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcl9pbXBsJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIGFzc2VydChtX29iamVjdCAhPSBudWxscHRyKTsKKworICAgICAgICBzd2l0Y2ggKG1fb2JqZWN0LT5tX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwOSwgImNhbm5vdCB1c2Ugb2Zmc2V0cyB3aXRoIG9iamVjdCBpdGVyYXRvcnMiKSk7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1faXQuYXJyYXlfaXRlcmF0b3IgLSBvdGhlci5tX2l0LmFycmF5X2l0ZXJhdG9yOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBtX2l0LnByaW1pdGl2ZV9pdGVyYXRvciAtIG90aGVyLm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICBhY2Nlc3MgdG8gc3VjY2Vzc29yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQobV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgc3dpdGNoIChtX29iamVjdC0+bV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDgsICJjYW5ub3QgdXNlIG9wZXJhdG9yW10gZm9yIG9iamVjdCBpdGVyYXRvcnMiKSk7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgcmV0dXJuICpzdGQ6Om5leHQobV9pdC5hcnJheV9pdGVyYXRvciwgbik7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMTQsICJjYW5ub3QgZ2V0IHZhbHVlIikpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChKU09OX0xJS0VMWShtX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5nZXRfdmFsdWUoKSA9PSAtbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKm1fb2JqZWN0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxNCwgImNhbm5vdCBnZXQgdmFsdWUiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgIHJldHVybiB0aGUga2V5IG9mIGFuIG9iamVjdCBpdGVyYXRvcgorICAgIEBwcmUgVGhlIGl0ZXJhdG9yIGlzIGluaXRpYWxpemVkOyBpLmUuIGBtX29iamVjdCAhPSBudWxscHRyYC4KKyAgICAqLworICAgIHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSBrZXkoKSBjb25zdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fb2JqZWN0ICE9IG51bGxwdHIpOworCisgICAgICAgIGlmIChKU09OX0xJS0VMWShtX29iamVjdC0+aXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pdC5vYmplY3RfaXRlcmF0b3ItPmZpcnN0OworICAgICAgICB9CisKKyAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjA3LCAiY2Fubm90IHVzZSBrZXkoKSBmb3Igbm9uLW9iamVjdCBpdGVyYXRvcnMiKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmICByZXR1cm4gdGhlIHZhbHVlIG9mIGFuIGl0ZXJhdG9yCisgICAgQHByZSBUaGUgaXRlcmF0b3IgaXMgaW5pdGlhbGl6ZWQ7IGkuZS4gYG1fb2JqZWN0ICE9IG51bGxwdHJgLgorICAgICovCisgICAgcmVmZXJlbmNlIHZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVyYXRvciooKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gYXNzb2NpYXRlZCBKU09OIGluc3RhbmNlCisgICAgcG9pbnRlciBtX29iamVjdCA9IG51bGxwdHI7CisgICAgLy8vIHRoZSBhY3R1YWwgaXRlcmF0b3Igb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UKKyAgICBpbnRlcm5hbF9pdGVyYXRvcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxCYXNpY0pzb25UeXBlPjo6dHlwZT4gbV9pdDsKK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcmF0aW9uX3Byb3h5LmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9pdGVyYXRpb25fcHJveHkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDdkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcmF0aW9uX3Byb3h5LmhwcApAQCAtMCwwICsxLDk4IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nLCB0b19zdHJpbmcKKworI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisvLy8gcHJveHkgY2xhc3MgZm9yIHRoZSBpdGVtcygpIGZ1bmN0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvclR5cGU+IGNsYXNzIGl0ZXJhdGlvbl9wcm94eQoreworICBwcml2YXRlOgorICAgIC8vLyBoZWxwZXIgY2xhc3MgZm9yIGl0ZXJhdGlvbgorICAgIGNsYXNzIGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbAorICAgIHsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIC8vLyB0aGUgaXRlcmF0b3IKKyAgICAgICAgSXRlcmF0b3JUeXBlIGFuY2hvcjsKKyAgICAgICAgLy8vIGFuIGluZGV4IGZvciBhcnJheXMgKHVzZWQgdG8gY3JlYXRlIGtleSBuYW1lcykKKyAgICAgICAgc3RkOjpzaXplX3QgYXJyYXlfaW5kZXggPSAwOworCisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbChJdGVyYXRvclR5cGUgaXQpIG5vZXhjZXB0IDogYW5jaG9yKGl0KSB7fQorCisgICAgICAgIC8vLyBkZXJlZmVyZW5jZSBvcGVyYXRvciAobmVlZGVkIGZvciByYW5nZS1iYXNlZCBmb3IpCisgICAgICAgIGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbCYgb3BlcmF0b3IqKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIGluY3JlbWVudCBvcGVyYXRvciAobmVlZGVkIGZvciByYW5nZS1iYXNlZCBmb3IpCisgICAgICAgIGl0ZXJhdGlvbl9wcm94eV9pbnRlcm5hbCYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrYW5jaG9yOworICAgICAgICAgICAgKythcnJheV9pbmRleDsKKworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIGluZXF1YWxpdHkgb3BlcmF0b3IgKG5lZWRlZCBmb3IgcmFuZ2UtYmFzZWQgZm9yKQorICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsJiBvKSBjb25zdCBub2V4Y2VwdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYW5jaG9yICE9IG8uYW5jaG9yOworICAgICAgICB9CisKKyAgICAgICAgLy8vIHJldHVybiBrZXkgb2YgdGhlIGl0ZXJhdG9yCisgICAgICAgIHN0ZDo6c3RyaW5nIGtleSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChhbmNob3IubV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgICAgIHN3aXRjaCAoYW5jaG9yLm1fb2JqZWN0LT50eXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGludGVnZXIgYXJyYXkgaW5kZXggYXMga2V5CisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKGFycmF5X2luZGV4KTsKKworICAgICAgICAgICAgICAgIC8vIHVzZSBrZXkgZnJvbSB0aGUgb2JqZWN0CisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmNob3Iua2V5KCk7CisKKyAgICAgICAgICAgICAgICAvLyB1c2UgYW4gZW1wdHkga2V5IGZvciBhbGwgcHJpbWl0aXZlIHR5cGVzCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHJldHVybiB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IKKyAgICAgICAgdHlwZW5hbWUgSXRlcmF0b3JUeXBlOjpyZWZlcmVuY2UgdmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYW5jaG9yLnZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8vIHRoZSBjb250YWluZXIgdG8gaXRlcmF0ZQorICAgIHR5cGVuYW1lIEl0ZXJhdG9yVHlwZTo6cmVmZXJlbmNlIGNvbnRhaW5lcjsKKworICBwdWJsaWM6CisgICAgLy8vIGNvbnN0cnVjdCBpdGVyYXRpb24gcHJveHkgZnJvbSBhIGNvbnRhaW5lcgorICAgIGV4cGxpY2l0IGl0ZXJhdGlvbl9wcm94eSh0eXBlbmFtZSBJdGVyYXRvclR5cGU6OnJlZmVyZW5jZSBjb250KSBub2V4Y2VwdAorICAgICAgICA6IGNvbnRhaW5lcihjb250KSB7fQorCisgICAgLy8vIHJldHVybiBpdGVyYXRvciBiZWdpbiAobmVlZGVkIGZvciByYW5nZS1iYXNlZCBmb3IpCisgICAgaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsIGJlZ2luKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwoY29udGFpbmVyLmJlZ2luKCkpOworICAgIH0KKworICAgIC8vLyByZXR1cm4gaXRlcmF0b3IgZW5kIChuZWVkZWQgZm9yIHJhbmdlLWJhc2VkIGZvcikKKyAgICBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwgZW5kKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHlfaW50ZXJuYWwoY29udGFpbmVyLmVuZCgpKTsKKyAgICB9Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2pzb25fcmV2ZXJzZV9pdGVyYXRvci5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvanNvbl9yZXZlcnNlX2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQ0ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2pzb25fcmV2ZXJzZV9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMTkgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gcHRyZGlmZl90CisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIHJldmVyc2VfaXRlcmF0b3IKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBkZWNsdmFsCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gcmV2ZXJzZV9pdGVyYXRvciAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiEKK0BicmllZiBhIHRlbXBsYXRlIGZvciBhIHJldmVyc2UgaXRlcmF0b3IgY2xhc3MKKworQHRwYXJhbSBCYXNlIHRoZSBiYXNlIGl0ZXJhdG9yIHR5cGUgdG8gcmV2ZXJzZS4gVmFsaWQgdHlwZXMgYXJlIEByZWYKK2l0ZXJhdG9yICh0byBjcmVhdGUgQHJlZiByZXZlcnNlX2l0ZXJhdG9yKSBhbmQgQHJlZiBjb25zdF9pdGVyYXRvciAodG8KK2NyZWF0ZSBAcmVmIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IpLgorCitAcmVxdWlyZW1lbnQgVGhlIGNsYXNzIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIGNvbmNlcHQgcmVxdWlyZW1lbnRzOgorLQorW0JpZGlyZWN0aW9uYWxJdGVyYXRvcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9CaWRpcmVjdGlvbmFsSXRlcmF0b3IpOgorICBUaGUgaXRlcmF0b3IgdGhhdCBjYW4gYmUgbW92ZWQgY2FuIGJlIG1vdmVkIGluIGJvdGggZGlyZWN0aW9ucyAoaS5lLgorICBpbmNyZW1lbnRlZCBhbmQgZGVjcmVtZW50ZWQpLgorLSBbT3V0cHV0SXRlcmF0b3JdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvT3V0cHV0SXRlcmF0b3IpOgorICBJdCBpcyBwb3NzaWJsZSB0byB3cml0ZSB0byB0aGUgcG9pbnRlZC10byBlbGVtZW50IChvbmx5IGlmIEBhIEJhc2UgaXMKKyAgQHJlZiBpdGVyYXRvcikuCisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisqLwordGVtcGxhdGU8dHlwZW5hbWUgQmFzZT4KK2NsYXNzIGpzb25fcmV2ZXJzZV9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8QmFzZT4KK3sKKyAgcHVibGljOgorICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworICAgIC8vLyBzaG9ydGN1dCB0byB0aGUgcmV2ZXJzZSBpdGVyYXRvciBhZGFwdGVyCisgICAgdXNpbmcgYmFzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxCYXNlPjsKKyAgICAvLy8gdGhlIHJlZmVyZW5jZSB0eXBlIGZvciB0aGUgcG9pbnRlZC10byBlbGVtZW50CisgICAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgQmFzZTo6cmVmZXJlbmNlOworCisgICAgLy8vIGNyZWF0ZSByZXZlcnNlIGl0ZXJhdG9yIGZyb20gaXRlcmF0b3IKKyAgICBqc29uX3JldmVyc2VfaXRlcmF0b3IoY29uc3QgdHlwZW5hbWUgYmFzZV9pdGVyYXRvcjo6aXRlcmF0b3JfdHlwZSYgaXQpIG5vZXhjZXB0CisgICAgICAgIDogYmFzZV9pdGVyYXRvcihpdCkge30KKworICAgIC8vLyBjcmVhdGUgcmV2ZXJzZSBpdGVyYXRvciBmcm9tIGJhc2UgY2xhc3MKKyAgICBqc29uX3JldmVyc2VfaXRlcmF0b3IoY29uc3QgYmFzZV9pdGVyYXRvciYgaXQpIG5vZXhjZXB0IDogYmFzZV9pdGVyYXRvcihpdCkge30KKworICAgIC8vLyBwb3N0LWluY3JlbWVudCAoaXQrKykKKyAgICBqc29uX3JldmVyc2VfaXRlcmF0b3IgY29uc3Qgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8anNvbl9yZXZlcnNlX2l0ZXJhdG9yPihiYXNlX2l0ZXJhdG9yOjpvcGVyYXRvcisrKDEpKTsKKyAgICB9CisKKyAgICAvLy8gcHJlLWluY3JlbWVudCAoKytpdCkKKyAgICBqc29uX3JldmVyc2VfaXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGpzb25fcmV2ZXJzZV9pdGVyYXRvciY+KGJhc2VfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSk7CisgICAgfQorCisgICAgLy8vIHBvc3QtZGVjcmVtZW50IChpdC0tKQorICAgIGpzb25fcmV2ZXJzZV9pdGVyYXRvciBjb25zdCBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxqc29uX3JldmVyc2VfaXRlcmF0b3I+KGJhc2VfaXRlcmF0b3I6Om9wZXJhdG9yLS0oMSkpOworICAgIH0KKworICAgIC8vLyBwcmUtZGVjcmVtZW50ICgtLWl0KQorICAgIGpzb25fcmV2ZXJzZV9pdGVyYXRvciYgb3BlcmF0b3ItLSgpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8anNvbl9yZXZlcnNlX2l0ZXJhdG9yJj4oYmFzZV9pdGVyYXRvcjo6b3BlcmF0b3ItLSgpKTsKKyAgICB9CisKKyAgICAvLy8gYWRkIHRvIGl0ZXJhdG9yCisgICAganNvbl9yZXZlcnNlX2l0ZXJhdG9yJiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGpzb25fcmV2ZXJzZV9pdGVyYXRvciY+KGJhc2VfaXRlcmF0b3I6Om9wZXJhdG9yKz0oaSkpOworICAgIH0KKworICAgIC8vLyBhZGQgdG8gaXRlcmF0b3IKKyAgICBqc29uX3JldmVyc2VfaXRlcmF0b3Igb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGpzb25fcmV2ZXJzZV9pdGVyYXRvcj4oYmFzZV9pdGVyYXRvcjo6b3BlcmF0b3IrKGkpKTsKKyAgICB9CisKKyAgICAvLy8gc3VidHJhY3QgZnJvbSBpdGVyYXRvcgorICAgIGpzb25fcmV2ZXJzZV9pdGVyYXRvciBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIGkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8anNvbl9yZXZlcnNlX2l0ZXJhdG9yPihiYXNlX2l0ZXJhdG9yOjpvcGVyYXRvci0oaSkpOworICAgIH0KKworICAgIC8vLyByZXR1cm4gZGlmZmVyZW5jZQorICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QganNvbl9yZXZlcnNlX2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlX2l0ZXJhdG9yKCp0aGlzKSAtIGJhc2VfaXRlcmF0b3Iob3RoZXIpOworICAgIH0KKworICAgIC8vLyBhY2Nlc3MgdG8gc3VjY2Vzc29yCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIG4pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKih0aGlzLT5vcGVyYXRvcisobikpOworICAgIH0KKworICAgIC8vLyByZXR1cm4gdGhlIGtleSBvZiBhbiBvYmplY3QgaXRlcmF0b3IKKyAgICBhdXRvIGtleSgpIGNvbnN0IC0+IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxCYXNlPigpLmtleSgpKQorICAgIHsKKyAgICAgICAgYXV0byBpdCA9IC0tdGhpcy0+YmFzZSgpOworICAgICAgICByZXR1cm4gaXQua2V5KCk7CisgICAgfQorCisgICAgLy8vIHJldHVybiB0aGUgdmFsdWUgb2YgYW4gaXRlcmF0b3IKKyAgICByZWZlcmVuY2UgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgYXV0byBpdCA9IC0tdGhpcy0+YmFzZSgpOworICAgICAgICByZXR1cm4gaXQub3BlcmF0b3IgKiAoKTsKKyAgICB9Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL3ByaW1pdGl2ZV9pdGVyYXRvci5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvcHJpbWl0aXZlX2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBiMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL3ByaW1pdGl2ZV9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMjAgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gcHRyZGlmZl90CisjaW5jbHVkZSA8bGltaXRzPiAgLy8gbnVtZXJpY19saW1pdHMKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisvKgorQGJyaWVmIGFuIGl0ZXJhdG9yIGZvciBwcmltaXRpdmUgSlNPTiB0eXBlcworCitUaGlzIGNsYXNzIG1vZGVscyBhbiBpdGVyYXRvciBmb3IgcHJpbWl0aXZlIEpTT04gdHlwZXMgKGJvb2xlYW4sIG51bWJlciwKK3N0cmluZykuIEl0J3Mgb25seSBwdXJwb3NlIGlzIHRvIGFsbG93IHRoZSBpdGVyYXRvci9jb25zdF9pdGVyYXRvciBjbGFzc2VzCit0byAiaXRlcmF0ZSIgb3ZlciBwcmltaXRpdmUgdmFsdWVzLiBJbnRlcm5hbGx5LCB0aGUgaXRlcmF0b3IgaXMgbW9kZWxlZCBieQorYSBgZGlmZmVyZW5jZV90eXBlYCB2YXJpYWJsZS4gVmFsdWUgYmVnaW5fdmFsdWUgKGAwYCkgbW9kZWxzIHRoZSBiZWdpbiwKK2VuZF92YWx1ZSAoYDFgKSBtb2RlbHMgcGFzdCB0aGUgZW5kLgorKi8KK2NsYXNzIHByaW1pdGl2ZV9pdGVyYXRvcl90Cit7CisgIHByaXZhdGU6CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgICAgc3RhdGljIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgYmVnaW5fdmFsdWUgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgZGlmZmVyZW5jZV90eXBlIGVuZF92YWx1ZSA9IGJlZ2luX3ZhbHVlICsgMTsKKworICAgIC8vLyBpdGVyYXRvciBhcyBzaWduZWQgaW50ZWdlciB0eXBlCisgICAgZGlmZmVyZW5jZV90eXBlIG1faXQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnB0cmRpZmZfdD46Om1pbikoKTsKKworICBwdWJsaWM6CisgICAgY29uc3RleHByIGRpZmZlcmVuY2VfdHlwZSBnZXRfdmFsdWUoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faXQ7CisgICAgfQorCisgICAgLy8vIHNldCBpdGVyYXRvciB0byBhIGRlZmluZWQgYmVnaW5uaW5nCisgICAgdm9pZCBzZXRfYmVnaW4oKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgbV9pdCA9IGJlZ2luX3ZhbHVlOworICAgIH0KKworICAgIC8vLyBzZXQgaXRlcmF0b3IgdG8gYSBkZWZpbmVkIHBhc3QgdGhlIGVuZAorICAgIHZvaWQgc2V0X2VuZCgpIG5vZXhjZXB0CisgICAgeworICAgICAgICBtX2l0ID0gZW5kX3ZhbHVlOworICAgIH0KKworICAgIC8vLyByZXR1cm4gd2hldGhlciB0aGUgaXRlcmF0b3IgY2FuIGJlIGRlcmVmZXJlbmNlZAorICAgIGNvbnN0ZXhwciBib29sIGlzX2JlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBtX2l0ID09IGJlZ2luX3ZhbHVlOworICAgIH0KKworICAgIC8vLyByZXR1cm4gd2hldGhlciB0aGUgaXRlcmF0b3IgaXMgYXQgZW5kCisgICAgY29uc3RleHByIGJvb2wgaXNfZW5kKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBtX2l0ID09IGVuZF92YWx1ZTsKKyAgICB9CisKKyAgICBmcmllbmQgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShwcmltaXRpdmVfaXRlcmF0b3JfdCBsaHMsIHByaW1pdGl2ZV9pdGVyYXRvcl90IHJocykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBsaHMubV9pdCA9PSByaHMubV9pdDsKKyAgICB9CisKKyAgICBmcmllbmQgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KHByaW1pdGl2ZV9pdGVyYXRvcl90IGxocywgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxocy5tX2l0IDwgcmhzLm1faXQ7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3Qgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBuKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKKyAgICAgICAgcmVzdWx0ICs9IG47CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZnJpZW5kIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKHByaW1pdGl2ZV9pdGVyYXRvcl90IGxocywgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGxocy5tX2l0IC0gcmhzLm1faXQ7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yKysoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgKyttX2l0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgY29uc3Qgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0CisgICAgeworICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOworICAgICAgICBtX2l0Kys7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yLS0oKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgLS1tX2l0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgY29uc3Qgb3BlcmF0b3ItLShpbnQpIG5vZXhjZXB0CisgICAgeworICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOworICAgICAgICBtX2l0LS07CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIG4pIG5vZXhjZXB0CisgICAgeworICAgICAgICBtX2l0ICs9IG47CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBwcmltaXRpdmVfaXRlcmF0b3JfdCYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgbikgbm9leGNlcHQKKyAgICB7CisgICAgICAgIG1faXQgLT0gbjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9qc29uX3BvaW50ZXIuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvanNvbl9wb2ludGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U4MDAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvanNvbl9wb2ludGVyLmhwcApAQCAtMCwwICsxLDY5NiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxudW1lcmljPiAvLyBhY2N1bXVsYXRlCisjaW5jbHVkZSA8c3RyaW5nPiAvLyBzdHJpbmcKKyNpbmNsdWRlIDx2ZWN0b3I+IC8vIHZlY3RvcgorCisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21hY3JvX3Njb3BlLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL3ZhbHVlX3QuaHBwPgorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CitjbGFzcyBqc29uX3BvaW50ZXIKK3sKKyAgICAvLyBhbGxvdyBiYXNpY19qc29uIHRvIGFjY2VzcyBwcml2YXRlIG1lbWJlcnMKKyAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgorICAgIGZyaWVuZCBjbGFzcyBiYXNpY19qc29uOworCisgIHB1YmxpYzoKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIEpTT04gcG9pbnRlcgorCisgICAgQ3JlYXRlIGEgSlNPTiBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgc3ludGF4IGRlc2NyaWJlZCBpbgorICAgIFtTZWN0aW9uIDMgb2YgUkZDNjkwMV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEjc2VjdGlvbi0zKS4KKworICAgIEBwYXJhbVtpbl0gcyAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSlNPTiBwb2ludGVyOyBpZiBvbWl0dGVkLCB0aGUgZW1wdHkKKyAgICAgICAgICAgICAgICAgIHN0cmluZyBpcyBhc3N1bWVkIHdoaWNoIHJlZmVyZW5jZXMgdGhlIHdob2xlIEpTT04gdmFsdWUKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDcgaWYgdGhlIGdpdmVuIEpTT04gcG9pbnRlciBAYSBzIGlzIG5vbmVtcHR5IGFuZCBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmVnaW4gd2l0aCBhIHNsYXNoIChgL2ApOyBzZWUgZXhhbXBsZSBiZWxvdworCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOCBpZiBhIHRpbGRlIChgfmApIGluIHRoZSBnaXZlbiBKU09OIHBvaW50ZXIgQGEgcyBpcworICAgIG5vdCBmb2xsb3dlZCBieSBgMGAgKHJlcHJlc2VudGluZyBgfmApIG9yIGAxYCAocmVwcmVzZW50aW5nIGAvYCk7IHNlZQorICAgIGV4YW1wbGUgYmVsb3cKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgY29uc3RydWN0aW9uIHNldmVyYWwgdmFsaWQgSlNPTiBwb2ludGVycworICAgIGFzIHdlbGwgYXMgdGhlIGV4Y2VwdGlvbmFsIGJlaGF2aW9yLixqc29uX3BvaW50ZXJ9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAorICAgICovCisgICAgZXhwbGljaXQganNvbl9wb2ludGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzID0gIiIpCisgICAgICAgIDogcmVmZXJlbmNlX3Rva2VucyhzcGxpdChzKSkKKyAgICB7fQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNPTiBwb2ludGVyCisKKyAgICBAaW52YXJpYW50IEZvciBlYWNoIEpTT04gcG9pbnRlciBgcHRyYCwgaXQgaG9sZHM6CisgICAgQGNvZGUgey5jcHB9CisgICAgcHRyID09IGpzb25fcG9pbnRlcihwdHIudG9fc3RyaW5nKCkpOworICAgIEBlbmRjb2RlCisKKyAgICBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBKU09OIHBvaW50ZXIKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgcmVzdWx0IG9mIGB0b19zdHJpbmdgLiwKKyAgICBqc29uX3BvaW50ZXJfX3RvX3N0cmluZ30KKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICBzdGQ6OnN0cmluZyB0b19zdHJpbmcoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6YWNjdW11bGF0ZShyZWZlcmVuY2VfdG9rZW5zLmJlZ2luKCksIHJlZmVyZW5jZV90b2tlbnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmd7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyAmIGEsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGEgKyAiLyIgKyBlc2NhcGUoYik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vLyBAY29weWRvYyB0b19zdHJpbmcoKQorICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0b19zdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAcGFyYW1baW5dIHMgIHJlZmVyZW5jZSB0b2tlbiB0byBiZSBjb252ZXJ0ZWQgaW50byBhbiBhcnJheSBpbmRleAorCisgICAgQHJldHVybiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIEBhIHMKKworICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0IGlmIHN0cmluZyBAYSBzIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcgorICAgICovCisgICAgc3RhdGljIGludCBhcnJheV9pbmRleChjb25zdCBzdGQ6OnN0cmluZyYgcykKKyAgICB7CisgICAgICAgIHN0ZDo6c2l6ZV90IHByb2Nlc3NlZF9jaGFycyA9IDA7CisgICAgICAgIGNvbnN0IGludCByZXMgPSBzdGQ6OnN0b2kocywgJnByb2Nlc3NlZF9jaGFycyk7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHN0cmluZyB3YXMgY29tcGxldGVseSByZWFkCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHByb2Nlc3NlZF9jaGFycyAhPSBzLnNpemUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDQsICJ1bnJlc29sdmVkIHJlZmVyZW5jZSB0b2tlbiAnIiArIHMgKyAiJyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyohCisgICAgQGJyaWVmIHJlbW92ZSBhbmQgcmV0dXJuIGxhc3QgcmVmZXJlbmNlIHBvaW50ZXIKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNSBpZiBKU09OIHBvaW50ZXIgaGFzIG5vIHBhcmVudAorICAgICovCisgICAgc3RkOjpzdHJpbmcgcG9wX2JhY2soKQorICAgIHsKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoaXNfcm9vdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwNSwgIkpTT04gcG9pbnRlciBoYXMgbm8gcGFyZW50IikpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBsYXN0ID0gcmVmZXJlbmNlX3Rva2Vucy5iYWNrKCk7CisgICAgICAgIHJlZmVyZW5jZV90b2tlbnMucG9wX2JhY2soKTsKKyAgICAgICAgcmV0dXJuIGxhc3Q7CisgICAgfQorCisgICAgLy8vIHJldHVybiB3aGV0aGVyIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSByb290IGRvY3VtZW50CisgICAgYm9vbCBpc19yb290KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VfdG9rZW5zLmVtcHR5KCk7CisgICAgfQorCisgICAganNvbl9wb2ludGVyIHRvcCgpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShpc19yb290KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA1LCAiSlNPTiBwb2ludGVyIGhhcyBubyBwYXJlbnQiKSk7CisgICAgICAgIH0KKworICAgICAgICBqc29uX3BvaW50ZXIgcmVzdWx0ID0gKnRoaXM7CisgICAgICAgIHJlc3VsdC5yZWZlcmVuY2VfdG9rZW5zID0ge3JlZmVyZW5jZV90b2tlbnNbMF19OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjcmVhdGUgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgcG9pbnRlZCB0byB2YWx1ZQorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIHRva2Vucy4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgaWYgYXJyYXkgaW5kZXggaXMgbm90IGEgbnVtYmVyCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzEzIGlmIHZhbHVlIGNhbm5vdCBiZSB1bmZsYXR0ZW5lZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSYgZ2V0X2FuZF9jcmVhdGUoQmFzaWNKc29uVHlwZSYgaikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgYXV0byByZXN1bHQgPSAmajsKKworICAgICAgICAvLyBpbiBjYXNlIG5vIHJlZmVyZW5jZSB0b2tlbnMgZXhpc3QsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgSlNPTiB2YWx1ZQorICAgICAgICAvLyBqIHdoaWNoIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYSBwcmltaXRpdmUgdmFsdWUKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpudWxsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZV90b2tlbiA9PSAiMCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IGFycmF5IGlmIHJlZmVyZW5jZSB0b2tlbiBpcyAwCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgYSBuZXcgb2JqZWN0IG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKHJlZmVyZW5jZV90b2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIG9ubHkgcmVhY2hlZCBpZiB0aGVyZSBleGlzdHMgYSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICB0b2tlbiBfYW5kXyB0aGUgY3VycmVudCB2YWx1ZSBpcyBwcmltaXRpdmUuIEluIHRoaXMgY2FzZSwgd2UgaGF2ZQorICAgICAgICAgICAgICAgIGFuIGVycm9yIHNpdHVhdGlvbiwgYmVjYXVzZSBwcmltaXRpdmUgdmFsdWVzIG1heSBvbmx5IG9jY3VyIGFzCisgICAgICAgICAgICAgICAgc2luZ2xlIHZhbHVlOyB0aGF0IGlzLCB3aXRoIGFuIGVtcHR5IGxpc3Qgb2YgcmVmZXJlbmNlIHRva2Vucy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjp0eXBlX2Vycm9yOjpjcmVhdGUoMzEzLCAiaW52YWxpZCB2YWx1ZSB0byB1bmZsYXR0ZW4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBwb2ludGVkIHRvIHZhbHVlCisKKyAgICBAbm90ZSBUaGlzIHZlcnNpb24gZG9lcyBub3QgdGhyb3cgaWYgYSB2YWx1ZSBpcyBub3QgcHJlc2VudCwgYnV0IHRyaWVzIHRvCisgICAgICAgICAgY3JlYXRlIG5lc3RlZCB2YWx1ZXMgaW5zdGVhZC4gRm9yIGluc3RhbmNlLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICB3aXRoIHBvaW50ZXIgYCIvdGhpcy90aGF0ImAgb24gYSBudWxsIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAgICAgIGBvcGVyYXRvcltdKCJ0aGlzIikub3BlcmF0b3JbXSgidGhhdCIpYCBvbiB0aGF0IHZhbHVlLCBlZmZlY3RpdmVseQorICAgICAgICAgIGNoYW5naW5nIHRoZSBudWxsIHZhbHVlIHRvIGFuIG9iamVjdC4KKworICAgIEBwYXJhbVtpbl0gcHRyICBhIEpTT04gdmFsdWUKKworICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBKU09OIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlIEpTT04gcG9pbnRlcgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBsZW5ndGggb2YgdGhlIEpTT04gcG9pbnRlci4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5ICAgaWYgYW4gYXJyYXkgaW5kZXggd2FzIG5vdCBhIG51bWJlcgorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0ICBpZiB0aGUgSlNPTiBwb2ludGVyIGNhbiBub3QgYmUgcmVzb2x2ZWQKKyAgICAqLworICAgIEJhc2ljSnNvblR5cGUmIGdldF91bmNoZWNrZWQoQmFzaWNKc29uVHlwZSogcHRyKSBjb25zdAorICAgIHsKKyAgICAgICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c2l6ZV90eXBlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgbnVsbCB2YWx1ZXMgdG8gYXJyYXlzIG9yIG9iamVjdHMgYmVmb3JlIGNvbnRpbnVpbmcKKyAgICAgICAgICAgIGlmIChwdHItPm1fdHlwZSA9PSBkZXRhaWw6OnZhbHVlX3Q6Om51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVmZXJlbmNlIHRva2VuIGlzIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBudW1zID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxfb2YocmVmZXJlbmNlX3Rva2VuLmJlZ2luKCksIHJlZmVyZW5jZV90b2tlbi5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgY2hhciB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh4ID49ICcwJyBhbmQgeCA8PSAnOScpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHZhbHVlIHRvIGFycmF5IGZvciBudW1iZXJzIG9yICItIiBvciB0byBvYmplY3Qgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgKnB0ciA9IChudW1zIG9yIHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpCisgICAgICAgICAgICAgICAgICAgICAgID8gZGV0YWlsOjp2YWx1ZV90OjphcnJheQorICAgICAgICAgICAgICAgICAgICAgICA6IGRldGFpbDo6dmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdW5jaGVja2VkIG9iamVjdCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBjb25kaXRpb24gKGNmLiBSRkMgNjkwMSwgU2VjdC4gNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocmVmZXJlbmNlX3Rva2VuLnNpemUoKSA+IDEgYW5kIHJlZmVyZW5jZV90b2tlblswXSA9PSAnMCcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlX3Rva2VuID09ICItIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSB0cmVhdCAiLSIgYXMgaW5kZXggYmV5b25kIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPm9wZXJhdG9yW10ocHRyLT5tX3ZhbHVlLmFycmF5LT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBhcnJheSBpbmRleCB0byBudW1iZXI7IHVuY2hlY2tlZCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVFJZCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA5LCAwLCAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyBpcyBub3QgYSBudW1iZXIiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwNCwgInVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICciICsgcmVmZXJlbmNlX3Rva2VuICsgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnB0cjsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA2ICAgaWYgYW4gYXJyYXkgaW5kZXggYmVnaW5zIHdpdGggJzAnCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMiAgaWYgdGhlIGFycmF5IGluZGV4ICctJyBpcyB1c2VkCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDQgIGlmIHRoZSBKU09OIHBvaW50ZXIgY2FuIG5vdCBiZSByZXNvbHZlZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSYgZ2V0X2NoZWNrZWQoQmFzaWNKc29uVHlwZSogcHRyKSBjb25zdAorICAgIHsKKyAgICAgICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c2l6ZV90eXBlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHRyLT5tX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IGF0IHBlcmZvcm1zIHJhbmdlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPmF0KHJlZmVyZW5jZV90b2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAiLSIgYWx3YXlzIGZhaWxzIHRoZSByYW5nZSBjaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kZXggJy0nICgiICsgc3RkOjp0b19zdHJpbmcocHRyLT5tX3ZhbHVlLmFycmF5LT5zaXplKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBjb25kaXRpb24gKGNmLiBSRkMgNjkwMSwgU2VjdC4gNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocmVmZXJlbmNlX3Rva2VuLnNpemUoKSA+IDEgYW5kIHJlZmVyZW5jZV90b2tlblswXSA9PSAnMCcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBhdCBwZXJmb3JtcyByYW5nZSBjaGVjaworICAgICAgICAgICAgICAgICAgICBKU09OX1RSWQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5hdChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDQsICJ1bnJlc29sdmVkIHJlZmVyZW5jZSB0b2tlbiAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICpwdHI7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgcG9pbnRlZCB0byB2YWx1ZQorCisgICAgQHBhcmFtW2luXSBwdHIgIGEgSlNPTiB2YWx1ZQorCisgICAgQHJldHVybiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIEpTT04gdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgSlNPTgorICAgIHBvaW50ZXIKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5ICAgaWYgYW4gYXJyYXkgaW5kZXggd2FzIG5vdCBhIG51bWJlcgorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAyICBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCisgICAgKi8KKyAgICBjb25zdCBCYXNpY0pzb25UeXBlJiBnZXRfdW5jaGVja2VkKGNvbnN0IEJhc2ljSnNvblR5cGUqIHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdW5jaGVja2VkIG9iamVjdCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGNhbm5vdCBiZSB1c2VkIGZvciBjb25zdCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICctJyAoIiArIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHVuY2hlY2tlZCBhcnJheSBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDQsICJ1bnJlc29sdmVkIHJlZmVyZW5jZSB0b2tlbiAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICpwdHI7CisgICAgfQorCisgICAgLyohCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwNiAgIGlmIGFuIGFycmF5IGluZGV4IGJlZ2lucyB3aXRoICcwJworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgICBpZiBhbiBhcnJheSBpbmRleCB3YXMgbm90IGEgbnVtYmVyCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDIgIGlmIHRoZSBhcnJheSBpbmRleCAnLScgaXMgdXNlZAorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0ICBpZiB0aGUgSlNPTiBwb2ludGVyIGNhbiBub3QgYmUgcmVzb2x2ZWQKKyAgICAqLworICAgIGNvbnN0IEJhc2ljSnNvblR5cGUmIGdldF9jaGVja2VkKGNvbnN0IEJhc2ljSnNvblR5cGUqIHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBhdCBwZXJmb3JtcyByYW5nZSBjaGVjaworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5hdChyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGFsd2F5cyBmYWlscyB0aGUgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICctJyAoIiArIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVRDSChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDksIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIGlzIG5vdCBhIG51bWJlciIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAqcHRyOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBzcGxpdCB0aGUgc3RyaW5nIGlucHV0IHRvIHJlZmVyZW5jZSB0b2tlbnMKKworICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYnkgdGhlIGpzb25fcG9pbnRlciBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICBBbGwgZXhjZXB0aW9ucyBiZWxvdyBhcmUgZG9jdW1lbnRlZCB0aGVyZS4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDcgIGlmIHRoZSBwb2ludGVyIGlzIG5vdCBlbXB0eSBvciBiZWdpbnMgd2l0aCAnLycKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA4ICBpZiBjaGFyYWN0ZXIgJ34nIGlzIG5vdCBmb2xsb3dlZCBieSAnMCcgb3IgJzEnCisgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZlcmVuY2Vfc3RyaW5nKQorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKKworICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGVtcHR5IHJlZmVyZW5jZSBzdHJpbmcgLT4gbm8gcmVmZXJlbmNlIHRva2VucworICAgICAgICBpZiAocmVmZXJlbmNlX3N0cmluZy5lbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgbm9uZW1wdHkgcmVmZXJlbmNlIHN0cmluZyBiZWdpbnMgd2l0aCBzbGFzaAorICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2Vfc3RyaW5nWzBdICE9ICcvJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIHBvaW50ZXIgbXVzdCBiZSBlbXB0eSBvciBiZWdpbiB3aXRoICcvJyAtIHdhczogJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX3N0cmluZyArICInIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXh0cmFjdCB0aGUgcmVmZXJlbmNlIHRva2VuczoKKyAgICAgICAgLy8gLSBzbGFzaDogcG9zaXRpb24gb2YgdGhlIGxhc3QgcmVhZCBzbGFzaCAob3IgZW5kIG9mIHN0cmluZykKKyAgICAgICAgLy8gLSBzdGFydDogcG9zaXRpb24gYWZ0ZXIgdGhlIHByZXZpb3VzIHNsYXNoCisgICAgICAgIGZvciAoCisgICAgICAgICAgICAvLyBzZWFyY2ggZm9yIHRoZSBmaXJzdCBzbGFzaCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgICAgICAgICBzdGQ6OnNpemVfdCBzbGFzaCA9IHJlZmVyZW5jZV9zdHJpbmcuZmluZF9maXJzdF9vZignLycsIDEpLAorICAgICAgICAgICAgLy8gc2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHJlZmVyZW5jZSB0b2tlbgorICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgLy8gd2UgY2FuIHN0b3AgaWYgc3RhcnQgPT0gc3RyaW5nOjpucG9zKzEgPSAwCisgICAgICAgICAgICBzdGFydCAhPSAwOworICAgICAgICAgICAgLy8gc2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcmVmZXJlbmNlIHRva2VuCisgICAgICAgICAgICAvLyAod2lsbCBldmVudHVhbGx5IGJlIDAgaWYgc2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICBzdGFydCA9IHNsYXNoICsgMSwKKyAgICAgICAgICAgIC8vIGZpbmQgbmV4dCBzbGFzaAorICAgICAgICAgICAgc2xhc2ggPSByZWZlcmVuY2Vfc3RyaW5nLmZpbmRfZmlyc3Rfb2YoJy8nLCBzdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZmVyZW5jZSB0b2tlbgorICAgICAgICAgICAgLy8gKHN0YXJ0KSBhbmQgdGhlIGxhc3Qgc2xhc2ggKHNsYXNoKS4KKyAgICAgICAgICAgIGF1dG8gcmVmZXJlbmNlX3Rva2VuID0gcmVmZXJlbmNlX3N0cmluZy5zdWJzdHIoc3RhcnQsIHNsYXNoIC0gc3RhcnQpOworCisgICAgICAgICAgICAvLyBjaGVjayByZWZlcmVuY2UgdG9rZW5zIGFyZSBwcm9wZXJseSBlc2NhcGVkCisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IHBvcyA9IHJlZmVyZW5jZV90b2tlbi5maW5kX2ZpcnN0X29mKCd+Jyk7CisgICAgICAgICAgICAgICAgICAgIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcmVmZXJlbmNlX3Rva2VuLmZpbmRfZmlyc3Rfb2YoJ34nLCBwb3MgKyAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQocmVmZXJlbmNlX3Rva2VuW3Bvc10gPT0gJ34nKTsKKworICAgICAgICAgICAgICAgIC8vIH4gbXVzdCBiZSBmb2xsb3dlZCBieSAwIG9yIDEKKyAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShwb3MgPT0gcmVmZXJlbmNlX3Rva2VuLnNpemUoKSAtIDEgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmZXJlbmNlX3Rva2VuW3BvcyArIDFdICE9ICcwJyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlX3Rva2VuW3BvcyArIDFdICE9ICcxJykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA4LCAwLCAiZXNjYXBlIGNoYXJhY3RlciAnficgbXVzdCBiZSBmb2xsb3dlZCB3aXRoICcwJyBvciAnMSciKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaW5hbGx5LCBzdG9yZSB0aGUgcmVmZXJlbmNlIHRva2VuCisgICAgICAgICAgICB1bmVzY2FwZShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBzdWJzdHJpbmcgYnkgYW5vdGhlciBzdHJpbmcKKworICAgIEBwYXJhbVtpbixvdXRdIHMgIHRoZSBzdHJpbmcgdG8gbWFuaXB1bGF0ZTsgY2hhbmdlZCBzbyB0aGF0IGFsbAorICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzIG9mIEBhIGYgYXJlIHJlcGxhY2VkIHdpdGggQGEgdAorICAgIEBwYXJhbVtpbl0gICAgIGYgIHRoZSBzdWJzdHJpbmcgdG8gcmVwbGFjZSB3aXRoIEBhIHQKKyAgICBAcGFyYW1baW5dICAgICB0ICB0aGUgc3RyaW5nIHRvIHJlcGxhY2UgQGEgZgorCisgICAgQHByZSBUaGUgc2VhcmNoIHN0cmluZyBAYSBmIG11c3Qgbm90IGJlIGVtcHR5LiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzCisgICAgZW5mb3JjZWQgd2l0aCBhbiBhc3NlcnRpb24uKioKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICBzdGF0aWMgdm9pZCByZXBsYWNlX3N1YnN0cmluZyhzdGQ6OnN0cmluZyYgcywgY29uc3Qgc3RkOjpzdHJpbmcmIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHQpCisgICAgeworICAgICAgICBhc3NlcnQobm90IGYuZW1wdHkoKSk7CisgICAgICAgIGZvciAoYXV0byBwb3MgPSBzLmZpbmQoZik7ICAgICAgICAgICAgICAgIC8vIGZpbmQgZmlyc3Qgb2NjdXJyZW5jZSBvZiBmCisgICAgICAgICAgICAgICAgcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zOyAgICAgICAgIC8vIG1ha2Ugc3VyZSBmIHdhcyBmb3VuZAorICAgICAgICAgICAgICAgIHMucmVwbGFjZShwb3MsIGYuc2l6ZSgpLCB0KSwgICAgICAvLyByZXBsYWNlIHdpdGggdCwgYW5kCisgICAgICAgICAgICAgICAgcG9zID0gcy5maW5kKGYsIHBvcyArIHQuc2l6ZSgpKSkgIC8vIGZpbmQgbmV4dCBvY2N1cnJlbmNlIG9mIGYKKyAgICAgICAge30KKyAgICB9CisKKyAgICAvLy8gZXNjYXBlICJ+IiIgdG8gIn4wIiBhbmQgIi8iIHRvICJ+MSIKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZXNjYXBlKHN0ZDo6c3RyaW5nIHMpCisgICAgeworICAgICAgICByZXBsYWNlX3N1YnN0cmluZyhzLCAifiIsICJ+MCIpOworICAgICAgICByZXBsYWNlX3N1YnN0cmluZyhzLCAiLyIsICJ+MSIpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvLy8gdW5lc2NhcGUgIn4xIiB0byB0aWxkZSBhbmQgIn4wIiB0byBzbGFzaCAob3JkZXIgaXMgaW1wb3J0YW50ISkKKyAgICBzdGF0aWMgdm9pZCB1bmVzY2FwZShzdGQ6OnN0cmluZyYgcykKKyAgICB7CisgICAgICAgIHJlcGxhY2Vfc3Vic3RyaW5nKHMsICJ+MSIsICIvIik7CisgICAgICAgIHJlcGxhY2Vfc3Vic3RyaW5nKHMsICJ+MCIsICJ+Iik7CisgICAgfQorCisgICAgLyohCisgICAgQHBhcmFtW2luXSByZWZlcmVuY2Vfc3RyaW5nICB0aGUgcmVmZXJlbmNlIHN0cmluZyB0byB0aGUgY3VycmVudCB2YWx1ZQorICAgIEBwYXJhbVtpbl0gdmFsdWUgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGNvbnNpZGVyCisgICAgQHBhcmFtW2luLG91dF0gcmVzdWx0ICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0byBpbnNlcnQgdmFsdWVzIHRvCisKKyAgICBAbm90ZSBFbXB0eSBvYmplY3RzIG9yIGFycmF5cyBhcmUgZmxhdHRlbmVkIHRvIGBudWxsYC4KKyAgICAqLworICAgIHN0YXRpYyB2b2lkIGZsYXR0ZW4oY29uc3Qgc3RkOjpzdHJpbmcmIHJlZmVyZW5jZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0pzb25UeXBlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljSnNvblR5cGUmIHJlc3VsdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodmFsdWUubV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IGFycmF5IGFzIG51bGwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3JlZmVyZW5jZV9zdHJpbmddID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBhcnJheSBhbmQgdXNlIGluZGV4IGFzIHJlZmVyZW5jZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHZhbHVlLm1fdmFsdWUuYXJyYXktPnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKHJlZmVyZW5jZV9zdHJpbmcgKyAiLyIgKyBzdGQ6OnRvX3N0cmluZyhpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpKSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubV92YWx1ZS5vYmplY3QtPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IG9iamVjdCBhcyBudWxsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZWZlcmVuY2Vfc3RyaW5nXSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgb2JqZWN0IGFuZCB1c2Uga2V5cyBhcyByZWZlcmVuY2Ugc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6ICp2YWx1ZS5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihyZWZlcmVuY2Vfc3RyaW5nICsgIi8iICsgZXNjYXBlKGVsZW1lbnQuZmlyc3QpLCBlbGVtZW50LnNlY29uZCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgcHJpbWl0aXZlIHZhbHVlIHdpdGggaXRzIHJlZmVyZW5jZSBzdHJpbmcKKyAgICAgICAgICAgICAgICByZXN1bHRbcmVmZXJlbmNlX3N0cmluZ10gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBwYXJhbVtpbl0gdmFsdWUgIGZsYXR0ZW5lZCBKU09OCisKKyAgICBAcmV0dXJuIHVuZmxhdHRlbmVkIEpTT04KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgaWYgYXJyYXkgaW5kZXggaXMgbm90IGEgbnVtYmVyCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzE0ICBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0CisgICAgQHRocm93IHR5cGVfZXJyb3IuMzE1ICBpZiBvYmplY3QgdmFsdWVzIGFyZSBub3QgcHJpbWl0aXZlCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzEzICBpZiB2YWx1ZSBjYW5ub3QgYmUgdW5mbGF0dGVuZWQKKyAgICAqLworICAgIHN0YXRpYyBCYXNpY0pzb25UeXBlCisgICAgdW5mbGF0dGVuKGNvbnN0IEJhc2ljSnNvblR5cGUmIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IHZhbHVlLmlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnR5cGVfZXJyb3I6OmNyZWF0ZSgzMTQsICJvbmx5IG9iamVjdHMgY2FuIGJlIHVuZmxhdHRlbmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNKc29uVHlwZSByZXN1bHQ7CisKKyAgICAgICAgLy8gaXRlcmF0ZSB0aGUgSlNPTiBvYmplY3QgdmFsdWVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6ICp2YWx1ZS5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGVsZW1lbnQuc2Vjb25kLmlzX3ByaW1pdGl2ZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6dHlwZV9lcnJvcjo6Y3JlYXRlKDMxNSwgInZhbHVlcyBpbiBvYmplY3QgbXVzdCBiZSBwcmltaXRpdmUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFzc2lnbiB2YWx1ZSB0byByZWZlcmVuY2UgcG9pbnRlZCB0byBieSBKU09OIHBvaW50ZXI7IE5vdGUgdGhhdCBpZgorICAgICAgICAgICAgLy8gdGhlIEpTT04gcG9pbnRlciBpcyAiIiAoaS5lLiwgcG9pbnRzIHRvIHRoZSB3aG9sZSB2YWx1ZSksIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBnZXRfYW5kX2NyZWF0ZSByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHJlc3VsdCBpdHNlbGYuIEFuIGFzc2lnbm1lbnQKKyAgICAgICAgICAgIC8vIHdpbGwgdGhlbiBjcmVhdGUgYSBwcmltaXRpdmUgdmFsdWUuCisgICAgICAgICAgICBqc29uX3BvaW50ZXIoZWxlbWVudC5maXJzdCkuZ2V0X2FuZF9jcmVhdGUocmVzdWx0KSA9IGVsZW1lbnQuc2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGpzb25fcG9pbnRlciBjb25zdCYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGxocy5yZWZlcmVuY2VfdG9rZW5zID09IHJocy5yZWZlcmVuY2VfdG9rZW5zKTsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGpzb25fcG9pbnRlciBjb25zdCYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gbm90IChsaHMgPT0gcmhzKTsKKyAgICB9CisKKyAgICAvLy8gdGhlIHJlZmVyZW5jZSB0b2tlbnMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVmZXJlbmNlX3Rva2VuczsKK307Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9qc29uX3JlZi5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9qc29uX3JlZi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NWJlMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL2pzb25fcmVmLmhwcApAQCAtMCwwICsxLDYzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorY2xhc3MganNvbl9yZWYKK3sKKyAgcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBCYXNpY0pzb25UeXBlOworCisgICAganNvbl9yZWYodmFsdWVfdHlwZSYmIHZhbHVlKQorICAgICAgICA6IG93bmVkX3ZhbHVlKHN0ZDo6bW92ZSh2YWx1ZSkpLCB2YWx1ZV9yZWYoJm93bmVkX3ZhbHVlKSwgaXNfcnZhbHVlKHRydWUpCisgICAge30KKworICAgIGpzb25fcmVmKGNvbnN0IHZhbHVlX3R5cGUmIHZhbHVlKQorICAgICAgICA6IHZhbHVlX3JlZihjb25zdF9jYXN0PHZhbHVlX3R5cGUqPigmdmFsdWUpKSwgaXNfcnZhbHVlKGZhbHNlKQorICAgIHt9CisKKyAgICBqc29uX3JlZihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8anNvbl9yZWY+IGluaXQpCisgICAgICAgIDogb3duZWRfdmFsdWUoaW5pdCksIHZhbHVlX3JlZigmb3duZWRfdmFsdWUpLCBpc19ydmFsdWUodHJ1ZSkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4KKyAgICBqc29uX3JlZihBcmdzJiYgLi4uIGFyZ3MpCisgICAgICAgIDogb3duZWRfdmFsdWUoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSwgdmFsdWVfcmVmKCZvd25lZF92YWx1ZSksIGlzX3J2YWx1ZSh0cnVlKQorICAgIHt9CisKKyAgICAvLyBjbGFzcyBzaG91bGQgYmUgbW92YWJsZSBvbmx5CisgICAganNvbl9yZWYoanNvbl9yZWYmJikgPSBkZWZhdWx0OworICAgIGpzb25fcmVmKGNvbnN0IGpzb25fcmVmJikgPSBkZWxldGU7CisgICAganNvbl9yZWYmIG9wZXJhdG9yPShjb25zdCBqc29uX3JlZiYpID0gZGVsZXRlOworCisgICAgdmFsdWVfdHlwZSBtb3ZlZF9vcl9jb3BpZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzX3J2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZSgqdmFsdWVfcmVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnZhbHVlX3JlZjsKKyAgICB9CisKKyAgICB2YWx1ZV90eXBlIGNvbnN0JiBvcGVyYXRvciooKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDx2YWx1ZV90eXBlIGNvbnN0Kj4odmFsdWVfcmVmKTsKKyAgICB9CisKKyAgICB2YWx1ZV90eXBlIGNvbnN0KiBvcGVyYXRvci0+KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlIGNvbnN0Kj4odmFsdWVfcmVmKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBtdXRhYmxlIHZhbHVlX3R5cGUgb3duZWRfdmFsdWUgPSBudWxscHRyOworICAgIHZhbHVlX3R5cGUqIHZhbHVlX3JlZiA9IG51bGxwdHI7CisgICAgY29uc3QgYm9vbCBpc19ydmFsdWU7Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzUyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHAKQEAgLTAsMCArMSwxMTUgQEAKKyNwcmFnbWEgb25jZQorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGludGVybmFsIG1hY3JvIGRlZmluaXRpb25zCisvLyBZb3UgTVVTVCBpbmNsdWRlIG1hY3JvX3Vuc2NvcGUuaHBwIGF0IHRoZSBlbmQgb2YganNvbi5ocHAgdG8gdW5kZWYgYWxsIG9mIHRoZW0KKworLy8gZXhjbHVkZSB1bnN1cHBvcnRlZCBjb21waWxlcnMKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyAgICAjaWYgKF9fY2xhbmdfbWFqb3JfXyAqIDEwMDAwICsgX19jbGFuZ19taW5vcl9fICogMTAwICsgX19jbGFuZ19wYXRjaGxldmVsX18pIDwgMzA0MDAKKyAgICAgICAgI2Vycm9yICJ1bnN1cHBvcnRlZCBDbGFuZyB2ZXJzaW9uIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uI3N1cHBvcnRlZC1jb21waWxlcnMiCisgICAgI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhKGRlZmluZWQoX19JQ0MpIHx8IGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikpCisgICAgI2lmIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKSA8IDQwOTAwCisgICAgICAgICNlcnJvciAidW5zdXBwb3J0ZWQgR0NDIHZlcnNpb24gLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24jc3VwcG9ydGVkLWNvbXBpbGVycyIKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvLyBkaXNhYmxlIGZsb2F0LWVxdWFsIHdhcm5pbmdzIG9uIEdDQy9jbGFuZworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdmbG9hdC1lcXVhbCIKKyNlbmRpZgorCisvLyBkaXNhYmxlIGRvY3VtZW50YXRpb24gd2FybmluZ3Mgb24gY2xhbmcKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZG9jdW1lbnRhdGlvbiIKKyNlbmRpZgorCisvLyBhbGxvdyBmb3IgcG9ydGFibGUgZGVwcmVjYXRpb24gd2FybmluZ3MKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0dOVUdfXykKKyAgICAjZGVmaW5lIEpTT05fREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBKU09OX0RFUFJFQ0FURUQgX19kZWNsc3BlYyhkZXByZWNhdGVkKQorI2Vsc2UKKyAgICAjZGVmaW5lIEpTT05fREVQUkVDQVRFRAorI2VuZGlmCisKKy8vIGFsbG93IHRvIGRpc2FibGUgZXhjZXB0aW9ucworI2lmIChkZWZpbmVkKF9fY3BwX2V4Y2VwdGlvbnMpIHx8IGRlZmluZWQoX19FWENFUFRJT05TKSB8fCBkZWZpbmVkKF9DUFBVTldJTkQpKSAmJiAhZGVmaW5lZChKU09OX05PRVhDRVBUSU9OKQorICAgICNkZWZpbmUgSlNPTl9USFJPVyhleGNlcHRpb24pIHRocm93IGV4Y2VwdGlvbgorICAgICNkZWZpbmUgSlNPTl9UUlkgdHJ5CisgICAgI2RlZmluZSBKU09OX0NBVENIKGV4Y2VwdGlvbikgY2F0Y2goZXhjZXB0aW9uKQorI2Vsc2UKKyAgICAjZGVmaW5lIEpTT05fVEhST1coZXhjZXB0aW9uKSBzdGQ6OmFib3J0KCkKKyAgICAjZGVmaW5lIEpTT05fVFJZIGlmKHRydWUpCisgICAgI2RlZmluZSBKU09OX0NBVENIKGV4Y2VwdGlvbikgaWYoZmFsc2UpCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgZXhjZXB0aW9uIG1hY3JvcworI2lmIGRlZmluZWQoSlNPTl9USFJPV19VU0VSKQorICAgICN1bmRlZiBKU09OX1RIUk9XCisgICAgI2RlZmluZSBKU09OX1RIUk9XIEpTT05fVEhST1dfVVNFUgorI2VuZGlmCisjaWYgZGVmaW5lZChKU09OX1RSWV9VU0VSKQorICAgICN1bmRlZiBKU09OX1RSWQorICAgICNkZWZpbmUgSlNPTl9UUlkgSlNPTl9UUllfVVNFUgorI2VuZGlmCisjaWYgZGVmaW5lZChKU09OX0NBVENIX1VTRVIpCisgICAgI3VuZGVmIEpTT05fQ0FUQ0gKKyAgICAjZGVmaW5lIEpTT05fQ0FUQ0ggSlNPTl9DQVRDSF9VU0VSCisjZW5kaWYKKworLy8gbWFudWFsIGJyYW5jaCBwcmVkaWN0aW9uCisjaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19HTlVHX18pCisgICAgI2RlZmluZSBKU09OX0xJS0VMWSh4KSAgICAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisgICAgI2RlZmluZSBKU09OX1VOTElLRUxZKHgpICAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisjZWxzZQorICAgICNkZWZpbmUgSlNPTl9MSUtFTFkoeCkgICAgICB4CisgICAgI2RlZmluZSBKU09OX1VOTElLRUxZKHgpICAgIHgKKyNlbmRpZgorCisvLyBDKysgbGFuZ3VhZ2Ugc3RhbmRhcmQgZGV0ZWN0aW9uCisjaWYgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wpIHx8IChkZWZpbmVkKF9IQVNfQ1hYMTcpICYmIF9IQVNfQ1hYMTcgPT0gMSkgLy8gZml4IGZvciBpc3N1ZSAjNDY0CisgICAgI2RlZmluZSBKU09OX0hBU19DUFBfMTcKKyAgICAjZGVmaW5lIEpTT05fSEFTX0NQUF8xNAorI2VsaWYgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTQwMkwpIHx8IChkZWZpbmVkKF9IQVNfQ1hYMTQpICYmIF9IQVNfQ1hYMTQgPT0gMSkKKyAgICAjZGVmaW5lIEpTT05fSEFTX0NQUF8xNAorI2VuZGlmCisKKy8vIFVnbHkgbWFjcm9zIHRvIGF2b2lkIHVnbGllciBjb3B5LXBhc3RlIHdoZW4gc3BlY2lhbGl6aW5nIGJhc2ljX2pzb24uIFRoZXkKKy8vIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgb25jZSB0aGUgY2xhc3MgaXMgc3BsaXQuCisKKyNkZWZpbmUgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUExfREVDTEFSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lLi4uPiBjbGFzcyBPYmplY3RUeXBlLCAgIFwKKyAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIEFycmF5VHlwZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBjbGFzcyBTdHJpbmdUeXBlLCBjbGFzcyBCb29sZWFuVHlwZSwgY2xhc3MgTnVtYmVySW50ZWdlclR5cGUsIFwKKyAgICAgICAgICAgICBjbGFzcyBOdW1iZXJVbnNpZ25lZFR5cGUsIGNsYXNzIE51bWJlckZsb2F0VHlwZSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgQWxsb2NhdG9yVHlwZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUgPSB2b2lkPiBjbGFzcyBKU09OU2VyaWFsaXplcj4KKworI2RlZmluZSBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJhc2ljX2pzb248T2JqZWN0VHlwZSwgQXJyYXlUeXBlLCBTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgICAgICAgICAgICAgXAorICAgIE51bWJlckludGVnZXJUeXBlLCBOdW1iZXJVbnNpZ25lZFR5cGUsIE51bWJlckZsb2F0VHlwZSwgICAgICAgICAgICAgICAgXAorICAgIEFsbG9jYXRvclR5cGUsIEpTT05TZXJpYWxpemVyPgorCisvKiEKK0BicmllZiBIZWxwZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUncyBhIGtleV90eXBlIGZvciBULgorCitUaGlzIGhlbHBlciBpcyB1c2VkIHRvIHRlbGwgYXNzb2NpYXRpdmUgY29udGFpbmVycyBhcGFydCBmcm9tIG90aGVyIGNvbnRhaW5lcnMKK3N1Y2ggYXMgc2VxdWVuY2UgY29udGFpbmVycy4gRm9yIGluc3RhbmNlLCBgc3RkOjptYXBgIHBhc3NlcyB0aGUgdGVzdCBhcyBpdAorY29udGFpbnMgYSBgbWFwcGVkX3R5cGVgLCB3aGVyZWFzIGBzdGQ6OnZlY3RvcmAgZmFpbHMgdGhlIHRlc3QuCisKK0BzYSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS83NzI4NzI4LzI2NjM3OAorQHNpbmNlIHZlcnNpb24gMS4wLjAsIG92ZXJ3b3JrZWQgaW4gdmVyc2lvbiAyLjAuNgorKi8KKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9IQVNfSEVMUEVSKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaGFzXyMjdHlwZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcml2YXRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBVOjp0eXBlPiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIGludCBkZXRlY3QoVSAmJik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIHZvaWQgZGV0ZWN0KC4uLik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2ludGVncmFsPGRlY2x0eXBlKGRldGVjdChzdGQ6OmRlY2x2YWw8VD4oKSkpPjo6dmFsdWU7IFwKKyAgICB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9tYWNyb191bnNjb3BlLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL21hY3JvX3Vuc2NvcGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTBhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9tYWNyb191bnNjb3BlLmhwcApAQCAtMCwwICsxLDIyIEBACisjcHJhZ21hIG9uY2UKKworLy8gcmVzdG9yZSBHQ0MvY2xhbmcgZGlhZ25vc3RpYyBzZXR0aW5ncworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKy8vIGNsZWFuIHVwCisjdW5kZWYgSlNPTl9DQVRDSAorI3VuZGVmIEpTT05fVEhST1cKKyN1bmRlZiBKU09OX1RSWQorI3VuZGVmIEpTT05fTElLRUxZCisjdW5kZWYgSlNPTl9VTkxJS0VMWQorI3VuZGVmIEpTT05fREVQUkVDQVRFRAorI3VuZGVmIEpTT05fSEFTX0NQUF8xNAorI3VuZGVmIEpTT05fSEFTX0NQUF8xNworI3VuZGVmIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCisjdW5kZWYgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwKKyN1bmRlZiBOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvbWV0YS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMTA2OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwCkBAIC0wLDAgKzEsMjU4IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNpc282NDY+IC8vIG5vdAorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGxpbWl0cz4gLy8gbnVtZXJpY19saW1pdHMKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy8gY29uZGl0aW9uYWwsIGVuYWJsZV9pZiwgZmFsc2VfdHlwZSwgaW50ZWdyYWxfY29uc3RhbnQsIGlzX2NvbnN0cnVjdGlibGUsIGlzX2ludGVncmFsLCBpc19zYW1lLCByZW1vdmVfY3YsIHJlbW92ZV9yZWZlcmVuY2UsIHRydWVfdHlwZQorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIGRlY2x2YWwKKworI2luY2x1ZGUgPG5sb2htYW5uL2pzb25fZndkLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKKy8qIQorQGJyaWVmIGRldGFpbCBuYW1lc3BhY2Ugd2l0aCBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zCisKK1RoaXMgbmFtZXNwYWNlIGNvbGxlY3RzIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgZXhwb3NlZCwKK2ltcGxlbWVudGF0aW9ucyBvZiBzb21lIEByZWYgYmFzaWNfanNvbiBtZXRob2RzLCBhbmQgbWV0YS1wcm9ncmFtbWluZyBoZWxwZXJzLgorCitAc2luY2UgdmVyc2lvbiAyLjEuMAorKi8KK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vLy8KKy8vIGhlbHBlcnMgLy8KKy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBpc19iYXNpY19qc29uIDogc3RkOjpmYWxzZV90eXBlIHt9OworCitOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgorc3RydWN0IGlzX2Jhc2ljX2pzb248TkxPSE1BTk5fQkFTSUNfSlNPTl9UUEw+IDogc3RkOjp0cnVlX3R5cGUge307CisKKy8vIGFsaWFzIHRlbXBsYXRlcyB0byByZWR1Y2UgYm9pbGVycGxhdGUKK3RlbXBsYXRlPGJvb2wgQiwgdHlwZW5hbWUgVCA9IHZvaWQ+Cit1c2luZyBlbmFibGVfaWZfdCA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEIsIFQ+Ojp0eXBlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordXNpbmcgdW5jdnJlZl90ID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfY3Y8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlPjo6dHlwZTsKKworLy8gaW1wbGVtZW50YXRpb24gb2YgQysrMTQgaW5kZXhfc2VxdWVuY2UgYW5kIGFmZmlsaWF0ZXMKKy8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMyMjIzMzQzCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLiBJbnRzPgorc3RydWN0IGluZGV4X3NlcXVlbmNlCit7CisgICAgdXNpbmcgdHlwZSA9IGluZGV4X3NlcXVlbmNlOworICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBzdGQ6OnNpemVfdDsKKyAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c2l6ZV90IHNpemUoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHNpemVvZi4uLihJbnRzKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBTZXF1ZW5jZTEsIGNsYXNzIFNlcXVlbmNlMj4KK3N0cnVjdCBtZXJnZV9hbmRfcmVudW1iZXI7CisKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uIEkxLCBzdGQ6OnNpemVfdC4uLiBJMj4KK3N0cnVjdCBtZXJnZV9hbmRfcmVudW1iZXI8aW5kZXhfc2VxdWVuY2U8STEuLi4+LCBpbmRleF9zZXF1ZW5jZTxJMi4uLj4+CisgICAgICAgIDogaW5kZXhfc2VxdWVuY2UgPCBJMS4uLiwgKHNpemVvZi4uLihJMSkgKyBJMikuLi4gPiB7fTsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgTj4KK3N0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlCisgICAgOiBtZXJnZV9hbmRfcmVudW1iZXIgPCB0eXBlbmFtZSBtYWtlX2luZGV4X3NlcXVlbmNlIDwgTiAvIDIgPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2UgPCBOIC0gTiAvIDIgPjo6dHlwZSA+IHt9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlPDA+IDogaW5kZXhfc2VxdWVuY2U8PiB7fTsKK3RlbXBsYXRlPD4gc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2U8MT4gOiBpbmRleF9zZXF1ZW5jZTwwPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+Cit1c2luZyBpbmRleF9zZXF1ZW5jZV9mb3IgPSBtYWtlX2luZGV4X3NlcXVlbmNlPHNpemVvZi4uLihUcyk+OworCisvKgorSW1wbGVtZW50YXRpb24gb2YgdHdvIEMrKzE3IGNvbnN0cnVjdHM6IGNvbmp1bmN0aW9uLCBuZWdhdGlvbi4gVGhpcyBpcyBuZWVkZWQKK3RvIGF2b2lkIGV2YWx1YXRpbmcgYWxsIHRoZSB0cmFpdHMgaW4gYSBjb25kaXRpb24KKworRm9yIGV4YW1wbGU6IG5vdCBzdGQ6OmlzX3NhbWU8dm9pZCwgVD46OnZhbHVlIGFuZCBoYXNfdmFsdWVfdHlwZTxUPjo6dmFsdWUKK3dpbGwgbm90IGNvbXBpbGUgd2hlbiBUID0gdm9pZCAob24gTVNWQyBhdCBsZWFzdCkuIFdoZXJlYXMKK2Nvbmp1bmN0aW9uPG5lZ2F0aW9uPHN0ZDo6aXNfc2FtZTx2b2lkLCBUPj4sIGhhc192YWx1ZV90eXBlPFQ+Pjo6dmFsdWUgd2lsbAorc3RvcCBldmFsdWF0aW5nIGlmIG5lZ2F0aW9uPC4uLj46OnZhbHVlID09IGZhbHNlCisKK1BsZWFzZSBub3RlIHRoYXQgdGhvc2UgY29uc3RydWN0cyBtdXN0IGJlIHVzZWQgd2l0aCBjYXV0aW9uLCBzaW5jZSBzeW1ib2xzIGNhbgorYmVjb21lIHZlcnkgbG9uZyBxdWlja2x5ICh3aGljaCBjYW4gc2xvdyBkb3duIGNvbXBpbGF0aW9uIGFuZCBjYXVzZSBNU1ZDCitpbnRlcm5hbCBjb21waWxlciBlcnJvcnMpLiBPbmx5IHVzZSBpdCB3aGVuIHlvdSBoYXZlIHRvIChzZWUgZXhhbXBsZSBhaGVhZCkuCisqLwordGVtcGxhdGU8Y2xhc3MuLi4+IHN0cnVjdCBjb25qdW5jdGlvbiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGU8Y2xhc3MgQjE+IHN0cnVjdCBjb25qdW5jdGlvbjxCMT4gOiBCMSB7fTsKK3RlbXBsYXRlPGNsYXNzIEIxLCBjbGFzcy4uLiBCbj4KK3N0cnVjdCBjb25qdW5jdGlvbjxCMSwgQm4uLi4+IDogc3RkOjpjb25kaXRpb25hbDxib29sKEIxOjp2YWx1ZSksIGNvbmp1bmN0aW9uPEJuLi4uPiwgQjE+Ojp0eXBlIHt9OworCit0ZW1wbGF0ZTxjbGFzcyBCPiBzdHJ1Y3QgbmVnYXRpb24gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIG5vdCBCOjp2YWx1ZT4ge307CisKKy8vIGRpc3BhdGNoIHV0aWxpdHkgKHRha2VuIGZyb20gcmFuZ2VzLXYzKQordGVtcGxhdGU8dW5zaWduZWQgTj4gc3RydWN0IHByaW9yaXR5X3RhZyA6IHByaW9yaXR5X3RhZyA8IE4gLSAxID4ge307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBwcmlvcml0eV90YWc8MD4ge307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaGFzXy9pc18gZnVuY3Rpb25zIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzcxOTMwODkvNDExNjQ1MworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB2b2lkPgorc3RydWN0IGlzX2NvbXBsZXRlX3R5cGUgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX2NvbXBsZXRlX3R5cGU8VCwgZGVjbHR5cGUodm9pZChzaXplb2YoVCkpKT4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworTkxPSE1BTk5fSlNPTl9IQVNfSEVMUEVSKG1hcHBlZF90eXBlKTsKK05MT0hNQU5OX0pTT05fSEFTX0hFTFBFUihrZXlfdHlwZSk7CitOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIodmFsdWVfdHlwZSk7CitOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIoaXRlcmF0b3IpOworCit0ZW1wbGF0ZTxib29sIEIsIGNsYXNzIFJlYWxUeXBlLCBjbGFzcyBDb21wYXRpYmxlT2JqZWN0VHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX29iamVjdF90eXBlX2ltcGwgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIFJlYWxUeXBlLCBjbGFzcyBDb21wYXRpYmxlT2JqZWN0VHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX29iamVjdF90eXBlX2ltcGw8dHJ1ZSwgUmVhbFR5cGUsIENvbXBhdGlibGVPYmplY3RUeXBlPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9CisgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBSZWFsVHlwZTo6a2V5X3R5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjprZXlfdHlwZT46OnZhbHVlIGFuZAorICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgUmVhbFR5cGU6Om1hcHBlZF90eXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlT2JqZWN0VHlwZTo6bWFwcGVkX3R5cGU+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEJhc2ljSnNvblR5cGUsIGNsYXNzIENvbXBhdGlibGVPYmplY3RUeXBlPgorc3RydWN0IGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGUKK3sKKyAgICBzdGF0aWMgYXV0byBjb25zdGV4cHIgdmFsdWUgPSBpc19jb21wYXRpYmxlX29iamVjdF90eXBlX2ltcGwgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmp1bmN0aW9uPG5lZ2F0aW9uPHN0ZDo6aXNfc2FtZTx2b2lkLCBDb21wYXRpYmxlT2JqZWN0VHlwZT4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19tYXBwZWRfdHlwZTxDb21wYXRpYmxlT2JqZWN0VHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2tleV90eXBlPENvbXBhdGlibGVPYmplY3RUeXBlPj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90LCBDb21wYXRpYmxlT2JqZWN0VHlwZSA+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfYmFzaWNfanNvbl9uZXN0ZWRfdHlwZQoreworICAgIHN0YXRpYyBhdXRvIGNvbnN0ZXhwciB2YWx1ZSA9IHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjppdGVyYXRvcj46OnZhbHVlIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6cmV2ZXJzZV9pdGVyYXRvcj46OnZhbHVlIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlPGNsYXNzIEJhc2ljSnNvblR5cGUsIGNsYXNzIENvbXBhdGlibGVBcnJheVR5cGU+CitzdHJ1Y3QgaXNfY29tcGF0aWJsZV9hcnJheV90eXBlCit7CisgICAgc3RhdGljIGF1dG8gY29uc3RleHByIHZhbHVlID0KKyAgICAgICAgY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIENvbXBhdGlibGVBcnJheVR5cGU+PiwKKyAgICAgICAgbmVnYXRpb248aXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZTwKKyAgICAgICAgQmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT4+LAorICAgICAgICBuZWdhdGlvbjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QsCisgICAgICAgIENvbXBhdGlibGVBcnJheVR5cGU+PiwKKyAgICAgICAgbmVnYXRpb248aXNfYmFzaWNfanNvbl9uZXN0ZWRfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCisgICAgICAgIGhhc192YWx1ZV90eXBlPENvbXBhdGlibGVBcnJheVR5cGU+LAorICAgICAgICBoYXNfaXRlcmF0b3I8Q29tcGF0aWJsZUFycmF5VHlwZT4+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlPGJvb2wsIHR5cGVuYW1lLCB0eXBlbmFtZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZV9pbXBsIDogc3RkOjpmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsSW50ZWdlclR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZV9pbXBsPHRydWUsIFJlYWxJbnRlZ2VyVHlwZSwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPgoreworICAgIC8vIGlzIHRoZXJlIGFuIGFzc2VydCBzb21ld2hlcmUgb24gb3ZlcmZsb3dzPworICAgIHVzaW5nIFJlYWxMaW1pdHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxJbnRlZ2VyVHlwZT47CisgICAgdXNpbmcgQ29tcGF0aWJsZUxpbWl0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8Q29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9CisgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxSZWFsSW50ZWdlclR5cGUsIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlIGFuZAorICAgICAgICBDb21wYXRpYmxlTGltaXRzOjppc19pbnRlZ2VyIGFuZAorICAgICAgICBSZWFsTGltaXRzOjppc19zaWduZWQgPT0gQ29tcGF0aWJsZUxpbWl0czo6aXNfc2lnbmVkOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbEludGVnZXJUeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+CitzdHJ1Y3QgaXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGUKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPQorICAgICAgICBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZV9pbXBsIDwKKyAgICAgICAgc3RkOjppc19pbnRlZ3JhbDxDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxib29sLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgUmVhbEludGVnZXJUeXBlLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUgPiA6OnZhbHVlOworfTsKKworLy8gdHJhaXQgY2hlY2tpbmcgaWYgSlNPTlNlcmlhbGl6ZXI8VD46OmZyb21fanNvbihqc29uIGNvbnN0JiwgdWR0JikgZXhpc3RzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgorc3RydWN0IGhhc19mcm9tX2pzb24KK3sKKyAgcHJpdmF0ZToKKyAgICAvLyBhbHNvIGNoZWNrIHRoZSByZXR1cm4gdHlwZSBvZiBmcm9tX2pzb24KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSA9IGVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTx2b2lkLCBkZWNsdHlwZSh1bmN2cmVmX3Q8VT46OmZyb21fanNvbigKKyAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPEJhc2ljSnNvblR5cGU+KCksIHN0ZDo6ZGVjbHZhbDxUJj4oKSkpPjo6dmFsdWU+PgorICAgIHN0YXRpYyBpbnQgZGV0ZWN0KFUmJik7CisgICAgc3RhdGljIHZvaWQgZGV0ZWN0KC4uLik7CisKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHN0ZDo6aXNfaW50ZWdyYWw8ZGVjbHR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdChzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6dGVtcGxhdGUganNvbl9zZXJpYWxpemVyPFQsIHZvaWQ+PigpKSk+Ojp2YWx1ZTsKK307CisKKy8vIFRoaXMgdHJhaXQgY2hlY2tzIGlmIEpTT05TZXJpYWxpemVyPFQ+Ojpmcm9tX2pzb24oanNvbiBjb25zdCYpIGV4aXN0cworLy8gdGhpcyBvdmVybG9hZCBpcyB1c2VkIGZvciBub24tZGVmYXVsdC1jb25zdHJ1Y3RpYmxlIHVzZXItZGVmaW5lZC10eXBlcwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBoYXNfbm9uX2RlZmF1bHRfZnJvbV9qc29uCit7CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBVLAorICAgICAgICB0eXBlbmFtZSA9IGVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgZGVjbHR5cGUodW5jdnJlZl90PFU+Ojpmcm9tX2pzb24oc3RkOjpkZWNsdmFsPEJhc2ljSnNvblR5cGU+KCkpKT46OnZhbHVlID4+CisgICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKKyAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZShkZXRlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOworfTsKKworLy8gVGhpcyB0cmFpdCBjaGVja3MgaWYgQmFzaWNKc29uVHlwZTo6anNvbl9zZXJpYWxpemVyPFQ+Ojp0b19qc29uIGV4aXN0cwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBoYXNfdG9fanNvbgoreworICBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lID0gZGVjbHR5cGUodW5jdnJlZl90PFU+Ojp0b19qc29uKAorICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8QmFzaWNKc29uVHlwZSY+KCksIHN0ZDo6ZGVjbHZhbDxUPigpKSk+CisgICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKKyAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZShkZXRlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVDb21wbGV0ZVR5cGU+CitzdHJ1Y3QgaXNfY29tcGF0aWJsZV9jb21wbGV0ZV90eXBlCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0KKyAgICAgICAgbm90IHN0ZDo6aXNfYmFzZV9vZjxzdGQ6OmlzdHJlYW0sIENvbXBhdGlibGVDb21wbGV0ZVR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQ29tcGxldGVUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgIG5vdCBpc19iYXNpY19qc29uX25lc3RlZF90eXBlPEJhc2ljSnNvblR5cGUsIENvbXBhdGlibGVDb21wbGV0ZVR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgaGFzX3RvX2pzb248QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUNvbXBsZXRlVHlwZT46OnZhbHVlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVUeXBlPgorc3RydWN0IGlzX2NvbXBhdGlibGVfdHlwZQorICAgIDogY29uanVuY3Rpb248aXNfY29tcGxldGVfdHlwZTxDb21wYXRpYmxlVHlwZT4sCisgICAgICBpc19jb21wYXRpYmxlX2NvbXBsZXRlX3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZVR5cGU+PgoreworfTsKKworLy8gdGFrZW4gZnJvbSByYW5nZXMtdjMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RhdGljX2NvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBUIHZhbHVle307Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3RleHByIFQgc3RhdGljX2NvbnN0PFQ+Ojp2YWx1ZTsKK30KK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9iaW5hcnlfd3JpdGVyLmhwcCBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9iaW5hcnlfd3JpdGVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE4MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvb3V0cHV0L2JpbmFyeV93cml0ZXIuaHBwCkBAIC0wLDAgKzEsOTA5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gcmV2ZXJzZQorI2luY2x1ZGUgPGFycmF5PiAvLyBhcnJheQorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50MzJfdCwgdWludDY0X3QKKyNpbmNsdWRlIDxjc3RyaW5nPiAvLyBtZW1jcHkKKyNpbmNsdWRlIDxsaW1pdHM+IC8vIG51bWVyaWNfbGltaXRzCisKKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvYmluYXJ5X3JlYWRlci5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL291dHB1dC9vdXRwdXRfYWRhcHRlcnMuaHBwPgorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGJpbmFyeSB3cml0ZXIgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyohCitAYnJpZWYgc2VyaWFsaXphdGlvbiB0byBDQk9SIGFuZCBNZXNzYWdlUGFjayB2YWx1ZXMKKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDaGFyVHlwZT4KK2NsYXNzIGJpbmFyeV93cml0ZXIKK3sKKyAgcHVibGljOgorICAgIC8qIQorICAgIEBicmllZiBjcmVhdGUgYSBiaW5hcnkgd3JpdGVyCisKKyAgICBAcGFyYW1baW5dIGFkYXB0ZXIgIG91dHB1dCBhZGFwdGVyIHRvIHdyaXRlIHRvCisgICAgKi8KKyAgICBleHBsaWNpdCBiaW5hcnlfd3JpdGVyKG91dHB1dF9hZGFwdGVyX3Q8Q2hhclR5cGU+IGFkYXB0ZXIpIDogb2EoYWRhcHRlcikKKyAgICB7CisgICAgICAgIGFzc2VydChvYSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmW2luXSBqICBKU09OIHZhbHVlIHRvIHNlcmlhbGl6ZQorICAgICovCisgICAgdm9pZCB3cml0ZV9jYm9yKGNvbnN0IEJhc2ljSnNvblR5cGUmIGopCisgICAgeworICAgICAgICBzd2l0Y2ggKGoudHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhGNikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihqLm1fdmFsdWUuYm9vbGVhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhGNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4RjQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDQk9SIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwb3NpdGl2ZSBzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdlcnMgYW5kIHVuc2lnbmVkIGludGVnZXJzLiBUaGVyZWZvcmUsIHdlIHVzZWQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgZnJvbSB0aGUgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkIGNhc2UgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAweDE3KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MTgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MTkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDFBKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHgxQikpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29udmVyc2lvbnMgYmVsb3cgZW5jb2RlIHRoZSBzaWduIGluIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICAvLyBieXRlLCBhbmQgdGhlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIHBvc2l0aXZlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBwb3NpdGl2ZV9udW1iZXIgPSAtMSAtIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA+PSAtMjQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PigweDIwICsgcG9zaXRpdmVfbnVtYmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpdmVfbnVtYmVyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MzgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90Pihwb3NpdGl2ZV9udW1iZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NpdGl2ZV9udW1iZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MzkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4ocG9zaXRpdmVfbnVtYmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpdmVfbnVtYmVyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDNBKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBvc2l0aXZlX251bWJlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHgzQikpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90Pihwb3NpdGl2ZV9udW1iZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gMHgxNykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MTgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4MTkpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDFBKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDFCKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6IC8vIERvdWJsZS1QcmVjaXNpb24gRmxvYXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweEZCKSk7CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKGoubV92YWx1ZS5udW1iZXJfZmxvYXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIGNvbnRyb2wgYnl0ZSBhbmQgdGhlIHN0cmluZyBsZW5ndGgKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIE4gPSBqLm1fdmFsdWUuc3RyaW5nLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKE4gPD0gMHgxNykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PigweDYwICsgTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDc4KSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDc5KSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHg3QSkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUQVJUCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4N0IpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVE9QCisKKyAgICAgICAgICAgICAgICAvLyBzdGVwIDI6IHdyaXRlIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVycygKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KGoubV92YWx1ZS5zdHJpbmctPmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICBqLm1fdmFsdWUuc3RyaW5nLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHN0ZXAgMTogd3JpdGUgY29udHJvbCBieXRlIGFuZCB0aGUgYXJyYXkgc2l6ZQorICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gTiA9IGoubV92YWx1ZS5hcnJheS0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChOIDw9IDB4MTcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg4MCArIE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHg5OCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHg5OSkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4OUEpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVEFSVAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweDlCKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBMQ09WX0VYQ0xfU1RPUAorCisgICAgICAgICAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSBlYWNoIGVsZW1lbnQKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsIDogKmoubV92YWx1ZS5hcnJheSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2Nib3IoZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc3RlcCAxOiB3cml0ZSBjb250cm9sIGJ5dGUgYW5kIHRoZSBvYmplY3Qgc2l6ZQorICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gTiA9IGoubV92YWx1ZS5vYmplY3QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoTiA8PSAweDE3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4QTAgKyBOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QjgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QjkpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweEJBKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBMQ09WX0VYQ0xfU1RBUlQKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhCQikpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUT1AKKworICAgICAgICAgICAgICAgIC8vIHN0ZXAgMjogd3JpdGUgZWFjaCBlbGVtZW50CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbCA6ICpqLm1fdmFsdWUub2JqZWN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfY2JvcihlbC5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2Nib3IoZWwuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWZbaW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCisgICAgKi8KKyAgICB2b2lkIHdyaXRlX21zZ3BhY2soY29uc3QgQmFzaWNKc29uVHlwZSYgaikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoai50eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDogLy8gbmlsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDMCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46IC8vIHRydWUgYW5kIGZhbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihqLm1fdmFsdWUuYm9vbGVhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QzIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlUGFjayBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcG9zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIGludGVnZXJzIGFuZCB1bnNpZ25lZCBpbnRlZ2Vycy4gVGhlcmVmb3JlLCB3ZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb2RlIGZyb20gdGhlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCBjYXNlIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDwgMTI4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGl2ZSBmaXhudW0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpbnQgOAorICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDQykpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpbnQgMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4Q0QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWludCAzMgorICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDY0CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweENGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPj0gLTMyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSBmaXhudW0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA+PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptaW4pKCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCA4CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweEQwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50OF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPj0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCAxNgorICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhEMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PGludDE2X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA+PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50IDMyCisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweEQyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID49IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQgNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4RDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQ2NF90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPCAxMjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGl2ZSBmaXhudW0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDgKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDQykpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB1aW50IDE2CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4Q0QpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVpbnQgMzIKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhDRSkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdWludCA2NAorICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweENGKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50NjRfdD4oai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDogLy8gZmxvYXQgNjQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweENCKSk7CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKGoubV92YWx1ZS5udW1iZXJfZmxvYXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIGNvbnRyb2wgYnl0ZSBhbmQgdGhlIHN0cmluZyBsZW5ndGgKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIE4gPSBqLm1fdmFsdWUuc3RyaW5nLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKE4gPD0gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXhzdHIKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4QTAgfCBOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0ciA4CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4RDkpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0ciAxNgorICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigweERBKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50MTZfdD4oTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyIDMyCisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REIpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcnMoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihqLm1fdmFsdWUuc3RyaW5nLT5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgai5tX3ZhbHVlLnN0cmluZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIGNvbnRyb2wgYnl0ZSBhbmQgdGhlIGFycmF5IHNpemUKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIE4gPSBqLm1fdmFsdWUuYXJyYXktPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoTiA8PSAxNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpeGFycmF5CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDx1aW50OF90PigweDkwIHwgTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgMTYKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhEQykpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IDMyCisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REQpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSBlYWNoIGVsZW1lbnQKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsIDogKmoubV92YWx1ZS5hcnJheSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX21zZ3BhY2soZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc3RlcCAxOiB3cml0ZSBjb250cm9sIGJ5dGUgYW5kIHRoZSBvYmplY3Qgc2l6ZQorICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gTiA9IGoubV92YWx1ZS5vYmplY3QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoTiA8PSAxNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpeG1hcAorICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg4MCB8IChOICYgMHhGKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFwIDE2CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXAgMzIKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhERikpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdGVwIDI6IHdyaXRlIGVhY2ggZWxlbWVudAorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiAqai5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX21zZ3BhY2soZWwuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9tc2dwYWNrKGVsLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQHBhcmFtW2luXSBqICBKU09OIHZhbHVlIHRvIHNlcmlhbGl6ZQorICAgIEBwYXJhbVtpbl0gdXNlX2NvdW50ICAgd2hldGhlciB0byB1c2UgJyMnIHByZWZpeGVzIChvcHRpbWl6ZWQgZm9ybWF0KQorICAgIEBwYXJhbVtpbl0gdXNlX3R5cGUgICAgd2hldGhlciB0byB1c2UgJyQnIHByZWZpeGVzIChvcHRpbWl6ZWQgZm9ybWF0KQorICAgIEBwYXJhbVtpbl0gYWRkX3ByZWZpeCAgd2hldGhlciBwcmVmaXhlcyBuZWVkIHRvIGJlIHVzZWQgZm9yIHRoaXMgdmFsdWUKKyAgICAqLworICAgIHZvaWQgd3JpdGVfdWJqc29uKGNvbnN0IEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IGJvb2wgdXNlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlX3R5cGUsIGNvbnN0IGJvb2wgYWRkX3ByZWZpeCA9IHRydWUpCisgICAgeworICAgICAgICBzd2l0Y2ggKGoudHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignWicpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihqLm1fdmFsdWUuYm9vbGVhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdUJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PENoYXJUeXBlPignRicpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXJfd2l0aF91Ympzb25fcHJlZml4KGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciwgYWRkX3ByZWZpeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcl93aXRoX3VianNvbl9wcmVmaXgoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCwgYWRkX3ByZWZpeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcl93aXRoX3VianNvbl9wcmVmaXgoai5tX3ZhbHVlLm51bWJlcl9mbG9hdCwgYWRkX3ByZWZpeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ1MnKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcl93aXRoX3VianNvbl9wcmVmaXgoai5tX3ZhbHVlLnN0cmluZy0+c2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVycygKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KGoubV92YWx1ZS5zdHJpbmctPmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICBqLm1fdmFsdWUuc3RyaW5nLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ1snKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbCBwcmVmaXhfcmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICh1c2VfdHlwZSBhbmQgbm90IGoubV92YWx1ZS5hcnJheS0+ZW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh1c2VfY291bnQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGZpcnN0X3ByZWZpeCA9IHVianNvbl9wcmVmaXgoai5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzYW1lX3ByZWZpeCA9IHN0ZDo6YWxsX29mKGouYmVnaW4oKSArIDEsIGouZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcywgZmlyc3RfcHJlZml4XShjb25zdCBCYXNpY0pzb25UeXBlICYgdikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVianNvbl9wcmVmaXgodikgPT0gZmlyc3RfcHJlZml4OworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtZV9wcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9yZXF1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJyQnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPihmaXJzdF9wcmVmaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1c2VfY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignIycpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChqLm1fdmFsdWUuYXJyYXktPnNpemUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbCA6ICpqLm1fdmFsdWUuYXJyYXkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZV91Ympzb24oZWwsIHVzZV9jb3VudCwgdXNlX3R5cGUsIHByZWZpeF9yZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vdCB1c2VfY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignXScpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPigneycpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sIHByZWZpeF9yZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKHVzZV90eXBlIGFuZCBub3Qgai5tX3ZhbHVlLm9iamVjdC0+ZW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh1c2VfY291bnQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGZpcnN0X3ByZWZpeCA9IHVianNvbl9wcmVmaXgoai5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzYW1lX3ByZWZpeCA9IHN0ZDo6YWxsX29mKGouYmVnaW4oKSwgai5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLCBmaXJzdF9wcmVmaXhdKGNvbnN0IEJhc2ljSnNvblR5cGUgJiB2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWJqc29uX3ByZWZpeCh2KSA9PSBmaXJzdF9wcmVmaXg7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lX3ByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X3JlcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignJCcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KGZpcnN0X3ByZWZpeCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVzZV9jb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCcjJykpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXJfd2l0aF91Ympzb25fcHJlZml4KGoubV92YWx1ZS5vYmplY3QtPnNpemUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbCA6ICpqLm1fdmFsdWUub2JqZWN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChlbC5maXJzdC5zaXplKCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihlbC5maXJzdC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsLmZpcnN0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX3VianNvbihlbC5zZWNvbmQsIHVzZV9jb3VudCwgdXNlX3R5cGUsIHByZWZpeF9yZXF1aXJlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vdCB1c2VfY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignfScpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8qCisgICAgQGJyaWVmIHdyaXRlIGEgbnVtYmVyIHRvIG91dHB1dCBpbnB1dAorCisgICAgQHBhcmFtW2luXSBuIG51bWJlciBvZiB0eXBlIEBhIE51bWJlclR5cGUKKyAgICBAdHBhcmFtIE51bWJlclR5cGUgdGhlIHR5cGUgb2YgdGhlIG51bWJlcgorCisgICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byByZXNwZWN0IHRoZSBzeXN0ZW0ncyBlbmRpYW5lc3MsIGJlY2F1c2UgYnl0ZXMKKyAgICAgICAgICBpbiBDQk9SLCBNZXNzYWdlUGFjaywgYW5kIFVCSlNPTiBhcmUgc3RvcmVkIGluIG5ldHdvcmsgb3JkZXIgKGJpZworICAgICAgICAgIGVuZGlhbikgYW5kIHRoZXJlZm9yZSBuZWVkIHJlb3JkZXJpbmcgb24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgICB2b2lkIHdyaXRlX251bWJlcihjb25zdCBOdW1iZXJUeXBlIG4pCisgICAgeworICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIG51bWJlciB0byBhcnJheSBvZiBsZW5ndGggTnVtYmVyVHlwZQorICAgICAgICBzdGQ6OmFycmF5PENoYXJUeXBlLCBzaXplb2YoTnVtYmVyVHlwZSk+IHZlYzsKKyAgICAgICAgc3RkOjptZW1jcHkodmVjLmRhdGEoKSwgJm4sIHNpemVvZihOdW1iZXJUeXBlKSk7CisKKyAgICAgICAgLy8gc3RlcCAyOiB3cml0ZSBhcnJheSB0byBvdXRwdXQgKHdpdGggcG9zc2libGUgcmVvcmRlcmluZykKKyAgICAgICAgaWYgKGlzX2xpdHRsZV9lbmRpYW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJldmVyc2UgYnl0ZSBvcmRlciBwcmlvciB0byBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgc3RkOjpyZXZlcnNlKHZlYy5iZWdpbigpLCB2ZWMuZW5kKCkpOworICAgICAgICB9CisKKyAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcnModmVjLmRhdGEoKSwgc2l6ZW9mKE51bWJlclR5cGUpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOdW1iZXJUeXBlPgorICAgIHZvaWQgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChjb25zdCBOdW1iZXJUeXBlIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYWRkX3ByZWZpeCkKKyAgICB7CisgICAgICAgIGlmIChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PE51bWJlclR5cGU+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0QnKSk7ICAvLyBmbG9hdDY0CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZV9udW1iZXIobik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc191bnNpZ25lZDxOdW1iZXJUeXBlPjo6dmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdpJykpOyAgLy8gaW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ1UnKSk7ICAvLyB1aW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0knKSk7ICAvLyBpbnQxNgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MTZfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ2wnKSk7ICAvLyBpbnQzMgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0wnKSk7ICAvLyBpbnQ2NAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50NjRfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA3LCAibnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICIgKyBzdGQ6OnRvX3N0cmluZyhuKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1pbikoKSA8PSBuIGFuZCBuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdpJykpOyAgLy8gaW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50OF90PihuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWluKSgpIDw9IG4gYW5kIG4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdVJykpOyAgLy8gdWludDgKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkgPD0gbiBhbmQgbiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0knKSk7ICAvLyBpbnQxNgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MTZfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSA8PSBuIGFuZCBuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignbCcpKTsgIC8vIGludDMyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpIDw9IG4gYW5kIG4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdMJykpOyAgLy8gaW50NjQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PGludDY0X3Q+KG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVEFSVAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA3LCAibnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICIgKyBzdGQ6OnRvX3N0cmluZyhuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUT1AKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXRlcm1pbmUgdGhlIHR5cGUgcHJlZml4IG9mIGNvbnRhaW5lciB2YWx1ZXMKKworICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbmVlZCB0byBiZSAxMDAlIGFjY3VyYXRlIHdoZW4gaXQgY29tZXMgdG8KKyAgICAgICAgICBpbnRlZ2VyIGxpbWl0cy4gSW4gY2FzZSBhIG51bWJlciBleGNlZWRzIHRoZSBsaW1pdHMgb2YgaW50NjRfdCwKKyAgICAgICAgICB0aGlzIHdpbGwgYmUgZGV0ZWN0ZWQgYnkgYSBsYXRlciBjYWxsIHRvIGZ1bmN0aW9uCisgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeC4gVGhlcmVmb3JlLCB3ZSByZXR1cm4gJ0wnIGZvciBhbnkKKyAgICAgICAgICB2YWx1ZSB0aGF0IGRvZXMgbm90IGZpdCB0aGUgcHJldmlvdXMgbGltaXRzLgorICAgICovCisgICAgY2hhciB1Ympzb25fcHJlZml4KGNvbnN0IEJhc2ljSnNvblR5cGUmIGopIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBzd2l0Y2ggKGoudHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICAgICAgcmV0dXJuICdaJzsKKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgICAgIHJldHVybiBqLm1fdmFsdWUuYm9vbGVhbiA/ICdUJyA6ICdGJzsKKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpIDw9IGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciBhbmQgai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnVSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgIC8vIG5vIGNoZWNrIGFuZCBhc3N1bWUgaW50NjRfdCAoc2VlIG5vdGUgYWJvdmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0wnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdpJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgLy8gbm8gY2hlY2sgYW5kIGFzc3VtZSBpbnQ2NF90IChzZWUgbm90ZSBhYm92ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0QnOworCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1MnOworCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgICAgIHJldHVybiAnWyc7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAneyc7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBkaXNjYXJkZWQgdmFsdWVzCisgICAgICAgICAgICAgICAgcmV0dXJuICdOJzsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8vLyB3aGV0aGVyIHdlIGNhbiBhc3N1bWUgbGl0dGxlIGVuZGlhbmVzcworICAgIGNvbnN0IGJvb2wgaXNfbGl0dGxlX2VuZGlhbiA9IGJpbmFyeV9yZWFkZXI8QmFzaWNKc29uVHlwZT46OmxpdHRsZV9lbmRpYW5lc3MoKTsKKworICAgIC8vLyB0aGUgb3V0cHV0CisgICAgb3V0cHV0X2FkYXB0ZXJfdDxDaGFyVHlwZT4gb2EgPSBudWxscHRyOworfTsKK30KK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9vdXRwdXRfYWRhcHRlcnMuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvb3V0cHV0L291dHB1dF9hZGFwdGVycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5ZTFiMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9vdXRwdXRfYWRhcHRlcnMuaHBwCkBAIC0wLDAgKzEsMTEzIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gY29weQorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGlvcz4gLy8gc3RyZWFtc2l6ZQorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBiYWNrX2luc2VydGVyCisjaW5jbHVkZSA8bWVtb3J5PiAvLyBzaGFyZWRfcHRyLCBtYWtlX3NoYXJlZAorI2luY2x1ZGUgPG9zdHJlYW0+IC8vIGJhc2ljX29zdHJlYW0KKyNpbmNsdWRlIDxzdHJpbmc+IC8vIGJhc2ljX3N0cmluZworI2luY2x1ZGUgPHZlY3Rvcj4gLy8gdmVjdG9yCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vIGFic3RyYWN0IG91dHB1dCBhZGFwdGVyIGludGVyZmFjZQordGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+IHN0cnVjdCBvdXRwdXRfYWRhcHRlcl9wcm90b2NvbAoreworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9jaGFyYWN0ZXIoQ2hhclR5cGUgYykgPSAwOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9jaGFyYWN0ZXJzKGNvbnN0IENoYXJUeXBlKiBzLCBzdGQ6OnNpemVfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIH5vdXRwdXRfYWRhcHRlcl9wcm90b2NvbCgpID0gZGVmYXVsdDsKK307CisKKy8vLyBhIHR5cGUgdG8gc2ltcGxpZnkgaW50ZXJmYWNlcwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+Cit1c2luZyBvdXRwdXRfYWRhcHRlcl90ID0gc3RkOjpzaGFyZWRfcHRyPG91dHB1dF9hZGFwdGVyX3Byb3RvY29sPENoYXJUeXBlPj47CisKKy8vLyBvdXRwdXQgYWRhcHRlciBmb3IgYnl0ZSB2ZWN0b3JzCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KK2NsYXNzIG91dHB1dF92ZWN0b3JfYWRhcHRlciA6IHB1YmxpYyBvdXRwdXRfYWRhcHRlcl9wcm90b2NvbDxDaGFyVHlwZT4KK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IG91dHB1dF92ZWN0b3JfYWRhcHRlcihzdGQ6OnZlY3RvcjxDaGFyVHlwZT4mIHZlYykgOiB2KHZlYykge30KKworICAgIHZvaWQgd3JpdGVfY2hhcmFjdGVyKENoYXJUeXBlIGMpIG92ZXJyaWRlCisgICAgeworICAgICAgICB2LnB1c2hfYmFjayhjKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlX2NoYXJhY3RlcnMoY29uc3QgQ2hhclR5cGUqIHMsIHN0ZDo6c2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHN0ZDo6Y29weShzLCBzICsgbGVuZ3RoLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIodikpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPENoYXJUeXBlPiYgdjsKK307CisKKy8vLyBvdXRwdXQgYWRhcHRlciBmb3Igb3V0cHV0IHN0cmVhbXMKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgorY2xhc3Mgb3V0cHV0X3N0cmVhbV9hZGFwdGVyIDogcHVibGljIG91dHB1dF9hZGFwdGVyX3Byb3RvY29sPENoYXJUeXBlPgoreworICBwdWJsaWM6CisgICAgZXhwbGljaXQgb3V0cHV0X3N0cmVhbV9hZGFwdGVyKHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZT4mIHMpIDogc3RyZWFtKHMpIHt9CisKKyAgICB2b2lkIHdyaXRlX2NoYXJhY3RlcihDaGFyVHlwZSBjKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgc3RyZWFtLnB1dChjKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlX2NoYXJhY3RlcnMoY29uc3QgQ2hhclR5cGUqIHMsIHN0ZDo6c2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHN0cmVhbS53cml0ZShzLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KGxlbmd0aCkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZT4mIHN0cmVhbTsKK307CisKKy8vLyBvdXRwdXQgYWRhcHRlciBmb3IgYmFzaWNfc3RyaW5nCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KK2NsYXNzIG91dHB1dF9zdHJpbmdfYWRhcHRlciA6IHB1YmxpYyBvdXRwdXRfYWRhcHRlcl9wcm90b2NvbDxDaGFyVHlwZT4KK3sKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IG91dHB1dF9zdHJpbmdfYWRhcHRlcihzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVHlwZT4mIHMpIDogc3RyKHMpIHt9CisKKyAgICB2b2lkIHdyaXRlX2NoYXJhY3RlcihDaGFyVHlwZSBjKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgc3RyLnB1c2hfYmFjayhjKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlX2NoYXJhY3RlcnMoY29uc3QgQ2hhclR5cGUqIHMsIHN0ZDo6c2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHN0ci5hcHBlbmQocywgbGVuZ3RoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVHlwZT4mIHN0cjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgorY2xhc3Mgb3V0cHV0X2FkYXB0ZXIKK3sKKyAgcHVibGljOgorICAgIG91dHB1dF9hZGFwdGVyKHN0ZDo6dmVjdG9yPENoYXJUeXBlPiYgdmVjKQorICAgICAgICA6IG9hKHN0ZDo6bWFrZV9zaGFyZWQ8b3V0cHV0X3ZlY3Rvcl9hZGFwdGVyPENoYXJUeXBlPj4odmVjKSkge30KKworICAgIG91dHB1dF9hZGFwdGVyKHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZT4mIHMpCisgICAgICAgIDogb2Eoc3RkOjptYWtlX3NoYXJlZDxvdXRwdXRfc3RyZWFtX2FkYXB0ZXI8Q2hhclR5cGU+PihzKSkge30KKworICAgIG91dHB1dF9hZGFwdGVyKHN0ZDo6YmFzaWNfc3RyaW5nPENoYXJUeXBlPiYgcykKKyAgICAgICAgOiBvYShzdGQ6Om1ha2Vfc2hhcmVkPG91dHB1dF9zdHJpbmdfYWRhcHRlcjxDaGFyVHlwZT4+KHMpKSB7fQorCisgICAgb3BlcmF0b3Igb3V0cHV0X2FkYXB0ZXJfdDxDaGFyVHlwZT4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9hOworICAgIH0KKworICBwcml2YXRlOgorICAgIG91dHB1dF9hZGFwdGVyX3Q8Q2hhclR5cGU+IG9hID0gbnVsbHB0cjsKK307Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9vdXRwdXQvc2VyaWFsaXplci5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC9vdXRwdXQvc2VyaWFsaXplci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0NDI2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vZGV0YWlsL291dHB1dC9zZXJpYWxpemVyLmhwcApAQCAtMCwwICsxLDYzNCBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIHJldmVyc2UsIHJlbW92ZSwgZmlsbCwgZmluZCwgbm9uZV9vZgorI2luY2x1ZGUgPGFycmF5PiAvLyBhcnJheQorI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGFzc2VydAorI2luY2x1ZGUgPGNpc282NDY+IC8vIGFuZCwgb3IKKyNpbmNsdWRlIDxjbG9jYWxlPiAvLyBsb2NhbGVjb252LCBsY29udgorI2luY2x1ZGUgPGNtYXRoPiAvLyBsYWJzLCBpc2Zpbml0ZSwgaXNuYW4sIHNpZ25iaXQKKyNpbmNsdWRlIDxjc3RkZGVmPiAvLyBzaXplX3QsIHB0cmRpZmZfdAorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIHVpbnQ4X3QKKyNpbmNsdWRlIDxjc3RkaW8+IC8vIHNucHJpbnRmCisjaW5jbHVkZSA8aW9tYW5pcD4gLy8gc2V0ZmlsbAorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBuZXh0CisjaW5jbHVkZSA8bGltaXRzPiAvLyBudW1lcmljX2xpbWl0cworI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nCisjaW5jbHVkZSA8c3N0cmVhbT4gLy8gc3RyaW5nc3RyZWFtCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGlzX3NhbWUKKworI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvdG9fY2hhcnMuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9vdXRwdXQvb3V0cHV0X2FkYXB0ZXJzLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc2VyaWFsaXphdGlvbiAvLworLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorY2xhc3Mgc2VyaWFsaXplcgoreworICAgIHVzaW5nIHN0cmluZ190ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3Q7CisgICAgdXNpbmcgbnVtYmVyX2Zsb2F0X3QgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfZmxvYXRfdDsKKyAgICB1c2luZyBudW1iZXJfaW50ZWdlcl90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdDsKKyAgICB1c2luZyBudW1iZXJfdW5zaWduZWRfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl91bnNpZ25lZF90OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBVVEY4X0FDQ0VQVCA9IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFVURjhfUkVKRUNUID0gMTsKKworICBwdWJsaWM6CisgICAgLyohCisgICAgQHBhcmFtW2luXSBzICBvdXRwdXQgc3RyZWFtIHRvIHNlcmlhbGl6ZSB0bworICAgIEBwYXJhbVtpbl0gaWNoYXIgIGluZGVudGF0aW9uIGNoYXJhY3RlciB0byB1c2UKKyAgICAqLworICAgIHNlcmlhbGl6ZXIob3V0cHV0X2FkYXB0ZXJfdDxjaGFyPiBzLCBjb25zdCBjaGFyIGljaGFyKQorICAgICAgICA6IG8oc3RkOjptb3ZlKHMpKSwgbG9jKHN0ZDo6bG9jYWxlY29udigpKSwKKyAgICAgICAgICB0aG91c2FuZHNfc2VwKGxvYy0+dGhvdXNhbmRzX3NlcCA9PSBudWxscHRyID8gJ1wwJyA6ICogKGxvYy0+dGhvdXNhbmRzX3NlcCkpLAorICAgICAgICAgIGRlY2ltYWxfcG9pbnQobG9jLT5kZWNpbWFsX3BvaW50ID09IG51bGxwdHIgPyAnXDAnIDogKiAobG9jLT5kZWNpbWFsX3BvaW50KSksCisgICAgICAgICAgaW5kZW50X2NoYXIoaWNoYXIpLCBpbmRlbnRfc3RyaW5nKDUxMiwgaW5kZW50X2NoYXIpCisgICAge30KKworICAgIC8vIGRlbGV0ZSBiZWNhdXNlIG9mIHBvaW50ZXIgbWVtYmVycworICAgIHNlcmlhbGl6ZXIoY29uc3Qgc2VyaWFsaXplciYpID0gZGVsZXRlOworICAgIHNlcmlhbGl6ZXImIG9wZXJhdG9yPShjb25zdCBzZXJpYWxpemVyJikgPSBkZWxldGU7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb24KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwdWJsaWMgbWVtYmVyIGZ1bmN0aW9uIGR1bXAgYW5kIG9yZ2FuaXplcworICAgIHRoZSBzZXJpYWxpemF0aW9uIGludGVybmFsbHkuIFRoZSBpbmRlbnRhdGlvbiBsZXZlbCBpcyBwcm9wYWdhdGVkIGFzCisgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXIuIEluIGNhc2Ugb2YgYXJyYXlzIGFuZCBvYmplY3RzLCB0aGUgZnVuY3Rpb24gaXMKKyAgICBjYWxsZWQgcmVjdXJzaXZlbHkuCisKKyAgICAtIHN0cmluZ3MgYW5kIG9iamVjdCBrZXlzIGFyZSBlc2NhcGVkIHVzaW5nIGBlc2NhcGVfc3RyaW5nKClgCisgICAgLSBpbnRlZ2VyIG51bWJlcnMgYXJlIGNvbnZlcnRlZCBpbXBsaWNpdGx5IHZpYSBgb3BlcmF0b3I8PGAKKyAgICAtIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyBgIiVnImAgZm9ybWF0CisKKyAgICBAcGFyYW1baW5dIHZhbCAgICAgICAgICAgICB2YWx1ZSB0byBzZXJpYWxpemUKKyAgICBAcGFyYW1baW5dIHByZXR0eV9wcmludCAgICB3aGV0aGVyIHRoZSBvdXRwdXQgc2hhbGwgYmUgcHJldHR5LXByaW50ZWQKKyAgICBAcGFyYW1baW5dIGluZGVudF9zdGVwICAgICB0aGUgaW5kZW50IGxldmVsCisgICAgQHBhcmFtW2luXSBjdXJyZW50X2luZGVudCAgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIChvbmx5IHVzZWQgaW50ZXJuYWxseSkKKyAgICAqLworICAgIHZvaWQgZHVtcChjb25zdCBCYXNpY0pzb25UeXBlJiB2YWwsIGNvbnN0IGJvb2wgcHJldHR5X3ByaW50LAorICAgICAgICAgICAgICBjb25zdCBib29sIGVuc3VyZV9hc2NpaSwKKyAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGluZGVudF9zdGVwLAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgY3VycmVudF9pbmRlbnQgPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh2YWwubV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsLm1fdmFsdWUub2JqZWN0LT5lbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycygie30iLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcmV0dHlfcHJpbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJ7XG4iLCAyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSB0byBob2xkIGluZGVudGF0aW9uIGZvciByZWN1cnNpdmUgY2FsbHMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBuZXdfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyBpbmRlbnRfc3RlcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoaW5kZW50X3N0cmluZy5zaXplKCkgPCBuZXdfaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3N0cmluZy5yZXNpemUoaW5kZW50X3N0cmluZy5zaXplKCkgKiAyLCAnICcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgbi0xIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIGF1dG8gaSA9IHZhbC5tX3ZhbHVlLm9iamVjdC0+Y2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgY250ID0gMDsgY250IDwgdmFsLm1fdmFsdWUub2JqZWN0LT5zaXplKCkgLSAxOyArK2NudCwgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGluZGVudF9zdHJpbmcuY19zdHIoKSwgbmV3X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ1wiJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2VzY2FwZWQoaS0+Zmlyc3QsIGVuc3VyZV9hc2NpaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJcIjogIiwgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKGktPnNlY29uZCwgdHJ1ZSwgZW5zdXJlX2FzY2lpLCBpbmRlbnRfc3RlcCwgbmV3X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCIsXG4iLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPSB2YWwubV92YWx1ZS5vYmplY3QtPmNlbmQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGQ6Om5leHQoaSkgPT0gdmFsLm1fdmFsdWUub2JqZWN0LT5jZW5kKCkpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGluZGVudF9zdHJpbmcuY19zdHIoKSwgbmV3X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignXCInKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcF9lc2NhcGVkKGktPmZpcnN0LCBlbnN1cmVfYXNjaWkpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJcIjogIiwgMyk7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoaS0+c2Vjb25kLCB0cnVlLCBlbnN1cmVfYXNjaWksIGluZGVudF9zdGVwLCBuZXdfaW5kZW50KTsKKworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoaW5kZW50X3N0cmluZy5jX3N0cigpLCBjdXJyZW50X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignfScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ3snKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBuLTEgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpID0gdmFsLm1fdmFsdWUub2JqZWN0LT5jYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBjbnQgPSAwOyBjbnQgPCB2YWwubV92YWx1ZS5vYmplY3QtPnNpemUoKSAtIDE7ICsrY250LCArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignXCInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfZXNjYXBlZChpLT5maXJzdCwgZW5zdXJlX2FzY2lpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoIlwiOiIsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcChpLT5zZWNvbmQsIGZhbHNlLCBlbnN1cmVfYXNjaWksIGluZGVudF9zdGVwLCBjdXJyZW50X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPSB2YWwubV92YWx1ZS5vYmplY3QtPmNlbmQoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGQ6Om5leHQoaSkgPT0gdmFsLm1fdmFsdWUub2JqZWN0LT5jZW5kKCkpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ1wiJyk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBfZXNjYXBlZChpLT5maXJzdCwgZW5zdXJlX2FzY2lpKTsKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycygiXCI6IiwgMik7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoaS0+c2Vjb25kLCBmYWxzZSwgZW5zdXJlX2FzY2lpLCBpbmRlbnRfc3RlcCwgY3VycmVudF9pbmRlbnQpOworCisgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignfScpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJbXSIsIDIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByZXR0eV9wcmludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoIltcbiIsIDIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhYmxlIHRvIGhvbGQgaW5kZW50YXRpb24gZm9yIHJlY3Vyc2l2ZSBjYWxscworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIG5ld19pbmRlbnQgPSBjdXJyZW50X2luZGVudCArIGluZGVudF9zdGVwOworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShpbmRlbnRfc3RyaW5nLnNpemUoKSA8IG5ld19pbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfc3RyaW5nLnJlc2l6ZShpbmRlbnRfc3RyaW5nLnNpemUoKSAqIDIsICcgJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBuLTEgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgPSB2YWwubV92YWx1ZS5hcnJheS0+Y2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAhPSB2YWwubV92YWx1ZS5hcnJheS0+Y2VuZCgpIC0gMTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGluZGVudF9zdHJpbmcuY19zdHIoKSwgbmV3X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCppLCB0cnVlLCBlbnN1cmVfYXNjaWksIGluZGVudF9zdGVwLCBuZXdfaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoIixcbiIsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChub3QgdmFsLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGluZGVudF9zdHJpbmcuY19zdHIoKSwgbmV3X2luZGVudCk7CisgICAgICAgICAgICAgICAgICAgIGR1bXAodmFsLm1fdmFsdWUuYXJyYXktPmJhY2soKSwgdHJ1ZSwgZW5zdXJlX2FzY2lpLCBpbmRlbnRfc3RlcCwgbmV3X2luZGVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVyKCdcbicpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGluZGVudF9zdHJpbmcuY19zdHIoKSwgY3VycmVudF9pbmRlbnQpOworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ10nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVyKCdbJyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgbi0xIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpID0gdmFsLm1fdmFsdWUuYXJyYXktPmNiZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gdmFsLm1fdmFsdWUuYXJyYXktPmNlbmQoKSAtIDE7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgqaSwgZmFsc2UsIGVuc3VyZV9hc2NpaSwgaW5kZW50X3N0ZXAsIGN1cnJlbnRfaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignLCcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChub3QgdmFsLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpOworICAgICAgICAgICAgICAgICAgICBkdW1wKHZhbC5tX3ZhbHVlLmFycmF5LT5iYWNrKCksIGZhbHNlLCBlbnN1cmVfYXNjaWksIGluZGVudF9zdGVwLCBjdXJyZW50X2luZGVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVyKCddJyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXIoJ1wiJyk7CisgICAgICAgICAgICAgICAgZHVtcF9lc2NhcGVkKCp2YWwubV92YWx1ZS5zdHJpbmcsIGVuc3VyZV9hc2NpaSk7CisgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVyKCdcIicpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWwubV92YWx1ZS5ib29sZWFuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycygidHJ1ZSIsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJmYWxzZSIsIDUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHVtcF9pbnRlZ2VyKHZhbC5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGR1bXBfaW50ZWdlcih2YWwubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHVtcF9mbG9hdCh2YWwubV92YWx1ZS5udW1iZXJfZmxvYXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpkaXNjYXJkZWQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycygiPGRpc2NhcmRlZD4iLCAxMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycygibnVsbCIsIDQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8qIQorICAgIEBicmllZiBkdW1wIGVzY2FwZWQgc3RyaW5nCisKKyAgICBFc2NhcGUgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGNlcnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGJ5IGEgc2VxdWVuY2Ugb2YgYW4KKyAgICBlc2NhcGUgY2hhcmFjdGVyIChiYWNrc2xhc2gpIGFuZCBhbm90aGVyIGNoYXJhY3RlciBhbmQgb3RoZXIgY29udHJvbAorICAgIGNoYXJhY3RlcnMgYnkgYSBzZXF1ZW5jZSBvZiAiXHUiIGZvbGxvd2VkIGJ5IGEgZm91ci1kaWdpdCBoZXgKKyAgICByZXByZXNlbnRhdGlvbi4gVGhlIGVzY2FwZWQgc3RyaW5nIGlzIHdyaXR0ZW4gdG8gb3V0cHV0IHN0cmVhbSBAYSBvLgorCisgICAgQHBhcmFtW2luXSBzICB0aGUgc3RyaW5nIHRvIGVzY2FwZQorICAgIEBwYXJhbVtpbl0gZW5zdXJlX2FzY2lpICB3aGV0aGVyIHRvIGVzY2FwZSBub24tQVNDSUkgY2hhcmFjdGVycyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1WFhYWCBzZXF1ZW5jZXMKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIHN0cmluZyBAYSBzLgorICAgICovCisgICAgdm9pZCBkdW1wX2VzY2FwZWQoY29uc3Qgc3RyaW5nX3QmIHMsIGNvbnN0IGJvb2wgZW5zdXJlX2FzY2lpKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY29kZXBvaW50OworICAgICAgICB1aW50OF90IHN0YXRlID0gVVRGOF9BQ0NFUFQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzID0gMDsgIC8vIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHN0cmluZ19idWZmZXIKKworICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgYXV0byBieXRlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc1tpXSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZGVjb2RlKHN0YXRlLCBjb2RlcG9pbnQsIGJ5dGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVVRGOF9BQ0NFUFQ6ICAvLyBkZWNvZGUgZm91bmQgYSBuZXcgY29kZSBwb2ludAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlcG9pbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwODogLy8gYmFja3NwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdiJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA5OiAvLyBob3Jpem9udGFsIHRhYgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAndCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwQTogLy8gbmV3bGluZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnbic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwQzogLy8gZm9ybWZlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ2YnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEQ6IC8vIGNhcnJpYWdlIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAncic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyMjogLy8gcXVvdGF0aW9uIG1hcmsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ1wiJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDVDOiAvLyByZXZlcnNlIHNvbGlkdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgY29udHJvbCBjaGFyYWN0ZXJzICgweDAwLi4weDFGKSBvciwgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmVfYXNjaWkgcGFyYW1ldGVyIGlzIHVzZWQsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlcG9pbnQgPD0gMHgxRikgb3IgKGVuc3VyZV9hc2NpaSBhbmQgKGNvZGVwb2ludCA+PSAweDdGKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50IDw9IDB4RkZGRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzbnByaW50ZihzdHJpbmdfYnVmZmVyLmRhdGEoKSArIGJ5dGVzLCA3LCAiXFx1JTA0eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb2RlcG9pbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNucHJpbnRmKHN0cmluZ19idWZmZXIuZGF0YSgpICsgYnl0ZXMsIDEzLCAiXFx1JTA0eFxcdSUwNHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oMHhEN0MwICsgKGNvZGVwb2ludCA+PiAxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oMHhEQzAwICsgKGNvZGVwb2ludCAmIDB4M0ZGKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gMTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBieXRlIHRvIGJ1ZmZlciAoYWxsIHByZXZpb3VzIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gY29waWVkIGhhdmUgaW4gZGVmYXVsdCBjYXNlIGFib3ZlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIgYW5kIHJlc2V0IGluZGV4OyB0aGVyZSBtdXN0IGJlIDEzIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGxlZnQsIGFzIHRoaXMgaXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gKCJcdXh4eHhcdXh4eHhcMCIpIGZvciBvbmUgY29kZSBwb2ludAorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nX2J1ZmZlci5zaXplKCkgLSBieXRlcyA8IDEzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKHN0cmluZ19idWZmZXIuZGF0YSgpLCBieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBVVEY4X1JFSkVDVDogIC8vIGRlY29kZSBmb3VuZCBpbnZhbGlkIFVURi04IGJ5dGUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgICAgICAgICBzcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXggPDwgc3RhdGljX2Nhc3Q8aW50PihieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzE2LCAiaW52YWxpZCBVVEYtOCBieXRlIGF0IGluZGV4ICIgKyBzdGQ6OnRvX3N0cmluZyhpKSArICI6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8vIGRlY29kZSBmb3VuZCB5ZXQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNvZGUgcG9pbnQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgZW5zdXJlX2FzY2lpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIHBvaW50IHdpbGwgbm90IGJlIGVzY2FwZWQgLSBjb3B5IGJ5dGUgdG8gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfYnVmZmVyW2J5dGVzKytdID0gc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoc3RhdGUgPT0gVVRGOF9BQ0NFUFQpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIKKyAgICAgICAgICAgIGlmIChieXRlcyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhzdHJpbmdfYnVmZmVyLmRhdGEoKSwgYnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgZmluaXNoIHJlYWRpbmcsIGJ1dCBkbyBub3QgYWNjZXB0OiBzdHJpbmcgd2FzIGluY29tcGxldGUKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocy5iYWNrKCkpKTsKKyAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMxNiwgImluY29tcGxldGUgVVRGLTggc3RyaW5nOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZHVtcCBhbiBpbnRlZ2VyCisKKyAgICBEdW1wIGEgZ2l2ZW4gaW50ZWdlciB0byBvdXRwdXQgc3RyZWFtIEBhIG8uIFdvcmtzIGludGVybmFsbHkgd2l0aAorICAgIEBhIG51bWJlcl9idWZmZXIuCisKKyAgICBAcGFyYW1baW5dIHggIGludGVnZXIgbnVtYmVyIChzaWduZWQgb3IgdW5zaWduZWQpIHRvIGR1bXAKKyAgICBAdHBhcmFtIE51bWJlclR5cGUgZWl0aGVyIEBhIG51bWJlcl9pbnRlZ2VyX3Qgb3IgQGEgbnVtYmVyX3Vuc2lnbmVkX3QKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE51bWJlclR5cGUsIGRldGFpbDo6ZW5hYmxlX2lmX3Q8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxOdW1iZXJUeXBlLCBudW1iZXJfdW5zaWduZWRfdD46OnZhbHVlIG9yCisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxOdW1iZXJUeXBlLCBudW1iZXJfaW50ZWdlcl90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIGludD4gPSAwPgorICAgIHZvaWQgZHVtcF9pbnRlZ2VyKE51bWJlclR5cGUgeCkKKyAgICB7CisgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgIjAiCisgICAgICAgIGlmICh4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcignMCcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYm9vbCBpc19uZWdhdGl2ZSA9ICh4IDw9IDApIGFuZCAoeCAhPSAwKTsgIC8vIHNlZSBpc3N1ZSAjNzU1CisgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSAwOworCisgICAgICAgIHdoaWxlICh4ICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNwYXJlIDEgYnl0ZSBmb3IgJ1wwJworICAgICAgICAgICAgYXNzZXJ0KGkgPCBudW1iZXJfYnVmZmVyLnNpemUoKSAtIDEpOworCisgICAgICAgICAgICBjb25zdCBhdXRvIGRpZ2l0ID0gc3RkOjpsYWJzKHN0YXRpY19jYXN0PGxvbmc+KHggJSAxMCkpOworICAgICAgICAgICAgbnVtYmVyX2J1ZmZlcltpKytdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgZGlnaXQpOworICAgICAgICAgICAgeCAvPSAxMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc19uZWdhdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIGNhcGFjaXR5IGZvciB0aGUgJy0nCisgICAgICAgICAgICBhc3NlcnQoaSA8IG51bWJlcl9idWZmZXIuc2l6ZSgpIC0gMik7CisgICAgICAgICAgICBudW1iZXJfYnVmZmVyW2krK10gPSAnLSc7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnJldmVyc2UobnVtYmVyX2J1ZmZlci5iZWdpbigpLCBudW1iZXJfYnVmZmVyLmJlZ2luKCkgKyBpKTsKKyAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhudW1iZXJfYnVmZmVyLmRhdGEoKSwgaSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGR1bXAgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKworICAgIER1bXAgYSBnaXZlbiBmbG9hdGluZy1wb2ludCBudW1iZXIgdG8gb3V0cHV0IHN0cmVhbSBAYSBvLiBXb3JrcyBpbnRlcm5hbGx5CisgICAgd2l0aCBAYSBudW1iZXJfYnVmZmVyLgorCisgICAgQHBhcmFtW2luXSB4ICBmbG9hdGluZy1wb2ludCBudW1iZXIgdG8gZHVtcAorICAgICovCisgICAgdm9pZCBkdW1wX2Zsb2F0KG51bWJlcl9mbG9hdF90IHgpCisgICAgeworICAgICAgICAvLyBOYU4gLyBpbmYKKyAgICAgICAgaWYgKG5vdCBzdGQ6OmlzZmluaXRlKHgpKQorICAgICAgICB7CisgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJudWxsIiwgNCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBudW1iZXJfZmxvYXRfdCBpcyBhbiBJRUVFLTc1NCBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBudW1iZXIsCisgICAgICAgIC8vIHVzZSB0aGUgR3Jpc3UyIGFsZ29yaXRobSB0byBwcm9kdWNlIHNob3J0IG51bWJlcnMgd2hpY2ggYXJlCisgICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gcm91bmQtdHJpcCwgdXNpbmcgc3RydG9mIGFuZCBzdHJ0b2QsIHJlc3AuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5COiBUaGUgdGVzdCBiZWxvdyB3b3JrcyBpZiA8bG9uZyBkb3VibGU+ID09IDxkb3VibGU+LgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfaWVlZV9zaW5nbGVfb3JfZG91YmxlCisgICAgICAgICAgICA9IChzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6aXNfaWVjNTU5IGFuZCBzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6ZGlnaXRzID09IDI0IGFuZCBzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6bWF4X2V4cG9uZW50ID09IDEyOCkgb3IKKyAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8bnVtYmVyX2Zsb2F0X3Q+Ojppc19pZWM1NTkgYW5kIHN0ZDo6bnVtZXJpY19saW1pdHM8bnVtYmVyX2Zsb2F0X3Q+OjpkaWdpdHMgPT0gNTMgYW5kIHN0ZDo6bnVtZXJpY19saW1pdHM8bnVtYmVyX2Zsb2F0X3Q+OjptYXhfZXhwb25lbnQgPT0gMTAyNCk7CisKKyAgICAgICAgZHVtcF9mbG9hdCh4LCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX2llZWVfc2luZ2xlX29yX2RvdWJsZT4oKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wX2Zsb2F0KG51bWJlcl9mbG9hdF90IHgsIHN0ZDo6dHJ1ZV90eXBlIC8qaXNfaWVlZV9zaW5nbGVfb3JfZG91YmxlKi8pCisgICAgeworICAgICAgICBjaGFyKiBiZWdpbiA9IG51bWJlcl9idWZmZXIuZGF0YSgpOworICAgICAgICBjaGFyKiBlbmQgPSA6Om5sb2htYW5uOjpkZXRhaWw6OnRvX2NoYXJzKGJlZ2luLCBiZWdpbiArIG51bWJlcl9idWZmZXIuc2l6ZSgpLCB4KTsKKworICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKGJlZ2luLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIGJlZ2luKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wX2Zsb2F0KG51bWJlcl9mbG9hdF90IHgsIHN0ZDo6ZmFsc2VfdHlwZSAvKmlzX2llZWVfc2luZ2xlX29yX2RvdWJsZSovKQorICAgIHsKKyAgICAgICAgLy8gZ2V0IG51bWJlciBvZiBkaWdpdHMgZm9yIGEgZmxvYXQgLT4gdGV4dCAtPiBmbG9hdCByb3VuZC10cmlwCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBkID0gc3RkOjpudW1lcmljX2xpbWl0czxudW1iZXJfZmxvYXRfdD46Om1heF9kaWdpdHMxMDsKKworICAgICAgICAvLyB0aGUgYWN0dWFsIGNvbnZlcnNpb24KKyAgICAgICAgc3RkOjpwdHJkaWZmX3QgbGVuID0gc25wcmludGYobnVtYmVyX2J1ZmZlci5kYXRhKCksIG51bWJlcl9idWZmZXIuc2l6ZSgpLCAiJS4qZyIsIGQsIHgpOworCisgICAgICAgIC8vIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBhbiBlcnJvcgorICAgICAgICBhc3NlcnQobGVuID4gMCk7CisgICAgICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciB3YXMgbGFyZ2UgZW5vdWdoCisgICAgICAgIGFzc2VydChzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4obGVuKSA8IG51bWJlcl9idWZmZXIuc2l6ZSgpKTsKKworICAgICAgICAvLyBlcmFzZSB0aG91c2FuZHMgc2VwYXJhdG9yCisgICAgICAgIGlmICh0aG91c2FuZHNfc2VwICE9ICdcMCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZW5kID0gc3RkOjpyZW1vdmUobnVtYmVyX2J1ZmZlci5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfYnVmZmVyLmJlZ2luKCkgKyBsZW4sIHRob3VzYW5kc19zZXApOworICAgICAgICAgICAgc3RkOjpmaWxsKGVuZCwgbnVtYmVyX2J1ZmZlci5lbmQoKSwgJ1wwJyk7CisgICAgICAgICAgICBhc3NlcnQoKGVuZCAtIG51bWJlcl9idWZmZXIuYmVnaW4oKSkgPD0gbGVuKTsKKyAgICAgICAgICAgIGxlbiA9IChlbmQgLSBudW1iZXJfYnVmZmVyLmJlZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29udmVydCBkZWNpbWFsIHBvaW50IHRvICcuJworICAgICAgICBpZiAoZGVjaW1hbF9wb2ludCAhPSAnXDAnIGFuZCBkZWNpbWFsX3BvaW50ICE9ICcuJykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgYXV0byBkZWNfcG9zID0gc3RkOjpmaW5kKG51bWJlcl9idWZmZXIuYmVnaW4oKSwgbnVtYmVyX2J1ZmZlci5lbmQoKSwgZGVjaW1hbF9wb2ludCk7CisgICAgICAgICAgICBpZiAoZGVjX3BvcyAhPSBudW1iZXJfYnVmZmVyLmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpkZWNfcG9zID0gJy4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhudW1iZXJfYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGxlbikpOworCisgICAgICAgIC8vIGRldGVybWluZSBpZiBuZWVkIHRvIGFwcGVuZCAiLjAiCisgICAgICAgIGNvbnN0IGJvb2wgdmFsdWVfaXNfaW50X2xpa2UgPQorICAgICAgICAgICAgc3RkOjpub25lX29mKG51bWJlcl9idWZmZXIuYmVnaW4oKSwgbnVtYmVyX2J1ZmZlci5iZWdpbigpICsgbGVuICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbXShjaGFyIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoYyA9PSAnLicgb3IgYyA9PSAnZScpOworICAgICAgICB9KTsKKworICAgICAgICBpZiAodmFsdWVfaXNfaW50X2xpa2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoIi4wIiwgMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBVVEYtOCBlbmNvZGVkCisKKyAgICBUaGUgZnVuY3Rpb24gY2hlY2tzIGVhY2ggYnl0ZSBvZiBhIHN0cmluZyB3aGV0aGVyIGl0IGlzIFVURi04IGVuY29kZWQuIFRoZQorICAgIHJlc3VsdCBvZiB0aGUgY2hlY2sgaXMgc3RvcmVkIGluIHRoZSBAYSBzdGF0ZSBwYXJhbWV0ZXIuIFRoZSBmdW5jdGlvbiBtdXN0CisgICAgYmUgY2FsbGVkIGluaXRpYWxseSB3aXRoIHN0YXRlIDAgKGFjY2VwdCkuIFN0YXRlIDEgbWVhbnMgdGhlIHN0cmluZyBtdXN0CisgICAgYmUgcmVqZWN0ZWQsIGJlY2F1c2UgdGhlIGN1cnJlbnQgYnl0ZSBpcyBub3QgYWxsb3dlZC4gSWYgdGhlIHN0cmluZyBpcworICAgIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBidXQgdGhlIHN0YXRlIGlzIG5vbi16ZXJvLCB0aGUgc3RyaW5nIGVuZGVkCisgICAgcHJlbWF0dXJlbHk7IHRoYXQgaXMsIHRoZSBsYXN0IGJ5dGUgaW5kaWNhdGVkIG1vcmUgYnl0ZXMgc2hvdWxkIGhhdmUKKyAgICBmb2xsb3dlZC4KKworICAgIEBwYXJhbVtpbixvdXRdIHN0YXRlICB0aGUgc3RhdGUgb2YgdGhlIGRlY29kaW5nCisgICAgQHBhcmFtW2luLG91dF0gY29kZXAgIGNvZGVwb2ludCAodmFsaWQgb25seSBpZiByZXN1bHRpbmcgc3RhdGUgaXMgVVRGOF9BQ0NFUFQpCisgICAgQHBhcmFtW2luXSBieXRlICAgICAgIG5leHQgYnl0ZSB0byBkZWNvZGUKKyAgICBAcmV0dXJuICAgICAgICAgICAgICAgbmV3IHN0YXRlCisKKyAgICBAbm90ZSBUaGUgZnVuY3Rpb24gaGFzIGJlZW4gZWRpdGVkOiBhIHN0ZDo6YXJyYXkgaXMgdXNlZC4KKworICAgIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgQmpvZXJuIEhvZWhybWFubiA8YmpvZXJuQGhvZWhybWFubi5kZT4KKyAgICBAc2EgaHR0cDovL2Jqb2Vybi5ob2Vocm1hbm4uZGUvdXRmLTgvZGVjb2Rlci9kZmEvCisgICAgKi8KKyAgICBzdGF0aWMgdWludDhfdCBkZWNvZGUodWludDhfdCYgc3RhdGUsIHVpbnQzMl90JiBjb2RlcCwgY29uc3QgdWludDhfdCBieXRlKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgNDAwPiB1dGY4ZCA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAwMC4uMUYKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAyMC4uM0YKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA0MC4uNUYKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA2MC4uN0YKKyAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCAvLyA4MC4uOUYKKyAgICAgICAgICAgICAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAvLyBBMC4uQkYKKyAgICAgICAgICAgICAgICA4LCA4LCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAvLyBDMC4uREYKKyAgICAgICAgICAgICAgICAweEEsIDB4MywgMHgzLCAweDMsIDB4MywgMHgzLCAweDMsIDB4MywgMHgzLCAweDMsIDB4MywgMHgzLCAweDMsIDB4NCwgMHgzLCAweDMsIC8vIEUwLi5FRgorICAgICAgICAgICAgICAgIDB4QiwgMHg2LCAweDYsIDB4NiwgMHg1LCAweDgsIDB4OCwgMHg4LCAweDgsIDB4OCwgMHg4LCAweDgsIDB4OCwgMHg4LCAweDgsIDB4OCwgLy8gRjAuLkZGCisgICAgICAgICAgICAgICAgMHgwLCAweDEsIDB4MiwgMHgzLCAweDUsIDB4OCwgMHg3LCAweDEsIDB4MSwgMHgxLCAweDQsIDB4NiwgMHgxLCAweDEsIDB4MSwgMHgxLCAvLyBzMC4uczAKKyAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyBzMS4uczIKKyAgICAgICAgICAgICAgICAxLCAyLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyBzMy4uczQKKyAgICAgICAgICAgICAgICAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAzLCAxLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyBzNS4uczYKKyAgICAgICAgICAgICAgICAxLCAzLCAxLCAxLCAxLCAxLCAxLCAzLCAxLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIC8vIHM3Li5zOAorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IHV0ZjhkW2J5dGVdOworCisgICAgICAgIGNvZGVwID0gKHN0YXRlICE9IFVURjhfQUNDRVBUKQorICAgICAgICAgICAgICAgID8gKGJ5dGUgJiAweDNmdSkgfCAoY29kZXAgPDwgNikKKyAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PHVpbnQzMl90PigweGZmID4+IHR5cGUpICYgKGJ5dGUpOworCisgICAgICAgIHN0YXRlID0gdXRmOGRbMjU2dSArIHN0YXRlICogMTZ1ICsgdHlwZV07CisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gdGhlIG91dHB1dCBvZiB0aGUgc2VyaWFsaXplcgorICAgIG91dHB1dF9hZGFwdGVyX3Q8Y2hhcj4gbyA9IG51bGxwdHI7CisKKyAgICAvLy8gYSAoaG9wZWZ1bGx5KSBsYXJnZSBlbm91Z2ggY2hhcmFjdGVyIGJ1ZmZlcgorICAgIHN0ZDo6YXJyYXk8Y2hhciwgNjQ+IG51bWJlcl9idWZmZXJ7e319OworCisgICAgLy8vIHRoZSBsb2NhbGUKKyAgICBjb25zdCBzdGQ6Omxjb252KiBsb2MgPSBudWxscHRyOworICAgIC8vLyB0aGUgbG9jYWxlJ3MgdGhvdXNhbmQgc2VwYXJhdG9yIGNoYXJhY3RlcgorICAgIGNvbnN0IGNoYXIgdGhvdXNhbmRzX3NlcCA9ICdcMCc7CisgICAgLy8vIHRoZSBsb2NhbGUncyBkZWNpbWFsIHBvaW50IGNoYXJhY3RlcgorICAgIGNvbnN0IGNoYXIgZGVjaW1hbF9wb2ludCA9ICdcMCc7CisKKyAgICAvLy8gc3RyaW5nIGJ1ZmZlcgorICAgIHN0ZDo6YXJyYXk8Y2hhciwgNTEyPiBzdHJpbmdfYnVmZmVye3t9fTsKKworICAgIC8vLyB0aGUgaW5kZW50YXRpb24gY2hhcmFjdGVyCisgICAgY29uc3QgY2hhciBpbmRlbnRfY2hhcjsKKyAgICAvLy8gdGhlIGluZGVudGF0aW9uIHN0cmluZworICAgIHN0cmluZ190IGluZGVudF9zdHJpbmc7Cit9OworfQorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHAgYi9pbmNsdWRlL25sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjYzNjdjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHAKQEAgLTAsMCArMSw3NiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4gLy8gYXJyYXkKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBhbmQKKyNpbmNsdWRlIDxjc3RkZGVmPiAvLyBzaXplX3QKKyNpbmNsdWRlIDxjc3RkaW50PiAvLyB1aW50OF90CisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBKU09OIHR5cGUgZW51bWVyYXRpb24gLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiEKK0BicmllZiB0aGUgSlNPTiB0eXBlIGVudW1lcmF0aW9uCisKK1RoaXMgZW51bWVyYXRpb24gY29sbGVjdHMgdGhlIGRpZmZlcmVudCBKU09OIHR5cGVzLiBJdCBpcyBpbnRlcm5hbGx5IHVzZWQgdG8KK2Rpc3Rpbmd1aXNoIHRoZSBzdG9yZWQgdmFsdWVzLCBhbmQgdGhlIGZ1bmN0aW9ucyBAcmVmIGJhc2ljX2pzb246OmlzX251bGwoKSwKK0ByZWYgYmFzaWNfanNvbjo6aXNfb2JqZWN0KCksIEByZWYgYmFzaWNfanNvbjo6aXNfYXJyYXkoKSwKK0ByZWYgYmFzaWNfanNvbjo6aXNfc3RyaW5nKCksIEByZWYgYmFzaWNfanNvbjo6aXNfYm9vbGVhbigpLAorQHJlZiBiYXNpY19qc29uOjppc19udW1iZXIoKSAod2l0aCBAcmVmIGJhc2ljX2pzb246OmlzX251bWJlcl9pbnRlZ2VyKCksCitAcmVmIGJhc2ljX2pzb246OmlzX251bWJlcl91bnNpZ25lZCgpLCBhbmQgQHJlZiBiYXNpY19qc29uOjppc19udW1iZXJfZmxvYXQoKSksCitAcmVmIGJhc2ljX2pzb246OmlzX2Rpc2NhcmRlZCgpLCBAcmVmIGJhc2ljX2pzb246OmlzX3ByaW1pdGl2ZSgpLCBhbmQKK0ByZWYgYmFzaWNfanNvbjo6aXNfc3RydWN0dXJlZCgpIHJlbHkgb24gaXQuCisKK0Bub3RlIFRoZXJlIGFyZSB0aHJlZSBlbnVtZXJhdGlvbiBlbnRyaWVzIChudW1iZXJfaW50ZWdlciwgbnVtYmVyX3Vuc2lnbmVkLCBhbmQKK251bWJlcl9mbG9hdCksIGJlY2F1c2UgdGhlIGxpYnJhcnkgZGlzdGluZ3Vpc2hlcyB0aGVzZSB0aHJlZSB0eXBlcyBmb3IgbnVtYmVyczoKK0ByZWYgYmFzaWNfanNvbjo6bnVtYmVyX3Vuc2lnbmVkX3QgaXMgdXNlZCBmb3IgdW5zaWduZWQgaW50ZWdlcnMsCitAcmVmIGJhc2ljX2pzb246Om51bWJlcl9pbnRlZ2VyX3QgaXMgdXNlZCBmb3Igc2lnbmVkIGludGVnZXJzLCBhbmQKK0ByZWYgYmFzaWNfanNvbjo6bnVtYmVyX2Zsb2F0X3QgaXMgdXNlZCBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBvciB0bworYXBwcm94aW1hdGUgaW50ZWdlcnMgd2hpY2ggZG8gbm90IGZpdCBpbiB0aGUgbGltaXRzIG9mIHRoZWlyIHJlc3BlY3RpdmUgdHlwZS4KKworQHNhIEByZWYgYmFzaWNfanNvbjo6YmFzaWNfanNvbihjb25zdCB2YWx1ZV90IHZhbHVlX3R5cGUpIC0tIGNyZWF0ZSBhIEpTT04KK3ZhbHVlIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZ2l2ZW4gdHlwZQorCitAc2luY2UgdmVyc2lvbiAxLjAuMAorKi8KK2VudW0gY2xhc3MgdmFsdWVfdCA6IHN0ZDo6dWludDhfdAoreworICAgIG51bGwsICAgICAgICAgICAgIC8vLzwgbnVsbCB2YWx1ZQorICAgIG9iamVjdCwgICAgICAgICAgIC8vLzwgb2JqZWN0ICh1bm9yZGVyZWQgc2V0IG9mIG5hbWUvdmFsdWUgcGFpcnMpCisgICAgYXJyYXksICAgICAgICAgICAgLy8vPCBhcnJheSAob3JkZXJlZCBjb2xsZWN0aW9uIG9mIHZhbHVlcykKKyAgICBzdHJpbmcsICAgICAgICAgICAvLy88IHN0cmluZyB2YWx1ZQorICAgIGJvb2xlYW4sICAgICAgICAgIC8vLzwgYm9vbGVhbiB2YWx1ZQorICAgIG51bWJlcl9pbnRlZ2VyLCAgIC8vLzwgbnVtYmVyIHZhbHVlIChzaWduZWQgaW50ZWdlcikKKyAgICBudW1iZXJfdW5zaWduZWQsICAvLy88IG51bWJlciB2YWx1ZSAodW5zaWduZWQgaW50ZWdlcikKKyAgICBudW1iZXJfZmxvYXQsICAgICAvLy88IG51bWJlciB2YWx1ZSAoZmxvYXRpbmctcG9pbnQpCisgICAgZGlzY2FyZGVkICAgICAgICAgLy8vPCBkaXNjYXJkZWQgYnkgdGhlIHRoZSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24KK307CisKKy8qIQorQGJyaWVmIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIEpTT04gdHlwZXMKKworUmV0dXJucyBhbiBvcmRlcmluZyB0aGF0IGlzIHNpbWlsYXIgdG8gUHl0aG9uOgorLSBvcmRlcjogbnVsbCA8IGJvb2xlYW4gPCBudW1iZXIgPCBvYmplY3QgPCBhcnJheSA8IHN0cmluZworLSBmdXJ0aGVybW9yZSwgZWFjaCB0eXBlIGlzIG5vdCBzbWFsbGVyIHRoYW4gaXRzZWxmCistIGRpc2NhcmRlZCB2YWx1ZXMgYXJlIG5vdCBjb21wYXJhYmxlCisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisqLworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHZhbHVlX3QgbGhzLCBjb25zdCB2YWx1ZV90IHJocykgbm9leGNlcHQKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6YXJyYXk8c3RkOjp1aW50OF90LCA4PiBvcmRlciA9IHt7CisgICAgICAgICAgICAwIC8qIG51bGwgKi8sIDMgLyogb2JqZWN0ICovLCA0IC8qIGFycmF5ICovLCA1IC8qIHN0cmluZyAqLywKKyAgICAgICAgICAgIDEgLyogYm9vbGVhbiAqLywgMiAvKiBpbnRlZ2VyICovLCAyIC8qIHVuc2lnbmVkICovLCAyIC8qIGZsb2F0ICovCisgICAgICAgIH0KKyAgICB9OworCisgICAgY29uc3QgYXV0byBsX2luZGV4ID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGxocyk7CisgICAgY29uc3QgYXV0byByX2luZGV4ID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJocyk7CisgICAgcmV0dXJuIGxfaW5kZXggPCBvcmRlci5zaXplKCkgYW5kIHJfaW5kZXggPCBvcmRlci5zaXplKCkgYW5kIG9yZGVyW2xfaW5kZXhdIDwgb3JkZXJbcl9pbmRleF07Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwIGIvaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA0ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcApAQCAtMCwwICsxLDc1NjkgQEAKKy8qCisgICAgX18gX19fX18gX19fX18gX19fX18KKyBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKK3xfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKK2NvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKK0lNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCitBVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCitTT0ZUV0FSRS4KKyovCisKKyNpZm5kZWYgTkxPSE1BTk5fSlNPTl9IUFAKKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9IUFAKKworI2RlZmluZSBOTE9ITUFOTl9KU09OX1ZFUlNJT05fTUFKT1IgMworI2RlZmluZSBOTE9ITUFOTl9KU09OX1ZFUlNJT05fTUlOT1IgMQorI2RlZmluZSBOTE9ITUFOTl9KU09OX1ZFUlNJT05fUEFUQ0ggMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBhbGxfb2YsIGZpbmQsIGZvcl9lYWNoCisjaW5jbHVkZSA8Y2Fzc2VydD4gLy8gYXNzZXJ0CisjaW5jbHVkZSA8Y2lzbzY0Nj4gLy8gYW5kLCBub3QsIG9yCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gbnVsbHB0cl90LCBwdHJkaWZmX3QsIHNpemVfdAorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IC8vIGhhc2gsIGxlc3MKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PiAvLyBpbml0aWFsaXplcl9saXN0CisjaW5jbHVkZSA8aW9zZndkPiAvLyBpc3RyZWFtLCBvc3RyZWFtCisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGl0ZXJhdG9yX3RyYWl0cywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcKKyNpbmNsdWRlIDxudW1lcmljPiAvLyBhY2N1bXVsYXRlCisjaW5jbHVkZSA8c3RyaW5nPiAvLyBzdHJpbmcsIHN0b2ksIHRvX3N0cmluZworI2luY2x1ZGUgPHV0aWxpdHk+IC8vIGRlY2x2YWwsIGZvcndhcmQsIG1vdmUsIHBhaXIsIHN3YXAKKworI2luY2x1ZGUgPG5sb2htYW5uL2pzb25fZndkLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL3ZhbHVlX3QuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy9mcm9tX2pzb24uaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvaW5wdXRfYWRhcHRlcnMuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pbnB1dC9sZXhlci5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L3BhcnNlci5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9wcmltaXRpdmVfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaW50ZXJuYWxfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcl9pbXBsLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2l0ZXJhdGlvbl9wcm94eS5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9qc29uX3JldmVyc2VfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9vdXRwdXQvb3V0cHV0X2FkYXB0ZXJzLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvYmluYXJ5X3JlYWRlci5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL291dHB1dC9iaW5hcnlfd3JpdGVyLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvb3V0cHV0L3NlcmlhbGl6ZXIuaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9qc29uX3JlZi5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2pzb25fcG9pbnRlci5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vYWRsX3NlcmlhbGl6ZXIuaHBwPgorCisvKiEKK0BicmllZiBuYW1lc3BhY2UgZm9yIE5pZWxzIExvaG1hbm4KK0BzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uCitAc2luY2UgdmVyc2lvbiAxLjAuMAorKi8KK25hbWVzcGFjZSBubG9obWFubgoreworCisvKiEKK0BicmllZiBhIGNsYXNzIHRvIHN0b3JlIEpTT04gdmFsdWVzCisKK0B0cGFyYW0gT2JqZWN0VHlwZSB0eXBlIGZvciBKU09OIG9iamVjdHMgKGBzdGQ6Om1hcGAgYnkgZGVmYXVsdDsgd2lsbCBiZSB1c2VkCitpbiBAcmVmIG9iamVjdF90KQorQHRwYXJhbSBBcnJheVR5cGUgdHlwZSBmb3IgSlNPTiBhcnJheXMgKGBzdGQ6OnZlY3RvcmAgYnkgZGVmYXVsdDsgd2lsbCBiZSB1c2VkCitpbiBAcmVmIGFycmF5X3QpCitAdHBhcmFtIFN0cmluZ1R5cGUgdHlwZSBmb3IgSlNPTiBzdHJpbmdzIGFuZCBvYmplY3Qga2V5cyAoYHN0ZDo6c3RyaW5nYCBieQorZGVmYXVsdDsgd2lsbCBiZSB1c2VkIGluIEByZWYgc3RyaW5nX3QpCitAdHBhcmFtIEJvb2xlYW5UeXBlIHR5cGUgZm9yIEpTT04gYm9vbGVhbnMgKGBib29sYCBieSBkZWZhdWx0OyB3aWxsIGJlIHVzZWQKK2luIEByZWYgYm9vbGVhbl90KQorQHRwYXJhbSBOdW1iZXJJbnRlZ2VyVHlwZSB0eXBlIGZvciBKU09OIGludGVnZXIgbnVtYmVycyAoYGludDY0X3RgIGJ5CitkZWZhdWx0OyB3aWxsIGJlIHVzZWQgaW4gQHJlZiBudW1iZXJfaW50ZWdlcl90KQorQHRwYXJhbSBOdW1iZXJVbnNpZ25lZFR5cGUgdHlwZSBmb3IgSlNPTiB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcnMgKEBjCitgdWludDY0X3RgIGJ5IGRlZmF1bHQ7IHdpbGwgYmUgdXNlZCBpbiBAcmVmIG51bWJlcl91bnNpZ25lZF90KQorQHRwYXJhbSBOdW1iZXJGbG9hdFR5cGUgdHlwZSBmb3IgSlNPTiBmbG9hdGluZy1wb2ludCBudW1iZXJzIChgZG91YmxlYCBieQorZGVmYXVsdDsgd2lsbCBiZSB1c2VkIGluIEByZWYgbnVtYmVyX2Zsb2F0X3QpCitAdHBhcmFtIEFsbG9jYXRvclR5cGUgdHlwZSBvZiB0aGUgYWxsb2NhdG9yIHRvIHVzZSAoYHN0ZDo6YWxsb2NhdG9yYCBieQorZGVmYXVsdCkKK0B0cGFyYW0gSlNPTlNlcmlhbGl6ZXIgdGhlIHNlcmlhbGl6ZXIgdG8gcmVzb2x2ZSBpbnRlcm5hbCBjYWxscyB0byBgdG9fanNvbigpYAorYW5kIGBmcm9tX2pzb24oKWAgKEByZWYgYWRsX3NlcmlhbGl6ZXIgYnkgZGVmYXVsdCkKKworQHJlcXVpcmVtZW50IFRoZSBjbGFzcyBzYXRpc2ZpZXMgdGhlIGZvbGxvd2luZyBjb25jZXB0IHJlcXVpcmVtZW50czoKKy0gQmFzaWMKKyAtIFtEZWZhdWx0Q29uc3RydWN0aWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9EZWZhdWx0Q29uc3RydWN0aWJsZSk6CisgICBKU09OIHZhbHVlcyBjYW4gYmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgSlNPTiBudWxsCisgICB2YWx1ZS4KKyAtIFtNb3ZlQ29uc3RydWN0aWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Nb3ZlQ29uc3RydWN0aWJsZSk6CisgICBBIEpTT04gdmFsdWUgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYW4gcnZhbHVlIGFyZ3VtZW50LgorIC0gW0NvcHlDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvcHlDb25zdHJ1Y3RpYmxlKToKKyAgIEEgSlNPTiB2YWx1ZSBjYW4gYmUgY29weS1jb25zdHJ1Y3RlZCBmcm9tIGFuIGx2YWx1ZSBleHByZXNzaW9uLgorIC0gW01vdmVBc3NpZ25hYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L01vdmVBc3NpZ25hYmxlKToKKyAgIEEgSlNPTiB2YWx1ZSB2YW4gYmUgYXNzaWduZWQgZnJvbSBhbiBydmFsdWUgYXJndW1lbnQuCisgLSBbQ29weUFzc2lnbmFibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29weUFzc2lnbmFibGUpOgorICAgQSBKU09OIHZhbHVlIGNhbiBiZSBjb3B5LWFzc2lnbmVkIGZyb20gYW4gbHZhbHVlIGV4cHJlc3Npb24uCisgLSBbRGVzdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0Rlc3RydWN0aWJsZSk6CisgICBKU09OIHZhbHVlcyBjYW4gYmUgZGVzdHJ1Y3RlZC4KKy0gTGF5b3V0CisgLSBbU3RhbmRhcmRMYXlvdXRUeXBlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L1N0YW5kYXJkTGF5b3V0VHlwZSk6CisgICBKU09OIHZhbHVlcyBoYXZlCisgICBbc3RhbmRhcmQgbGF5b3V0XShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9kYXRhX21lbWJlcnMjU3RhbmRhcmRfbGF5b3V0KToKKyAgIEFsbCBub24tc3RhdGljIGRhdGEgbWVtYmVycyBhcmUgcHJpdmF0ZSBhbmQgc3RhbmRhcmQgbGF5b3V0IHR5cGVzLCB0aGUKKyAgIGNsYXNzIGhhcyBubyB2aXJ0dWFsIGZ1bmN0aW9ucyBvciAodmlydHVhbCkgYmFzZSBjbGFzc2VzLgorLSBMaWJyYXJ5LXdpZGUKKyAtIFtFcXVhbGl0eUNvbXBhcmFibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvRXF1YWxpdHlDb21wYXJhYmxlKToKKyAgIEpTT04gdmFsdWVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIGA9PWAsIHNlZSBAcmVmCisgICBvcGVyYXRvcj09KGNvbnN0X3JlZmVyZW5jZSxjb25zdF9yZWZlcmVuY2UpLgorIC0gW0xlc3NUaGFuQ29tcGFyYWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9MZXNzVGhhbkNvbXBhcmFibGUpOgorICAgSlNPTiB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggYDxgLCBzZWUgQHJlZgorICAgb3BlcmF0b3I8KGNvbnN0X3JlZmVyZW5jZSxjb25zdF9yZWZlcmVuY2UpLgorIC0gW1N3YXBwYWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Td2FwcGFibGUpOgorICAgQW55IEpTT04gbHZhbHVlIG9yIHJ2YWx1ZSBvZiBjYW4gYmUgc3dhcHBlZCB3aXRoIGFueSBsdmFsdWUgb3IgcnZhbHVlIG9mCisgICBvdGhlciBjb21wYXRpYmxlIHR5cGVzLCB1c2luZyB1bnF1YWxpZmllZCBmdW5jdGlvbiBjYWxsIEByZWYgc3dhcCgpLgorIC0gW051bGxhYmxlUG9pbnRlcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9OdWxsYWJsZVBvaW50ZXIpOgorICAgSlNPTiB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIGFnYWluc3QgYHN0ZDo6bnVsbHB0cl90YCBvYmplY3RzIHdoaWNoIGFyZSB1c2VkCisgICB0byBtb2RlbCB0aGUgYG51bGxgIHZhbHVlLgorLSBDb250YWluZXIKKyAtIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKToKKyAgIEpTT04gdmFsdWVzIGNhbiBiZSB1c2VkIGxpa2UgU1RMIGNvbnRhaW5lcnMgYW5kIHByb3ZpZGUgaXRlcmF0b3IgYWNjZXNzLgorIC0gW1JldmVyc2libGVDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvUmV2ZXJzaWJsZUNvbnRhaW5lcik7CisgICBKU09OIHZhbHVlcyBjYW4gYmUgdXNlZCBsaWtlIFNUTCBjb250YWluZXJzIGFuZCBwcm92aWRlIHJldmVyc2UgaXRlcmF0b3IKKyAgIGFjY2Vzcy4KKworQGludmFyaWFudCBUaGUgbWVtYmVyIHZhcmlhYmxlcyBAYSBtX3ZhbHVlIGFuZCBAYSBtX3R5cGUgaGF2ZSB0aGUgZm9sbG93aW5nCityZWxhdGlvbnNoaXA6CistIElmIGBtX3R5cGUgPT0gdmFsdWVfdDo6b2JqZWN0YCwgdGhlbiBgbV92YWx1ZS5vYmplY3QgIT0gbnVsbHB0cmAuCistIElmIGBtX3R5cGUgPT0gdmFsdWVfdDo6YXJyYXlgLCB0aGVuIGBtX3ZhbHVlLmFycmF5ICE9IG51bGxwdHJgLgorLSBJZiBgbV90eXBlID09IHZhbHVlX3Q6OnN0cmluZ2AsIHRoZW4gYG1fdmFsdWUuc3RyaW5nICE9IG51bGxwdHJgLgorVGhlIGludmFyaWFudHMgYXJlIGNoZWNrZWQgYnkgbWVtYmVyIGZ1bmN0aW9uIGFzc2VydF9pbnZhcmlhbnQoKS4KKworQGludGVybmFsCitAbm90ZSBPYmplY3RUeXBlIHRyaWNrIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTg2MDkxMQorQGVuZGludGVybmFsCisKK0BzZWUgW1JGQyA3MTU5OiBUaGUgSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24gKEpTT04pIERhdGEgSW50ZXJjaGFuZ2UKK0Zvcm1hdF0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpCisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisKK0Bub3N1Ymdyb3VwaW5nCisqLworTkxPSE1BTk5fQkFTSUNfSlNPTl9UUExfREVDTEFSQVRJT04KK2NsYXNzIGJhc2ljX2pzb24KK3sKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxkZXRhaWw6OnZhbHVlX3Q+IGZyaWVuZCBzdHJ1Y3QgZGV0YWlsOjpleHRlcm5hbF9jb25zdHJ1Y3RvcjsKKyAgICBmcmllbmQgOjpubG9obWFubjo6anNvbl9wb2ludGVyPGJhc2ljX2pzb24+OworICAgIGZyaWVuZCA6Om5sb2htYW5uOjpkZXRhaWw6OnBhcnNlcjxiYXNpY19qc29uPjsKKyAgICBmcmllbmQgOjpubG9obWFubjo6ZGV0YWlsOjpzZXJpYWxpemVyPGJhc2ljX2pzb24+OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgZnJpZW5kIGNsYXNzIDo6bmxvaG1hbm46OmRldGFpbDo6aXRlcl9pbXBsOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENoYXJUeXBlPgorICAgIGZyaWVuZCBjbGFzcyA6Om5sb2htYW5uOjpkZXRhaWw6OmJpbmFyeV93cml0ZXI7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBmcmllbmQgY2xhc3MgOjpubG9obWFubjo6ZGV0YWlsOjpiaW5hcnlfcmVhZGVyOworCisgICAgLy8vIHdvcmthcm91bmQgdHlwZSBmb3IgTVNWQworICAgIHVzaW5nIGJhc2ljX2pzb25fdCA9IE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMOworCisgICAgLy8gY29udmVuaWVuY2UgYWxpYXNlcyBmb3IgdHlwZXMgcmVzaWRpbmcgaW4gbmFtZXNwYWNlIGRldGFpbDsKKyAgICB1c2luZyBsZXhlciA9IDo6bmxvaG1hbm46OmRldGFpbDo6bGV4ZXI8YmFzaWNfanNvbj47CisgICAgdXNpbmcgcGFyc2VyID0gOjpubG9obWFubjo6ZGV0YWlsOjpwYXJzZXI8YmFzaWNfanNvbj47CisKKyAgICB1c2luZyBwcmltaXRpdmVfaXRlcmF0b3JfdCA9IDo6bmxvaG1hbm46OmRldGFpbDo6cHJpbWl0aXZlX2l0ZXJhdG9yX3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICB1c2luZyBpbnRlcm5hbF9pdGVyYXRvciA9IDo6bmxvaG1hbm46OmRldGFpbDo6aW50ZXJuYWxfaXRlcmF0b3I8QmFzaWNKc29uVHlwZT47CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICB1c2luZyBpdGVyX2ltcGwgPSA6Om5sb2htYW5uOjpkZXRhaWw6Oml0ZXJfaW1wbDxCYXNpY0pzb25UeXBlPjsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvcj4KKyAgICB1c2luZyBpdGVyYXRpb25fcHJveHkgPSA6Om5sb2htYW5uOjpkZXRhaWw6Oml0ZXJhdGlvbl9wcm94eTxJdGVyYXRvcj47CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzZT4gdXNpbmcganNvbl9yZXZlcnNlX2l0ZXJhdG9yID0gOjpubG9obWFubjo6ZGV0YWlsOjpqc29uX3JldmVyc2VfaXRlcmF0b3I8QmFzZT47CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KKyAgICB1c2luZyBvdXRwdXRfYWRhcHRlcl90ID0gOjpubG9obWFubjo6ZGV0YWlsOjpvdXRwdXRfYWRhcHRlcl90PENoYXJUeXBlPjsKKworICAgIHVzaW5nIGJpbmFyeV9yZWFkZXIgPSA6Om5sb2htYW5uOjpkZXRhaWw6OmJpbmFyeV9yZWFkZXI8YmFzaWNfanNvbj47CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+IHVzaW5nIGJpbmFyeV93cml0ZXIgPSA6Om5sb2htYW5uOjpkZXRhaWw6OmJpbmFyeV93cml0ZXI8YmFzaWNfanNvbiwgQ2hhclR5cGU+OworCisgICAgdXNpbmcgc2VyaWFsaXplciA9IDo6bmxvaG1hbm46OmRldGFpbDo6c2VyaWFsaXplcjxiYXNpY19qc29uPjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgdmFsdWVfdCA9IGRldGFpbDo6dmFsdWVfdDsKKyAgICAvLy8gQGNvcHlkb2MgbmxvaG1hbm46Ompzb25fcG9pbnRlcgorICAgIHVzaW5nIGpzb25fcG9pbnRlciA9IDo6bmxvaG1hbm46Ompzb25fcG9pbnRlcjxiYXNpY19qc29uPjsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTRklOQUU+CisgICAgdXNpbmcganNvbl9zZXJpYWxpemVyID0gSlNPTlNlcmlhbGl6ZXI8VCwgU0ZJTkFFPjsKKyAgICAvLy8gaGVscGVyIHR5cGUgZm9yIGluaXRpYWxpemVyIGxpc3RzIG9mIGJhc2ljX2pzb24gdmFsdWVzCisgICAgdXNpbmcgaW5pdGlhbGl6ZXJfbGlzdF90ID0gc3RkOjppbml0aWFsaXplcl9saXN0PGRldGFpbDo6anNvbl9yZWY8YmFzaWNfanNvbj4+OworCisgICAgLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGV4Y2VwdGlvbnMgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgZXhjZXB0aW9ucworICAgIC8vLyBDbGFzc2VzIHRvIGltcGxlbWVudCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucy4KKyAgICAvLy8gQHsKKworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6OmV4Y2VwdGlvbgorICAgIHVzaW5nIGV4Y2VwdGlvbiA9IGRldGFpbDo6ZXhjZXB0aW9uOworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6OnBhcnNlX2Vycm9yCisgICAgdXNpbmcgcGFyc2VfZXJyb3IgPSBkZXRhaWw6OnBhcnNlX2Vycm9yOworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6OmludmFsaWRfaXRlcmF0b3IKKyAgICB1c2luZyBpbnZhbGlkX2l0ZXJhdG9yID0gZGV0YWlsOjppbnZhbGlkX2l0ZXJhdG9yOworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6OnR5cGVfZXJyb3IKKyAgICB1c2luZyB0eXBlX2Vycm9yID0gZGV0YWlsOjp0eXBlX2Vycm9yOworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6Om91dF9vZl9yYW5nZQorICAgIHVzaW5nIG91dF9vZl9yYW5nZSA9IGRldGFpbDo6b3V0X29mX3JhbmdlOworICAgIC8vLyBAY29weWRvYyBkZXRhaWw6Om90aGVyX2Vycm9yCisgICAgdXNpbmcgb3RoZXJfZXJyb3IgPSBkZXRhaWw6Om90aGVyX2Vycm9yOworCisgICAgLy8vIEB9CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGNvbnRhaW5lciB0eXBlcyAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vIEBuYW1lIGNvbnRhaW5lciB0eXBlcworICAgIC8vLyBUaGUgY2Fub25pYyBjb250YWluZXIgdHlwZXMgdG8gdXNlIEByZWYgYmFzaWNfanNvbiBsaWtlIGFueSBvdGhlciBTVEwKKyAgICAvLy8gY29udGFpbmVyLgorICAgIC8vLyBAeworCisgICAgLy8vIHRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIGEgYmFzaWNfanNvbiBjb250YWluZXIKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gYmFzaWNfanNvbjsKKworICAgIC8vLyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IHJlZmVyZW5jZQorICAgIHVzaW5nIHJlZmVyZW5jZSA9IHZhbHVlX3R5cGUmOworICAgIC8vLyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50IGNvbnN0IHJlZmVyZW5jZQorICAgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IHZhbHVlX3R5cGUmOworCisgICAgLy8vIGEgdHlwZSB0byByZXByZXNlbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBpdGVyYXRvcnMKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKKyAgICAvLy8gYSB0eXBlIHRvIHJlcHJlc2VudCBjb250YWluZXIgc2l6ZXMKKyAgICB1c2luZyBzaXplX3R5cGUgPSBzdGQ6OnNpemVfdDsKKworICAgIC8vLyB0aGUgYWxsb2NhdG9yIHR5cGUKKyAgICB1c2luZyBhbGxvY2F0b3JfdHlwZSA9IEFsbG9jYXRvclR5cGU8YmFzaWNfanNvbj47CisKKyAgICAvLy8gdGhlIHR5cGUgb2YgYW4gZWxlbWVudCBwb2ludGVyCisgICAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxhbGxvY2F0b3JfdHlwZT46OnBvaW50ZXI7CisgICAgLy8vIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQgY29uc3QgcG9pbnRlcgorICAgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8YWxsb2NhdG9yX3R5cGU+Ojpjb25zdF9wb2ludGVyOworCisgICAgLy8vIGFuIGl0ZXJhdG9yIGZvciBhIGJhc2ljX2pzb24gY29udGFpbmVyCisgICAgdXNpbmcgaXRlcmF0b3IgPSBpdGVyX2ltcGw8YmFzaWNfanNvbj47CisgICAgLy8vIGEgY29uc3QgaXRlcmF0b3IgZm9yIGEgYmFzaWNfanNvbiBjb250YWluZXIKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGl0ZXJfaW1wbDxjb25zdCBiYXNpY19qc29uPjsKKyAgICAvLy8gYSByZXZlcnNlIGl0ZXJhdG9yIGZvciBhIGJhc2ljX2pzb24gY29udGFpbmVyCisgICAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IGpzb25fcmV2ZXJzZV9pdGVyYXRvcjx0eXBlbmFtZSBiYXNpY19qc29uOjppdGVyYXRvcj47CisgICAgLy8vIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciBmb3IgYSBiYXNpY19qc29uIGNvbnRhaW5lcgorICAgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBqc29uX3JldmVyc2VfaXRlcmF0b3I8dHlwZW5hbWUgYmFzaWNfanNvbjo6Y29uc3RfaXRlcmF0b3I+OworCisgICAgLy8vIEB9CisKKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIHRoZSBhbGxvY2F0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250YWluZXIKKyAgICAqLworICAgIHN0YXRpYyBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhbGxvY2F0b3JfdHlwZSgpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIHZlcnNpb24gaW5mb3JtYXRpb24gb24gdGhlIGxpYnJhcnkKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIEpTT04gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpYnJhcnksCisgICAgaW5jbHVkaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgaW5mb3JtYXRpb24gb24gdGhlIHBsYXRmb3JtIGFuZCBjb21waWxlci4KKworICAgIEByZXR1cm4gSlNPTiBvYmplY3QgaG9sZGluZyB2ZXJzaW9uIGluZm9ybWF0aW9uCisgICAga2V5ICAgICAgICAgfCBkZXNjcmlwdGlvbgorICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tCisgICAgYGNvbXBpbGVyYCAgfCBJbmZvcm1hdGlvbiBvbiB0aGUgdXNlZCBjb21waWxlci4gSXQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOiBgYysrYCAodGhlIHVzZWQgQysrIHN0YW5kYXJkKSwgYGZhbWlseWAgKHRoZSBjb21waWxlciBmYW1pbHk7IHBvc3NpYmxlIHZhbHVlcyBhcmUgYGNsYW5nYCwgYGljY2AsIGBnY2NgLCBgaWxlY3BwYCwgYG1zdmNgLCBgcGdjcHBgLCBgc3VucHJvYCwgYW5kIGB1bmtub3duYCksIGFuZCBgdmVyc2lvbmAgKHRoZSBjb21waWxlciB2ZXJzaW9uKS4KKyAgICBgY29weXJpZ2h0YCB8IFRoZSBjb3B5cmlnaHQgbGluZSBmb3IgdGhlIGxpYnJhcnkgYXMgc3RyaW5nLgorICAgIGBuYW1lYCAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgYXMgc3RyaW5nLgorICAgIGBwbGF0Zm9ybWAgIHwgVGhlIHVzZWQgcGxhdGZvcm0gYXMgc3RyaW5nLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGB3aW4zMmAsIGBsaW51eGAsIGBhcHBsZWAsIGB1bml4YCwgYW5kIGB1bmtub3duYC4KKyAgICBgdXJsYCAgICAgICB8IFRoZSBVUkwgb2YgdGhlIHByb2plY3QgYXMgc3RyaW5nLgorICAgIGB2ZXJzaW9uYCAgIHwgVGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIEl0IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czogYG1ham9yYCwgYG1pbm9yYCwgYW5kIGBwYXRjaGAgYXMgZGVmaW5lZCBieSBbU2VtYW50aWMgVmVyc2lvbmluZ10oaHR0cDovL3NlbXZlci5vcmcpLCBhbmQgYHN0cmluZ2AgKHRoZSB2ZXJzaW9uIHN0cmluZykuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgb3V0cHV0IG9mIHRoZSBgbWV0YSgpYAorICAgIGZ1bmN0aW9uLixtZXRhfQorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIHRvIGFueSBKU09OIHZhbHVlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAc2luY2UgMi4xLjAKKyAgICAqLworICAgIHN0YXRpYyBiYXNpY19qc29uIG1ldGEoKQorICAgIHsKKyAgICAgICAgYmFzaWNfanNvbiByZXN1bHQ7CisKKyAgICAgICAgcmVzdWx0WyJjb3B5cmlnaHQiXSA9ICIoQykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4iOworICAgICAgICByZXN1bHRbIm5hbWUiXSA9ICJKU09OIGZvciBNb2Rlcm4gQysrIjsKKyAgICAgICAgcmVzdWx0WyJ1cmwiXSA9ICJodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbiI7CisgICAgICAgIHJlc3VsdFsidmVyc2lvbiJdWyJzdHJpbmciXSA9CisgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhOTE9ITUFOTl9KU09OX1ZFUlNJT05fTUFKT1IpICsgIi4iICsKKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKE5MT0hNQU5OX0pTT05fVkVSU0lPTl9NSU5PUikgKyAiLiIgKworICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoTkxPSE1BTk5fSlNPTl9WRVJTSU9OX1BBVENIKTsKKyAgICAgICAgcmVzdWx0WyJ2ZXJzaW9uIl1bIm1ham9yIl0gPSBOTE9ITUFOTl9KU09OX1ZFUlNJT05fTUFKT1I7CisgICAgICAgIHJlc3VsdFsidmVyc2lvbiJdWyJtaW5vciJdID0gTkxPSE1BTk5fSlNPTl9WRVJTSU9OX01JTk9SOworICAgICAgICByZXN1bHRbInZlcnNpb24iXVsicGF0Y2giXSA9IE5MT0hNQU5OX0pTT05fVkVSU0lPTl9QQVRDSDsKKworI2lmZGVmIF9XSU4zMgorICAgICAgICByZXN1bHRbInBsYXRmb3JtIl0gPSAid2luMzIiOworI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18KKyAgICAgICAgcmVzdWx0WyJwbGF0Zm9ybSJdID0gImxpbnV4IjsKKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisgICAgICAgIHJlc3VsdFsicGxhdGZvcm0iXSA9ICJhcHBsZSI7CisjZWxpZiBkZWZpbmVkIF9fdW5peF9fCisgICAgICAgIHJlc3VsdFsicGxhdGZvcm0iXSA9ICJ1bml4IjsKKyNlbHNlCisgICAgICAgIHJlc3VsdFsicGxhdGZvcm0iXSA9ICJ1bmtub3duIjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0lDQykgfHwgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorICAgICAgICByZXN1bHRbImNvbXBpbGVyIl0gPSB7eyJmYW1pbHkiLCAiaWNjIn0sIHsidmVyc2lvbiIsIF9fSU5URUxfQ09NUElMRVJ9fTsKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorICAgICAgICByZXN1bHRbImNvbXBpbGVyIl0gPSB7eyJmYW1pbHkiLCAiY2xhbmcifSwgeyJ2ZXJzaW9uIiwgX19jbGFuZ192ZXJzaW9uX199fTsKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19HTlVHX18pCisgICAgICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJnY2MifSwgeyJ2ZXJzaW9uIiwgc3RkOjp0b19zdHJpbmcoX19HTlVDX18pICsgIi4iICsgc3RkOjp0b19zdHJpbmcoX19HTlVDX01JTk9SX18pICsgIi4iICsgc3RkOjp0b19zdHJpbmcoX19HTlVDX1BBVENITEVWRUxfXyl9fTsKKyNlbGlmIGRlZmluZWQoX19IUF9jYykgfHwgZGVmaW5lZChfX0hQX2FDQykKKyAgICAgICAgcmVzdWx0WyJjb21waWxlciJdID0gImhwIgorI2VsaWYgZGVmaW5lZChfX0lCTUNQUF9fKQorICAgICAgICByZXN1bHRbImNvbXBpbGVyIl0gPSB7eyJmYW1pbHkiLCAiaWxlY3BwIn0sIHsidmVyc2lvbiIsIF9fSUJNQ1BQX199fTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJtc3ZjIn0sIHsidmVyc2lvbiIsIF9NU0NfVkVSfX07CisjZWxpZiBkZWZpbmVkKF9fUEdJKQorICAgICAgICByZXN1bHRbImNvbXBpbGVyIl0gPSB7eyJmYW1pbHkiLCAicGdjcHAifSwgeyJ2ZXJzaW9uIiwgX19QR0l9fTsKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisgICAgICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJzdW5wcm8ifSwgeyJ2ZXJzaW9uIiwgX19TVU5QUk9fQ0N9fTsKKyNlbHNlCisgICAgICAgIHJlc3VsdFsiY29tcGlsZXIiXSA9IHt7ImZhbWlseSIsICJ1bmtub3duIn0sIHsidmVyc2lvbiIsICJ1bmtub3duIn19OworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICByZXN1bHRbImNvbXBpbGVyIl1bImMrKyJdID0gc3RkOjp0b19zdHJpbmcoX19jcGx1c3BsdXMpOworI2Vsc2UKKyAgICAgICAgcmVzdWx0WyJjb21waWxlciJdWyJjKysiXSA9ICJ1bmtub3duIjsKKyNlbmRpZgorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSlNPTiB2YWx1ZSBkYXRhIHR5cGVzIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgSlNPTiB2YWx1ZSBkYXRhIHR5cGVzCisgICAgLy8vIFRoZSBkYXRhIHR5cGVzIHRvIHN0b3JlIGEgSlNPTiB2YWx1ZS4gVGhlc2UgdHlwZXMgYXJlIGRlcml2ZWQgZnJvbQorICAgIC8vLyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBjbGFzcyBAcmVmIGJhc2ljX2pzb24uCisgICAgLy8vIEB7CisKKyNpZiBkZWZpbmVkKEpTT05fSEFTX0NQUF8xNCkKKyAgICAvLyBVc2UgdHJhbnNwYXJlbnQgY29tcGFyYXRvciBpZiBwb3NzaWJsZSwgY29tYmluZWQgd2l0aCBwZXJmZWN0IGZvcndhcmRpbmcKKyAgICAvLyBvbiBmaW5kKCkgYW5kIGNvdW50KCkgY2FsbHMgcHJldmVudHMgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbnN0cnVjdGlvbi4KKyAgICB1c2luZyBvYmplY3RfY29tcGFyYXRvcl90ID0gc3RkOjpsZXNzPD47CisjZWxzZQorICAgIHVzaW5nIG9iamVjdF9jb21wYXJhdG9yX3QgPSBzdGQ6Omxlc3M8U3RyaW5nVHlwZT47CisjZW5kaWYKKworICAgIC8qIQorICAgIEBicmllZiBhIHR5cGUgZm9yIGFuIG9iamVjdAorCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZGVzY3JpYmVzIEpTT04gb2JqZWN0cyBhcyBmb2xsb3dzOgorICAgID4gQW4gb2JqZWN0IGlzIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHplcm8gb3IgbW9yZSBuYW1lL3ZhbHVlIHBhaXJzLAorICAgID4gd2hlcmUgYSBuYW1lIGlzIGEgc3RyaW5nIGFuZCBhIHZhbHVlIGlzIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsCisgICAgPiBvYmplY3QsIG9yIGFycmF5LgorCisgICAgVG8gc3RvcmUgb2JqZWN0cyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisgICAgZGVzY3JpYmVkIGJlbG93LgorCisgICAgQHRwYXJhbSBPYmplY3RUeXBlICB0aGUgY29udGFpbmVyIHRvIHN0b3JlIG9iamVjdHMgKGUuZy4sIGBzdGQ6Om1hcGAgb3IKKyAgICBgc3RkOjp1bm9yZGVyZWRfbWFwYCkKKyAgICBAdHBhcmFtIFN0cmluZ1R5cGUgdGhlIHR5cGUgb2YgdGhlIGtleXMgb3IgbmFtZXMgKGUuZy4sIGBzdGQ6OnN0cmluZ2ApLgorICAgIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGBzdGQ6Omxlc3M8U3RyaW5nVHlwZT5gIGlzIHVzZWQgdG8gb3JkZXIgZWxlbWVudHMKKyAgICBpbnNpZGUgdGhlIGNvbnRhaW5lci4KKyAgICBAdHBhcmFtIEFsbG9jYXRvclR5cGUgdGhlIGFsbG9jYXRvciB0byB1c2UgZm9yIG9iamVjdHMgKGUuZy4sCisgICAgYHN0ZDo6YWxsb2NhdG9yYCkKKworICAgICMjIyMgRGVmYXVsdCB0eXBlCisKKyAgICBXaXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQGEgT2JqZWN0VHlwZSAoYHN0ZDo6bWFwYCksIEBhIFN0cmluZ1R5cGUKKyAgICAoYHN0ZDo6c3RyaW5nYCksIGFuZCBAYSBBbGxvY2F0b3JUeXBlIChgc3RkOjphbGxvY2F0b3JgKSwgdGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBmb3IgQGEgb2JqZWN0X3QgaXM6CisKKyAgICBAY29kZSB7LmNwcH0KKyAgICBzdGQ6Om1hcDwKKyAgICAgIHN0ZDo6c3RyaW5nLCAvLyBrZXlfdHlwZQorICAgICAgYmFzaWNfanNvbiwgLy8gdmFsdWVfdHlwZQorICAgICAgc3RkOjpsZXNzPHN0ZDo6c3RyaW5nPiwgLy8ga2V5X2NvbXBhcmUKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgYmFzaWNfanNvbj4+IC8vIGFsbG9jYXRvcl90eXBlCisgICAgPgorICAgIEBlbmRjb2RlCisKKyAgICAjIyMjIEJlaGF2aW9yCisKKyAgICBUaGUgY2hvaWNlIG9mIEBhIG9iamVjdF90IGluZmx1ZW5jZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBKU09OIGNsYXNzLiBXaXRoCisgICAgdGhlIGRlZmF1bHQgdHlwZSwgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6CisKKyAgICAtIFdoZW4gYWxsIG5hbWVzIGFyZSB1bmlxdWUsIG9iamVjdHMgd2lsbCBiZSBpbnRlcm9wZXJhYmxlIGluIHRoZSBzZW5zZQorICAgICAgdGhhdCBhbGwgc29mdHdhcmUgaW1wbGVtZW50YXRpb25zIHJlY2VpdmluZyB0aGF0IG9iamVjdCB3aWxsIGFncmVlIG9uCisgICAgICB0aGUgbmFtZS12YWx1ZSBtYXBwaW5ncy4KKyAgICAtIFdoZW4gdGhlIG5hbWVzIHdpdGhpbiBhbiBvYmplY3QgYXJlIG5vdCB1bmlxdWUsIGxhdGVyIHN0b3JlZCBuYW1lL3ZhbHVlCisgICAgICBwYWlycyBvdmVyd3JpdGUgcHJldmlvdXNseSBzdG9yZWQgbmFtZS92YWx1ZSBwYWlycywgbGVhdmluZyB0aGUgdXNlZAorICAgICAgbmFtZXMgdW5pcXVlLiBGb3IgaW5zdGFuY2UsIGB7ImtleSI6IDF9YCBhbmQgYHsia2V5IjogMiwgImtleSI6IDF9YCB3aWxsCisgICAgICBiZSB0cmVhdGVkIGFzIGVxdWFsIGFuZCBib3RoIHN0b3JlZCBhcyBgeyJrZXkiOiAxfWAuCisgICAgLSBJbnRlcm5hbGx5LCBuYW1lL3ZhbHVlIHBhaXJzIGFyZSBzdG9yZWQgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyIG9mIHRoZQorICAgICAgbmFtZXMuIE9iamVjdHMgd2lsbCBhbHNvIGJlIHNlcmlhbGl6ZWQgKHNlZSBAcmVmIGR1bXApIGluIHRoaXMgb3JkZXIuCisgICAgICBGb3IgaW5zdGFuY2UsIGB7ImIiOiAxLCAiYSI6IDJ9YCBhbmQgYHsiYSI6IDIsICJiIjogMX1gIHdpbGwgYmUgc3RvcmVkCisgICAgICBhbmQgc2VyaWFsaXplZCBhcyBgeyJhIjogMiwgImIiOiAxfWAuCisgICAgLSBXaGVuIGNvbXBhcmluZyBvYmplY3RzLCB0aGUgb3JkZXIgb2YgdGhlIG5hbWUvdmFsdWUgcGFpcnMgaXMgaXJyZWxldmFudC4KKyAgICAgIFRoaXMgbWFrZXMgb2JqZWN0cyBpbnRlcm9wZXJhYmxlIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgd2lsbCBub3QgYmUKKyAgICAgIGFmZmVjdGVkIGJ5IHRoZXNlIGRpZmZlcmVuY2VzLiBGb3IgaW5zdGFuY2UsIGB7ImIiOiAxLCAiYSI6IDJ9YCBhbmQKKyAgICAgIGB7ImEiOiAyLCAiYiI6IDF9YCB3aWxsIGJlIHRyZWF0ZWQgYXMgZXF1YWwuCisKKyAgICAjIyMjIExpbWl0cworCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgc3BlY2lmaWVzOgorICAgID4gQW4gaW1wbGVtZW50YXRpb24gbWF5IHNldCBsaW1pdHMgb24gdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZy4KKworICAgIEluIHRoaXMgY2xhc3MsIHRoZSBvYmplY3QncyBsaW1pdCBvZiBuZXN0aW5nIGlzIG5vdCBleHBsaWNpdGx5IGNvbnN0cmFpbmVkLgorICAgIEhvd2V2ZXIsIGEgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG1heSBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlciBvcgorICAgIHJ1bnRpbWUgZW52aXJvbm1lbnQuIEEgdGhlb3JldGljYWwgbGltaXQgY2FuIGJlIHF1ZXJpZWQgYnkgY2FsbGluZyB0aGUKKyAgICBAcmVmIG1heF9zaXplIGZ1bmN0aW9uIG9mIGEgSlNPTiBvYmplY3QuCisKKyAgICAjIyMjIFN0b3JhZ2UKKworICAgIE9iamVjdHMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBpbiBhIEByZWYgYmFzaWNfanNvbiB0eXBlLiBUaGF0IGlzLCBmb3IgYW55CisgICAgYWNjZXNzIHRvIG9iamVjdCB2YWx1ZXMsIGEgcG9pbnRlciBvZiB0eXBlIGBvYmplY3RfdCpgIG11c3QgYmUKKyAgICBkZXJlZmVyZW5jZWQuCisKKyAgICBAc2EgQHJlZiBhcnJheV90IC0tIHR5cGUgZm9yIGFuIGFycmF5IHZhbHVlCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorCisgICAgQG5vdGUgVGhlIG9yZGVyIG5hbWUvdmFsdWUgcGFpcnMgYXJlIGFkZGVkIHRvIHRoZSBvYmplY3QgaXMgKm5vdCoKKyAgICBwcmVzZXJ2ZWQgYnkgdGhlIGxpYnJhcnkuIFRoZXJlZm9yZSwgaXRlcmF0aW5nIGFuIG9iamVjdCBtYXkgcmV0dXJuCisgICAgbmFtZS92YWx1ZSBwYWlycyBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgd2VyZSBvcmlnaW5hbGx5IHN0b3JlZC4gSW4KKyAgICBmYWN0LCBrZXlzIHdpbGwgYmUgdHJhdmVyc2VkIGluIGFscGhhYmV0aWNhbCBvcmRlciBhcyBgc3RkOjptYXBgIHdpdGgKKyAgICBgc3RkOjpsZXNzYCBpcyB1c2VkIGJ5IGRlZmF1bHQuIFBsZWFzZSBub3RlIHRoaXMgYmVoYXZpb3IgY29uZm9ybXMgdG8gW1JGQworICAgIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSwgYmVjYXVzZSBhbnkgb3JkZXIgaW1wbGVtZW50cyB0aGUKKyAgICBzcGVjaWZpZWQgInVub3JkZXJlZCIgbmF0dXJlIG9mIEpTT04gb2JqZWN0cy4KKyAgICAqLworICAgIHVzaW5nIG9iamVjdF90ID0gT2JqZWN0VHlwZTxTdHJpbmdUeXBlLAorICAgICAgICAgIGJhc2ljX2pzb24sCisgICAgICAgICAgb2JqZWN0X2NvbXBhcmF0b3JfdCwKKyAgICAgICAgICBBbGxvY2F0b3JUeXBlPHN0ZDo6cGFpcjxjb25zdCBTdHJpbmdUeXBlLAorICAgICAgICAgIGJhc2ljX2pzb24+Pj47CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYSB0eXBlIGZvciBhbiBhcnJheQorCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZGVzY3JpYmVzIEpTT04gYXJyYXlzIGFzIGZvbGxvd3M6CisgICAgPiBBbiBhcnJheSBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZSB2YWx1ZXMuCisKKyAgICBUbyBzdG9yZSBvYmplY3RzIGluIEMrKywgYSB0eXBlIGlzIGRlZmluZWQgYnkgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMKKyAgICBleHBsYWluZWQgYmVsb3cuCisKKyAgICBAdHBhcmFtIEFycmF5VHlwZSAgY29udGFpbmVyIHR5cGUgdG8gc3RvcmUgYXJyYXlzIChlLmcuLCBgc3RkOjp2ZWN0b3JgIG9yCisgICAgYHN0ZDo6bGlzdGApCisgICAgQHRwYXJhbSBBbGxvY2F0b3JUeXBlIGFsbG9jYXRvciB0byB1c2UgZm9yIGFycmF5cyAoZS5nLiwgYHN0ZDo6YWxsb2NhdG9yYCkKKworICAgICMjIyMgRGVmYXVsdCB0eXBlCisKKyAgICBXaXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQGEgQXJyYXlUeXBlIChgc3RkOjp2ZWN0b3JgKSBhbmQgQGEKKyAgICBBbGxvY2F0b3JUeXBlIChgc3RkOjphbGxvY2F0b3JgKSwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIEBhIGFycmF5X3QgaXM6CisKKyAgICBAY29kZSB7LmNwcH0KKyAgICBzdGQ6OnZlY3RvcjwKKyAgICAgIGJhc2ljX2pzb24sIC8vIHZhbHVlX3R5cGUKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPGJhc2ljX2pzb24+IC8vIGFsbG9jYXRvcl90eXBlCisgICAgPgorICAgIEBlbmRjb2RlCisKKyAgICAjIyMjIExpbWl0cworCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgc3BlY2lmaWVzOgorICAgID4gQW4gaW1wbGVtZW50YXRpb24gbWF5IHNldCBsaW1pdHMgb24gdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdGluZy4KKworICAgIEluIHRoaXMgY2xhc3MsIHRoZSBhcnJheSdzIGxpbWl0IG9mIG5lc3RpbmcgaXMgbm90IGV4cGxpY2l0bHkgY29uc3RyYWluZWQuCisgICAgSG93ZXZlciwgYSBtYXhpbXVtIGRlcHRoIG9mIG5lc3RpbmcgbWF5IGJlIGludHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyIG9yCisgICAgcnVudGltZSBlbnZpcm9ubWVudC4gQSB0aGVvcmV0aWNhbCBsaW1pdCBjYW4gYmUgcXVlcmllZCBieSBjYWxsaW5nIHRoZQorICAgIEByZWYgbWF4X3NpemUgZnVuY3Rpb24gb2YgYSBKU09OIGFycmF5LgorCisgICAgIyMjIyBTdG9yYWdlCisKKyAgICBBcnJheXMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBpbiBhIEByZWYgYmFzaWNfanNvbiB0eXBlLiBUaGF0IGlzLCBmb3IgYW55CisgICAgYWNjZXNzIHRvIGFycmF5IHZhbHVlcywgYSBwb2ludGVyIG9mIHR5cGUgYGFycmF5X3QqYCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKworICAgIEBzYSBAcmVmIG9iamVjdF90IC0tIHR5cGUgZm9yIGFuIG9iamVjdCB2YWx1ZQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIGFycmF5X3QgPSBBcnJheVR5cGU8YmFzaWNfanNvbiwgQWxsb2NhdG9yVHlwZTxiYXNpY19qc29uPj47CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYSB0eXBlIGZvciBhIHN0cmluZworCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZGVzY3JpYmVzIEpTT04gc3RyaW5ncyBhcyBmb2xsb3dzOgorICAgID4gQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgVW5pY29kZSBjaGFyYWN0ZXJzLgorCisgICAgVG8gc3RvcmUgb2JqZWN0cyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICBkZXNjcmliZWQgYmVsb3cuIFVuaWNvZGUgdmFsdWVzIGFyZSBzcGxpdCBieSB0aGUgSlNPTiBjbGFzcyBpbnRvCisgICAgYnl0ZS1zaXplZCBjaGFyYWN0ZXJzIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uCisKKyAgICBAdHBhcmFtIFN0cmluZ1R5cGUgIHRoZSBjb250YWluZXIgdG8gc3RvcmUgc3RyaW5ncyAoZS5nLiwgYHN0ZDo6c3RyaW5nYCkuCisgICAgTm90ZSB0aGlzIGNvbnRhaW5lciBpcyB1c2VkIGZvciBrZXlzL25hbWVzIGluIG9iamVjdHMsIHNlZSBAcmVmIG9iamVjdF90LgorCisgICAgIyMjIyBEZWZhdWx0IHR5cGUKKworICAgIFdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBAYSBTdHJpbmdUeXBlIChgc3RkOjpzdHJpbmdgKSwgdGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBmb3IgQGEgc3RyaW5nX3QgaXM6CisKKyAgICBAY29kZSB7LmNwcH0KKyAgICBzdGQ6OnN0cmluZworICAgIEBlbmRjb2RlCisKKyAgICAjIyMjIEVuY29kaW5nCisKKyAgICBTdHJpbmdzIGFyZSBzdG9yZWQgaW4gVVRGLTggZW5jb2RpbmcuIFRoZXJlZm9yZSwgZnVuY3Rpb25zIGxpa2UKKyAgICBgc3RkOjpzdHJpbmc6OnNpemUoKWAgb3IgYHN0ZDo6c3RyaW5nOjpsZW5ndGgoKWAgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAgICBieXRlcyBpbiB0aGUgc3RyaW5nIHJhdGhlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvciBnbHlwaHMuCisKKyAgICAjIyMjIFN0cmluZyBjb21wYXJpc29uCisKKyAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBzdGF0ZXM6CisgICAgPiBTb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbnMgYXJlIHR5cGljYWxseSByZXF1aXJlZCB0byB0ZXN0IG5hbWVzIG9mIG9iamVjdAorICAgID4gbWVtYmVycyBmb3IgZXF1YWxpdHkuIEltcGxlbWVudGF0aW9ucyB0aGF0IHRyYW5zZm9ybSB0aGUgdGV4dHVhbAorICAgID4gcmVwcmVzZW50YXRpb24gaW50byBzZXF1ZW5jZXMgb2YgVW5pY29kZSBjb2RlIHVuaXRzIGFuZCB0aGVuIHBlcmZvcm0gdGhlCisgICAgPiBjb21wYXJpc29uIG51bWVyaWNhbGx5LCBjb2RlIHVuaXQgYnkgY29kZSB1bml0LCBhcmUgaW50ZXJvcGVyYWJsZSBpbiB0aGUKKyAgICA+IHNlbnNlIHRoYXQgaW1wbGVtZW50YXRpb25zIHdpbGwgYWdyZWUgaW4gYWxsIGNhc2VzIG9uIGVxdWFsaXR5IG9yCisgICAgPiBpbmVxdWFsaXR5IG9mIHR3byBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgaW1wbGVtZW50YXRpb25zIHRoYXQgY29tcGFyZQorICAgID4gc3RyaW5ncyB3aXRoIGVzY2FwZWQgY2hhcmFjdGVycyB1bmNvbnZlcnRlZCBtYXkgaW5jb3JyZWN0bHkgZmluZCB0aGF0CisgICAgPiBgImFcXGIiYCBhbmQgYCJhXHUwMDVDYiJgIGFyZSBub3QgZXF1YWwuCisKKyAgICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGludGVyb3BlcmFibGUgYXMgaXQgZG9lcyBjb21wYXJlIHN0cmluZ3MgY29kZSB1bml0CisgICAgYnkgY29kZSB1bml0LgorCisgICAgIyMjIyBTdG9yYWdlCisKKyAgICBTdHJpbmcgdmFsdWVzIGFyZSBzdG9yZWQgYXMgcG9pbnRlcnMgaW4gYSBAcmVmIGJhc2ljX2pzb24gdHlwZS4gVGhhdCBpcywKKyAgICBmb3IgYW55IGFjY2VzcyB0byBzdHJpbmcgdmFsdWVzLCBhIHBvaW50ZXIgb2YgdHlwZSBgc3RyaW5nX3QqYCBtdXN0IGJlCisgICAgZGVyZWZlcmVuY2VkLgorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIHN0cmluZ190ID0gU3RyaW5nVHlwZTsKKworICAgIC8qIQorICAgIEBicmllZiBhIHR5cGUgZm9yIGEgYm9vbGVhbgorCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgaW1wbGljaXRseSBkZXNjcmliZXMgYSBib29sZWFuIGFzIGEKKyAgICB0eXBlIHdoaWNoIGRpZmZlcmVudGlhdGVzIHRoZSB0d28gbGl0ZXJhbHMgYHRydWVgIGFuZCBgZmFsc2VgLgorCisgICAgVG8gc3RvcmUgb2JqZWN0cyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgQGEKKyAgICBCb29sZWFuVHlwZSB3aGljaCBjaG9vc2VzIHRoZSB0eXBlIHRvIHVzZS4KKworICAgICMjIyMgRGVmYXVsdCB0eXBlCisKKyAgICBXaXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQGEgQm9vbGVhblR5cGUgKGBib29sYCksIHRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgIEBhIGJvb2xlYW5fdCBpczoKKworICAgIEBjb2RlIHsuY3BwfQorICAgIGJvb2wKKyAgICBAZW5kY29kZQorCisgICAgIyMjIyBTdG9yYWdlCisKKyAgICBCb29sZWFuIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluc2lkZSBhIEByZWYgYmFzaWNfanNvbiB0eXBlLgorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIGJvb2xlYW5fdCA9IEJvb2xlYW5UeXBlOworCisgICAgLyohCisgICAgQGJyaWVmIGEgdHlwZSBmb3IgYSBudW1iZXIgKGludGVnZXIpCisKKyAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBkZXNjcmliZXMgbnVtYmVycyBhcyBmb2xsb3dzOgorICAgID4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIG51bWJlcnMgaXMgc2ltaWxhciB0byB0aGF0IHVzZWQgaW4gbW9zdAorICAgID4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBBIG51bWJlciBpcyByZXByZXNlbnRlZCBpbiBiYXNlIDEwIHVzaW5nIGRlY2ltYWwKKyAgICA+IGRpZ2l0cy4gSXQgY29udGFpbnMgYW4gaW50ZWdlciBjb21wb25lbnQgdGhhdCBtYXkgYmUgcHJlZml4ZWQgd2l0aCBhbgorICAgID4gb3B0aW9uYWwgbWludXMgc2lnbiwgd2hpY2ggbWF5IGJlIGZvbGxvd2VkIGJ5IGEgZnJhY3Rpb24gcGFydCBhbmQvb3IgYW4KKyAgICA+IGV4cG9uZW50IHBhcnQuIExlYWRpbmcgemVyb3MgYXJlIG5vdCBhbGxvd2VkLiAoLi4uKSBOdW1lcmljIHZhbHVlcyB0aGF0CisgICAgPiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIGdyYW1tYXIgYmVsb3cgKHN1Y2ggYXMgSW5maW5pdHkgYW5kIE5hTikKKyAgICA+IGFyZSBub3QgcGVybWl0dGVkLgorCisgICAgVGhpcyBkZXNjcmlwdGlvbiBpbmNsdWRlcyBib3RoIGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCisgICAgSG93ZXZlciwgQysrIGFsbG93cyBtb3JlIHByZWNpc2Ugc3RvcmFnZSBpZiBpdCBpcyBrbm93biB3aGV0aGVyIHRoZSBudW1iZXIKKyAgICBpcyBhIHNpZ25lZCBpbnRlZ2VyLCBhbiB1bnNpZ25lZCBpbnRlZ2VyIG9yIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgIFRoZXJlZm9yZSwgdGhyZWUgZGlmZmVyZW50IHR5cGVzLCBAcmVmIG51bWJlcl9pbnRlZ2VyX3QsIEByZWYKKyAgICBudW1iZXJfdW5zaWduZWRfdCBhbmQgQHJlZiBudW1iZXJfZmxvYXRfdCBhcmUgdXNlZC4KKworICAgIFRvIHN0b3JlIGludGVnZXIgbnVtYmVycyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZQorICAgIHBhcmFtZXRlciBAYSBOdW1iZXJJbnRlZ2VyVHlwZSB3aGljaCBjaG9vc2VzIHRoZSB0eXBlIHRvIHVzZS4KKworICAgICMjIyMgRGVmYXVsdCB0eXBlCisKKyAgICBXaXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQGEgTnVtYmVySW50ZWdlclR5cGUgKGBpbnQ2NF90YCksIHRoZSBkZWZhdWx0CisgICAgdmFsdWUgZm9yIEBhIG51bWJlcl9pbnRlZ2VyX3QgaXM6CisKKyAgICBAY29kZSB7LmNwcH0KKyAgICBpbnQ2NF90CisgICAgQGVuZGNvZGUKKworICAgICMjIyMgRGVmYXVsdCBiZWhhdmlvcgorCisgICAgLSBUaGUgcmVzdHJpY3Rpb25zIGFib3V0IGxlYWRpbmcgemVyb3MgaXMgbm90IGVuZm9yY2VkIGluIEMrKy4gSW5zdGVhZCwKKyAgICAgIGxlYWRpbmcgemVyb3MgaW4gaW50ZWdlciBsaXRlcmFscyBsZWFkIHRvIGFuIGludGVycHJldGF0aW9uIGFzIG9jdGFsCisgICAgICBudW1iZXIuIEludGVybmFsbHksIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBhcyBkZWNpbWFsIG51bWJlci4gRm9yCisgICAgICBpbnN0YW5jZSwgdGhlIEMrKyBpbnRlZ2VyIGxpdGVyYWwgYDAxMGAgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGA4YC4KKyAgICAgIER1cmluZyBkZXNlcmlhbGl6YXRpb24sIGxlYWRpbmcgemVyb3MgeWllbGQgYW4gZXJyb3IuCisgICAgLSBOb3QtYS1udW1iZXIgKE5hTikgdmFsdWVzIHdpbGwgYmUgc2VyaWFsaXplZCB0byBgbnVsbGAuCisKKyAgICAjIyMjIExpbWl0cworCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgc3BlY2lmaWVzOgorICAgID4gQW4gaW1wbGVtZW50YXRpb24gbWF5IHNldCBsaW1pdHMgb24gdGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgbnVtYmVycy4KKworICAgIFdoZW4gdGhlIGRlZmF1bHQgdHlwZSBpcyB1c2VkLCB0aGUgbWF4aW1hbCBpbnRlZ2VyIG51bWJlciB0aGF0IGNhbiBiZQorICAgIHN0b3JlZCBpcyBgOTIyMzM3MjAzNjg1NDc3NTgwN2AgKElOVDY0X01BWCkgYW5kIHRoZSBtaW5pbWFsIGludGVnZXIgbnVtYmVyCisgICAgdGhhdCBjYW4gYmUgc3RvcmVkIGlzIGAtOTIyMzM3MjAzNjg1NDc3NTgwOGAgKElOVDY0X01JTikuIEludGVnZXIgbnVtYmVycworICAgIHRoYXQgYXJlIG91dCBvZiByYW5nZSB3aWxsIHlpZWxkIG92ZXIvdW5kZXJmbG93IHdoZW4gdXNlZCBpbiBhCisgICAgY29uc3RydWN0b3IuIER1cmluZyBkZXNlcmlhbGl6YXRpb24sIHRvbyBsYXJnZSBvciBzbWFsbCBpbnRlZ2VyIG51bWJlcnMKKyAgICB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYmUgc3RvcmVkIGFzIEByZWYgbnVtYmVyX3Vuc2lnbmVkX3Qgb3IgQHJlZgorICAgIG51bWJlcl9mbG9hdF90LgorCisgICAgW1JGQyA3MTU5XShodHRwOi8vcmZjNzE1OS5uZXQvcmZjNzE1OSkgZnVydGhlciBzdGF0ZXM6CisgICAgPiBOb3RlIHRoYXQgd2hlbiBzdWNoIHNvZnR3YXJlIGlzIHVzZWQsIG51bWJlcnMgdGhhdCBhcmUgaW50ZWdlcnMgYW5kIGFyZQorICAgID4gaW4gdGhlIHJhbmdlIFxmJFstMl57NTN9KzEsIDJeezUzfS0xXVxmJCBhcmUgaW50ZXJvcGVyYWJsZSBpbiB0aGUgc2Vuc2UKKyAgICA+IHRoYXQgaW1wbGVtZW50YXRpb25zIHdpbGwgYWdyZWUgZXhhY3RseSBvbiB0aGVpciBudW1lcmljIHZhbHVlcy4KKworICAgIEFzIHRoaXMgcmFuZ2UgaXMgYSBzdWJyYW5nZSBvZiB0aGUgZXhhY3RseSBzdXBwb3J0ZWQgcmFuZ2UgW0lOVDY0X01JTiwKKyAgICBJTlQ2NF9NQVhdLCB0aGlzIGNsYXNzJ3MgaW50ZWdlciB0eXBlIGlzIGludGVyb3BlcmFibGUuCisKKyAgICAjIyMjIFN0b3JhZ2UKKworICAgIEludGVnZXIgbnVtYmVyIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluc2lkZSBhIEByZWYgYmFzaWNfanNvbiB0eXBlLgorCisgICAgQHNhIEByZWYgbnVtYmVyX2Zsb2F0X3QgLS0gdHlwZSBmb3IgbnVtYmVyIHZhbHVlcyAoZmxvYXRpbmctcG9pbnQpCisKKyAgICBAc2EgQHJlZiBudW1iZXJfdW5zaWduZWRfdCAtLSB0eXBlIGZvciBudW1iZXIgdmFsdWVzICh1bnNpZ25lZCBpbnRlZ2VyKQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIG51bWJlcl9pbnRlZ2VyX3QgPSBOdW1iZXJJbnRlZ2VyVHlwZTsKKworICAgIC8qIQorICAgIEBicmllZiBhIHR5cGUgZm9yIGEgbnVtYmVyICh1bnNpZ25lZCkKKworICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGRlc2NyaWJlcyBudW1iZXJzIGFzIGZvbGxvd3M6CisgICAgPiBUaGUgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyBpcyBzaW1pbGFyIHRvIHRoYXQgdXNlZCBpbiBtb3N0CisgICAgPiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEEgbnVtYmVyIGlzIHJlcHJlc2VudGVkIGluIGJhc2UgMTAgdXNpbmcgZGVjaW1hbAorICAgID4gZGlnaXRzLiBJdCBjb250YWlucyBhbiBpbnRlZ2VyIGNvbXBvbmVudCB0aGF0IG1heSBiZSBwcmVmaXhlZCB3aXRoIGFuCisgICAgPiBvcHRpb25hbCBtaW51cyBzaWduLCB3aGljaCBtYXkgYmUgZm9sbG93ZWQgYnkgYSBmcmFjdGlvbiBwYXJ0IGFuZC9vciBhbgorICAgID4gZXhwb25lbnQgcGFydC4gTGVhZGluZyB6ZXJvcyBhcmUgbm90IGFsbG93ZWQuICguLi4pIE51bWVyaWMgdmFsdWVzIHRoYXQKKyAgICA+IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgZ3JhbW1hciBiZWxvdyAoc3VjaCBhcyBJbmZpbml0eSBhbmQgTmFOKQorICAgID4gYXJlIG5vdCBwZXJtaXR0ZWQuCisKKyAgICBUaGlzIGRlc2NyaXB0aW9uIGluY2x1ZGVzIGJvdGggaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKyAgICBIb3dldmVyLCBDKysgYWxsb3dzIG1vcmUgcHJlY2lzZSBzdG9yYWdlIGlmIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIG51bWJlcgorICAgIGlzIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIgb3IgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgVGhlcmVmb3JlLCB0aHJlZSBkaWZmZXJlbnQgdHlwZXMsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwgQHJlZgorICAgIG51bWJlcl91bnNpZ25lZF90IGFuZCBAcmVmIG51bWJlcl9mbG9hdF90IGFyZSB1c2VkLgorCisgICAgVG8gc3RvcmUgdW5zaWduZWQgaW50ZWdlciBudW1iZXJzIGluIEMrKywgYSB0eXBlIGlzIGRlZmluZWQgYnkgdGhlCisgICAgdGVtcGxhdGUgcGFyYW1ldGVyIEBhIE51bWJlclVuc2lnbmVkVHlwZSB3aGljaCBjaG9vc2VzIHRoZSB0eXBlIHRvIHVzZS4KKworICAgICMjIyMgRGVmYXVsdCB0eXBlCisKKyAgICBXaXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQGEgTnVtYmVyVW5zaWduZWRUeXBlIChgdWludDY0X3RgKSwgdGhlCisgICAgZGVmYXVsdCB2YWx1ZSBmb3IgQGEgbnVtYmVyX3Vuc2lnbmVkX3QgaXM6CisKKyAgICBAY29kZSB7LmNwcH0KKyAgICB1aW50NjRfdAorICAgIEBlbmRjb2RlCisKKyAgICAjIyMjIERlZmF1bHQgYmVoYXZpb3IKKworICAgIC0gVGhlIHJlc3RyaWN0aW9ucyBhYm91dCBsZWFkaW5nIHplcm9zIGlzIG5vdCBlbmZvcmNlZCBpbiBDKysuIEluc3RlYWQsCisgICAgICBsZWFkaW5nIHplcm9zIGluIGludGVnZXIgbGl0ZXJhbHMgbGVhZCB0byBhbiBpbnRlcnByZXRhdGlvbiBhcyBvY3RhbAorICAgICAgbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgYXMgZGVjaW1hbCBudW1iZXIuIEZvcgorICAgICAgaW5zdGFuY2UsIHRoZSBDKysgaW50ZWdlciBsaXRlcmFsIGAwMTBgIHdpbGwgYmUgc2VyaWFsaXplZCB0byBgOGAuCisgICAgICBEdXJpbmcgZGVzZXJpYWxpemF0aW9uLCBsZWFkaW5nIHplcm9zIHlpZWxkIGFuIGVycm9yLgorICAgIC0gTm90LWEtbnVtYmVyIChOYU4pIHZhbHVlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYG51bGxgLgorCisgICAgIyMjIyBMaW1pdHMKKworICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIHNwZWNpZmllczoKKyAgICA+IEFuIGltcGxlbWVudGF0aW9uIG1heSBzZXQgbGltaXRzIG9uIHRoZSByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIG51bWJlcnMuCisKKyAgICBXaGVuIHRoZSBkZWZhdWx0IHR5cGUgaXMgdXNlZCwgdGhlIG1heGltYWwgaW50ZWdlciBudW1iZXIgdGhhdCBjYW4gYmUKKyAgICBzdG9yZWQgaXMgYDE4NDQ2NzQ0MDczNzA5NTUxNjE1YCAoVUlOVDY0X01BWCkgYW5kIHRoZSBtaW5pbWFsIGludGVnZXIKKyAgICBudW1iZXIgdGhhdCBjYW4gYmUgc3RvcmVkIGlzIGAwYC4gSW50ZWdlciBudW1iZXJzIHRoYXQgYXJlIG91dCBvZiByYW5nZQorICAgIHdpbGwgeWllbGQgb3Zlci91bmRlcmZsb3cgd2hlbiB1c2VkIGluIGEgY29uc3RydWN0b3IuIER1cmluZworICAgIGRlc2VyaWFsaXphdGlvbiwgdG9vIGxhcmdlIG9yIHNtYWxsIGludGVnZXIgbnVtYmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgICBiZSBzdG9yZWQgYXMgQHJlZiBudW1iZXJfaW50ZWdlcl90IG9yIEByZWYgbnVtYmVyX2Zsb2F0X3QuCisKKyAgICBbUkZDIDcxNTldKGh0dHA6Ly9yZmM3MTU5Lm5ldC9yZmM3MTU5KSBmdXJ0aGVyIHN0YXRlczoKKyAgICA+IE5vdGUgdGhhdCB3aGVuIHN1Y2ggc29mdHdhcmUgaXMgdXNlZCwgbnVtYmVycyB0aGF0IGFyZSBpbnRlZ2VycyBhbmQgYXJlCisgICAgPiBpbiB0aGUgcmFuZ2UgXGYkWy0yXns1M30rMSwgMl57NTN9LTFdXGYkIGFyZSBpbnRlcm9wZXJhYmxlIGluIHRoZSBzZW5zZQorICAgID4gdGhhdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBhZ3JlZSBleGFjdGx5IG9uIHRoZWlyIG51bWVyaWMgdmFsdWVzLgorCisgICAgQXMgdGhpcyByYW5nZSBpcyBhIHN1YnJhbmdlICh3aGVuIGNvbnNpZGVyZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKyAgICBudW1iZXJfaW50ZWdlcl90IHR5cGUpIG9mIHRoZSBleGFjdGx5IHN1cHBvcnRlZCByYW5nZSBbMCwgVUlOVDY0X01BWF0sCisgICAgdGhpcyBjbGFzcydzIGludGVnZXIgdHlwZSBpcyBpbnRlcm9wZXJhYmxlLgorCisgICAgIyMjIyBTdG9yYWdlCisKKyAgICBJbnRlZ2VyIG51bWJlciB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbnNpZGUgYSBAcmVmIGJhc2ljX2pzb24gdHlwZS4KKworICAgIEBzYSBAcmVmIG51bWJlcl9mbG9hdF90IC0tIHR5cGUgZm9yIG51bWJlciB2YWx1ZXMgKGZsb2F0aW5nLXBvaW50KQorICAgIEBzYSBAcmVmIG51bWJlcl9pbnRlZ2VyX3QgLS0gdHlwZSBmb3IgbnVtYmVyIHZhbHVlcyAoaW50ZWdlcikKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICB1c2luZyBudW1iZXJfdW5zaWduZWRfdCA9IE51bWJlclVuc2lnbmVkVHlwZTsKKworICAgIC8qIQorICAgIEBicmllZiBhIHR5cGUgZm9yIGEgbnVtYmVyIChmbG9hdGluZy1wb2ludCkKKworICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIGRlc2NyaWJlcyBudW1iZXJzIGFzIGZvbGxvd3M6CisgICAgPiBUaGUgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVycyBpcyBzaW1pbGFyIHRvIHRoYXQgdXNlZCBpbiBtb3N0CisgICAgPiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEEgbnVtYmVyIGlzIHJlcHJlc2VudGVkIGluIGJhc2UgMTAgdXNpbmcgZGVjaW1hbAorICAgID4gZGlnaXRzLiBJdCBjb250YWlucyBhbiBpbnRlZ2VyIGNvbXBvbmVudCB0aGF0IG1heSBiZSBwcmVmaXhlZCB3aXRoIGFuCisgICAgPiBvcHRpb25hbCBtaW51cyBzaWduLCB3aGljaCBtYXkgYmUgZm9sbG93ZWQgYnkgYSBmcmFjdGlvbiBwYXJ0IGFuZC9vciBhbgorICAgID4gZXhwb25lbnQgcGFydC4gTGVhZGluZyB6ZXJvcyBhcmUgbm90IGFsbG93ZWQuICguLi4pIE51bWVyaWMgdmFsdWVzIHRoYXQKKyAgICA+IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGUgZ3JhbW1hciBiZWxvdyAoc3VjaCBhcyBJbmZpbml0eSBhbmQgTmFOKQorICAgID4gYXJlIG5vdCBwZXJtaXR0ZWQuCisKKyAgICBUaGlzIGRlc2NyaXB0aW9uIGluY2x1ZGVzIGJvdGggaW50ZWdlciBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KKyAgICBIb3dldmVyLCBDKysgYWxsb3dzIG1vcmUgcHJlY2lzZSBzdG9yYWdlIGlmIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIG51bWJlcgorICAgIGlzIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIgb3IgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgVGhlcmVmb3JlLCB0aHJlZSBkaWZmZXJlbnQgdHlwZXMsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwgQHJlZgorICAgIG51bWJlcl91bnNpZ25lZF90IGFuZCBAcmVmIG51bWJlcl9mbG9hdF90IGFyZSB1c2VkLgorCisgICAgVG8gc3RvcmUgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbiBDKyssIGEgdHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSB0ZW1wbGF0ZQorICAgIHBhcmFtZXRlciBAYSBOdW1iZXJGbG9hdFR5cGUgd2hpY2ggY2hvb3NlcyB0aGUgdHlwZSB0byB1c2UuCisKKyAgICAjIyMjIERlZmF1bHQgdHlwZQorCisgICAgV2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEBhIE51bWJlckZsb2F0VHlwZSAoYGRvdWJsZWApLCB0aGUgZGVmYXVsdAorICAgIHZhbHVlIGZvciBAYSBudW1iZXJfZmxvYXRfdCBpczoKKworICAgIEBjb2RlIHsuY3BwfQorICAgIGRvdWJsZQorICAgIEBlbmRjb2RlCisKKyAgICAjIyMjIERlZmF1bHQgYmVoYXZpb3IKKworICAgIC0gVGhlIHJlc3RyaWN0aW9ucyBhYm91dCBsZWFkaW5nIHplcm9zIGlzIG5vdCBlbmZvcmNlZCBpbiBDKysuIEluc3RlYWQsCisgICAgICBsZWFkaW5nIHplcm9zIGluIGZsb2F0aW5nLXBvaW50IGxpdGVyYWxzIHdpbGwgYmUgaWdub3JlZC4gSW50ZXJuYWxseSwKKyAgICAgIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBhcyBkZWNpbWFsIG51bWJlci4gRm9yIGluc3RhbmNlLCB0aGUgQysrCisgICAgICBmbG9hdGluZy1wb2ludCBsaXRlcmFsIGAwMS4yYCB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYDEuMmAuIER1cmluZworICAgICAgZGVzZXJpYWxpemF0aW9uLCBsZWFkaW5nIHplcm9zIHlpZWxkIGFuIGVycm9yLgorICAgIC0gTm90LWEtbnVtYmVyIChOYU4pIHZhbHVlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYG51bGxgLgorCisgICAgIyMjIyBMaW1pdHMKKworICAgIFtSRkMgNzE1OV0oaHR0cDovL3JmYzcxNTkubmV0L3JmYzcxNTkpIHN0YXRlczoKKyAgICA+IFRoaXMgc3BlY2lmaWNhdGlvbiBhbGxvd3MgaW1wbGVtZW50YXRpb25zIHRvIHNldCBsaW1pdHMgb24gdGhlIHJhbmdlIGFuZAorICAgID4gcHJlY2lzaW9uIG9mIG51bWJlcnMgYWNjZXB0ZWQuIFNpbmNlIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cyBJRUVFCisgICAgPiA3NTQtMjAwOCBiaW5hcnk2NCAoZG91YmxlIHByZWNpc2lvbikgbnVtYmVycyBpcyBnZW5lcmFsbHkgYXZhaWxhYmxlIGFuZAorICAgID4gd2lkZWx5IHVzZWQsIGdvb2QgaW50ZXJvcGVyYWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgaW1wbGVtZW50YXRpb25zCisgICAgPiB0aGF0IGV4cGVjdCBubyBtb3JlIHByZWNpc2lvbiBvciByYW5nZSB0aGFuIHRoZXNlIHByb3ZpZGUsIGluIHRoZSBzZW5zZQorICAgID4gdGhhdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBhcHByb3hpbWF0ZSBKU09OIG51bWJlcnMgd2l0aGluIHRoZSBleHBlY3RlZAorICAgID4gcHJlY2lzaW9uLgorCisgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIGV4YWN0bHkgZm9sbG93IHRoaXMgYXBwcm9hY2gsIGFzIGl0IHVzZXMgZG91YmxlCisgICAgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuIE5vdGUgdmFsdWVzIHNtYWxsZXIgdGhhbgorICAgIGAtMS43OTc2OTMxMzQ4NjIzMmUrMzA4YCBhbmQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBgMS43OTc2OTMxMzQ4NjIzMmUrMzA4YAorICAgIHdpbGwgYmUgc3RvcmVkIGFzIE5hTiBpbnRlcm5hbGx5IGFuZCBiZSBzZXJpYWxpemVkIHRvIGBudWxsYC4KKworICAgICMjIyMgU3RvcmFnZQorCisgICAgRmxvYXRpbmctcG9pbnQgbnVtYmVyIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGluc2lkZSBhIEByZWYgYmFzaWNfanNvbgorICAgIHR5cGUuCisKKyAgICBAc2EgQHJlZiBudW1iZXJfaW50ZWdlcl90IC0tIHR5cGUgZm9yIG51bWJlciB2YWx1ZXMgKGludGVnZXIpCisKKyAgICBAc2EgQHJlZiBudW1iZXJfdW5zaWduZWRfdCAtLSB0eXBlIGZvciBudW1iZXIgdmFsdWVzICh1bnNpZ25lZCBpbnRlZ2VyKQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIG51bWJlcl9mbG9hdF90ID0gTnVtYmVyRmxvYXRUeXBlOworCisgICAgLy8vIEB9CisKKyAgcHJpdmF0ZToKKworICAgIC8vLyBoZWxwZXIgZm9yIGV4Y2VwdGlvbi1zYWZlIG9iamVjdCBjcmVhdGlvbgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgc3RhdGljIFQqIGNyZWF0ZShBcmdzJiYgLi4uIGFyZ3MpCisgICAgeworICAgICAgICBBbGxvY2F0b3JUeXBlPFQ+IGFsbG9jOworICAgICAgICB1c2luZyBBbGxvY2F0b3JUcmFpdHMgPSBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8QWxsb2NhdG9yVHlwZTxUPj47CisKKyAgICAgICAgYXV0byBkZWxldGVyID0gWyZdKFQgKiBvYmplY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsbG9jYXRvclRyYWl0czo6ZGVhbGxvY2F0ZShhbGxvYywgb2JqZWN0LCAxKTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQsIGRlY2x0eXBlKGRlbGV0ZXIpPiBvYmplY3QoQWxsb2NhdG9yVHJhaXRzOjphbGxvY2F0ZShhbGxvYywgMSksIGRlbGV0ZXIpOworICAgICAgICBBbGxvY2F0b3JUcmFpdHM6OmNvbnN0cnVjdChhbGxvYywgb2JqZWN0LmdldCgpLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgICBhc3NlcnQob2JqZWN0ICE9IG51bGxwdHIpOworICAgICAgICByZXR1cm4gb2JqZWN0LnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKU09OIHZhbHVlIHN0b3JhZ2UgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qIQorICAgIEBicmllZiBhIEpTT04gdmFsdWUKKworICAgIFRoZSBhY3R1YWwgc3RvcmFnZSBmb3IgYSBKU09OIHZhbHVlIG9mIHRoZSBAcmVmIGJhc2ljX2pzb24gY2xhc3MuIFRoaXMKKyAgICB1bmlvbiBjb21iaW5lcyB0aGUgZGlmZmVyZW50IHN0b3JhZ2UgdHlwZXMgZm9yIHRoZSBKU09OIHZhbHVlIHR5cGVzCisgICAgZGVmaW5lZCBpbiBAcmVmIHZhbHVlX3QuCisKKyAgICBKU09OIHR5cGUgfCB2YWx1ZV90IHR5cGUgICAgfCB1c2VkIHR5cGUKKyAgICAtLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBvYmplY3QgICAgfCBvYmplY3QgICAgICAgICAgfCBwb2ludGVyIHRvIEByZWYgb2JqZWN0X3QKKyAgICBhcnJheSAgICAgfCBhcnJheSAgICAgICAgICAgfCBwb2ludGVyIHRvIEByZWYgYXJyYXlfdAorICAgIHN0cmluZyAgICB8IHN0cmluZyAgICAgICAgICB8IHBvaW50ZXIgdG8gQHJlZiBzdHJpbmdfdAorICAgIGJvb2xlYW4gICB8IGJvb2xlYW4gICAgICAgICB8IEByZWYgYm9vbGVhbl90CisgICAgbnVtYmVyICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgQHJlZiBudW1iZXJfaW50ZWdlcl90CisgICAgbnVtYmVyICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgQHJlZiBudW1iZXJfdW5zaWduZWRfdAorICAgIG51bWJlciAgICB8IG51bWJlcl9mbG9hdCAgICB8IEByZWYgbnVtYmVyX2Zsb2F0X3QKKyAgICBudWxsICAgICAgfCBudWxsICAgICAgICAgICAgfCAqbm8gdmFsdWUgaXMgc3RvcmVkKgorCisgICAgQG5vdGUgVmFyaWFibGUtbGVuZ3RoIHR5cGVzIChvYmplY3RzLCBhcnJheXMsIGFuZCBzdHJpbmdzKSBhcmUgc3RvcmVkIGFzCisgICAgcG9pbnRlcnMuIFRoZSBzaXplIG9mIHRoZSB1bmlvbiBzaG91bGQgbm90IGV4Y2VlZCA2NCBiaXRzIGlmIHRoZSBkZWZhdWx0CisgICAgdmFsdWUgdHlwZXMgYXJlIHVzZWQuCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgdW5pb24ganNvbl92YWx1ZQorICAgIHsKKyAgICAgICAgLy8vIG9iamVjdCAoc3RvcmVkIHdpdGggcG9pbnRlciB0byBzYXZlIHN0b3JhZ2UpCisgICAgICAgIG9iamVjdF90KiBvYmplY3Q7CisgICAgICAgIC8vLyBhcnJheSAoc3RvcmVkIHdpdGggcG9pbnRlciB0byBzYXZlIHN0b3JhZ2UpCisgICAgICAgIGFycmF5X3QqIGFycmF5OworICAgICAgICAvLy8gc3RyaW5nIChzdG9yZWQgd2l0aCBwb2ludGVyIHRvIHNhdmUgc3RvcmFnZSkKKyAgICAgICAgc3RyaW5nX3QqIHN0cmluZzsKKyAgICAgICAgLy8vIGJvb2xlYW4KKyAgICAgICAgYm9vbGVhbl90IGJvb2xlYW47CisgICAgICAgIC8vLyBudW1iZXIgKGludGVnZXIpCisgICAgICAgIG51bWJlcl9pbnRlZ2VyX3QgbnVtYmVyX2ludGVnZXI7CisgICAgICAgIC8vLyBudW1iZXIgKHVuc2lnbmVkIGludGVnZXIpCisgICAgICAgIG51bWJlcl91bnNpZ25lZF90IG51bWJlcl91bnNpZ25lZDsKKyAgICAgICAgLy8vIG51bWJlciAoZmxvYXRpbmctcG9pbnQpCisgICAgICAgIG51bWJlcl9mbG9hdF90IG51bWJlcl9mbG9hdDsKKworICAgICAgICAvLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciAoZm9yIG51bGwgdmFsdWVzKQorICAgICAgICBqc29uX3ZhbHVlKCkgPSBkZWZhdWx0OworICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIGJvb2xlYW5zCisgICAgICAgIGpzb25fdmFsdWUoYm9vbGVhbl90IHYpIG5vZXhjZXB0IDogYm9vbGVhbih2KSB7fQorICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIG51bWJlcnMgKGludGVnZXIpCisgICAgICAgIGpzb25fdmFsdWUobnVtYmVyX2ludGVnZXJfdCB2KSBub2V4Y2VwdCA6IG51bWJlcl9pbnRlZ2VyKHYpIHt9CisgICAgICAgIC8vLyBjb25zdHJ1Y3RvciBmb3IgbnVtYmVycyAodW5zaWduZWQpCisgICAgICAgIGpzb25fdmFsdWUobnVtYmVyX3Vuc2lnbmVkX3Qgdikgbm9leGNlcHQgOiBudW1iZXJfdW5zaWduZWQodikge30KKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBudW1iZXJzIChmbG9hdGluZy1wb2ludCkKKyAgICAgICAganNvbl92YWx1ZShudW1iZXJfZmxvYXRfdCB2KSBub2V4Y2VwdCA6IG51bWJlcl9mbG9hdCh2KSB7fQorICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIGVtcHR5IHZhbHVlcyBvZiBhIGdpdmVuIHR5cGUKKyAgICAgICAganNvbl92YWx1ZSh2YWx1ZV90IHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IGNyZWF0ZTxvYmplY3RfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gY3JlYXRlPGFycmF5X3Q+KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gY3JlYXRlPHN0cmluZ190PigiIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gPSBib29sZWFuX3QoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyX2ludGVnZXIgPSBudW1iZXJfaW50ZWdlcl90KDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG51bWJlcl91bnNpZ25lZCA9IG51bWJlcl91bnNpZ25lZF90KDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG51bWJlcl9mbG9hdCA9IG51bWJlcl9mbG9hdF90KDAuMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG51bGxwdHI7ICAvLyBzaWxlbmNlIHdhcm5pbmcsIHNlZSAjODIxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBudWxscHRyOyAgLy8gc2lsZW5jZSB3YXJuaW5nLCBzZWUgIzgyMQorICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWSh0ID09IHZhbHVlX3Q6Om51bGwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG90aGVyX2Vycm9yOjpjcmVhdGUoNTAwLCAiOTYxYzE1MWQyZTg3ZjI2ODZhOTU1YTliZTI0ZDMxNmYxMzYyYmYyMSAzLjEuMCIpKTsgLy8gTENPVl9FWENMX0xJTkUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIHN0cmluZ3MKKyAgICAgICAganNvbl92YWx1ZShjb25zdCBzdHJpbmdfdCYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyA9IGNyZWF0ZTxzdHJpbmdfdD4odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBydmFsdWUgc3RyaW5ncworICAgICAgICBqc29uX3ZhbHVlKHN0cmluZ190JiYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyA9IGNyZWF0ZTxzdHJpbmdfdD4oc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIG9iamVjdHMKKyAgICAgICAganNvbl92YWx1ZShjb25zdCBvYmplY3RfdCYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCA9IGNyZWF0ZTxvYmplY3RfdD4odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yIGZvciBydmFsdWUgb2JqZWN0cworICAgICAgICBqc29uX3ZhbHVlKG9iamVjdF90JiYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCA9IGNyZWF0ZTxvYmplY3RfdD4oc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIGFycmF5cworICAgICAgICBqc29uX3ZhbHVlKGNvbnN0IGFycmF5X3QmIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheSA9IGNyZWF0ZTxhcnJheV90Pih2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IgZm9yIHJ2YWx1ZSBhcnJheXMKKyAgICAgICAganNvbl92YWx1ZShhcnJheV90JiYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5ID0gY3JlYXRlPGFycmF5X3Q+KHN0ZDo6bW92ZSh2YWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZXN0cm95KHZhbHVlX3QgdCkgbm9leGNlcHQKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yVHlwZTxvYmplY3RfdD4gYWxsb2M7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZXN0cm95KGFsbG9jLCBvYmplY3QpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8ZGVjbHR5cGUoYWxsb2MpPjo6ZGVhbGxvY2F0ZShhbGxvYywgb2JqZWN0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvclR5cGU8YXJyYXlfdD4gYWxsb2M7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZXN0cm95KGFsbG9jLCBhcnJheSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZWFsbG9jYXRlKGFsbG9jLCBhcnJheSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yVHlwZTxzdHJpbmdfdD4gYWxsb2M7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZXN0cm95KGFsbG9jLCBzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8ZGVjbHR5cGUoYWxsb2MpPjo6ZGVhbGxvY2F0ZShhbGxvYywgc3RyaW5nLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY2hlY2tzIHRoZSBjbGFzcyBpbnZhcmlhbnRzCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFzc2VydHMgdGhlIGNsYXNzIGludmFyaWFudHMuIEl0IG5lZWRzIHRvIGJlIGNhbGxlZCBhdCB0aGUKKyAgICBlbmQgb2YgZXZlcnkgY29uc3RydWN0b3IgdG8gbWFrZSBzdXJlIHRoYXQgY3JlYXRlZCBvYmplY3RzIHJlc3BlY3QgdGhlCisgICAgaW52YXJpYW50LiBGdXJ0aGVybW9yZSwgaXQgaGFzIHRvIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHR5cGUgb2YgYSBKU09OCisgICAgdmFsdWUgaXMgY2hhbmdlZCwgYmVjYXVzZSB0aGUgaW52YXJpYW50IGV4cHJlc3NlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisgICAgQGEgbV90eXBlIGFuZCBAYSBtX3ZhbHVlLgorICAgICovCisgICAgdm9pZCBhc3NlcnRfaW52YXJpYW50KCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGFzc2VydChtX3R5cGUgIT0gdmFsdWVfdDo6b2JqZWN0IG9yIG1fdmFsdWUub2JqZWN0ICE9IG51bGxwdHIpOworICAgICAgICBhc3NlcnQobV90eXBlICE9IHZhbHVlX3Q6OmFycmF5IG9yIG1fdmFsdWUuYXJyYXkgIT0gbnVsbHB0cik7CisgICAgICAgIGFzc2VydChtX3R5cGUgIT0gdmFsdWVfdDo6c3RyaW5nIG9yIG1fdmFsdWUuc3RyaW5nICE9IG51bGxwdHIpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBKU09OIHBhcnNlciBjYWxsYmFjayAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKiEKKyAgICBAYnJpZWYgcGFyc2VyIGV2ZW50IHR5cGVzCisKKyAgICBUaGUgcGFyc2VyIGNhbGxiYWNrIGRpc3Rpbmd1aXNoZXMgdGhlIGZvbGxvd2luZyBldmVudHM6CisgICAgLSBgb2JqZWN0X3N0YXJ0YDogdGhlIHBhcnNlciByZWFkIGB7YCBhbmQgc3RhcnRlZCB0byBwcm9jZXNzIGEgSlNPTiBvYmplY3QKKyAgICAtIGBrZXlgOiB0aGUgcGFyc2VyIHJlYWQgYSBrZXkgb2YgYSB2YWx1ZSBpbiBhbiBvYmplY3QKKyAgICAtIGBvYmplY3RfZW5kYDogdGhlIHBhcnNlciByZWFkIGB9YCBhbmQgZmluaXNoZWQgcHJvY2Vzc2luZyBhIEpTT04gb2JqZWN0CisgICAgLSBgYXJyYXlfc3RhcnRgOiB0aGUgcGFyc2VyIHJlYWQgYFtgIGFuZCBzdGFydGVkIHRvIHByb2Nlc3MgYSBKU09OIGFycmF5CisgICAgLSBgYXJyYXlfZW5kYDogdGhlIHBhcnNlciByZWFkIGBdYCBhbmQgZmluaXNoZWQgcHJvY2Vzc2luZyBhIEpTT04gYXJyYXkKKyAgICAtIGB2YWx1ZWA6IHRoZSBwYXJzZXIgZmluaXNoZWQgcmVhZGluZyBhIEpTT04gdmFsdWUKKworICAgIEBpbWFnZSBodG1sIGNhbGxiYWNrX2V2ZW50cy5wbmcgIkV4YW1wbGUgd2hlbiBjZXJ0YWluIHBhcnNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIgorCisgICAgQHNhIEByZWYgcGFyc2VyX2NhbGxiYWNrX3QgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzCisgICAgKi8KKyAgICB1c2luZyBwYXJzZV9ldmVudF90ID0gdHlwZW5hbWUgcGFyc2VyOjpwYXJzZV9ldmVudF90OworCisgICAgLyohCisgICAgQGJyaWVmIHBlci1lbGVtZW50IHBhcnNlciBjYWxsYmFjayB0eXBlCisKKyAgICBXaXRoIGEgcGFyc2VyIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYSBKU09OIHRleHQgY2FuIGJlCisgICAgaW5mbHVlbmNlZC4gV2hlbiBwYXNzZWQgdG8gQHJlZiBwYXJzZSwgaXQgaXMgY2FsbGVkIG9uIGNlcnRhaW4gZXZlbnRzCisgICAgKHBhc3NlZCBhcyBAcmVmIHBhcnNlX2V2ZW50X3QgdmlhIHBhcmFtZXRlciBAYSBldmVudCkgd2l0aCBhIHNldCByZWN1cnNpb24KKyAgICBkZXB0aCBAYSBkZXB0aCBhbmQgY29udGV4dCBKU09OIHZhbHVlIEBhIHBhcnNlZC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKyAgICBjYWxsYmFjayBmdW5jdGlvbiBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IHRoYXQgZW1pdHRlZAorICAgIHRoZSBjYWxsYmFjayBzaGFsbCBiZSBrZXB0IG9yIG5vdC4KKworICAgIFdlIGRpc3Rpbmd1aXNoIHNpeCBzY2VuYXJpb3MgKGRldGVybWluZWQgYnkgdGhlIGV2ZW50IHR5cGUpIGluIHdoaWNoIHRoZQorICAgIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2YWx1ZXMKKyAgICBvZiB0aGUgcGFyYW1ldGVycyBAYSBkZXB0aCwgQGEgZXZlbnQsIGFuZCBAYSBwYXJzZWQuCisKKyAgICBwYXJhbWV0ZXIgQGEgZXZlbnQgfCBkZXNjcmlwdGlvbiB8IHBhcmFtZXRlciBAYSBkZXB0aCB8IHBhcmFtZXRlciBAYSBwYXJzZWQKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwYXJzZV9ldmVudF90OjpvYmplY3Rfc3RhcnQgfCB0aGUgcGFyc2VyIHJlYWQgYHtgIGFuZCBzdGFydGVkIHRvIHByb2Nlc3MgYSBKU09OIG9iamVjdCB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gb2JqZWN0IHwgYSBKU09OIHZhbHVlIHdpdGggdHlwZSBkaXNjYXJkZWQKKyAgICBwYXJzZV9ldmVudF90OjprZXkgfCB0aGUgcGFyc2VyIHJlYWQgYSBrZXkgb2YgYSB2YWx1ZSBpbiBhbiBvYmplY3QgfCBkZXB0aCBvZiB0aGUgY3VycmVudGx5IHBhcnNlZCBKU09OIG9iamVjdCB8IGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUga2V5CisgICAgcGFyc2VfZXZlbnRfdDo6b2JqZWN0X2VuZCB8IHRoZSBwYXJzZXIgcmVhZCBgfWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIG9iamVjdCB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gb2JqZWN0IHwgdGhlIHBhcnNlZCBKU09OIG9iamVjdAorICAgIHBhcnNlX2V2ZW50X3Q6OmFycmF5X3N0YXJ0IHwgdGhlIHBhcnNlciByZWFkIGBbYCBhbmQgc3RhcnRlZCB0byBwcm9jZXNzIGEgSlNPTiBhcnJheSB8IGRlcHRoIG9mIHRoZSBwYXJlbnQgb2YgdGhlIEpTT04gYXJyYXkgfCBhIEpTT04gdmFsdWUgd2l0aCB0eXBlIGRpc2NhcmRlZAorICAgIHBhcnNlX2V2ZW50X3Q6OmFycmF5X2VuZCB8IHRoZSBwYXJzZXIgcmVhZCBgXWAgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcgYSBKU09OIGFycmF5IHwgZGVwdGggb2YgdGhlIHBhcmVudCBvZiB0aGUgSlNPTiBhcnJheSB8IHRoZSBwYXJzZWQgSlNPTiBhcnJheQorICAgIHBhcnNlX2V2ZW50X3Q6OnZhbHVlIHwgdGhlIHBhcnNlciBmaW5pc2hlZCByZWFkaW5nIGEgSlNPTiB2YWx1ZSB8IGRlcHRoIG9mIHRoZSB2YWx1ZSB8IHRoZSBwYXJzZWQgSlNPTiB2YWx1ZQorCisgICAgQGltYWdlIGh0bWwgY2FsbGJhY2tfZXZlbnRzLnBuZyAiRXhhbXBsZSB3aGVuIGNlcnRhaW4gcGFyc2UgZXZlbnRzIGFyZSB0cmlnZ2VyZWQiCisKKyAgICBEaXNjYXJkaW5nIGEgdmFsdWUgKGkuZS4sIHJldHVybmluZyBgZmFsc2VgKSBoYXMgZGlmZmVyZW50IGVmZmVjdHMKKyAgICBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggZnVuY3Rpb24gd2FzIGNhbGxlZDoKKworICAgIC0gRGlzY2FyZGVkIHZhbHVlcyBpbiBzdHJ1Y3R1cmVkIHR5cGVzIGFyZSBza2lwcGVkLiBUaGF0IGlzLCB0aGUgcGFyc2VyCisgICAgICB3aWxsIGJlaGF2ZSBhcyBpZiB0aGUgZGlzY2FyZGVkIHZhbHVlIHdhcyBuZXZlciByZWFkLgorICAgIC0gSW4gY2FzZSBhIHZhbHVlIG91dHNpZGUgYSBzdHJ1Y3R1cmVkIHR5cGUgaXMgc2tpcHBlZCwgaXQgaXMgcmVwbGFjZWQKKyAgICAgIHdpdGggYG51bGxgLiBUaGlzIGNhc2UgaGFwcGVucyBpZiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgaXMgc2tpcHBlZC4KKworICAgIEBwYXJhbVtpbl0gZGVwdGggIHRoZSBkZXB0aCBvZiB0aGUgcmVjdXJzaW9uIGR1cmluZyBwYXJzaW5nCisKKyAgICBAcGFyYW1baW5dIGV2ZW50ICBhbiBldmVudCBvZiB0eXBlIHBhcnNlX2V2ZW50X3QgaW5kaWNhdGluZyB0aGUgY29udGV4dCBpbgorICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQKKworICAgIEBwYXJhbVtpbixvdXRdIHBhcnNlZCAgdGhlIGN1cnJlbnQgaW50ZXJtZWRpYXRlIHBhcnNlIHJlc3VsdDsgbm90ZSB0aGF0CisgICAgd3JpdGluZyB0byB0aGlzIHZhbHVlIGhhcyBubyBlZmZlY3QgZm9yIHBhcnNlX2V2ZW50X3Q6OmtleSBldmVudHMKKworICAgIEByZXR1cm4gV2hldGhlciB0aGUgSlNPTiB2YWx1ZSB3aGljaCBjYWxsZWQgdGhlIGZ1bmN0aW9uIGR1cmluZyBwYXJzaW5nCisgICAgc2hvdWxkIGJlIGtlcHQgKGB0cnVlYCkgb3Igbm90IChgZmFsc2VgKS4gSW4gdGhlIGxhdHRlciBjYXNlLCBpdCBpcyBlaXRoZXIKKyAgICBza2lwcGVkIGNvbXBsZXRlbHkgb3IgcmVwbGFjZWQgYnkgYW4gZW1wdHkgZGlzY2FyZGVkIG9iamVjdC4KKworICAgIEBzYSBAcmVmIHBhcnNlIGZvciBleGFtcGxlcworCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHVzaW5nIHBhcnNlcl9jYWxsYmFja190ID0gdHlwZW5hbWUgcGFyc2VyOjpwYXJzZXJfY2FsbGJhY2tfdDsKKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gY29uc3RydWN0b3JzIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycworICAgIC8vLyBDb25zdHJ1Y3RvcnMgb2YgY2xhc3MgQHJlZiBiYXNpY19qc29uLCBjb3B5L21vdmUgY29uc3RydWN0b3IsIGNvcHkKKyAgICAvLy8gYXNzaWdubWVudCwgc3RhdGljIGZ1bmN0aW9ucyBjcmVhdGluZyBvYmplY3RzLCBhbmQgdGhlIGRlc3RydWN0b3IuCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGFuIGVtcHR5IHZhbHVlIHdpdGggYSBnaXZlbiB0eXBlCisKKyAgICBDcmVhdGUgYW4gZW1wdHkgSlNPTiB2YWx1ZSB3aXRoIGEgZ2l2ZW4gdHlwZS4gVGhlIHZhbHVlIHdpbGwgYmUgZGVmYXVsdAorICAgIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUgd2hpY2ggZGVwZW5kcyBvbiB0aGUgdHlwZToKKworICAgIFZhbHVlIHR5cGUgIHwgaW5pdGlhbCB2YWx1ZQorICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorICAgIG51bGwgICAgICAgIHwgYG51bGxgCisgICAgYm9vbGVhbiAgICAgfCBgZmFsc2VgCisgICAgc3RyaW5nICAgICAgfCBgIiJgCisgICAgbnVtYmVyICAgICAgfCBgMGAKKyAgICBvYmplY3QgICAgICB8IGB7fWAKKyAgICBhcnJheSAgICAgICB8IGBbXWAKKworICAgIEBwYXJhbVtpbl0gdiAgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGNyZWF0ZQorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgdG8gYW55IEpTT04gdmFsdWUuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIHRoZSBjb25zdHJ1Y3RvciBmb3IgZGlmZmVyZW50IEByZWYKKyAgICB2YWx1ZV90IHZhbHVlcyxiYXNpY19qc29uX192YWx1ZV90fQorCisgICAgQHNhIEByZWYgY2xlYXIoKSAtLSByZXN0b3JlcyB0aGUgcG9zdGNvbmRpdGlvbiBvZiB0aGlzIGNvbnN0cnVjdG9yCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgYmFzaWNfanNvbihjb25zdCB2YWx1ZV90IHYpCisgICAgICAgIDogbV90eXBlKHYpLCBtX3ZhbHVlKHYpCisgICAgeworICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIG51bGwgb2JqZWN0CisKKyAgICBDcmVhdGUgYSBgbnVsbGAgSlNPTiB2YWx1ZS4gSXQgZWl0aGVyIHRha2VzIGEgbnVsbCBwb2ludGVyIGFzIHBhcmFtZXRlcgorICAgIChleHBsaWNpdGx5IGNyZWF0aW5nIGBudWxsYCkgb3Igbm8gcGFyYW1ldGVyIChpbXBsaWNpdGx5IGNyZWF0aW5nIGBudWxsYCkuCisgICAgVGhlIHBhc3NlZCBudWxsIHBvaW50ZXIgaXRzZWxmIGlzIG5vdCByZWFkIC0tIGl0IGlzIG9ubHkgdXNlZCB0byBjaG9vc2UKKyAgICB0aGUgcmlnaHQgY29uc3RydWN0b3IuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGNvbnN0cnVjdG9yIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGFuZCB3aXRob3V0IGEKKyAgICBudWxsIHBvaW50ZXIgcGFyYW1ldGVyLixiYXNpY19qc29uX19udWxscHRyX3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgYmFzaWNfanNvbihzdGQ6Om51bGxwdHJfdCA9IG51bGxwdHIpIG5vZXhjZXB0CisgICAgICAgIDogYmFzaWNfanNvbih2YWx1ZV90OjpudWxsKQorICAgIHsKKyAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjcmVhdGUgYSBKU09OIHZhbHVlCisKKyAgICBUaGlzIGlzIGEgImNhdGNoIGFsbCIgY29uc3RydWN0b3IgZm9yIGFsbCBjb21wYXRpYmxlIEpTT04gdHlwZXM7IHRoYXQgaXMsCisgICAgdHlwZXMgZm9yIHdoaWNoIGEgYHRvX2pzb24oKWAgbWV0aG9kIGV4aXN0cy4gVGhlIGNvbnN0cnVjdG9yIGZvcndhcmRzIHRoZQorICAgIHBhcmFtZXRlciBAYSB2YWwgdG8gdGhhdCBtZXRob2QgKHRvIGBqc29uX3NlcmlhbGl6ZXI8VT46OnRvX2pzb25gIG1ldGhvZAorICAgIHdpdGggYFUgPSB1bmN2cmVmX3Q8Q29tcGF0aWJsZVR5cGU+YCwgdG8gYmUgZXhhY3QpLgorCisgICAgVGVtcGxhdGUgdHlwZSBAYSBDb21wYXRpYmxlVHlwZSBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCB0aGUKKyAgICBmb2xsb3dpbmcgdHlwZXM6CisgICAgLSAqKmFycmF5cyoqOiBAcmVmIGFycmF5X3QgYW5kIGFsbCBraW5kcyBvZiBjb21wYXRpYmxlIGNvbnRhaW5lcnMgc3VjaCBhcworICAgICAgYHN0ZDo6dmVjdG9yYCwgYHN0ZDo6ZGVxdWVgLCBgc3RkOjpsaXN0YCwgYHN0ZDo6Zm9yd2FyZF9saXN0YCwKKyAgICAgIGBzdGQ6OmFycmF5YCwgYHN0ZDo6dmFsYXJyYXlgLCBgc3RkOjpzZXRgLCBgc3RkOjp1bm9yZGVyZWRfc2V0YCwKKyAgICAgIGBzdGQ6Om11bHRpc2V0YCwgYW5kIGBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldGAgd2l0aCBhIGB2YWx1ZV90eXBlYCBmcm9tCisgICAgICB3aGljaCBhIEByZWYgYmFzaWNfanNvbiB2YWx1ZSBjYW4gYmUgY29uc3RydWN0ZWQuCisgICAgLSAqKm9iamVjdHMqKjogQHJlZiBvYmplY3RfdCBhbmQgYWxsIGtpbmRzIG9mIGNvbXBhdGlibGUgYXNzb2NpYXRpdmUKKyAgICAgIGNvbnRhaW5lcnMgc3VjaCBhcyBgc3RkOjptYXBgLCBgc3RkOjp1bm9yZGVyZWRfbWFwYCwgYHN0ZDo6bXVsdGltYXBgLAorICAgICAgYW5kIGBzdGQ6OnVub3JkZXJlZF9tdWx0aW1hcGAgd2l0aCBhIGBrZXlfdHlwZWAgY29tcGF0aWJsZSB0bworICAgICAgQHJlZiBzdHJpbmdfdCBhbmQgYSBgdmFsdWVfdHlwZWAgZnJvbSB3aGljaCBhIEByZWYgYmFzaWNfanNvbiB2YWx1ZSBjYW4KKyAgICAgIGJlIGNvbnN0cnVjdGVkLgorICAgIC0gKipzdHJpbmdzKio6IEByZWYgc3RyaW5nX3QsIHN0cmluZyBsaXRlcmFscywgYW5kIGFsbCBjb21wYXRpYmxlIHN0cmluZworICAgICAgY29udGFpbmVycyBjYW4gYmUgdXNlZC4KKyAgICAtICoqbnVtYmVycyoqOiBAcmVmIG51bWJlcl9pbnRlZ2VyX3QsIEByZWYgbnVtYmVyX3Vuc2lnbmVkX3QsCisgICAgICBAcmVmIG51bWJlcl9mbG9hdF90LCBhbmQgYWxsIGNvbnZlcnRpYmxlIG51bWJlciB0eXBlcyBzdWNoIGFzIGBpbnRgLAorICAgICAgYHNpemVfdGAsIGBpbnQ2NF90YCwgYGZsb2F0YCBvciBgZG91YmxlYCBjYW4gYmUgdXNlZC4KKyAgICAtICoqYm9vbGVhbioqOiBAcmVmIGJvb2xlYW5fdCAvIGBib29sYCBjYW4gYmUgdXNlZC4KKworICAgIFNlZSB0aGUgZXhhbXBsZXMgYmVsb3cuCisKKyAgICBAdHBhcmFtIENvbXBhdGlibGVUeXBlIGEgdHlwZSBzdWNoIHRoYXQ6CisgICAgLSBAYSBDb21wYXRpYmxlVHlwZSBpcyBub3QgZGVyaXZlZCBmcm9tIGBzdGQ6OmlzdHJlYW1gLAorICAgIC0gQGEgQ29tcGF0aWJsZVR5cGUgaXMgbm90IEByZWYgYmFzaWNfanNvbiAodG8gYXZvaWQgaGlqYWNraW5nIGNvcHkvbW92ZQorICAgICAgICAgY29uc3RydWN0b3JzKSwKKyAgICAtIEBhIENvbXBhdGlibGVUeXBlIGlzIG5vdCBhIEByZWYgYmFzaWNfanNvbiBuZXN0ZWQgdHlwZSAoZS5nLiwKKyAgICAgICAgIEByZWYganNvbl9wb2ludGVyLCBAcmVmIGl0ZXJhdG9yLCBldGMgLi4uKQorICAgIC0gQHJlZiBAcmVmIGpzb25fc2VyaWFsaXplcjxVPiBoYXMgYQorICAgICAgICAgYHRvX2pzb24oYmFzaWNfanNvbl90JiwgQ29tcGF0aWJsZVR5cGUmJilgIG1ldGhvZAorCisgICAgQHRwYXJhbSBVID0gYHVuY3ZyZWZfdDxDb21wYXRpYmxlVHlwZT5gCisKKyAgICBAcGFyYW1baW5dIHZhbCB0aGUgdmFsdWUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSByZXNwZWN0aXZlIGNvbnN0cnVjdG9yCisKKyAgICBAY29tcGxleGl0eSBVc3VhbGx5IGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgcGFzc2VkIEBhIHZhbCwgYWxzbworICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhbGxlZCBgdG9fanNvbigpYAorICAgICAgICAgICAgICAgIG1ldGhvZC4KKworICAgIEBleGNlcHRpb25zYWZldHkgRGVwZW5kcyBvbiB0aGUgY2FsbGVkIGNvbnN0cnVjdG9yLiBGb3IgdHlwZXMgZGlyZWN0bHkKKyAgICBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkgKGkuZS4sIGFsbCB0eXBlcyBmb3Igd2hpY2ggbm8gYHRvX2pzb24oKWAgZnVuY3Rpb24KKyAgICB3YXMgcHJvdmlkZWQpLCBzdHJvbmcgZ3VhcmFudGVlIGhvbGRzOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUKKyAgICBubyBjaGFuZ2VzIHRvIGFueSBKU09OIHZhbHVlLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyB0aGUgY29uc3RydWN0b3Igd2l0aCBzZXZlcmFsCisgICAgY29tcGF0aWJsZSB0eXBlcy4sYmFzaWNfanNvbl9fQ29tcGF0aWJsZVR5cGV9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjEuMAorICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhdGlibGVUeXBlLAorICAgICAgICAgICAgICB0eXBlbmFtZSBVID0gZGV0YWlsOjp1bmN2cmVmX3Q8Q29tcGF0aWJsZVR5cGU+LAorICAgICAgICAgICAgICBkZXRhaWw6OmVuYWJsZV9pZl90PAorICAgICAgICAgICAgICAgICAgZGV0YWlsOjppc19jb21wYXRpYmxlX3R5cGU8YmFzaWNfanNvbl90LCBVPjo6dmFsdWUsIGludD4gPSAwPgorICAgIGJhc2ljX2pzb24oQ29tcGF0aWJsZVR5cGUgJiYgdmFsKSBub2V4Y2VwdChub2V4Y2VwdCgKKyAgICAgICAgICAgICAgICBKU09OU2VyaWFsaXplcjxVPjo6dG9fanNvbihzdGQ6OmRlY2x2YWw8YmFzaWNfanNvbl90Jj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8Q29tcGF0aWJsZVR5cGU+KHZhbCkpKSkKKyAgICB7CisgICAgICAgIEpTT05TZXJpYWxpemVyPFU+Ojp0b19qc29uKCp0aGlzLCBzdGQ6OmZvcndhcmQ8Q29tcGF0aWJsZVR5cGU+KHZhbCkpOworICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIGNvbnRhaW5lciAoYXJyYXkgb3Igb2JqZWN0KSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKKworICAgIENyZWF0ZXMgYSBKU09OIHZhbHVlIG9mIHR5cGUgYXJyYXkgb3Igb2JqZWN0IGZyb20gdGhlIHBhc3NlZCBpbml0aWFsaXplcgorICAgIGxpc3QgQGEgaW5pdC4gSW4gY2FzZSBAYSB0eXBlX2RlZHVjdGlvbiBpcyBgdHJ1ZWAgKGRlZmF1bHQpLCB0aGUgdHlwZSBvZgorICAgIHRoZSBKU09OIHZhbHVlIHRvIGJlIGNyZWF0ZWQgaXMgZGVkdWN0ZWQgZnJvbSB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBpbml0CisgICAgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisKKyAgICAxLiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgYW4gZW1wdHkgSlNPTiBvYmplY3QgdmFsdWUgYHt9YCBpcyBjcmVhdGVkLgorICAgIDIuIElmIHRoZSBsaXN0IGNvbnNpc3RzIG9mIHBhaXJzIHdob3NlIGZpcnN0IGVsZW1lbnQgaXMgYSBzdHJpbmcsIGEgSlNPTgorICAgICAgIG9iamVjdCB2YWx1ZSBpcyBjcmVhdGVkIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50cyBvZiB0aGUgcGFpcnMgYXJlCisgICAgICAgdHJlYXRlZCBhcyBrZXlzIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnRzIGFyZSBhcyB2YWx1ZXMuCisgICAgMy4gSW4gYWxsIG90aGVyIGNhc2VzLCBhbiBhcnJheSBpcyBjcmVhdGVkLgorCisgICAgVGhlIHJ1bGVzIGFpbSB0byBjcmVhdGUgdGhlIGJlc3QgZml0IGJldHdlZW4gYSBDKysgaW5pdGlhbGl6ZXIgbGlzdCBhbmQKKyAgICBKU09OIHZhbHVlcy4gVGhlIHJhdGlvbmFsZSBpcyBhcyBmb2xsb3dzOgorCisgICAgMS4gVGhlIGVtcHR5IGluaXRpYWxpemVyIGxpc3QgaXMgd3JpdHRlbiBhcyBge31gIHdoaWNoIGlzIGV4YWN0bHkgYW4gZW1wdHkKKyAgICAgICBKU09OIG9iamVjdC4KKyAgICAyLiBDKysgaGFzIG5vIHdheSBvZiBkZXNjcmliaW5nIG1hcHBlZCB0eXBlcyBvdGhlciB0aGFuIHRvIGxpc3QgYSBsaXN0IG9mCisgICAgICAgcGFpcnMuIEFzIEpTT04gcmVxdWlyZXMgdGhhdCBrZXlzIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsIHJ1bGUgMiBpcyB0aGUKKyAgICAgICB3ZWFrZXN0IGNvbnN0cmFpbnQgb25lIGNhbiBwb3NlIG9uIGluaXRpYWxpemVyIGxpc3RzIHRvIGludGVycHJldCB0aGVtCisgICAgICAgYXMgYW4gb2JqZWN0LgorICAgIDMuIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGluaXRpYWxpemVyIGxpc3QgY291bGQgbm90IGJlIGludGVycHJldGVkIGFzCisgICAgICAgSlNPTiBvYmplY3QgdHlwZSwgc28gaW50ZXJwcmV0aW5nIGl0IGFzIEpTT04gYXJyYXkgdHlwZSBpcyBzYWZlLgorCisgICAgV2l0aCB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlLCB0aGUgZm9sbG93aW5nIEpTT04gdmFsdWVzIGNhbm5vdCBiZQorICAgIGV4cHJlc3NlZCBieSBhbiBpbml0aWFsaXplciBsaXN0OgorCisgICAgLSB0aGUgZW1wdHkgYXJyYXkgKGBbXWApOiB1c2UgQHJlZiBhcnJheShpbml0aWFsaXplcl9saXN0X3QpCisgICAgICB3aXRoIGFuIGVtcHR5IGluaXRpYWxpemVyIGxpc3QgaW4gdGhpcyBjYXNlCisgICAgLSBhcnJheXMgd2hvc2UgZWxlbWVudHMgc2F0aXNmeSBydWxlIDI6IHVzZSBAcmVmCisgICAgICBhcnJheShpbml0aWFsaXplcl9saXN0X3QpIHdpdGggdGhlIHNhbWUgaW5pdGlhbGl6ZXIgbGlzdAorICAgICAgaW4gdGhpcyBjYXNlCisKKyAgICBAbm90ZSBXaGVuIHVzZWQgd2l0aG91dCBwYXJlbnRoZXNlcyBhcm91bmQgYW4gZW1wdHkgaW5pdGlhbGl6ZXIgbGlzdCwgQHJlZgorICAgIGJhc2ljX2pzb24oKSBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLCB5aWVsZGluZyB0aGUgSlNPTiBudWxsCisgICAgdmFsdWUuCisKKyAgICBAcGFyYW1baW5dIGluaXQgIGluaXRpYWxpemVyIGxpc3Qgd2l0aCBKU09OIHZhbHVlcworCisgICAgQHBhcmFtW2luXSB0eXBlX2RlZHVjdGlvbiBpbnRlcm5hbCBwYXJhbWV0ZXI7IHdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIHR5cGUKKyAgICBvZiB0aGUgSlNPTiB2YWx1ZSBpcyBkZWR1Y3RlZCBmcm9tIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIGluaXQ7IHdoZW4gc2V0CisgICAgdG8gYGZhbHNlYCwgdGhlIHR5cGUgcHJvdmlkZWQgdmlhIEBhIG1hbnVhbF90eXBlIGlzIGZvcmNlZC4gVGhpcyBtb2RlIGlzCisgICAgdXNlZCBieSB0aGUgZnVuY3Rpb25zIEByZWYgYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdF90KSBhbmQKKyAgICBAcmVmIG9iamVjdChpbml0aWFsaXplcl9saXN0X3QpLgorCisgICAgQHBhcmFtW2luXSBtYW51YWxfdHlwZSBpbnRlcm5hbCBwYXJhbWV0ZXI7IHdoZW4gQGEgdHlwZV9kZWR1Y3Rpb24gaXMgc2V0CisgICAgdG8gYGZhbHNlYCwgdGhlIGNyZWF0ZWQgSlNPTiB2YWx1ZSB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgdHlwZSAob25seSBAcmVmCisgICAgdmFsdWVfdDo6YXJyYXkgYW5kIEByZWYgdmFsdWVfdDo6b2JqZWN0IGFyZSB2YWxpZCk7IHdoZW4gQGEgdHlwZV9kZWR1Y3Rpb24KKyAgICBpcyBzZXQgdG8gYHRydWVgLCB0aGlzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0CisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDEgaWYgQGEgdHlwZV9kZWR1Y3Rpb24gaXMgYGZhbHNlYCwgQGEgbWFudWFsX3R5cGUgaXMKKyAgICBgdmFsdWVfdDo6b2JqZWN0YCwgYnV0IEBhIGluaXQgY29udGFpbnMgYW4gZWxlbWVudCB3aGljaCBpcyBub3QgYSBwYWlyCisgICAgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBhIHN0cmluZy4gSW4gdGhpcyBjYXNlLCB0aGUgY29uc3RydWN0b3IgY291bGQgbm90CisgICAgY3JlYXRlIGFuIG9iamVjdC4gSWYgQGEgdHlwZV9kZWR1Y3Rpb24gd291bGQgaGF2ZSBiZSBgdHJ1ZWAsIGFuIGFycmF5CisgICAgd291bGQgaGF2ZSBiZWVuIGNyZWF0ZWQuIFNlZSBAcmVmIG9iamVjdChpbml0aWFsaXplcl9saXN0X3QpCisgICAgZm9yIGFuIGV4YW1wbGUuCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIGluaXRpYWxpemVyIGxpc3QgQGEgaW5pdC4KKworICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCisgICAgY2hhbmdlcyB0byBhbnkgSlNPTiB2YWx1ZS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgSlNPTiB2YWx1ZXMgYXJlIGNyZWF0ZWQgZnJvbQorICAgIGluaXRpYWxpemVyIGxpc3RzLixiYXNpY19qc29uX19saXN0X2luaXRfdH0KKworICAgIEBzYSBAcmVmIGFycmF5KGluaXRpYWxpemVyX2xpc3RfdCkgLS0gY3JlYXRlIGEgSlNPTiBhcnJheQorICAgIHZhbHVlIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAorICAgIEBzYSBAcmVmIG9iamVjdChpbml0aWFsaXplcl9saXN0X3QpIC0tIGNyZWF0ZSBhIEpTT04gb2JqZWN0CisgICAgdmFsdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgYmFzaWNfanNvbihpbml0aWFsaXplcl9saXN0X3QgaW5pdCwKKyAgICAgICAgICAgICAgIGJvb2wgdHlwZV9kZWR1Y3Rpb24gPSB0cnVlLAorICAgICAgICAgICAgICAgdmFsdWVfdCBtYW51YWxfdHlwZSA9IHZhbHVlX3Q6OmFycmF5KQorICAgIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgZWFjaCBlbGVtZW50IGlzIGFuIGFycmF5IHdpdGggdHdvIGVsZW1lbnRzIHdob3NlIGZpcnN0CisgICAgICAgIC8vIGVsZW1lbnQgaXMgYSBzdHJpbmcKKyAgICAgICAgYm9vbCBpc19hbl9vYmplY3QgPSBzdGQ6OmFsbF9vZihpbml0LmJlZ2luKCksIGluaXQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgZGV0YWlsOjpqc29uX3JlZjxiYXNpY19qc29uPiYgZWxlbWVudF9yZWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoZWxlbWVudF9yZWYtPmlzX2FycmF5KCkgYW5kIGVsZW1lbnRfcmVmLT5zaXplKCkgPT0gMiBhbmQgKCplbGVtZW50X3JlZilbMF0uaXNfc3RyaW5nKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBhZGp1c3QgdHlwZSBpZiB0eXBlIGRlZHVjdGlvbiBpcyBub3Qgd2FudGVkCisgICAgICAgIGlmIChub3QgdHlwZV9kZWR1Y3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIGFycmF5IGlzIHdhbnRlZCwgZG8gbm90IGNyZWF0ZSBhbiBvYmplY3QgdGhvdWdoIHBvc3NpYmxlCisgICAgICAgICAgICBpZiAobWFudWFsX3R5cGUgPT0gdmFsdWVfdDo6YXJyYXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNfYW5fb2JqZWN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG9iamVjdCBpcyB3YW50ZWQgYnV0IGltcG9zc2libGUsIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobWFudWFsX3R5cGUgPT0gdmFsdWVfdDo6b2JqZWN0IGFuZCBub3QgaXNfYW5fb2JqZWN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDEsICJjYW5ub3QgY3JlYXRlIG9iamVjdCBmcm9tIGluaXRpYWxpemVyIGxpc3QiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfYW5fb2JqZWN0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBpcyBhIGxpc3Qgb2YgcGFpcnMgLT4gY3JlYXRlIG9iamVjdAorICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgbV92YWx1ZSA9IHZhbHVlX3Q6Om9iamVjdDsKKworICAgICAgICAgICAgc3RkOjpmb3JfZWFjaChpbml0LmJlZ2luKCksIGluaXQuZW5kKCksIFt0aGlzXShjb25zdCBkZXRhaWw6Ompzb25fcmVmPGJhc2ljX2pzb24+JiBlbGVtZW50X3JlZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBlbGVtZW50X3JlZi5tb3ZlZF9vcl9jb3BpZWQoKTsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlLm9iamVjdC0+ZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKCooKCplbGVtZW50Lm1fdmFsdWUuYXJyYXkpWzBdLm1fdmFsdWUuc3RyaW5nKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSgoKmVsZW1lbnQubV92YWx1ZS5hcnJheSlbMV0pKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhlIGluaXRpYWxpemVyIGxpc3QgZGVzY3JpYmVzIGFuIGFycmF5IC0+IGNyZWF0ZSBhcnJheQorICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgICAgICBtX3ZhbHVlLmFycmF5ID0gY3JlYXRlPGFycmF5X3Q+KGluaXQuYmVnaW4oKSwgaW5pdC5lbmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGV4cGxpY2l0bHkgY3JlYXRlIGFuIGFycmF5IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAorCisgICAgQ3JlYXRlcyBhIEpTT04gYXJyYXkgdmFsdWUgZnJvbSBhIGdpdmVuIGluaXRpYWxpemVyIGxpc3QuIFRoYXQgaXMsIGdpdmVuIGEKKyAgICBsaXN0IG9mIHZhbHVlcyBgYSwgYiwgY2AsIGNyZWF0ZXMgdGhlIEpTT04gdmFsdWUgYFthLCBiLCBjXWAuIElmIHRoZQorICAgIGluaXRpYWxpemVyIGxpc3QgaXMgZW1wdHksIHRoZSBlbXB0eSBhcnJheSBgW11gIGlzIGNyZWF0ZWQuCisKKyAgICBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIHRvIGV4cHJlc3MgdHdvIGVkZ2UgY2FzZXMgdGhhdCBjYW5ub3QKKyAgICBiZSByZWFsaXplZCB3aXRoIHRoZSBpbml0aWFsaXplciBsaXN0IGNvbnN0cnVjdG9yIChAcmVmCisgICAgYmFzaWNfanNvbihpbml0aWFsaXplcl9saXN0X3QsIGJvb2wsIHZhbHVlX3QpKS4gVGhlc2UgY2FzZXMKKyAgICBhcmU6CisgICAgMS4gY3JlYXRpbmcgYW4gYXJyYXkgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCBwYWlycyB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEKKyAgICBzdHJpbmcgLS0gaW4gdGhpcyBjYXNlLCB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBjb25zdHJ1Y3RvciB3b3VsZCBjcmVhdGUgYW4KKyAgICBvYmplY3QsIHRha2luZyB0aGUgZmlyc3QgZWxlbWVudHMgYXMga2V5cworICAgIDIuIGNyZWF0aW5nIGFuIGVtcHR5IGFycmF5IC0tIHBhc3NpbmcgdGhlIGVtcHR5IGluaXRpYWxpemVyIGxpc3QgdG8gdGhlCisgICAgaW5pdGlhbGl6ZXIgbGlzdCBjb25zdHJ1Y3RvciB5aWVsZHMgYW4gZW1wdHkgb2JqZWN0CisKKyAgICBAcGFyYW1baW5dIGluaXQgIGluaXRpYWxpemVyIGxpc3Qgd2l0aCBKU09OIHZhbHVlcyB0byBjcmVhdGUgYW4gYXJyYXkgZnJvbQorICAgIChvcHRpb25hbCkKKworICAgIEByZXR1cm4gSlNPTiBhcnJheSB2YWx1ZQorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIEBhIGluaXQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgdG8gYW55IEpTT04gdmFsdWUuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIHRoZSBgYXJyYXlgCisgICAgZnVuY3Rpb24uLGFycmF5fQorCisgICAgQHNhIEByZWYgYmFzaWNfanNvbihpbml0aWFsaXplcl9saXN0X3QsIGJvb2wsIHZhbHVlX3QpIC0tCisgICAgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKKyAgICBAc2EgQHJlZiBvYmplY3QoaW5pdGlhbGl6ZXJfbGlzdF90KSAtLSBjcmVhdGUgYSBKU09OIG9iamVjdAorICAgIHZhbHVlIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHN0YXRpYyBiYXNpY19qc29uIGFycmF5KGluaXRpYWxpemVyX2xpc3RfdCBpbml0ID0ge30pCisgICAgeworICAgICAgICByZXR1cm4gYmFzaWNfanNvbihpbml0LCBmYWxzZSwgdmFsdWVfdDo6YXJyYXkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBleHBsaWNpdGx5IGNyZWF0ZSBhbiBvYmplY3QgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0CisKKyAgICBDcmVhdGVzIGEgSlNPTiBvYmplY3QgdmFsdWUgZnJvbSBhIGdpdmVuIGluaXRpYWxpemVyIGxpc3QuIFRoZSBpbml0aWFsaXplcgorICAgIGxpc3RzIGVsZW1lbnRzIG11c3QgYmUgcGFpcnMsIGFuZCB0aGVpciBmaXJzdCBlbGVtZW50cyBtdXN0IGJlIHN0cmluZ3MuIElmCisgICAgdGhlIGluaXRpYWxpemVyIGxpc3QgaXMgZW1wdHksIHRoZSBlbXB0eSBvYmplY3QgYHt9YCBpcyBjcmVhdGVkLgorCisgICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGFkZGVkIGZvciBzeW1tZXRyeSByZWFzb25zLiBJbiBjb250cmFzdCB0byB0aGUKKyAgICByZWxhdGVkIGZ1bmN0aW9uIEByZWYgYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdF90KSwgdGhlcmUgYXJlCisgICAgbm8gY2FzZXMgd2hpY2ggY2FuIG9ubHkgYmUgZXhwcmVzc2VkIGJ5IHRoaXMgZnVuY3Rpb24uIFRoYXQgaXMsIGFueQorICAgIGluaXRpYWxpemVyIGxpc3QgQGEgaW5pdCBjYW4gYWxzbyBiZSBwYXNzZWQgdG8gdGhlIGluaXRpYWxpemVyIGxpc3QKKyAgICBjb25zdHJ1Y3RvciBAcmVmIGJhc2ljX2pzb24oaW5pdGlhbGl6ZXJfbGlzdF90LCBib29sLCB2YWx1ZV90KS4KKworICAgIEBwYXJhbVtpbl0gaW5pdCAgaW5pdGlhbGl6ZXIgbGlzdCB0byBjcmVhdGUgYW4gb2JqZWN0IGZyb20gKG9wdGlvbmFsKQorCisgICAgQHJldHVybiBKU09OIG9iamVjdCB2YWx1ZQorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzAxIGlmIEBhIGluaXQgaXMgbm90IGEgbGlzdCBvZiBwYWlycyB3aG9zZSBmaXJzdAorICAgIGVsZW1lbnRzIGFyZSBzdHJpbmdzLiBJbiB0aGlzIGNhc2UsIG5vIG9iamVjdCBjYW4gYmUgY3JlYXRlZC4gV2hlbiBzdWNoIGEKKyAgICB2YWx1ZSBpcyBwYXNzZWQgdG8gQHJlZiBiYXNpY19qc29uKGluaXRpYWxpemVyX2xpc3RfdCwgYm9vbCwgdmFsdWVfdCksCisgICAgYW4gYXJyYXkgd291bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgcGFzc2VkIGluaXRpYWxpemVyIGxpc3QgQGEgaW5pdC4KKyAgICBTZWUgZXhhbXBsZSBiZWxvdy4KKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiBAYSBpbml0LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIHRvIGFueSBKU09OIHZhbHVlLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciB0aGUgYG9iamVjdGAKKyAgICBmdW5jdGlvbi4sb2JqZWN0fQorCisgICAgQHNhIEByZWYgYmFzaWNfanNvbihpbml0aWFsaXplcl9saXN0X3QsIGJvb2wsIHZhbHVlX3QpIC0tCisgICAgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKKyAgICBAc2EgQHJlZiBhcnJheShpbml0aWFsaXplcl9saXN0X3QpIC0tIGNyZWF0ZSBhIEpTT04gYXJyYXkKKyAgICB2YWx1ZSBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBzdGF0aWMgYmFzaWNfanNvbiBvYmplY3QoaW5pdGlhbGl6ZXJfbGlzdF90IGluaXQgPSB7fSkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNpY19qc29uKGluaXQsIGZhbHNlLCB2YWx1ZV90OjpvYmplY3QpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCBjb3VudCBjb3BpZXMgb2YgZ2l2ZW4gdmFsdWUKKworICAgIENvbnN0cnVjdHMgYSBKU09OIGFycmF5IHZhbHVlIGJ5IGNyZWF0aW5nIEBhIGNudCBjb3BpZXMgb2YgYSBwYXNzZWQgdmFsdWUuCisgICAgSW4gY2FzZSBAYSBjbnQgaXMgYDBgLCBhbiBlbXB0eSBhcnJheSBpcyBjcmVhdGVkLgorCisgICAgQHBhcmFtW2luXSBjbnQgIHRoZSBudW1iZXIgb2YgSlNPTiBjb3BpZXMgb2YgQGEgdmFsIHRvIGNyZWF0ZQorICAgIEBwYXJhbVtpbl0gdmFsICB0aGUgSlNPTiB2YWx1ZSB0byBjb3B5CisKKyAgICBAcG9zdCBgc3RkOjpkaXN0YW5jZShiZWdpbigpLGVuZCgpKSA9PSBjbnRgIGhvbGRzLgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIEBhIGNudC4KKworICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCisgICAgY2hhbmdlcyB0byBhbnkgSlNPTiB2YWx1ZS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgZXhhbXBsZXMgZm9yIHRoZSBAcmVmCisgICAgYmFzaWNfanNvbihzaXplX3R5cGVcLCBjb25zdCBiYXNpY19qc29uJikKKyAgICBjb25zdHJ1Y3Rvci4sYmFzaWNfanNvbl9fc2l6ZV90eXBlX2Jhc2ljX2pzb259CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgYmFzaWNfanNvbihzaXplX3R5cGUgY250LCBjb25zdCBiYXNpY19qc29uJiB2YWwpCisgICAgICAgIDogbV90eXBlKHZhbHVlX3Q6OmFycmF5KQorICAgIHsKKyAgICAgICAgbV92YWx1ZS5hcnJheSA9IGNyZWF0ZTxhcnJheV90PihjbnQsIHZhbCk7CisgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29uc3RydWN0IGEgSlNPTiBjb250YWluZXIgZ2l2ZW4gYW4gaXRlcmF0b3IgcmFuZ2UKKworICAgIENvbnN0cnVjdHMgdGhlIEpTT04gdmFsdWUgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIHJhbmdlIGBbZmlyc3QsIGxhc3QpYC4KKyAgICBUaGUgc2VtYW50aWNzIGRlcGVuZHMgb24gdGhlIGRpZmZlcmVudCB0eXBlcyBhIEpTT04gdmFsdWUgY2FuIGhhdmU6CisgICAgLSBJbiBjYXNlIG9mIGEgbnVsbCB0eXBlLCBpbnZhbGlkX2l0ZXJhdG9yLjIwNiBpcyB0aHJvd24uCisgICAgLSBJbiBjYXNlIG9mIG90aGVyIHByaW1pdGl2ZSB0eXBlcyAobnVtYmVyLCBib29sZWFuLCBvciBzdHJpbmcpLCBAYSBmaXJzdAorICAgICAgbXVzdCBiZSBgYmVnaW4oKWAgYW5kIEBhIGxhc3QgbXVzdCBiZSBgZW5kKClgLiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSBpcworICAgICAgY29waWVkLiBPdGhlcndpc2UsIGludmFsaWRfaXRlcmF0b3IuMjA0IGlzIHRocm93bi4KKyAgICAtIEluIGNhc2Ugb2Ygc3RydWN0dXJlZCB0eXBlcyAoYXJyYXksIG9iamVjdCksIHRoZSBjb25zdHJ1Y3RvciBiZWhhdmVzIGFzCisgICAgICBzaW1pbGFyIHZlcnNpb25zIGZvciBgc3RkOjp2ZWN0b3JgIG9yIGBzdGQ6Om1hcGA7IHRoYXQgaXMsIGEgSlNPTiBhcnJheQorICAgICAgb3Igb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisKKyAgICBAdHBhcmFtIElucHV0SVQgYW4gaW5wdXQgaXRlcmF0b3IgdHlwZSAoQHJlZiBpdGVyYXRvciBvciBAcmVmCisgICAgY29uc3RfaXRlcmF0b3IpCisKKyAgICBAcGFyYW1baW5dIGZpcnN0IGJlZ2luIG9mIHRoZSByYW5nZSB0byBjb3B5IGZyb20gKGluY2x1ZGVkKQorICAgIEBwYXJhbVtpbl0gbGFzdCBlbmQgb2YgdGhlIHJhbmdlIHRvIGNvcHkgZnJvbSAoZXhjbHVkZWQpCisKKyAgICBAcHJlIEl0ZXJhdG9ycyBAYSBmaXJzdCBhbmQgQGEgbGFzdCBtdXN0IGJlIGluaXRpYWxpemVkLiAqKlRoaXMKKyAgICAgICAgIHByZWNvbmRpdGlvbiBpcyBlbmZvcmNlZCB3aXRoIGFuIGFzc2VydGlvbiAoc2VlIHdhcm5pbmcpLioqIElmCisgICAgICAgICBhc3NlcnRpb25zIGFyZSBzd2l0Y2hlZCBvZmYsIGEgdmlvbGF0aW9uIG9mIHRoaXMgcHJlY29uZGl0aW9uIHlpZWxkcworICAgICAgICAgdW5kZWZpbmVkIGJlaGF2aW9yLgorCisgICAgQHByZSBSYW5nZSBgW2ZpcnN0LCBsYXN0KWAgaXMgdmFsaWQuIFVzdWFsbHksIHRoaXMgcHJlY29uZGl0aW9uIGNhbm5vdCBiZQorICAgICAgICAgY2hlY2tlZCBlZmZpY2llbnRseS4gT25seSBjZXJ0YWluIGVkZ2UgY2FzZXMgYXJlIGRldGVjdGVkOyBzZWUgdGhlCisgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgZXhjZXB0aW9ucyBiZWxvdy4gQSB2aW9sYXRpb24gb2YgdGhpcyBwcmVjb25kaXRpb24KKyAgICAgICAgIHlpZWxkcyB1bmRlZmluZWQgYmVoYXZpb3IuCisKKyAgICBAd2FybmluZyBBIHByZWNvbmRpdGlvbiBpcyBlbmZvcmNlZCB3aXRoIGEgcnVudGltZSBhc3NlcnRpb24gdGhhdCB3aWxsCisgICAgICAgICAgICAgcmVzdWx0IGluIGNhbGxpbmcgYHN0ZDo6YWJvcnRgIGlmIHRoaXMgcHJlY29uZGl0aW9uIGlzIG5vdCBtZXQuCisgICAgICAgICAgICAgQXNzZXJ0aW9ucyBjYW4gYmUgZGlzYWJsZWQgYnkgZGVmaW5pbmcgYE5ERUJVR2AgYXQgY29tcGlsZSB0aW1lLgorICAgICAgICAgICAgIFNlZSBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9lcnJvci9hc3NlcnQgZm9yIG1vcmUKKyAgICAgICAgICAgICBpbmZvcm1hdGlvbi4KKworICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMSBpZiBpdGVyYXRvcnMgQGEgZmlyc3QgYW5kIEBhIGxhc3QgYXJlIG5vdAorICAgIGNvbXBhdGlibGUgKGkuZS4sIGRvIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgSlNPTiB2YWx1ZSkuIEluIHRoaXMgY2FzZSwKKyAgICB0aGUgcmFuZ2UgYFtmaXJzdCwgbGFzdClgIGlzIHVuZGVmaW5lZC4KKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDQgaWYgaXRlcmF0b3JzIEBhIGZpcnN0IGFuZCBAYSBsYXN0IGJlbG9uZyB0byBhCisgICAgcHJpbWl0aXZlIHR5cGUgKG51bWJlciwgYm9vbGVhbiwgb3Igc3RyaW5nKSwgYnV0IEBhIGZpcnN0IGRvZXMgbm90IHBvaW50CisgICAgdG8gdGhlIGZpcnN0IGVsZW1lbnQgYW55IG1vcmUuIEluIHRoaXMgY2FzZSwgdGhlIHJhbmdlIGBbZmlyc3QsIGxhc3QpYCBpcworICAgIHVuZGVmaW5lZC4gU2VlIGV4YW1wbGUgY29kZSBiZWxvdy4KKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDYgaWYgaXRlcmF0b3JzIEBhIGZpcnN0IGFuZCBAYSBsYXN0IGJlbG9uZyB0byBhCisgICAgbnVsbCB2YWx1ZS4gSW4gdGhpcyBjYXNlLCB0aGUgcmFuZ2UgYFtmaXJzdCwgbGFzdClgIGlzIHVuZGVmaW5lZC4KKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiBkaXN0YW5jZSBiZXR3ZWVuIEBhIGZpcnN0IGFuZCBAYSBsYXN0LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIHRvIGFueSBKU09OIHZhbHVlLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIHNldmVyYWwgd2F5cyB0byBjcmVhdGUgSlNPTiB2YWx1ZXMgYnkKKyAgICBzcGVjaWZ5aW5nIGEgc3VicmFuZ2Ugd2l0aCBpdGVyYXRvcnMuLGJhc2ljX2pzb25fX0lucHV0SXRfSW5wdXRJdH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dElULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPElucHV0SVQsIHR5cGVuYW1lIGJhc2ljX2pzb25fdDo6aXRlcmF0b3I+Ojp2YWx1ZSBvcgorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SW5wdXRJVCwgdHlwZW5hbWUgYmFzaWNfanNvbl90Ojpjb25zdF9pdGVyYXRvcj46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBiYXNpY19qc29uKElucHV0SVQgZmlyc3QsIElucHV0SVQgbGFzdCkKKyAgICB7CisgICAgICAgIGFzc2VydChmaXJzdC5tX29iamVjdCAhPSBudWxscHRyKTsKKyAgICAgICAgYXNzZXJ0KGxhc3QubV9vYmplY3QgIT0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIGl0ZXJhdG9yIGZpdHMgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZmlyc3QubV9vYmplY3QgIT0gbGFzdC5tX29iamVjdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMSwgIml0ZXJhdG9ycyBhcmUgbm90IGNvbXBhdGlibGUiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IHR5cGUgZnJvbSBmaXJzdCBpdGVyYXRvcgorICAgICAgICBtX3R5cGUgPSBmaXJzdC5tX29iamVjdC0+bV90eXBlOworCisgICAgICAgIC8vIGNoZWNrIGlmIGl0ZXJhdG9yIHJhbmdlIGlzIGNvbXBsZXRlIGZvciBwcmltaXRpdmUgdmFsdWVzCisgICAgICAgIHN3aXRjaCAobV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBmaXJzdC5tX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5pc19iZWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igbm90IGxhc3QubV9pdC5wcmltaXRpdmVfaXRlcmF0b3IuaXNfZW5kKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjA0LCAiaXRlcmF0b3JzIG91dCBvZiByYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlLm51bWJlcl9pbnRlZ2VyID0gZmlyc3QubV9vYmplY3QtPm1fdmFsdWUubnVtYmVyX2ludGVnZXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkID0gZmlyc3QubV9vYmplY3QtPm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlLm51bWJlcl9mbG9hdCA9IGZpcnN0Lm1fb2JqZWN0LT5tX3ZhbHVlLm51bWJlcl9mbG9hdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUuYm9vbGVhbiA9IGZpcnN0Lm1fb2JqZWN0LT5tX3ZhbHVlLmJvb2xlYW47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6c3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUgPSAqZmlyc3QubV9vYmplY3QtPm1fdmFsdWUuc3RyaW5nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlLm9iamVjdCA9IGNyZWF0ZTxvYmplY3RfdD4oZmlyc3QubV9pdC5vYmplY3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5vYmplY3RfaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUuYXJyYXkgPSBjcmVhdGU8YXJyYXlfdD4oZmlyc3QubV9pdC5hcnJheV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5hcnJheV9pdGVyYXRvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjA2LCAiY2Fubm90IGNvbnN0cnVjdCB3aXRoIGl0ZXJhdG9ycyBmcm9tICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZpcnN0Lm1fb2JqZWN0LT50eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIG90aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvciAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8vIEBwcml2YXRlCisgICAgYmFzaWNfanNvbihjb25zdCBkZXRhaWw6Ompzb25fcmVmPGJhc2ljX2pzb24+JiByZWYpCisgICAgICAgIDogYmFzaWNfanNvbihyZWYubW92ZWRfb3JfY29waWVkKCkpCisgICAge30KKworICAgIC8qIQorICAgIEBicmllZiBjb3B5IGNvbnN0cnVjdG9yCisKKyAgICBDcmVhdGVzIGEgY29weSBvZiBhIGdpdmVuIEpTT04gdmFsdWUuCisKKyAgICBAcGFyYW1baW5dIG90aGVyICB0aGUgSlNPTiB2YWx1ZSB0byBjb3B5CisKKyAgICBAcG9zdCBgKnRoaXMgPT0gb3RoZXJgCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgQGEgb3RoZXIuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgdG8gYW55IEpTT04gdmFsdWUuCisKKyAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBgYmFzaWNfanNvbmAgc2F0aXNmeWluZyB0aGUKKyAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKKyAgICByZXF1aXJlbWVudHM6CisgICAgLSBUaGUgY29tcGxleGl0eSBpcyBsaW5lYXIuCisgICAgLSBBcyBwb3N0Y29uZGl0aW9uLCBpdCBob2xkczogYG90aGVyID09IGJhc2ljX2pzb24ob3RoZXIpYC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgdGhlIGNvcHkKKyAgICBjb25zdHJ1Y3Rvci4sYmFzaWNfanNvbl9fYmFzaWNfanNvbn0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBiYXNpY19qc29uKGNvbnN0IGJhc2ljX2pzb24mIG90aGVyKQorICAgICAgICA6IG1fdHlwZShvdGhlci5tX3R5cGUpCisgICAgeworICAgICAgICAvLyBjaGVjayBvZiBwYXNzZWQgdmFsdWUgaXMgdmFsaWQKKyAgICAgICAgb3RoZXIuYXNzZXJ0X2ludmFyaWFudCgpOworCisgICAgICAgIHN3aXRjaCAobV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlID0gKm90aGVyLm1fdmFsdWUub2JqZWN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUgPSAqb3RoZXIubV92YWx1ZS5hcnJheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZSA9ICpvdGhlci5tX3ZhbHVlLnN0cmluZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBvdGhlci5tX3ZhbHVlLmJvb2xlYW47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZSA9IG90aGVyLm1fdmFsdWUubnVtYmVyX2ludGVnZXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUgPSBvdGhlci5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZSA9IG90aGVyLm1fdmFsdWUubnVtYmVyX2Zsb2F0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBtb3ZlIGNvbnN0cnVjdG9yCisKKyAgICBNb3ZlIGNvbnN0cnVjdG9yLiBDb25zdHJ1Y3RzIGEgSlNPTiB2YWx1ZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4KKyAgICB2YWx1ZSBAYSBvdGhlciB1c2luZyBtb3ZlIHNlbWFudGljcy4gSXQgInN0ZWFscyIgdGhlIHJlc291cmNlcyBmcm9tIEBhCisgICAgb3RoZXIgYW5kIGxlYXZlcyBpdCBhcyBKU09OIG51bGwgdmFsdWUuCisKKyAgICBAcGFyYW1baW4sb3V0XSBvdGhlciAgdmFsdWUgdG8gbW92ZSB0byB0aGlzIG9iamVjdAorCisgICAgQHBvc3QgYCp0aGlzYCBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgQGEgb3RoZXIgYmVmb3JlIHRoZSBjYWxsLgorICAgIEBwb3N0IEBhIG90aGVyIGlzIGEgSlNPTiBudWxsIHZhbHVlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBjb25zdHJ1Y3RvciBuZXZlciB0aHJvd3MKKyAgICBleGNlcHRpb25zLgorCisgICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGJhc2ljX2pzb25gIHNhdGlzZnlpbmcgdGhlCisgICAgW01vdmVDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L01vdmVDb25zdHJ1Y3RpYmxlKQorICAgIHJlcXVpcmVtZW50cy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgY29kZSBiZWxvdyBzaG93cyB0aGUgbW92ZSBjb25zdHJ1Y3RvciBleHBsaWNpdGx5IGNhbGxlZAorICAgIHZpYSBzdGQ6Om1vdmUuLGJhc2ljX2pzb25fX21vdmVjb25zdHJ1Y3Rvcn0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBiYXNpY19qc29uKGJhc2ljX2pzb24mJiBvdGhlcikgbm9leGNlcHQKKyAgICAgICAgOiBtX3R5cGUoc3RkOjptb3ZlKG90aGVyLm1fdHlwZSkpLAorICAgICAgICAgIG1fdmFsdWUoc3RkOjptb3ZlKG90aGVyLm1fdmFsdWUpKQorICAgIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBwYXNzZWQgdmFsdWUgaXMgdmFsaWQKKyAgICAgICAgb3RoZXIuYXNzZXJ0X2ludmFyaWFudCgpOworCisgICAgICAgIC8vIGludmFsaWRhdGUgcGF5bG9hZAorICAgICAgICBvdGhlci5tX3R5cGUgPSB2YWx1ZV90OjpudWxsOworICAgICAgICBvdGhlci5tX3ZhbHVlID0ge307CisKKyAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb3B5IGFzc2lnbm1lbnQKKworICAgIENvcHkgYXNzaWdubWVudCBvcGVyYXRvci4gQ29waWVzIGEgSlNPTiB2YWx1ZSB2aWEgdGhlICJjb3B5IGFuZCBzd2FwIgorICAgIHN0cmF0ZWd5OiBJdCBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YgdGhlIGNvcHkgY29uc3RydWN0b3IsIGRlc3RydWN0b3IsCisgICAgYW5kIHRoZSBgc3dhcCgpYCBtZW1iZXIgZnVuY3Rpb24uCisKKyAgICBAcGFyYW1baW5dIG90aGVyICB2YWx1ZSB0byBjb3B5IGZyb20KKworICAgIEBjb21wbGV4aXR5IExpbmVhci4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGxpbmVhci4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgY29kZSBiZWxvdyBzaG93cyBhbmQgZXhhbXBsZSBmb3IgdGhlIGNvcHkgYXNzaWdubWVudC4gSXQKKyAgICBjcmVhdGVzIGEgY29weSBvZiB2YWx1ZSBgYWAgd2hpY2ggaXMgdGhlbiBzd2FwcGVkIHdpdGggYGJgLiBGaW5hbGx5XCwgdGhlCisgICAgY29weSBvZiBgYWAgKHdoaWNoIGlzIHRoZSBudWxsIHZhbHVlIGFmdGVyIHRoZSBzd2FwKSBpcworICAgIGRlc3Ryb3llZC4sYmFzaWNfanNvbl9fY29weWFzc2lnbm1lbnR9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oYmFzaWNfanNvbiBvdGhlcikgbm9leGNlcHQgKAorICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPHZhbHVlX3Q+Ojp2YWx1ZSBhbmQKKyAgICAgICAgc3RkOjppc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTx2YWx1ZV90Pjo6dmFsdWUgYW5kCisgICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8anNvbl92YWx1ZT46OnZhbHVlIGFuZAorICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPGpzb25fdmFsdWU+Ojp2YWx1ZQorICAgICkKKyAgICB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgcGFzc2VkIHZhbHVlIGlzIHZhbGlkCisgICAgICAgIG90aGVyLmFzc2VydF9pbnZhcmlhbnQoKTsKKworICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICAgIHN3YXAobV90eXBlLCBvdGhlci5tX3R5cGUpOworICAgICAgICBzd2FwKG1fdmFsdWUsIG90aGVyLm1fdmFsdWUpOworCisgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXN0cnVjdG9yCisKKyAgICBEZXN0cm95cyB0aGUgSlNPTiB2YWx1ZSBhbmQgZnJlZXMgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIuCisKKyAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBgYmFzaWNfanNvbmAgc2F0aXNmeWluZyB0aGUKKyAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKKyAgICByZXF1aXJlbWVudHM6CisgICAgLSBUaGUgY29tcGxleGl0eSBpcyBsaW5lYXIuCisgICAgLSBBbGwgc3RvcmVkIGVsZW1lbnRzIGFyZSBkZXN0cm95ZWQgYW5kIGFsbCBtZW1vcnkgaXMgZnJlZWQuCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgfmJhc2ljX2pzb24oKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgICAgICBtX3ZhbHVlLmRlc3Ryb3kobV90eXBlKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKworICBwdWJsaWM6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBvYmplY3QgaW5zcGVjdGlvbiAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgb2JqZWN0IGluc3BlY3Rpb24KKyAgICAvLy8gRnVuY3Rpb25zIHRvIGluc3BlY3QgdGhlIHR5cGUgb2YgYSBKU09OIHZhbHVlLgorICAgIC8vLyBAeworCisgICAgLyohCisgICAgQGJyaWVmIHNlcmlhbGl6YXRpb24KKworICAgIFNlcmlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIEpTT04gdmFsdWVzLiBUaGUgZnVuY3Rpb24gdHJpZXMgdG8gbWltaWMKKyAgICBQeXRob24ncyBganNvbi5kdW1wcygpYCBmdW5jdGlvbiwgYW5kIGN1cnJlbnRseSBzdXBwb3J0cyBpdHMgQGEgaW5kZW50CisgICAgYW5kIEBhIGVuc3VyZV9hc2NpaSBwYXJhbWV0ZXJzLgorCisgICAgQHBhcmFtW2luXSBpbmRlbnQgSWYgaW5kZW50IGlzIG5vbm5lZ2F0aXZlLCB0aGVuIGFycmF5IGVsZW1lbnRzIGFuZCBvYmplY3QKKyAgICBtZW1iZXJzIHdpbGwgYmUgcHJldHR5LXByaW50ZWQgd2l0aCB0aGF0IGluZGVudCBsZXZlbC4gQW4gaW5kZW50IGxldmVsIG9mCisgICAgYDBgIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuIGAtMWAgKHRoZSBkZWZhdWx0KSBzZWxlY3RzIHRoZSBtb3N0IGNvbXBhY3QKKyAgICByZXByZXNlbnRhdGlvbi4KKyAgICBAcGFyYW1baW5dIGluZGVudF9jaGFyIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciBpbmRlbnRhdGlvbiBpZiBAYSBpbmRlbnQgaXMKKyAgICBncmVhdGVyIHRoYW4gYDBgLiBUaGUgZGVmYXVsdCBpcyBgIGAgKHNwYWNlKS4KKyAgICBAcGFyYW1baW5dIGVuc3VyZV9hc2NpaSBJZiBAYSBlbnN1cmVfYXNjaWkgaXMgdHJ1ZSwgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisgICAgaW4gdGhlIG91dHB1dCBhcmUgZXNjYXBlZCB3aXRoIGBcdVhYWFhgIHNlcXVlbmNlcywgYW5kIHRoZSByZXN1bHQgY29uc2lzdHMKKyAgICBvZiBBU0NJSSBjaGFyYWN0ZXJzIG9ubHkuCisKKyAgICBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBKU09OIHZhbHVlCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTYgaWYgYSBzdHJpbmcgc3RvcmVkIGluc2lkZSB0aGUgSlNPTiB2YWx1ZSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGLTggZW5jb2RlZAorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyLgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBAYSBpbmRlbnRcLAorICAgIEBhIGluZGVudF9jaGFyXCwgYW5kIEBhIGVuc3VyZV9hc2NpaSBwYXJhbWV0ZXJzIHRvIHRoZSByZXN1bHQgb2YgdGhlCisgICAgc2VyaWFsaXphdGlvbi4sZHVtcH0KKworICAgIEBzZWUgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L2pzb24uaHRtbCNqc29uLmR1bXAKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wOyBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIgQGEgaW5kZW50X2NoYXIsIG9wdGlvbgorICAgICAgICAgICBAYSBlbnN1cmVfYXNjaWkgYW5kIGV4Y2VwdGlvbnMgYWRkZWQgaW4gdmVyc2lvbiAzLjAuMAorICAgICovCisgICAgc3RyaW5nX3QgZHVtcChjb25zdCBpbnQgaW5kZW50ID0gLTEsIGNvbnN0IGNoYXIgaW5kZW50X2NoYXIgPSAnICcsCisgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGVuc3VyZV9hc2NpaSA9IGZhbHNlKSBjb25zdAorICAgIHsKKyAgICAgICAgc3RyaW5nX3QgcmVzdWx0OworICAgICAgICBzZXJpYWxpemVyIHMoZGV0YWlsOjpvdXRwdXRfYWRhcHRlcjxjaGFyPihyZXN1bHQpLCBpbmRlbnRfY2hhcik7CisKKyAgICAgICAgaWYgKGluZGVudCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzLmR1bXAoKnRoaXMsIHRydWUsIGVuc3VyZV9hc2NpaSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpbmRlbnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHMuZHVtcCgqdGhpcywgZmFsc2UsIGVuc3VyZV9hc2NpaSwgMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEpTT04gdmFsdWUgKGV4cGxpY2l0KQorCisgICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlIGFzIGEgdmFsdWUgZnJvbSB0aGUgQHJlZiB2YWx1ZV90CisgICAgZW51bWVyYXRpb24uCisKKyAgICBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlCisgICAgICAgICAgICBWYWx1ZSB0eXBlICAgICAgICAgICAgICAgIHwgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlX3Q6Om51bGwKKyAgICAgICAgICAgIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgfCB2YWx1ZV90Ojpib29sZWFuCisgICAgICAgICAgICBzdHJpbmcgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVfdDo6c3RyaW5nCisgICAgICAgICAgICBudW1iZXIgKGludGVnZXIpICAgICAgICAgIHwgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXIKKyAgICAgICAgICAgIG51bWJlciAodW5zaWduZWQgaW50ZWdlcikgfCB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQKKyAgICAgICAgICAgIG51bWJlciAoZmxvYXRpbmctcG9pbnQpICAgfCB2YWx1ZV90OjpudW1iZXJfZmxvYXQKKyAgICAgICAgICAgIG9iamVjdCAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZV90OjpvYmplY3QKKyAgICAgICAgICAgIGFycmF5ICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZV90OjphcnJheQorICAgICAgICAgICAgZGlzY2FyZGVkICAgICAgICAgICAgICAgICB8IHZhbHVlX3Q6OmRpc2NhcmRlZAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYHR5cGUoKWAgZm9yIGFsbCBKU09OCisgICAgdHlwZXMuLHR5cGV9CisKKyAgICBAc2EgQHJlZiBvcGVyYXRvciB2YWx1ZV90KCkgLS0gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlIChpbXBsaWNpdCkKKyAgICBAc2EgQHJlZiB0eXBlX25hbWUoKSAtLSByZXR1cm4gdGhlIHR5cGUgYXMgc3RyaW5nCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RleHByIHZhbHVlX3QgdHlwZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gbV90eXBlOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gd2hldGhlciB0eXBlIGlzIHByaW1pdGl2ZQorCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIEpTT04gdHlwZSBpcyBwcmltaXRpdmUKKyAgICAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIG51bGwpLgorCisgICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBudWxsKSwKKyAgICBgZmFsc2VgIG90aGVyd2lzZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19wcmltaXRpdmUoKWAgZm9yIGFsbCBKU09OCisgICAgdHlwZXMuLGlzX3ByaW1pdGl2ZX0KKworICAgIEBzYSBAcmVmIGlzX3N0cnVjdHVyZWQoKSAtLSByZXR1cm5zIHdoZXRoZXIgSlNPTiB2YWx1ZSBpcyBzdHJ1Y3R1cmVkCisgICAgQHNhIEByZWYgaXNfbnVsbCgpIC0tIHJldHVybnMgd2hldGhlciBKU09OIHZhbHVlIGlzIGBudWxsYAorICAgIEBzYSBAcmVmIGlzX3N0cmluZygpIC0tIHJldHVybnMgd2hldGhlciBKU09OIHZhbHVlIGlzIGEgc3RyaW5nCisgICAgQHNhIEByZWYgaXNfYm9vbGVhbigpIC0tIHJldHVybnMgd2hldGhlciBKU09OIHZhbHVlIGlzIGEgYm9vbGVhbgorICAgIEBzYSBAcmVmIGlzX251bWJlcigpIC0tIHJldHVybnMgd2hldGhlciBKU09OIHZhbHVlIGlzIGEgbnVtYmVyCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNfcHJpbWl0aXZlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBpc19udWxsKCkgb3IgaXNfc3RyaW5nKCkgb3IgaXNfYm9vbGVhbigpIG9yIGlzX251bWJlcigpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gd2hldGhlciB0eXBlIGlzIHN0cnVjdHVyZWQKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBKU09OIHR5cGUgaXMgc3RydWN0dXJlZAorICAgIChhcnJheSBvciBvYmplY3QpLgorCisgICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBzdHJ1Y3R1cmVkIChhcnJheSBvciBvYmplY3QpLCBgZmFsc2VgIG90aGVyd2lzZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19zdHJ1Y3R1cmVkKClgIGZvciBhbGwgSlNPTgorICAgIHR5cGVzLixpc19zdHJ1Y3R1cmVkfQorCisgICAgQHNhIEByZWYgaXNfcHJpbWl0aXZlKCkgLS0gcmV0dXJucyB3aGV0aGVyIHZhbHVlIGlzIHByaW1pdGl2ZQorICAgIEBzYSBAcmVmIGlzX2FycmF5KCkgLS0gcmV0dXJucyB3aGV0aGVyIHZhbHVlIGlzIGFuIGFycmF5CisgICAgQHNhIEByZWYgaXNfb2JqZWN0KCkgLS0gcmV0dXJucyB3aGV0aGVyIHZhbHVlIGlzIGFuIG9iamVjdAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzX3N0cnVjdHVyZWQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX2FycmF5KCkgb3IgaXNfb2JqZWN0KCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIG51bGwKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBKU09OIHZhbHVlIGlzIG51bGwuCisKKyAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIG51bGwsIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX251bGwoKWAgZm9yIGFsbCBKU09OCisgICAgdHlwZXMuLGlzX251bGx9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNfbnVsbCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKG1fdHlwZSA9PSB2YWx1ZV90OjpudWxsKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYSBib29sZWFuCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBhIGJvb2xlYW4uCisKKyAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIGJvb2xlYW4sIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX2Jvb2xlYW4oKWAgZm9yIGFsbCBKU09OCisgICAgdHlwZXMuLGlzX2Jvb2xlYW59CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNfYm9vbGVhbigpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKG1fdHlwZSA9PSB2YWx1ZV90Ojpib29sZWFuKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYSBudW1iZXIKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBKU09OIHZhbHVlIGlzIGEgbnVtYmVyLiBUaGlzCisgICAgaW5jbHVkZXMgYm90aCBpbnRlZ2VyIChzaWduZWQgYW5kIHVuc2lnbmVkKSBhbmQgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorCisgICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBudW1iZXIgKHJlZ2FyZGxlc3Mgd2hldGhlciBpbnRlZ2VyLCB1bnNpZ25lZAorICAgIGludGVnZXIgb3IgZmxvYXRpbmctdHlwZSksIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX251bWJlcigpYCBmb3IgYWxsIEpTT04KKyAgICB0eXBlcy4saXNfbnVtYmVyfQorCisgICAgQHNhIEByZWYgaXNfbnVtYmVyX2ludGVnZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9yIHVuc2lnbmVkCisgICAgaW50ZWdlciBudW1iZXIKKyAgICBAc2EgQHJlZiBpc19udW1iZXJfdW5zaWduZWQoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyCisgICAgbnVtYmVyCisgICAgQHNhIEByZWYgaXNfbnVtYmVyX2Zsb2F0KCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc19udW1iZXIoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX251bWJlcl9pbnRlZ2VyKCkgb3IgaXNfbnVtYmVyX2Zsb2F0KCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGFuIGludGVnZXIgbnVtYmVyCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBhIHNpZ25lZCBvcgorICAgIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyLiBUaGlzIGV4Y2x1ZGVzIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKworICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgYW4gaW50ZWdlciBvciB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlciwgYGZhbHNlYAorICAgIG90aGVyd2lzZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19udW1iZXJfaW50ZWdlcigpYCBmb3IgYWxsCisgICAgSlNPTiB0eXBlcy4saXNfbnVtYmVyX2ludGVnZXJ9CisKKyAgICBAc2EgQHJlZiBpc19udW1iZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhIG51bWJlcgorICAgIEBzYSBAcmVmIGlzX251bWJlcl91bnNpZ25lZCgpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIGFuIHVuc2lnbmVkIGludGVnZXIKKyAgICBudW1iZXIKKyAgICBAc2EgQHJlZiBpc19udW1iZXJfZmxvYXQoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlcgorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzX251bWJlcl9pbnRlZ2VyKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiAobV90eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyIG9yIG1fdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gd2hldGhlciB2YWx1ZSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlcgorCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIEpTT04gdmFsdWUgaXMgYW4gdW5zaWduZWQKKyAgICBpbnRlZ2VyIG51bWJlci4gVGhpcyBleGNsdWRlcyBmbG9hdGluZy1wb2ludCBhbmQgc2lnbmVkIGludGVnZXIgdmFsdWVzLgorCisgICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIG51bWJlciwgYGZhbHNlYCBvdGhlcndpc2UuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKKyAgICBleGNlcHRpb25zLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgaXNfbnVtYmVyX3Vuc2lnbmVkKClgIGZvciBhbGwKKyAgICBKU09OIHR5cGVzLixpc19udW1iZXJfdW5zaWduZWR9CisKKyAgICBAc2EgQHJlZiBpc19udW1iZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhIG51bWJlcgorICAgIEBzYSBAcmVmIGlzX251bWJlcl9pbnRlZ2VyKCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYW4gaW50ZWdlciBvciB1bnNpZ25lZAorICAgIGludGVnZXIgbnVtYmVyCisgICAgQHNhIEByZWYgaXNfbnVtYmVyX2Zsb2F0KCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc19udW1iZXJfdW5zaWduZWQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBKU09OIHZhbHVlIGlzIGEKKyAgICBmbG9hdGluZy1wb2ludCBudW1iZXIuIFRoaXMgZXhjbHVkZXMgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4KKworICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX251bWJlcl9mbG9hdCgpYCBmb3IgYWxsCisgICAgSlNPTiB0eXBlcy4saXNfbnVtYmVyX2Zsb2F0fQorCisgICAgQHNhIEByZWYgaXNfbnVtYmVyKCkgLS0gY2hlY2sgaWYgdmFsdWUgaXMgbnVtYmVyCisgICAgQHNhIEByZWYgaXNfbnVtYmVyX2ludGVnZXIoKSAtLSBjaGVjayBpZiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG51bWJlcgorICAgIEBzYSBAcmVmIGlzX251bWJlcl91bnNpZ25lZCgpIC0tIGNoZWNrIGlmIHZhbHVlIGlzIGFuIHVuc2lnbmVkIGludGVnZXIKKyAgICBudW1iZXIKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc19udW1iZXJfZmxvYXQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0KTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgYW4gb2JqZWN0CisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBhbiBvYmplY3QuCisKKyAgICBAcmV0dXJuIGB0cnVlYCBpZiB0eXBlIGlzIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2UuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIG1lbWJlciBmdW5jdGlvbiBuZXZlciB0aHJvd3MKKyAgICBleGNlcHRpb25zLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgaXNfb2JqZWN0KClgIGZvciBhbGwgSlNPTgorICAgIHR5cGVzLixpc19vYmplY3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNfb2JqZWN0KCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiAobV90eXBlID09IHZhbHVlX3Q6Om9iamVjdCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGFuIGFycmF5CisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBhbiBhcnJheS4KKworICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX2FycmF5KClgIGZvciBhbGwgSlNPTgorICAgIHR5cGVzLixpc19hcnJheX0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc19hcnJheSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKG1fdHlwZSA9PSB2YWx1ZV90OjphcnJheSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybiB3aGV0aGVyIHZhbHVlIGlzIGEgc3RyaW5nCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBhIHN0cmluZy4KKworICAgIEByZXR1cm4gYHRydWVgIGlmIHR5cGUgaXMgc3RyaW5nLCBgZmFsc2VgIG90aGVyd2lzZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIGBpc19zdHJpbmcoKWAgZm9yIGFsbCBKU09OCisgICAgdHlwZXMuLGlzX3N0cmluZ30KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc19zdHJpbmcoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChtX3R5cGUgPT0gdmFsdWVfdDo6c3RyaW5nKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHdoZXRoZXIgdmFsdWUgaXMgZGlzY2FyZGVkCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgSlNPTiB2YWx1ZSB3YXMgZGlzY2FyZGVkCisgICAgZHVyaW5nIHBhcnNpbmcgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgQHJlZiBwYXJzZXJfY2FsbGJhY2tfdCkuCisKKyAgICBAbm90ZSBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlIGBmYWxzZWAgZm9yIEpTT04gdmFsdWVzIGFmdGVyIHBhcnNpbmcuCisgICAgVGhhdCBpcywgZGlzY2FyZGVkIHZhbHVlcyBjYW4gb25seSBvY2N1ciBkdXJpbmcgcGFyc2luZywgYnV0IHdpbGwgYmUKKyAgICByZW1vdmVkIHdoZW4gaW5zaWRlIGEgc3RydWN0dXJlZCB2YWx1ZSBvciByZXBsYWNlZCBieSBudWxsIGluIG90aGVyIGNhc2VzLgorCisgICAgQHJldHVybiBgdHJ1ZWAgaWYgdHlwZSBpcyBkaXNjYXJkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBtZW1iZXIgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzCisgICAgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgZXhlbXBsaWZpZXMgYGlzX2Rpc2NhcmRlZCgpYCBmb3IgYWxsIEpTT04KKyAgICB0eXBlcy4saXNfZGlzY2FyZGVkfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzX2Rpc2NhcmRlZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKG1fdHlwZSA9PSB2YWx1ZV90OjpkaXNjYXJkZWQpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEpTT04gdmFsdWUgKGltcGxpY2l0KQorCisgICAgSW1wbGljaXRseSByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEpTT04gdmFsdWUgYXMgYSB2YWx1ZSBmcm9tIHRoZSBAcmVmCisgICAgdmFsdWVfdCBlbnVtZXJhdGlvbi4KKworICAgIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEpTT04gdmFsdWUKKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgbWVtYmVyIGZ1bmN0aW9uIG5ldmVyIHRocm93cworICAgIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIGV4ZW1wbGlmaWVzIHRoZSBAcmVmIHZhbHVlX3Qgb3BlcmF0b3IgZm9yCisgICAgYWxsIEpTT04gdHlwZXMuLG9wZXJhdG9yX192YWx1ZV90fQorCisgICAgQHNhIEByZWYgdHlwZSgpIC0tIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSlNPTiB2YWx1ZSAoZXhwbGljaXQpCisgICAgQHNhIEByZWYgdHlwZV9uYW1lKCkgLS0gcmV0dXJuIHRoZSB0eXBlIGFzIHN0cmluZworCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0ZXhwciBvcGVyYXRvciB2YWx1ZV90KCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBtX3R5cGU7CisgICAgfQorCisgICAgLy8vIEB9CisKKyAgcHJpdmF0ZToKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyB2YWx1ZSBhY2Nlc3MgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBnZXQgYSBib29sZWFuIChleHBsaWNpdCkKKyAgICBib29sZWFuX3QgZ2V0X2ltcGwoYm9vbGVhbl90KiAvKnVudXNlZCovKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX2Jvb2xlYW4oKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLmJvb2xlYW47CisgICAgICAgIH0KKworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDIsICJ0eXBlIG11c3QgYmUgYm9vbGVhbiwgYnV0IGlzICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgdmFsdWUgKG9iamVjdCkKKyAgICBvYmplY3RfdCogZ2V0X2ltcGxfcHRyKG9iamVjdF90KiAvKnVudXNlZCovKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX29iamVjdCgpID8gbV92YWx1ZS5vYmplY3QgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAob2JqZWN0KQorICAgIGNvbnN0ZXhwciBjb25zdCBvYmplY3RfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IG9iamVjdF90KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX29iamVjdCgpID8gbV92YWx1ZS5vYmplY3QgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoYXJyYXkpCisgICAgYXJyYXlfdCogZ2V0X2ltcGxfcHRyKGFycmF5X3QqIC8qdW51c2VkKi8pIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXNfYXJyYXkoKSA/IG1fdmFsdWUuYXJyYXkgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoYXJyYXkpCisgICAgY29uc3RleHByIGNvbnN0IGFycmF5X3QqIGdldF9pbXBsX3B0cihjb25zdCBhcnJheV90KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX2FycmF5KCkgPyBtX3ZhbHVlLmFycmF5IDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgdmFsdWUgKHN0cmluZykKKyAgICBzdHJpbmdfdCogZ2V0X2ltcGxfcHRyKHN0cmluZ190KiAvKnVudXNlZCovKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3N0cmluZygpID8gbV92YWx1ZS5zdHJpbmcgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoc3RyaW5nKQorICAgIGNvbnN0ZXhwciBjb25zdCBzdHJpbmdfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IHN0cmluZ190KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3N0cmluZygpID8gbV92YWx1ZS5zdHJpbmcgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoYm9vbGVhbikKKyAgICBib29sZWFuX3QqIGdldF9pbXBsX3B0cihib29sZWFuX3QqIC8qdW51c2VkKi8pIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXNfYm9vbGVhbigpID8gJm1fdmFsdWUuYm9vbGVhbiA6IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChib29sZWFuKQorICAgIGNvbnN0ZXhwciBjb25zdCBib29sZWFuX3QqIGdldF9pbXBsX3B0cihjb25zdCBib29sZWFuX3QqIC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXNfYm9vbGVhbigpID8gJm1fdmFsdWUuYm9vbGVhbiA6IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIChpbnRlZ2VyIG51bWJlcikKKyAgICBudW1iZXJfaW50ZWdlcl90KiBnZXRfaW1wbF9wdHIobnVtYmVyX2ludGVnZXJfdCogLyp1bnVzZWQqLykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBpc19udW1iZXJfaW50ZWdlcigpID8gJm1fdmFsdWUubnVtYmVyX2ludGVnZXIgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoaW50ZWdlciBudW1iZXIpCisgICAgY29uc3RleHByIGNvbnN0IG51bWJlcl9pbnRlZ2VyX3QqIGdldF9pbXBsX3B0cihjb25zdCBudW1iZXJfaW50ZWdlcl90KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX251bWJlcl9pbnRlZ2VyKCkgPyAmbV92YWx1ZS5udW1iZXJfaW50ZWdlciA6IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlICh1bnNpZ25lZCBudW1iZXIpCisgICAgbnVtYmVyX3Vuc2lnbmVkX3QqIGdldF9pbXBsX3B0cihudW1iZXJfdW5zaWduZWRfdCogLyp1bnVzZWQqLykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBpc19udW1iZXJfdW5zaWduZWQoKSA/ICZtX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA6IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlICh1bnNpZ25lZCBudW1iZXIpCisgICAgY29uc3RleHByIGNvbnN0IG51bWJlcl91bnNpZ25lZF90KiBnZXRfaW1wbF9wdHIoY29uc3QgbnVtYmVyX3Vuc2lnbmVkX3QqIC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXNfbnVtYmVyX3Vuc2lnbmVkKCkgPyAmbV92YWx1ZS5udW1iZXJfdW5zaWduZWQgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoZmxvYXRpbmctcG9pbnQgbnVtYmVyKQorICAgIG51bWJlcl9mbG9hdF90KiBnZXRfaW1wbF9wdHIobnVtYmVyX2Zsb2F0X3QqIC8qdW51c2VkKi8pIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXNfbnVtYmVyX2Zsb2F0KCkgPyAmbV92YWx1ZS5udW1iZXJfZmxvYXQgOiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBnZXQgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSAoZmxvYXRpbmctcG9pbnQgbnVtYmVyKQorICAgIGNvbnN0ZXhwciBjb25zdCBudW1iZXJfZmxvYXRfdCogZ2V0X2ltcGxfcHRyKGNvbnN0IG51bWJlcl9mbG9hdF90KiAvKnVudXNlZCovKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX251bWJlcl9mbG9hdCgpID8gJm1fdmFsdWUubnVtYmVyX2Zsb2F0IDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgaGVscGVyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBnZXRfcmVmKCkKKworICAgIFRoaXMgZnVuY3Rpb24gaGVscHMgdG8gaW1wbGVtZW50IGdldF9yZWYoKSB3aXRob3V0IGNvZGUgZHVwbGljYXRpb24gZm9yCisgICAgY29uc3QgYW5kIG5vbi1jb25zdCBvdmVybG9hZHMKKworICAgIEB0cGFyYW0gVGhpc1R5cGUgd2lsbCBiZSBkZWR1Y2VkIGFzIGBiYXNpY19qc29uYCBvciBgY29uc3QgYmFzaWNfanNvbmAKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwMyBpZiBSZWZlcmVuY2VUeXBlIGRvZXMgbm90IG1hdGNoIHVuZGVybHlpbmcgdmFsdWUKKyAgICB0eXBlIG9mIHRoZSBjdXJyZW50IEpTT04KKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlZmVyZW5jZVR5cGUsIHR5cGVuYW1lIFRoaXNUeXBlPgorICAgIHN0YXRpYyBSZWZlcmVuY2VUeXBlIGdldF9yZWZfaW1wbChUaGlzVHlwZSYgb2JqKQorICAgIHsKKyAgICAgICAgLy8gZGVsZWdhdGUgdGhlIGNhbGwgdG8gZ2V0X3B0cjw+KCkKKyAgICAgICAgYXV0byBwdHIgPSBvYmoudGVtcGxhdGUgZ2V0X3B0cjx0eXBlbmFtZSBzdGQ6OmFkZF9wb2ludGVyPFJlZmVyZW5jZVR5cGU+Ojp0eXBlPigpOworCisgICAgICAgIGlmIChKU09OX0xJS0VMWShwdHIgIT0gbnVsbHB0cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAqcHRyOworICAgICAgICB9CisKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzAzLCAiaW5jb21wYXRpYmxlIFJlZmVyZW5jZVR5cGUgZm9yIGdldF9yZWYsIGFjdHVhbCB0eXBlIGlzICIgKyBzdGQ6OnN0cmluZyhvYmoudHlwZV9uYW1lKCkpKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gQG5hbWUgdmFsdWUgYWNjZXNzCisgICAgLy8vIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHN0b3JlZCB2YWx1ZSBvZiBhIEpTT04gdmFsdWUuCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZ2V0IHNwZWNpYWwtY2FzZSBvdmVybG9hZAorCisgICAgVGhpcyBvdmVybG9hZHMgYXZvaWRzIGEgbG90IG9mIHRlbXBsYXRlIGJvaWxlcnBsYXRlLCBpdCBjYW4gYmUgc2VlbiBhcyB0aGUKKyAgICBpZGVudGl0eSBtZXRob2QKKworICAgIEB0cGFyYW0gQmFzaWNKc29uVHlwZSA9PSBAcmVmIGJhc2ljX2pzb24KKworICAgIEByZXR1cm4gYSBjb3B5IG9mICp0aGlzCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMS4wCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCBkZXRhaWw6OmVuYWJsZV9pZl90PAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8QmFzaWNKc29uVHlwZT46OnR5cGUsIGJhc2ljX2pzb25fdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KKyAgICBiYXNpY19qc29uIGdldCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGdldCBhIHZhbHVlIChleHBsaWNpdCkKKworICAgIEV4cGxpY2l0IHR5cGUgY29udmVyc2lvbiBiZXR3ZWVuIHRoZSBKU09OIHZhbHVlIGFuZCBhIGNvbXBhdGlibGUgdmFsdWUKKyAgICB3aGljaCBpcyBbQ29weUNvbnN0cnVjdGlibGVdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29weUNvbnN0cnVjdGlibGUpCisgICAgYW5kIFtEZWZhdWx0Q29uc3RydWN0aWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9EZWZhdWx0Q29uc3RydWN0aWJsZSkuCisgICAgVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCBieSBjYWxsaW5nIHRoZSBAcmVmIGpzb25fc2VyaWFsaXplcjxWYWx1ZVR5cGU+CisgICAgYGZyb21fanNvbigpYCBtZXRob2QuCisKKyAgICBUaGUgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKKyAgICBAY29kZSB7LmNwcH0KKyAgICBWYWx1ZVR5cGUgcmV0OworICAgIEpTT05TZXJpYWxpemVyPFZhbHVlVHlwZT46OmZyb21fanNvbigqdGhpcywgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICAgIEBlbmRjb2RlCisKKyAgICBUaGlzIG92ZXJsb2FkcyBpcyBjaG9zZW4gaWY6CisgICAgLSBAYSBWYWx1ZVR5cGUgaXMgbm90IEByZWYgYmFzaWNfanNvbiwKKyAgICAtIEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gaGFzIGEgYGZyb21fanNvbigpYCBtZXRob2Qgb2YgdGhlIGZvcm0KKyAgICAgIGB2b2lkIGZyb21fanNvbihjb25zdCBiYXNpY19qc29uJiwgVmFsdWVUeXBlJilgLCBhbmQKKyAgICAtIEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gZG9lcyBub3QgaGF2ZSBhIGBmcm9tX2pzb24oKWAgbWV0aG9kIG9mCisgICAgICB0aGUgZm9ybSBgVmFsdWVUeXBlIGZyb21fanNvbihjb25zdCBiYXNpY19qc29uJilgCisKKyAgICBAdHBhcmFtIFZhbHVlVHlwZUNWIHRoZSBwcm92aWRlZCB2YWx1ZSB0eXBlCisgICAgQHRwYXJhbSBWYWx1ZVR5cGUgdGhlIHJldHVybmVkIHZhbHVlIHR5cGUKKworICAgIEByZXR1cm4gY29weSBvZiB0aGUgSlNPTiB2YWx1ZSwgY29udmVydGVkIHRvIEBhIFZhbHVlVHlwZQorCisgICAgQHRocm93IHdoYXQgQHJlZiBqc29uX3NlcmlhbGl6ZXI8VmFsdWVUeXBlPiBgZnJvbV9qc29uKClgIG1ldGhvZCB0aHJvd3MKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBzZXZlcmFsIGNvbnZlcnNpb25zIGZyb20gSlNPTiB2YWx1ZXMKKyAgICB0byBvdGhlciB0eXBlcy4gVGhlcmUgYSBmZXcgdGhpbmdzIHRvIG5vdGU6ICgxKSBGbG9hdGluZy1wb2ludCBudW1iZXJzIGNhbgorICAgIGJlIGNvbnZlcnRlZCB0byBpbnRlZ2Vyc1wsICgyKSBBIEpTT04gYXJyYXkgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkCisgICAgYHN0ZDo6dmVjdG9yPHNob3J0PmBcLCAoMykgQSBKU09OIG9iamVjdCBjYW4gYmUgY29udmVydGVkIHRvIEMrKworICAgIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMgc3VjaCBhcyBgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nXCwKKyAgICBqc29uPmAuLGdldF9fVmFsdWVUeXBlX2NvbnN0fQorCisgICAgQHNpbmNlIHZlcnNpb24gMi4xLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZUNWLCB0eXBlbmFtZSBWYWx1ZVR5cGUgPSBkZXRhaWw6OnVuY3ZyZWZfdDxWYWx1ZVR5cGVDVj4sCisgICAgICAgICAgICAgZGV0YWlsOjplbmFibGVfaWZfdCA8CisgICAgICAgICAgICAgICAgIG5vdCBzdGQ6OmlzX3NhbWU8YmFzaWNfanNvbl90LCBWYWx1ZVR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgZGV0YWlsOjpoYXNfZnJvbV9qc29uPGJhc2ljX2pzb25fdCwgVmFsdWVUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgIG5vdCBkZXRhaWw6Omhhc19ub25fZGVmYXVsdF9mcm9tX2pzb248YmFzaWNfanNvbl90LCBWYWx1ZVR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50PiA9IDA+CisgICAgVmFsdWVUeXBlIGdldCgpIGNvbnN0IG5vZXhjZXB0KG5vZXhjZXB0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTlNlcmlhbGl6ZXI8VmFsdWVUeXBlPjo6ZnJvbV9qc29uKHN0ZDo6ZGVjbHZhbDxjb25zdCBiYXNpY19qc29uX3QmPigpLCBzdGQ6OmRlY2x2YWw8VmFsdWVUeXBlJj4oKSkpKQorICAgIHsKKyAgICAgICAgLy8gd2UgY2Fubm90IHN0YXRpY19hc3NlcnQgb24gVmFsdWVUeXBlQ1YgYmVpbmcgbm9uLWNvbnN0LCBiZWNhdXNlCisgICAgICAgIC8vIHRoZXJlIGlzIHN1cHBvcnQgZm9yIGdldDxjb25zdCBiYXNpY19qc29uX3Q+KCksIHdoaWNoIGlzIHdoeSB3ZQorICAgICAgICAvLyBzdGlsbCBuZWVkIHRoZSB1bmN2cmVmCisgICAgICAgIHN0YXRpY19hc3NlcnQobm90IHN0ZDo6aXNfcmVmZXJlbmNlPFZhbHVlVHlwZUNWPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgImdldCgpIGNhbm5vdCBiZSB1c2VkIHdpdGggcmVmZXJlbmNlIHR5cGVzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UgZ2V0X3JlZigpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8VmFsdWVUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgInR5cGVzIG11c3QgYmUgRGVmYXVsdENvbnN0cnVjdGlibGUgd2hlbiB1c2VkIHdpdGggZ2V0KCkiKTsKKworICAgICAgICBWYWx1ZVR5cGUgcmV0OworICAgICAgICBKU09OU2VyaWFsaXplcjxWYWx1ZVR5cGU+Ojpmcm9tX2pzb24oKnRoaXMsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGdldCBhIHZhbHVlIChleHBsaWNpdCk7IHNwZWNpYWwgY2FzZQorCisgICAgRXhwbGljaXQgdHlwZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlIEpTT04gdmFsdWUgYW5kIGEgY29tcGF0aWJsZSB2YWx1ZQorICAgIHdoaWNoIGlzICoqbm90KiogW0NvcHlDb25zdHJ1Y3RpYmxlXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvcHlDb25zdHJ1Y3RpYmxlKQorICAgIGFuZCAqKm5vdCoqIFtEZWZhdWx0Q29uc3RydWN0aWJsZV0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9EZWZhdWx0Q29uc3RydWN0aWJsZSkuCisgICAgVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCBieSBjYWxsaW5nIHRoZSBAcmVmIGpzb25fc2VyaWFsaXplcjxWYWx1ZVR5cGU+CisgICAgYGZyb21fanNvbigpYCBtZXRob2QuCisKKyAgICBUaGUgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKKyAgICBAY29kZSB7LmNwcH0KKyAgICByZXR1cm4gSlNPTlNlcmlhbGl6ZXI8VmFsdWVUeXBlQ1Y+Ojpmcm9tX2pzb24oKnRoaXMpOworICAgIEBlbmRjb2RlCisKKyAgICBUaGlzIG92ZXJsb2FkcyBpcyBjaG9zZW4gaWY6CisgICAgLSBAYSBWYWx1ZVR5cGUgaXMgbm90IEByZWYgYmFzaWNfanNvbiBhbmQKKyAgICAtIEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gaGFzIGEgYGZyb21fanNvbigpYCBtZXRob2Qgb2YgdGhlIGZvcm0KKyAgICAgIGBWYWx1ZVR5cGUgZnJvbV9qc29uKGNvbnN0IGJhc2ljX2pzb24mKWAKKworICAgIEBub3RlIElmIEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gaGFzIGJvdGggb3ZlcmxvYWRzIG9mCisgICAgYGZyb21fanNvbigpYCwgdGhpcyBvbmUgaXMgY2hvc2VuLgorCisgICAgQHRwYXJhbSBWYWx1ZVR5cGVDViB0aGUgcHJvdmlkZWQgdmFsdWUgdHlwZQorICAgIEB0cGFyYW0gVmFsdWVUeXBlIHRoZSByZXR1cm5lZCB2YWx1ZSB0eXBlCisKKyAgICBAcmV0dXJuIGNvcHkgb2YgdGhlIEpTT04gdmFsdWUsIGNvbnZlcnRlZCB0byBAYSBWYWx1ZVR5cGUKKworICAgIEB0aHJvdyB3aGF0IEByZWYganNvbl9zZXJpYWxpemVyPFZhbHVlVHlwZT4gYGZyb21fanNvbigpYCBtZXRob2QgdGhyb3dzCisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjEuMAorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlQ1YsIHR5cGVuYW1lIFZhbHVlVHlwZSA9IGRldGFpbDo6dW5jdnJlZl90PFZhbHVlVHlwZUNWPiwKKyAgICAgICAgICAgICBkZXRhaWw6OmVuYWJsZV9pZl90PG5vdCBzdGQ6OmlzX3NhbWU8YmFzaWNfanNvbl90LCBWYWx1ZVR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6aGFzX25vbl9kZWZhdWx0X2Zyb21fanNvbjxiYXNpY19qc29uX3QsIFZhbHVlVHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50PiA9IDA+CisgICAgVmFsdWVUeXBlIGdldCgpIGNvbnN0IG5vZXhjZXB0KG5vZXhjZXB0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTlNlcmlhbGl6ZXI8VmFsdWVUeXBlQ1Y+Ojpmcm9tX2pzb24oc3RkOjpkZWNsdmFsPGNvbnN0IGJhc2ljX2pzb25fdCY+KCkpKSkKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQobm90IHN0ZDo6aXNfcmVmZXJlbmNlPFZhbHVlVHlwZUNWPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgImdldCgpIGNhbm5vdCBiZSB1c2VkIHdpdGggcmVmZXJlbmNlIHR5cGVzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UgZ2V0X3JlZigpIik7CisgICAgICAgIHJldHVybiBKU09OU2VyaWFsaXplcjxWYWx1ZVR5cGVDVj46OmZyb21fanNvbigqdGhpcyk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGdldCBhIHBvaW50ZXIgdmFsdWUgKGV4cGxpY2l0KQorCisgICAgRXhwbGljaXQgcG9pbnRlciBhY2Nlc3MgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIEpTT04gdmFsdWUuIE5vIGNvcGllcyBhcmUKKyAgICBtYWRlLgorCisgICAgQHdhcm5pbmcgVGhlIHBvaW50ZXIgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSB1bmRlcmx5aW5nIEpTT04gb2JqZWN0CisgICAgY2hhbmdlcy4KKworICAgIEB0cGFyYW0gUG9pbnRlclR5cGUgcG9pbnRlciB0eXBlOyBtdXN0IGJlIGEgcG9pbnRlciB0byBAcmVmIGFycmF5X3QsIEByZWYKKyAgICBvYmplY3RfdCwgQHJlZiBzdHJpbmdfdCwgQHJlZiBib29sZWFuX3QsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwKKyAgICBAcmVmIG51bWJlcl91bnNpZ25lZF90LCBvciBAcmVmIG51bWJlcl9mbG9hdF90LgorCisgICAgQHJldHVybiBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCBKU09OIHZhbHVlIGlmIHRoZSByZXF1ZXN0ZWQKKyAgICBwb2ludGVyIHR5cGUgQGEgUG9pbnRlclR5cGUgZml0cyB0byB0aGUgSlNPTiB2YWx1ZTsgYG51bGxwdHJgIG90aGVyd2lzZQorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHBvaW50ZXJzIHRvIGludGVybmFsIHZhbHVlcyBvZiBhCisgICAgSlNPTiB2YWx1ZSBjYW4gYmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgbm8gdHlwZSBjb252ZXJzaW9ucyBhcmUgbWFkZSBhbmQgYQorICAgIGBudWxscHRyYCBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgYW5kIHRoZSByZXF1ZXN0ZWQgcG9pbnRlciB0eXBlIGRvZXMgbm90CisgICAgbWF0Y2guLGdldF9fUG9pbnRlclR5cGV9CisKKyAgICBAc2EgQHJlZiBnZXRfcHRyKCkgZm9yIGV4cGxpY2l0IHBvaW50ZXItbWVtYmVyIGFjY2VzcworCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFBvaW50ZXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFBvaW50ZXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFBvaW50ZXJUeXBlIGdldCgpIG5vZXhjZXB0CisgICAgeworICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBnZXRfcHRyCisgICAgICAgIHJldHVybiBnZXRfcHRyPFBvaW50ZXJUeXBlPigpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBnZXQgYSBwb2ludGVyIHZhbHVlIChleHBsaWNpdCkKKyAgICBAY29weWRvYyBnZXQoKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUG9pbnRlclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8UG9pbnRlclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgY29uc3RleHByIGNvbnN0IFBvaW50ZXJUeXBlIGdldCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBnZXRfcHRyCisgICAgICAgIHJldHVybiBnZXRfcHRyPFBvaW50ZXJUeXBlPigpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBnZXQgYSBwb2ludGVyIHZhbHVlIChpbXBsaWNpdCkKKworICAgIEltcGxpY2l0IHBvaW50ZXIgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCBKU09OIHZhbHVlLiBObyBjb3BpZXMgYXJlCisgICAgbWFkZS4KKworICAgIEB3YXJuaW5nIFdyaXRpbmcgZGF0YSB0byB0aGUgcG9pbnRlZSBvZiB0aGUgcmVzdWx0IHlpZWxkcyBhbiB1bmRlZmluZWQKKyAgICBzdGF0ZS4KKworICAgIEB0cGFyYW0gUG9pbnRlclR5cGUgcG9pbnRlciB0eXBlOyBtdXN0IGJlIGEgcG9pbnRlciB0byBAcmVmIGFycmF5X3QsIEByZWYKKyAgICBvYmplY3RfdCwgQHJlZiBzdHJpbmdfdCwgQHJlZiBib29sZWFuX3QsIEByZWYgbnVtYmVyX2ludGVnZXJfdCwKKyAgICBAcmVmIG51bWJlcl91bnNpZ25lZF90LCBvciBAcmVmIG51bWJlcl9mbG9hdF90LiBFbmZvcmNlZCBieSBhIHN0YXRpYworICAgIGFzc2VydGlvbi4KKworICAgIEByZXR1cm4gcG9pbnRlciB0byB0aGUgaW50ZXJuYWxseSBzdG9yZWQgSlNPTiB2YWx1ZSBpZiB0aGUgcmVxdWVzdGVkCisgICAgcG9pbnRlciB0eXBlIEBhIFBvaW50ZXJUeXBlIGZpdHMgdG8gdGhlIEpTT04gdmFsdWU7IGBudWxscHRyYCBvdGhlcndpc2UKKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBwb2ludGVycyB0byBpbnRlcm5hbCB2YWx1ZXMgb2YgYQorICAgIEpTT04gdmFsdWUgY2FuIGJlIHJlcXVlc3RlZC4gTm90ZSB0aGF0IG5vIHR5cGUgY29udmVyc2lvbnMgYXJlIG1hZGUgYW5kIGEKKyAgICBgbnVsbHB0cmAgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGFuZCB0aGUgcmVxdWVzdGVkIHBvaW50ZXIgdHlwZSBkb2VzIG5vdAorICAgIG1hdGNoLixnZXRfcHRyfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFBvaW50ZXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19wb2ludGVyPFBvaW50ZXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFBvaW50ZXJUeXBlIGdldF9wdHIoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHRoZSBQb2ludGVyVHlwZSAocmVtb3ZlIHBvaW50ZXIgYW5kIGNvbnN0KQorICAgICAgICB1c2luZyBwb2ludGVlX3QgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDx0eXBlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZV9wb2ludGVyPHR5cGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX2NvbnN0PFBvaW50ZXJUeXBlPjo6dHlwZT46OnR5cGU+Ojp0eXBlOworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgYWxsb3dlZCB0eXBlcworICAgICAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAgICAgc3RkOjppc19zYW1lPG9iamVjdF90LCBwb2ludGVlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgb3Igc3RkOjppc19zYW1lPGFycmF5X3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8c3RyaW5nX3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8Ym9vbGVhbl90LCBwb2ludGVlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgb3Igc3RkOjppc19zYW1lPG51bWJlcl9pbnRlZ2VyX3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8bnVtYmVyX3Vuc2lnbmVkX3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8bnVtYmVyX2Zsb2F0X3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICAsICJpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlIik7CisKKyAgICAgICAgLy8gZGVsZWdhdGUgdGhlIGNhbGwgdG8gZ2V0X2ltcGxfcHRyPD4oKQorICAgICAgICByZXR1cm4gZ2V0X2ltcGxfcHRyKHN0YXRpY19jYXN0PFBvaW50ZXJUeXBlPihudWxscHRyKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGdldCBhIHBvaW50ZXIgdmFsdWUgKGltcGxpY2l0KQorICAgIEBjb3B5ZG9jIGdldF9wdHIoKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUG9pbnRlclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8UG9pbnRlclR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgc3RkOjppc19jb25zdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPFBvaW50ZXJUeXBlPjo6dHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBjb25zdGV4cHIgY29uc3QgUG9pbnRlclR5cGUgZ2V0X3B0cigpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICAvLyBnZXQgdGhlIHR5cGUgb2YgdGhlIFBvaW50ZXJUeXBlIChyZW1vdmUgcG9pbnRlciBhbmQgY29uc3QpCisgICAgICAgIHVzaW5nIHBvaW50ZWVfdCA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PHR5cGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8dHlwZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmVfY29uc3Q8UG9pbnRlclR5cGU+Ojp0eXBlPjo6dHlwZT46OnR5cGU7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdHlwZSBtYXRjaGVzIHRoZSBhbGxvd2VkIHR5cGVzCisgICAgICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8b2JqZWN0X3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8YXJyYXlfdCwgcG9pbnRlZV90Pjo6dmFsdWUKKyAgICAgICAgICAgIG9yIHN0ZDo6aXNfc2FtZTxzdHJpbmdfdCwgcG9pbnRlZV90Pjo6dmFsdWUKKyAgICAgICAgICAgIG9yIHN0ZDo6aXNfc2FtZTxib29sZWFuX3QsIHBvaW50ZWVfdD46OnZhbHVlCisgICAgICAgICAgICBvciBzdGQ6OmlzX3NhbWU8bnVtYmVyX2ludGVnZXJfdCwgcG9pbnRlZV90Pjo6dmFsdWUKKyAgICAgICAgICAgIG9yIHN0ZDo6aXNfc2FtZTxudW1iZXJfdW5zaWduZWRfdCwgcG9pbnRlZV90Pjo6dmFsdWUKKyAgICAgICAgICAgIG9yIHN0ZDo6aXNfc2FtZTxudW1iZXJfZmxvYXRfdCwgcG9pbnRlZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICwgImluY29tcGF0aWJsZSBwb2ludGVyIHR5cGUiKTsKKworICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBnZXRfaW1wbF9wdHI8PigpIGNvbnN0CisgICAgICAgIHJldHVybiBnZXRfaW1wbF9wdHIoc3RhdGljX2Nhc3Q8UG9pbnRlclR5cGU+KG51bGxwdHIpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZ2V0IGEgcmVmZXJlbmNlIHZhbHVlIChpbXBsaWNpdCkKKworICAgIEltcGxpY2l0IHJlZmVyZW5jZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsbHkgc3RvcmVkIEpTT04gdmFsdWUuIE5vIGNvcGllcworICAgIGFyZSBtYWRlLgorCisgICAgQHdhcm5pbmcgV3JpdGluZyBkYXRhIHRvIHRoZSByZWZlcmVlIG9mIHRoZSByZXN1bHQgeWllbGRzIGFuIHVuZGVmaW5lZAorICAgIHN0YXRlLgorCisgICAgQHRwYXJhbSBSZWZlcmVuY2VUeXBlIHJlZmVyZW5jZSB0eXBlOyBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIEByZWYgYXJyYXlfdCwKKyAgICBAcmVmIG9iamVjdF90LCBAcmVmIHN0cmluZ190LCBAcmVmIGJvb2xlYW5fdCwgQHJlZiBudW1iZXJfaW50ZWdlcl90LCBvcgorICAgIEByZWYgbnVtYmVyX2Zsb2F0X3QuIEVuZm9yY2VkIGJ5IHN0YXRpYyBhc3NlcnRpb24uCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWxseSBzdG9yZWQgSlNPTiB2YWx1ZSBpZiB0aGUgcmVxdWVzdGVkCisgICAgcmVmZXJlbmNlIHR5cGUgQGEgUmVmZXJlbmNlVHlwZSBmaXRzIHRvIHRoZSBKU09OIHZhbHVlOyB0aHJvd3MKKyAgICB0eXBlX2Vycm9yLjMwMyBvdGhlcndpc2UKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwMyBpbiBjYXNlIHBhc3NlZCB0eXBlIEBhIFJlZmVyZW5jZVR5cGUgaXMgaW5jb21wYXRpYmxlCisgICAgd2l0aCB0aGUgc3RvcmVkIEpTT04gdmFsdWU7IHNlZSBleGFtcGxlIGJlbG93CisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBzZXZlcmFsIGNhbGxzIHRvIGBnZXRfcmVmKClgLixnZXRfcmVmfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4xLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlZmVyZW5jZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3JlZmVyZW5jZTxSZWZlcmVuY2VUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFJlZmVyZW5jZVR5cGUgZ2V0X3JlZigpCisgICAgeworICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIGdldF9yZWZfaW1wbAorICAgICAgICByZXR1cm4gZ2V0X3JlZl9pbXBsPFJlZmVyZW5jZVR5cGU+KCp0aGlzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZ2V0IGEgcmVmZXJlbmNlIHZhbHVlIChpbXBsaWNpdCkKKyAgICBAY29weWRvYyBnZXRfcmVmKCkKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlZmVyZW5jZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3JlZmVyZW5jZTxSZWZlcmVuY2VUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3Q8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFJlZmVyZW5jZVR5cGU+Ojp0eXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFJlZmVyZW5jZVR5cGUgZ2V0X3JlZigpIGNvbnN0CisgICAgeworICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIGdldF9yZWZfaW1wbAorICAgICAgICByZXR1cm4gZ2V0X3JlZl9pbXBsPFJlZmVyZW5jZVR5cGU+KCp0aGlzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZ2V0IGEgdmFsdWUgKGltcGxpY2l0KQorCisgICAgSW1wbGljaXQgdHlwZSBjb252ZXJzaW9uIGJldHdlZW4gdGhlIEpTT04gdmFsdWUgYW5kIGEgY29tcGF0aWJsZSB2YWx1ZS4KKyAgICBUaGUgY2FsbCBpcyByZWFsaXplZCBieSBjYWxsaW5nIEByZWYgZ2V0KCkgY29uc3QuCisKKyAgICBAdHBhcmFtIFZhbHVlVHlwZSBub24tcG9pbnRlciB0eXBlIGNvbXBhdGlibGUgdG8gdGhlIEpTT04gdmFsdWUsIGZvcgorICAgIGluc3RhbmNlIGBpbnRgIGZvciBKU09OIGludGVnZXIgbnVtYmVycywgYGJvb2xgIGZvciBKU09OIGJvb2xlYW5zLCBvcgorICAgIGBzdGQ6OnZlY3RvcmAgdHlwZXMgZm9yIEpTT04gYXJyYXlzLiBUaGUgY2hhcmFjdGVyIHR5cGUgb2YgQHJlZiBzdHJpbmdfdAorICAgIGFzIHdlbGwgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdCBvZiB0aGlzIHR5cGUgaXMgZXhjbHVkZWQgdG8gYXZvaWQKKyAgICBhbWJpZ3VpdGllcyBhcyB0aGVzZSB0eXBlcyBpbXBsaWNpdGx5IGNvbnZlcnQgdG8gYHN0ZDo6c3RyaW5nYC4KKworICAgIEByZXR1cm4gY29weSBvZiB0aGUgSlNPTiB2YWx1ZSwgY29udmVydGVkIHRvIHR5cGUgQGEgVmFsdWVUeXBlCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDIgaW4gY2FzZSBwYXNzZWQgdHlwZSBAYSBWYWx1ZVR5cGUgaXMgaW5jb21wYXRpYmxlCisgICAgdG8gdGhlIEpTT04gdmFsdWUgdHlwZSAoZS5nLiwgdGhlIEpTT04gdmFsdWUgaXMgb2YgdHlwZSBib29sZWFuLCBidXQgYQorICAgIHN0cmluZyBpcyByZXF1ZXN0ZWQpOyBzZWUgZXhhbXBsZSBiZWxvdworCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBKU09OIHZhbHVlLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIHNldmVyYWwgY29udmVyc2lvbnMgZnJvbSBKU09OIHZhbHVlcworICAgIHRvIG90aGVyIHR5cGVzLiBUaGVyZSBhIGZldyB0aGluZ3MgdG8gbm90ZTogKDEpIEZsb2F0aW5nLXBvaW50IG51bWJlcnMgY2FuCisgICAgYmUgY29udmVydGVkIHRvIGludGVnZXJzXCwgKDIpIEEgSlNPTiBhcnJheSBjYW4gYmUgY29udmVydGVkIHRvIGEgc3RhbmRhcmQKKyAgICBgc3RkOjp2ZWN0b3I8c2hvcnQ+YFwsICgzKSBBIEpTT04gb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gQysrCisgICAgYXNzb2NpYXRpdmUgY29udGFpbmVycyBzdWNoIGFzIGBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmdcLAorICAgIGpzb24+YC4sb3BlcmF0b3JfX1ZhbHVlVHlwZX0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWYgPAorICAgICAgICAgICAgICAgICAgIG5vdCBzdGQ6OmlzX3BvaW50ZXI8VmFsdWVUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxWYWx1ZVR5cGUsIGRldGFpbDo6anNvbl9yZWY8YmFzaWNfanNvbj4+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgICBub3Qgc3RkOjppc19zYW1lPFZhbHVlVHlwZSwgdHlwZW5hbWUgc3RyaW5nX3Q6OnZhbHVlX3R5cGU+Ojp2YWx1ZQorI2lmbmRlZiBfTVNDX1ZFUiAgLy8gZml4IGZvciBpc3N1ZSAjMTY3IG9wZXJhdG9yPDwgYW1iaWd1aXR5IHVuZGVyIFZTMjAxNQorICAgICAgICAgICAgICAgICAgIGFuZCBub3Qgc3RkOjppc19zYW1lPFZhbHVlVHlwZSwgc3RkOjppbml0aWFsaXplcl9saXN0PHR5cGVuYW1lIHN0cmluZ190Ojp2YWx1ZV90eXBlPj46OnZhbHVlCisjZW5kaWYKKyNpZiBkZWZpbmVkKEpTT05fSEFTX0NQUF8xNykKKyAgICAgICAgICAgICAgICAgICBhbmQgbm90IHN0ZDo6aXNfc2FtZTxWYWx1ZVR5cGUsIHR5cGVuYW1lIHN0ZDo6c3RyaW5nX3ZpZXc+Ojp2YWx1ZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgLCBpbnQgPjo6dHlwZSA9IDAgPgorICAgIG9wZXJhdG9yIFZhbHVlVHlwZSgpIGNvbnN0CisgICAgeworICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgY2FsbCB0byBnZXQ8PigpIGNvbnN0CisgICAgICAgIHJldHVybiBnZXQ8VmFsdWVUeXBlPigpOworICAgIH0KKworICAgIC8vLyBAfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGVsZW1lbnQgYWNjZXNzIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBlbGVtZW50IGFjY2VzcworICAgIC8vLyBBY2Nlc3MgdG8gdGhlIEpTT04gdmFsdWUuCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50IHdpdGggYm91bmRzIGNoZWNraW5nCisKKyAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHgsIHdpdGgKKyAgICBib3VuZHMgY2hlY2tpbmcuCisKKyAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNCBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXk7IGluIHRoaXMgY2FzZSwKKyAgICBjYWxsaW5nIGBhdGAgd2l0aCBhbiBpbmRleCBtYWtlcyBubyBzZW5zZS4gU2VlIGV4YW1wbGUgYmVsb3cuCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDEgaWYgdGhlIGluZGV4IEBhIGlkeCBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGFycmF5OworICAgIHRoYXQgaXMsIGBpZHggPj0gc2l6ZSgpYC4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IGFycmF5IGVsZW1lbnRzIGNhbiBiZSByZWFkIGFuZAorICAgIHdyaXR0ZW4gdXNpbmcgYGF0KClgLiBJdCBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgZGlmZmVyZW50IGV4Y2VwdGlvbnMgdGhhdAorICAgIGNhbiBiZSB0aHJvd24uLGF0X19zaXplX3R5cGV9CisgICAgKi8KKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIGlkeCkKKyAgICB7CisgICAgICAgIC8vIGF0IG9ubHkgd29ya3MgZm9yIGFycmF5cworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoaXNfYXJyYXkoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVFJZCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPmF0KGlkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBKU09OX0NBVENIIChzdGQ6Om91dF9vZl9yYW5nZSYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGJldHRlciBleGNlcHRpb24gZXhwbGFuYXRpb24KKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMSwgImFycmF5IGluZGV4ICIgKyBzdGQ6OnRvX3N0cmluZyhpZHgpICsgIiBpcyBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDQsICJjYW5ub3QgdXNlIGF0KCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50IHdpdGggYm91bmRzIGNoZWNraW5nCisKKyAgICBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHgsCisgICAgd2l0aCBib3VuZHMgY2hlY2tpbmcuCisKKyAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNCBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXk7IGluIHRoaXMgY2FzZSwKKyAgICBjYWxsaW5nIGBhdGAgd2l0aCBhbiBpbmRleCBtYWtlcyBubyBzZW5zZS4gU2VlIGV4YW1wbGUgYmVsb3cuCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDEgaWYgdGhlIGluZGV4IEBhIGlkeCBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGFycmF5OworICAgIHRoYXQgaXMsIGBpZHggPj0gc2l6ZSgpYC4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IGFycmF5IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCisgICAgYGF0KClgLiBJdCBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgZGlmZmVyZW50IGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duLiwKKyAgICBhdF9fc2l6ZV90eXBlX2NvbnN0fQorICAgICovCisgICAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBpZHgpIGNvbnN0CisgICAgeworICAgICAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBhcnJheXMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX2FycmF5KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RSWQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLmFycmF5LT5hdChpZHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjpvdXRfb2ZfcmFuZ2UmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBiZXR0ZXIgZXhjZXB0aW9uIGV4cGxhbmF0aW9uCisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDEsICJhcnJheSBpbmRleCAiICsgc3RkOjp0b19zdHJpbmcoaWR4KSArICIgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA0LCAiY2Fubm90IHVzZSBhdCgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQgd2l0aCBib3VuZHMgY2hlY2tpbmcKKworICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleSwgd2l0aAorICAgIGJvdW5kcyBjaGVja2luZy4KKworICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5CisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDQgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjdDsgaW4gdGhpcyBjYXNlLAorICAgIGNhbGxpbmcgYGF0YCB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLiBTZWUgZXhhbXBsZSBiZWxvdy4KKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMyBpZiB0aGUga2V5IEBhIGtleSBpcyBpcyBub3Qgc3RvcmVkIGluIHRoZSBvYmplY3Q7CisgICAgdGhhdCBpcywgYGZpbmQoa2V5KSA9PSBlbmQoKWAuIFNlZSBleGFtcGxlIGJlbG93LgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBzYSBAcmVmIG9wZXJhdG9yW10oY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgZm9yIHVuY2hlY2tlZAorICAgIGFjY2VzcyBieSByZWZlcmVuY2UKKyAgICBAc2EgQHJlZiB2YWx1ZSgpIGZvciBhY2Nlc3MgYnkgdmFsdWUgd2l0aCBhIGRlZmF1bHQgdmFsdWUKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcmVhZCBhbmQKKyAgICB3cml0dGVuIHVzaW5nIGBhdCgpYC4gSXQgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIGRpZmZlcmVudCBleGNlcHRpb25zIHRoYXQKKyAgICBjYW4gYmUgdGhyb3duLixhdF9fb2JqZWN0X3Rfa2V5X3R5cGV9CisgICAgKi8KKyAgICByZWZlcmVuY2UgYXQoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJiBrZXkpCisgICAgeworICAgICAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19vYmplY3QoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVFJZCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5hdChrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjpvdXRfb2ZfcmFuZ2UmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBiZXR0ZXIgZXhjZXB0aW9uIGV4cGxhbmF0aW9uCisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDMsICJrZXkgJyIgKyBrZXkgKyAiJyBub3QgZm91bmQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDQsICJjYW5ub3QgdXNlIGF0KCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBvYmplY3QgZWxlbWVudCB3aXRoIGJvdW5kcyBjaGVja2luZworCisgICAgUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB3aXRoIHNwZWNpZmllZCBrZXkgQGEga2V5LAorICAgIHdpdGggYm91bmRzIGNoZWNraW5nLgorCisgICAgQHBhcmFtW2luXSBrZXkgIGtleSBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKKworICAgIEByZXR1cm4gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGtleSBAYSBrZXkKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNCBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0OyBpbiB0aGlzIGNhc2UsCisgICAgY2FsbGluZyBgYXRgIHdpdGggYSBrZXkgbWFrZXMgbm8gc2Vuc2UuIFNlZSBleGFtcGxlIGJlbG93LgorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAzIGlmIHRoZSBrZXkgQGEga2V5IGlzIGlzIG5vdCBzdG9yZWQgaW4gdGhlIG9iamVjdDsKKyAgICB0aGF0IGlzLCBgZmluZChrZXkpID09IGVuZCgpYC4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCisKKyAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLgorCisgICAgQHNhIEByZWYgb3BlcmF0b3JbXShjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmKSBmb3IgdW5jaGVja2VkCisgICAgYWNjZXNzIGJ5IHJlZmVyZW5jZQorICAgIEBzYSBAcmVmIHZhbHVlKCkgZm9yIGFjY2VzcyBieSB2YWx1ZSB3aXRoIGEgZGVmYXVsdCB2YWx1ZQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCisgICAgYGF0KClgLiBJdCBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgZGlmZmVyZW50IGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duLiwKKyAgICBhdF9fb2JqZWN0X3Rfa2V5X3R5cGVfY29uc3R9CisgICAgKi8KKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJiBrZXkpIGNvbnN0CisgICAgeworICAgICAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19vYmplY3QoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVFJZCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5hdChrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSlNPTl9DQVRDSCAoc3RkOjpvdXRfb2ZfcmFuZ2UmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBiZXR0ZXIgZXhjZXB0aW9uIGV4cGxhbmF0aW9uCisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDMsICJrZXkgJyIgKyBrZXkgKyAiJyBub3QgZm91bmQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDQsICJjYW5ub3QgdXNlIGF0KCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50CisKKyAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHguCisKKyAgICBAbm90ZSBJZiBAYSBpZHggaXMgYmV5b25kIHRoZSByYW5nZSBvZiB0aGUgYXJyYXkgKGkuZS4sIGBpZHggPj0gc2l6ZSgpYCksCisgICAgdGhlbiB0aGUgYXJyYXkgaXMgc2lsZW50bHkgZmlsbGVkIHVwIHdpdGggYG51bGxgIHZhbHVlcyB0byBtYWtlIGBpZHhgIGEKKyAgICB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIGxhc3Qgc3RvcmVkIGVsZW1lbnQuCisKKyAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXkgb3IgbnVsbDsgaW4gdGhhdAorICAgIGNhc2VzLCB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhbiBpbmRleCBtYWtlcyBubyBzZW5zZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50IGlmIEBhIGlkeCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGFycmF5LiBPdGhlcndpc2UKKyAgICBsaW5lYXIgaW4gYGlkeCAtIHNpemUoKWAuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IGFycmF5IGVsZW1lbnRzIGNhbiBiZSByZWFkIGFuZAorICAgIHdyaXR0ZW4gdXNpbmcgYFtdYCBvcGVyYXRvci4gTm90ZSB0aGUgYWRkaXRpb24gb2YgYG51bGxgCisgICAgdmFsdWVzLixvcGVyYXRvcmFycmF5X19zaXplX3R5cGV9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIGlkeCkKKyAgICB7CisgICAgICAgIC8vIGltcGxpY2l0bHkgY29udmVydCBudWxsIHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5CisgICAgICAgIGlmIChpc19udWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgbV92YWx1ZS5hcnJheSA9IGNyZWF0ZTxhcnJheV90PigpOworICAgICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlcmF0b3JbXSBvbmx5IHdvcmtzIGZvciBhcnJheXMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX2FycmF5KCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmaWxsIHVwIGFycmF5IHdpdGggbnVsbCB2YWx1ZXMgaWYgZ2l2ZW4gaWR4IGlzIG91dHNpZGUgcmFuZ2UKKyAgICAgICAgICAgIGlmIChpZHggPj0gbV92YWx1ZS5hcnJheS0+c2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUuYXJyYXktPmluc2VydChtX3ZhbHVlLmFycmF5LT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4IC0gbV92YWx1ZS5hcnJheS0+c2l6ZSgpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfanNvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPm9wZXJhdG9yW10oaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBhcnJheSBlbGVtZW50CisKKyAgICBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHNwZWNpZmllZCBsb2NhdGlvbiBAYSBpZHguCisKKyAgICBAcGFyYW1baW5dIGlkeCAgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBpbmRleCBAYSBpZHgKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNSBpZiB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gYXJyYXk7IGluIHRoYXQgY2FzZSwKKyAgICB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhbiBpbmRleCBtYWtlcyBubyBzZW5zZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBhcnJheSBlbGVtZW50cyBjYW4gYmUgcmVhZCB1c2luZworICAgIHRoZSBgW11gIG9wZXJhdG9yLixvcGVyYXRvcmFycmF5X19zaXplX3R5cGVfY29uc3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIGlkeCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIGNvbnN0IG9wZXJhdG9yW10gb25seSB3b3JrcyBmb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPm9wZXJhdG9yW10oaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBvYmplY3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB3aXRoIHNwZWNpZmllZCBrZXkgQGEga2V5LgorCisgICAgQG5vdGUgSWYgQGEga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgb2JqZWN0LCB0aGVuIGl0IGlzIHNpbGVudGx5IGFkZGVkIHRvCisgICAgdGhlIG9iamVjdCBhbmQgZmlsbGVkIHdpdGggYSBgbnVsbGAgdmFsdWUgdG8gbWFrZSBga2V5YCBhIHZhbGlkIHJlZmVyZW5jZS4KKyAgICBJbiBjYXNlIHRoZSB2YWx1ZSB3YXMgYG51bGxgIGJlZm9yZSwgaXQgaXMgY29udmVydGVkIHRvIGFuIG9iamVjdC4KKworICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5CisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDUgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjdCBvciBudWxsOyBpbiB0aGF0CisgICAgY2FzZXMsIHVzaW5nIHRoZSBbXSBvcGVyYXRvciB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIGFuZAorICAgIHdyaXR0ZW4gdXNpbmcgdGhlIGBbXWAgb3BlcmF0b3IuLG9wZXJhdG9yYXJyYXlfX2tleV90eXBlfQorCisgICAgQHNhIEByZWYgYXQoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgZm9yIGFjY2VzcyBieSByZWZlcmVuY2UKKyAgICB3aXRoIHJhbmdlIGNoZWNraW5nCisgICAgQHNhIEByZWYgdmFsdWUoKSBmb3IgYWNjZXNzIGJ5IHZhbHVlIHdpdGggYSBkZWZhdWx0IHZhbHVlCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJiBrZXkpCisgICAgeworICAgICAgICAvLyBpbXBsaWNpdGx5IGNvbnZlcnQgbnVsbCB2YWx1ZSB0byBhbiBlbXB0eSBvYmplY3QKKyAgICAgICAgaWYgKGlzX251bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QgPSBjcmVhdGU8b2JqZWN0X3Q+KCk7CisgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVyYXRvcltdIG9ubHkgd29ya3MgZm9yIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5vcGVyYXRvcltdKGtleSk7CisgICAgICAgIH0KKworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDUsICJjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJlYWQtb25seSBhY2Nlc3Mgc3BlY2lmaWVkIG9iamVjdCBlbGVtZW50CisKKyAgICBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHdpdGggc3BlY2lmaWVkIGtleSBAYSBrZXkuIE5vCisgICAgYm91bmRzIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4KKworICAgIEB3YXJuaW5nIElmIHRoZSBlbGVtZW50IHdpdGgga2V5IEBhIGtleSBkb2VzIG5vdCBleGlzdCwgdGhlIGJlaGF2aW9yIGlzCisgICAgdW5kZWZpbmVkLgorCisgICAgQHBhcmFtW2luXSBrZXkgIGtleSBvZiB0aGUgZWxlbWVudCB0byBhY2Nlc3MKKworICAgIEByZXR1cm4gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IGtleSBAYSBrZXkKKworICAgIEBwcmUgVGhlIGVsZW1lbnQgd2l0aCBrZXkgQGEga2V5IG11c3QgZXhpc3QuICoqVGhpcyBwcmVjb25kaXRpb24gaXMKKyAgICAgICAgIGVuZm9yY2VkIHdpdGggYW4gYXNzZXJ0aW9uLioqCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDUgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjdDsgaW4gdGhhdCBjYXNlLAorICAgIHVzaW5nIHRoZSBbXSBvcGVyYXRvciB3aXRoIGEga2V5IG1ha2VzIG5vIHNlbnNlLgorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgb2JqZWN0IGVsZW1lbnRzIGNhbiBiZSByZWFkIHVzaW5nCisgICAgdGhlIGBbXWAgb3BlcmF0b3IuLG9wZXJhdG9yYXJyYXlfX2tleV90eXBlX2NvbnN0fQorCisgICAgQHNhIEByZWYgYXQoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgZm9yIGFjY2VzcyBieSByZWZlcmVuY2UKKyAgICB3aXRoIHJhbmdlIGNoZWNraW5nCisgICAgQHNhIEByZWYgdmFsdWUoKSBmb3IgYWNjZXNzIGJ5IHZhbHVlIHdpdGggYSBkZWZhdWx0IHZhbHVlCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJiBrZXkpIGNvbnN0CisgICAgeworICAgICAgICAvLyBjb25zdCBvcGVyYXRvcltdIG9ubHkgd29ya3MgZm9yIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSkgIT0gbV92YWx1ZS5vYmplY3QtPmVuZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLm9iamVjdC0+ZmluZChrZXkpLT5zZWNvbmQ7CisgICAgICAgIH0KKworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDUsICJjYW5ub3QgdXNlIG9wZXJhdG9yW10gd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgb2JqZWN0IGVsZW1lbnQKKworICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQga2V5IEBhIGtleS4KKworICAgIEBub3RlIElmIEBhIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIG9iamVjdCwgdGhlbiBpdCBpcyBzaWxlbnRseSBhZGRlZCB0bworICAgIHRoZSBvYmplY3QgYW5kIGZpbGxlZCB3aXRoIGEgYG51bGxgIHZhbHVlIHRvIG1ha2UgYGtleWAgYSB2YWxpZCByZWZlcmVuY2UuCisgICAgSW4gY2FzZSB0aGUgdmFsdWUgd2FzIGBudWxsYCBiZWZvcmUsIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBvYmplY3QuCisKKyAgICBAcGFyYW1baW5dIGtleSAga2V5IG9mIHRoZSBlbGVtZW50IHRvIGFjY2VzcworCisgICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQga2V5IEBhIGtleQorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA1IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Qgb3IgbnVsbDsgaW4gdGhhdAorICAgIGNhc2VzLCB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhIGtleSBtYWtlcyBubyBzZW5zZS4KKworICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcmVhZCBhbmQKKyAgICB3cml0dGVuIHVzaW5nIHRoZSBgW11gIG9wZXJhdG9yLixvcGVyYXRvcmFycmF5X19rZXlfdHlwZX0KKworICAgIEBzYSBAcmVmIGF0KGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYpIGZvciBhY2Nlc3MgYnkgcmVmZXJlbmNlCisgICAgd2l0aCByYW5nZSBjaGVja2luZworICAgIEBzYSBAcmVmIHZhbHVlKCkgZm9yIGFjY2VzcyBieSB2YWx1ZSB3aXRoIGEgZGVmYXVsdCB2YWx1ZQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4xLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oVCoga2V5KQorICAgIHsKKyAgICAgICAgLy8gaW1wbGljaXRseSBjb252ZXJ0IG51bGwgdG8gb2JqZWN0CisgICAgICAgIGlmIChpc19udWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjpvYmplY3Q7CisgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19vYmplY3QoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLm9iamVjdC0+b3BlcmF0b3JbXShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA1LCAiY2Fubm90IHVzZSBvcGVyYXRvcltdIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZWFkLW9ubHkgYWNjZXNzIHNwZWNpZmllZCBvYmplY3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB3aXRoIHNwZWNpZmllZCBrZXkgQGEga2V5LiBObworICAgIGJvdW5kcyBjaGVja2luZyBpcyBwZXJmb3JtZWQuCisKKyAgICBAd2FybmluZyBJZiB0aGUgZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZSBiZWhhdmlvciBpcworICAgIHVuZGVmaW5lZC4KKworICAgIEBwYXJhbVtpbl0ga2V5ICBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWNjZXNzCisKKyAgICBAcmV0dXJuIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5CisKKyAgICBAcHJlIFRoZSBlbGVtZW50IHdpdGgga2V5IEBhIGtleSBtdXN0IGV4aXN0LiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzCisgICAgICAgICBlbmZvcmNlZCB3aXRoIGFuIGFzc2VydGlvbi4qKgorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA1IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Q7IGluIHRoYXQgY2FzZSwKKyAgICB1c2luZyB0aGUgW10gb3BlcmF0b3Igd2l0aCBhIGtleSBtYWtlcyBubyBzZW5zZS4KKworICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcmVhZCB1c2luZworICAgIHRoZSBgW11gIG9wZXJhdG9yLixvcGVyYXRvcmFycmF5X19rZXlfdHlwZV9jb25zdH0KKworICAgIEBzYSBAcmVmIGF0KGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYpIGZvciBhY2Nlc3MgYnkgcmVmZXJlbmNlCisgICAgd2l0aCByYW5nZSBjaGVja2luZworICAgIEBzYSBAcmVmIHZhbHVlKCkgZm9yIGFjY2VzcyBieSB2YWx1ZSB3aXRoIGEgZGVmYXVsdCB2YWx1ZQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4xLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oVCoga2V5KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gYXQgb25seSB3b3JrcyBmb3Igb2JqZWN0cworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV92YWx1ZS5vYmplY3QtPmZpbmQoa2V5KSAhPSBtX3ZhbHVlLm9iamVjdC0+ZW5kKCkpOworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5maW5kKGtleSktPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNSwgImNhbm5vdCB1c2Ugb3BlcmF0b3JbXSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBvYmplY3QgZWxlbWVudCB3aXRoIGRlZmF1bHQgdmFsdWUKKworICAgIFJldHVybnMgZWl0aGVyIGEgY29weSBvZiBhbiBvYmplY3QncyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQga2V5IEBhIGtleQorICAgIG9yIGEgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiBubyBlbGVtZW50IHdpdGgga2V5IEBhIGtleSBleGlzdHMuCisKKyAgICBUaGUgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nCisgICAgQGNvZGUgey5jcHB9CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGF0KGtleSk7CisgICAgfSBjYXRjaChvdXRfb2ZfcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgICAgfQorICAgIEBlbmRjb2RlCisKKyAgICBAbm90ZSBVbmxpa2UgQHJlZiBhdChjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmKSwgdGhpcyBmdW5jdGlvbgorICAgIGRvZXMgbm90IHRocm93IGlmIHRoZSBnaXZlbiBrZXkgQGEga2V5IHdhcyBub3QgZm91bmQuCisKKyAgICBAbm90ZSBVbmxpa2UgQHJlZiBvcGVyYXRvcltdKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYga2V5KSwgdGhpcworICAgIGZ1bmN0aW9uIGRvZXMgbm90IGltcGxpY2l0bHkgYWRkIGFuIGVsZW1lbnQgdG8gdGhlIHBvc2l0aW9uIGRlZmluZWQgYnkgQGEKKyAgICBrZXkuIFRoaXMgZnVuY3Rpb24gaXMgZnVydGhlcm1vcmUgYWxzbyBhcHBsaWNhYmxlIHRvIGNvbnN0IG9iamVjdHMuCisKKyAgICBAcGFyYW1baW5dIGtleSAga2V5IG9mIHRoZSBlbGVtZW50IHRvIGFjY2VzcworICAgIEBwYXJhbVtpbl0gZGVmYXVsdF92YWx1ZSAgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBAYSBrZXkgaXMgbm90IGZvdW5kCisKKyAgICBAdHBhcmFtIFZhbHVlVHlwZSB0eXBlIGNvbXBhdGlibGUgdG8gSlNPTiB2YWx1ZXMsIGZvciBpbnN0YW5jZSBgaW50YCBmb3IKKyAgICBKU09OIGludGVnZXIgbnVtYmVycywgYGJvb2xgIGZvciBKU09OIGJvb2xlYW5zLCBvciBgc3RkOjp2ZWN0b3JgIHR5cGVzIGZvcgorICAgIEpTT04gYXJyYXlzLiBOb3RlIHRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCB2YWx1ZSBhdCBAYSBrZXkgYW5kIHRoZSBkZWZhdWx0CisgICAgdmFsdWUgQGEgZGVmYXVsdF92YWx1ZSBtdXN0IGJlIGNvbXBhdGlibGUuCisKKyAgICBAcmV0dXJuIGNvcHkgb2YgdGhlIGVsZW1lbnQgYXQga2V5IEBhIGtleSBvciBAYSBkZWZhdWx0X3ZhbHVlIGlmIEBhIGtleQorICAgIGlzIG5vdCBmb3VuZAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA2IGlmIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3Q7IGluIHRoYXQgY2FzZSwKKyAgICB1c2luZyBgdmFsdWUoKWAgd2l0aCBhIGtleSBtYWtlcyBubyBzZW5zZS4KKworICAgIEBjb21wbGV4aXR5IExvZ2FyaXRobWljIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdCBlbGVtZW50cyBjYW4gYmUgcXVlcmllZAorICAgIHdpdGggYSBkZWZhdWx0IHZhbHVlLixiYXNpY19qc29uX192YWx1ZX0KKworICAgIEBzYSBAcmVmIGF0KGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYpIGZvciBhY2Nlc3MgYnkgcmVmZXJlbmNlCisgICAgd2l0aCByYW5nZSBjaGVja2luZworICAgIEBzYSBAcmVmIG9wZXJhdG9yW10oY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgZm9yIHVuY2hlY2tlZAorICAgIGFjY2VzcyBieSByZWZlcmVuY2UKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBWYWx1ZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPGJhc2ljX2pzb25fdCwgVmFsdWVUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFZhbHVlVHlwZSB2YWx1ZShjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmIGtleSwgY29uc3QgVmFsdWVUeXBlJiBkZWZhdWx0X3ZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gYXQgb25seSB3b3JrcyBmb3Igb2JqZWN0cworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiBrZXkgaXMgZm91bmQsIHJldHVybiB2YWx1ZSBhbmQgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBmaW5kKGtleSk7CisgICAgICAgICAgICBpZiAoaXQgIT0gZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICppdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDYsICJjYW5ub3QgdXNlIHZhbHVlKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIG92ZXJsb2FkIGZvciBhIGRlZmF1bHQgdmFsdWUgb2YgdHlwZSBjb25zdCBjaGFyKgorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OnZhbHVlKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYsIFZhbHVlVHlwZSkgY29uc3QKKyAgICAqLworICAgIHN0cmluZ190IHZhbHVlKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYga2V5LCBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlKGtleSwgc3RyaW5nX3QoZGVmYXVsdF92YWx1ZSkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBhY2Nlc3Mgc3BlY2lmaWVkIG9iamVjdCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIgd2l0aCBkZWZhdWx0IHZhbHVlCisKKyAgICBSZXR1cm5zIGVpdGhlciBhIGNvcHkgb2YgYW4gb2JqZWN0J3MgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGtleSBAYSBrZXkKKyAgICBvciBhIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgbm8gZWxlbWVudCB3aXRoIGtleSBAYSBrZXkgZXhpc3RzLgorCisgICAgVGhlIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvIGV4ZWN1dGluZworICAgIEBjb2RlIHsuY3BwfQorICAgIHRyeSB7CisgICAgICAgIHJldHVybiBhdChwdHIpOworICAgIH0gY2F0Y2gob3V0X29mX3JhbmdlKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICAgIH0KKyAgICBAZW5kY29kZQorCisgICAgQG5vdGUgVW5saWtlIEByZWYgYXQoY29uc3QganNvbl9wb2ludGVyJiksIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGhyb3cKKyAgICBpZiB0aGUgZ2l2ZW4ga2V5IEBhIGtleSB3YXMgbm90IGZvdW5kLgorCisgICAgQHBhcmFtW2luXSBwdHIgIGEgSlNPTiBwb2ludGVyIHRvIHRoZSBlbGVtZW50IHRvIGFjY2VzcworICAgIEBwYXJhbVtpbl0gZGVmYXVsdF92YWx1ZSAgdGhlIHZhbHVlIHRvIHJldHVybiBpZiBAYSBwdHIgZm91bmQgbm8gdmFsdWUKKworICAgIEB0cGFyYW0gVmFsdWVUeXBlIHR5cGUgY29tcGF0aWJsZSB0byBKU09OIHZhbHVlcywgZm9yIGluc3RhbmNlIGBpbnRgIGZvcgorICAgIEpTT04gaW50ZWdlciBudW1iZXJzLCBgYm9vbGAgZm9yIEpTT04gYm9vbGVhbnMsIG9yIGBzdGQ6OnZlY3RvcmAgdHlwZXMgZm9yCisgICAgSlNPTiBhcnJheXMuIE5vdGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHZhbHVlIGF0IEBhIGtleSBhbmQgdGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBAYSBkZWZhdWx0X3ZhbHVlIG11c3QgYmUgY29tcGF0aWJsZS4KKworICAgIEByZXR1cm4gY29weSBvZiB0aGUgZWxlbWVudCBhdCBrZXkgQGEga2V5IG9yIEBhIGRlZmF1bHRfdmFsdWUgaWYgQGEga2V5CisgICAgaXMgbm90IGZvdW5kCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDYgaWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuIG9iamVjOyBpbiB0aGF0IGNhc2UsCisgICAgdXNpbmcgYHZhbHVlKClgIHdpdGggYSBrZXkgbWFrZXMgbm8gc2Vuc2UuCisKKyAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBvYmplY3QgZWxlbWVudHMgY2FuIGJlIHF1ZXJpZWQKKyAgICB3aXRoIGEgZGVmYXVsdCB2YWx1ZS4sYmFzaWNfanNvbl9fdmFsdWVfcHRyfQorCisgICAgQHNhIEByZWYgb3BlcmF0b3JbXShjb25zdCBqc29uX3BvaW50ZXImKSBmb3IgdW5jaGVja2VkIGFjY2VzcyBieSByZWZlcmVuY2UKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4yCisgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBWYWx1ZVR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPGJhc2ljX2pzb25fdCwgVmFsdWVUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIFZhbHVlVHlwZSB2YWx1ZShjb25zdCBqc29uX3BvaW50ZXImIHB0ciwgY29uc3QgVmFsdWVUeXBlJiBkZWZhdWx0X3ZhbHVlKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gYXQgb25seSB3b3JrcyBmb3Igb2JqZWN0cworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiBwb2ludGVyIHJlc29sdmVzIGEgdmFsdWUsIHJldHVybiBpdCBvciB1c2UgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHRyLmdldF9jaGVja2VkKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSlNPTl9DQVRDSCAob3V0X29mX3JhbmdlJikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNiwgImNhbm5vdCB1c2UgdmFsdWUoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgb3ZlcmxvYWQgZm9yIGEgZGVmYXVsdCB2YWx1ZSBvZiB0eXBlIGNvbnN0IGNoYXIqCisgICAgQGNvcHlkb2MgYmFzaWNfanNvbjo6dmFsdWUoY29uc3QganNvbl9wb2ludGVyJiwgVmFsdWVUeXBlKSBjb25zdAorICAgICovCisgICAgc3RyaW5nX3QgdmFsdWUoY29uc3QganNvbl9wb2ludGVyJiBwdHIsIGNvbnN0IGNoYXIqIGRlZmF1bHRfdmFsdWUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUocHRyLCBzdHJpbmdfdChkZWZhdWx0X3ZhbHVlKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFjY2VzcyB0aGUgZmlyc3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLiBGb3IgYSBKU09OCisgICAgY29udGFpbmVyIGBjYCwgdGhlIGV4cHJlc3Npb24gYGMuZnJvbnQoKWAgaXMgZXF1aXZhbGVudCB0byBgKmMuYmVnaW4oKWAuCisKKyAgICBAcmV0dXJuIEluIGNhc2Ugb2YgYSBzdHJ1Y3R1cmVkIHR5cGUgKGFycmF5IG9yIG9iamVjdCksIGEgcmVmZXJlbmNlIHRvIHRoZQorICAgIGZpcnN0IGVsZW1lbnQgaXMgcmV0dXJuZWQuIEluIGNhc2Ugb2YgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4gdmFsdWVzLCBhCisgICAgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQHByZSBUaGUgSlNPTiB2YWx1ZSBtdXN0IG5vdCBiZSBgbnVsbGAgKHdvdWxkIHRocm93IGBzdGQ6Om91dF9vZl9yYW5nZWApCisgICAgb3IgYW4gZW1wdHkgYXJyYXkgb3Igb2JqZWN0ICh1bmRlZmluZWQgYmVoYXZpb3IsICoqZ3VhcmRlZCBieQorICAgIGFzc2VydGlvbnMqKikuCisgICAgQHBvc3QgVGhlIEpTT04gdmFsdWUgcmVtYWlucyB1bmNoYW5nZWQuCisKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTQgd2hlbiBjYWxsZWQgb24gYG51bGxgIHZhbHVlCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBmcm9udCgpYC4sZnJvbnR9CisKKyAgICBAc2EgQHJlZiBiYWNrKCkgLS0gYWNjZXNzIHRoZSBsYXN0IGVsZW1lbnQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICByZWZlcmVuY2UgZnJvbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICpiZWdpbigpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OmZyb250KCkKKyAgICAqLworICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKmNiZWdpbigpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBhY2Nlc3MgdGhlIGxhc3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuIEZvciBhIEpTT04KKyAgICBjb250YWluZXIgYGNgLCB0aGUgZXhwcmVzc2lvbiBgYy5iYWNrKClgIGlzIGVxdWl2YWxlbnQgdG8KKyAgICBAY29kZSB7LmNwcH0KKyAgICBhdXRvIHRtcCA9IGMuZW5kKCk7CisgICAgLS10bXA7CisgICAgcmV0dXJuICp0bXA7CisgICAgQGVuZGNvZGUKKworICAgIEByZXR1cm4gSW4gY2FzZSBvZiBhIHN0cnVjdHVyZWQgdHlwZSAoYXJyYXkgb3Igb2JqZWN0KSwgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgbGFzdCBlbGVtZW50IGlzIHJldHVybmVkLiBJbiBjYXNlIG9mIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuIHZhbHVlcywgYQorICAgIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBwcmUgVGhlIEpTT04gdmFsdWUgbXVzdCBub3QgYmUgYG51bGxgICh3b3VsZCB0aHJvdyBgc3RkOjpvdXRfb2ZfcmFuZ2VgKQorICAgIG9yIGFuIGVtcHR5IGFycmF5IG9yIG9iamVjdCAodW5kZWZpbmVkIGJlaGF2aW9yLCAqKmd1YXJkZWQgYnkKKyAgICBhc3NlcnRpb25zKiopLgorICAgIEBwb3N0IFRoZSBKU09OIHZhbHVlIHJlbWFpbnMgdW5jaGFuZ2VkLgorCisgICAgQHRocm93IGludmFsaWRfaXRlcmF0b3IuMjE0IHdoZW4gY2FsbGVkIG9uIGEgYG51bGxgIHZhbHVlLiBTZWUgZXhhbXBsZQorICAgIGJlbG93LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciBgYmFjaygpYC4sYmFja30KKworICAgIEBzYSBAcmVmIGZyb250KCkgLS0gYWNjZXNzIHRoZSBmaXJzdCBlbGVtZW50CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmVmZXJlbmNlIGJhY2soKQorICAgIHsKKyAgICAgICAgYXV0byB0bXAgPSBlbmQoKTsKKyAgICAgICAgLS10bXA7CisgICAgICAgIHJldHVybiAqdG1wOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OmJhY2soKQorICAgICovCisgICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdAorICAgIHsKKyAgICAgICAgYXV0byB0bXAgPSBjZW5kKCk7CisgICAgICAgIC0tdG1wOworICAgICAgICByZXR1cm4gKnRtcDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmVtb3ZlIGVsZW1lbnQgZ2l2ZW4gYW4gaXRlcmF0b3IKKworICAgIFJlbW92ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IGl0ZXJhdG9yIEBhIHBvcy4gVGhlIGl0ZXJhdG9yIEBhIHBvcyBtdXN0CisgICAgYmUgdmFsaWQgYW5kIGRlcmVmZXJlbmNlYWJsZS4gVGh1cyB0aGUgYGVuZCgpYCBpdGVyYXRvciAod2hpY2ggaXMgdmFsaWQsCisgICAgYnV0IGlzIG5vdCBkZXJlZmVyZW5jZWFibGUpIGNhbm5vdCBiZSB1c2VkIGFzIGEgdmFsdWUgZm9yIEBhIHBvcy4KKworICAgIElmIGNhbGxlZCBvbiBhIHByaW1pdGl2ZSB0eXBlIG90aGVyIHRoYW4gYG51bGxgLCB0aGUgcmVzdWx0aW5nIEpTT04gdmFsdWUKKyAgICB3aWxsIGJlIGBudWxsYC4KKworICAgIEBwYXJhbVtpbl0gcG9zIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IHRvIHJlbW92ZQorICAgIEByZXR1cm4gSXRlcmF0b3IgZm9sbG93aW5nIHRoZSBsYXN0IHJlbW92ZWQgZWxlbWVudC4gSWYgdGhlIGl0ZXJhdG9yIEBhCisgICAgcG9zIHJlZmVycyB0byB0aGUgbGFzdCBlbGVtZW50LCB0aGUgYGVuZCgpYCBpdGVyYXRvciBpcyByZXR1cm5lZC4KKworICAgIEB0cGFyYW0gSXRlcmF0b3JUeXBlIGFuIEByZWYgaXRlcmF0b3Igb3IgQHJlZiBjb25zdF9pdGVyYXRvcgorCisgICAgQHBvc3QgSW52YWxpZGF0ZXMgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzIGF0IG9yIGFmdGVyIHRoZSBwb2ludCBvZiB0aGUKKyAgICBlcmFzZSwgaW5jbHVkaW5nIHRoZSBgZW5kKClgIGl0ZXJhdG9yLgorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA3IGlmIGNhbGxlZCBvbiBhIGBudWxsYCB2YWx1ZTsgZXhhbXBsZTogYCJjYW5ub3QgdXNlCisgICAgZXJhc2UoKSB3aXRoIG51bGwiYAorICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBjYWxsZWQgb24gYW4gaXRlcmF0b3Igd2hpY2ggZG9lcyBub3QgYmVsb25nCisgICAgdG8gdGhlIGN1cnJlbnQgSlNPTiB2YWx1ZTsgZXhhbXBsZTogYCJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudAorICAgIHZhbHVlImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDUgaWYgY2FsbGVkIG9uIGEgcHJpbWl0aXZlIHR5cGUgd2l0aCBpbnZhbGlkCisgICAgaXRlcmF0b3IgKGkuZS4sIGFueSBpdGVyYXRvciB3aGljaCBpcyBub3QgYGJlZ2luKClgKTsgZXhhbXBsZTogYCJpdGVyYXRvcgorICAgIG91dCBvZiByYW5nZSJgCisKKyAgICBAY29tcGxleGl0eSBUaGUgY29tcGxleGl0eSBkZXBlbmRzIG9uIHRoZSB0eXBlOgorICAgIC0gb2JqZWN0czogYW1vcnRpemVkIGNvbnN0YW50CisgICAgLSBhcnJheXM6IGxpbmVhciBpbiBkaXN0YW5jZSBiZXR3ZWVuIEBhIHBvcyBhbmQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyCisgICAgLSBzdHJpbmdzOiBsaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgICAgLSBvdGhlciB0eXBlczogY29uc3RhbnQKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgcmVzdWx0IG9mIGBlcmFzZSgpYCBmb3IgZGlmZmVyZW50IEpTT04KKyAgICB0eXBlcy4sZXJhc2VfX0l0ZXJhdG9yVHlwZX0KKworICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSwgSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50cyBpbgorICAgIHRoZSBnaXZlbiByYW5nZQorICAgIEBzYSBAcmVmIGVyYXNlKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90OjprZXlfdHlwZSYpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQKKyAgICBmcm9tIGFuIG9iamVjdCBhdCB0aGUgZ2l2ZW4ga2V5CisgICAgQHNhIEByZWYgZXJhc2UoY29uc3Qgc2l6ZV90eXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gYW4gYXJyYXkgYXQKKyAgICB0aGUgZ2l2ZW4gaW5kZXgKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SXRlcmF0b3JUeXBlLCB0eXBlbmFtZSBiYXNpY19qc29uX3Q6Oml0ZXJhdG9yPjo6dmFsdWUgb3IKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPEl0ZXJhdG9yVHlwZSwgdHlwZW5hbWUgYmFzaWNfanNvbl90Ojpjb25zdF9pdGVyYXRvcj46OnZhbHVlLCBpbnQ+Ojp0eXBlCisgICAgICAgICAgICAgPSAwPgorICAgIEl0ZXJhdG9yVHlwZSBlcmFzZShJdGVyYXRvclR5cGUgcG9zKQorICAgIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGl0ZXJhdG9yIGZpdHMgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkodGhpcyAhPSBwb3MubV9vYmplY3QpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yVHlwZSByZXN1bHQgPSBlbmQoKTsKKworICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOgorICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgcG9zLm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLmlzX2JlZ2luKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjA1LCAiaXRlcmF0b3Igb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvclR5cGU8c3RyaW5nX3Q+IGFsbG9jOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8ZGVjbHR5cGUoYWxsb2MpPjo6ZGVzdHJveShhbGxvYywgbV92YWx1ZS5zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8ZGVjbHR5cGUoYWxsb2MpPjo6ZGVhbGxvY2F0ZShhbGxvYywgbV92YWx1ZS5zdHJpbmcsIDEpOworICAgICAgICAgICAgICAgICAgICBtX3ZhbHVlLnN0cmluZyA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6bnVsbDsKKyAgICAgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tX2l0Lm9iamVjdF9pdGVyYXRvciA9IG1fdmFsdWUub2JqZWN0LT5lcmFzZShwb3MubV9pdC5vYmplY3RfaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tX2l0LmFycmF5X2l0ZXJhdG9yID0gbV92YWx1ZS5hcnJheS0+ZXJhc2UocG9zLm1faXQuYXJyYXlfaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNywgImNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJlbW92ZSBlbGVtZW50cyBnaXZlbiBhbiBpdGVyYXRvciByYW5nZQorCisgICAgUmVtb3ZlcyB0aGUgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIHJhbmdlIGBbZmlyc3Q7IGxhc3QpYC4gVGhlIGl0ZXJhdG9yCisgICAgQGEgZmlyc3QgZG9lcyBub3QgbmVlZCB0byBiZSBkZXJlZmVyZW5jZWFibGUgaWYgYGZpcnN0ID09IGxhc3RgOiBlcmFzaW5nCisgICAgYW4gZW1wdHkgcmFuZ2UgaXMgYSBuby1vcC4KKworICAgIElmIGNhbGxlZCBvbiBhIHByaW1pdGl2ZSB0eXBlIG90aGVyIHRoYW4gYG51bGxgLCB0aGUgcmVzdWx0aW5nIEpTT04gdmFsdWUKKyAgICB3aWxsIGJlIGBudWxsYC4KKworICAgIEBwYXJhbVtpbl0gZmlyc3QgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmFuZ2UgdG8gcmVtb3ZlCisgICAgQHBhcmFtW2luXSBsYXN0IGl0ZXJhdG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gcmVtb3ZlCisgICAgQHJldHVybiBJdGVyYXRvciBmb2xsb3dpbmcgdGhlIGxhc3QgcmVtb3ZlZCBlbGVtZW50LiBJZiB0aGUgaXRlcmF0b3IgQGEKKyAgICBzZWNvbmQgcmVmZXJzIHRvIHRoZSBsYXN0IGVsZW1lbnQsIHRoZSBgZW5kKClgIGl0ZXJhdG9yIGlzIHJldHVybmVkLgorCisgICAgQHRwYXJhbSBJdGVyYXRvclR5cGUgYW4gQHJlZiBpdGVyYXRvciBvciBAcmVmIGNvbnN0X2l0ZXJhdG9yCisKKyAgICBAcG9zdCBJbnZhbGlkYXRlcyBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMgYXQgb3IgYWZ0ZXIgdGhlIHBvaW50IG9mIHRoZQorICAgIGVyYXNlLCBpbmNsdWRpbmcgdGhlIGBlbmQoKWAgaXRlcmF0b3IuCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDcgaWYgY2FsbGVkIG9uIGEgYG51bGxgIHZhbHVlOyBleGFtcGxlOiBgImNhbm5vdCB1c2UKKyAgICBlcmFzZSgpIHdpdGggbnVsbCJgCisgICAgQHRocm93IGludmFsaWRfaXRlcmF0b3IuMjAzIGlmIGNhbGxlZCBvbiBpdGVyYXRvcnMgd2hpY2ggZG9lcyBub3QgYmVsb25nCisgICAgdG8gdGhlIGN1cnJlbnQgSlNPTiB2YWx1ZTsgZXhhbXBsZTogYCJpdGVyYXRvcnMgZG8gbm90IGZpdCBjdXJyZW50IHZhbHVlImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDQgaWYgY2FsbGVkIG9uIGEgcHJpbWl0aXZlIHR5cGUgd2l0aCBpbnZhbGlkCisgICAgaXRlcmF0b3JzIChpLmUuLCBpZiBgZmlyc3QgIT0gYmVnaW4oKWAgYW5kIGBsYXN0ICE9IGVuZCgpYCk7IGV4YW1wbGU6CisgICAgYCJpdGVyYXRvcnMgb3V0IG9mIHJhbmdlImAKKworICAgIEBjb21wbGV4aXR5IFRoZSBjb21wbGV4aXR5IGRlcGVuZHMgb24gdGhlIHR5cGU6CisgICAgLSBvYmplY3RzOiBgbG9nKHNpemUoKSkgKyBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KWAKKyAgICAtIGFycmF5czogbGluZWFyIGluIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIEBhIGZpcnN0IGFuZCBAYSBsYXN0LCBwbHVzIGxpbmVhcgorICAgICAgaW4gdGhlIGRpc3RhbmNlIGJldHdlZW4gQGEgbGFzdCBhbmQgZW5kIG9mIHRoZSBjb250YWluZXIKKyAgICAtIHN0cmluZ3M6IGxpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyAgICAtIG90aGVyIHR5cGVzOiBjb25zdGFudAorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSByZXN1bHQgb2YgYGVyYXNlKClgIGZvciBkaWZmZXJlbnQgSlNPTgorICAgIHR5cGVzLixlcmFzZV9fSXRlcmF0b3JUeXBlX0l0ZXJhdG9yVHlwZX0KKworICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSkgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uCisgICAgQHNhIEByZWYgZXJhc2UoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJikgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudAorICAgIGZyb20gYW4gb2JqZWN0IGF0IHRoZSBnaXZlbiBrZXkKKyAgICBAc2EgQHJlZiBlcmFzZShjb25zdCBzaXplX3R5cGUpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnQgZnJvbSBhbiBhcnJheSBhdAorICAgIHRoZSBnaXZlbiBpbmRleAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxJdGVyYXRvclR5cGUsIHR5cGVuYW1lIGJhc2ljX2pzb25fdDo6aXRlcmF0b3I+Ojp2YWx1ZSBvcgorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8SXRlcmF0b3JUeXBlLCB0eXBlbmFtZSBiYXNpY19qc29uX3Q6OmNvbnN0X2l0ZXJhdG9yPjo6dmFsdWUsIGludD46OnR5cGUKKyAgICAgICAgICAgICA9IDA+CisgICAgSXRlcmF0b3JUeXBlIGVyYXNlKEl0ZXJhdG9yVHlwZSBmaXJzdCwgSXRlcmF0b3JUeXBlIGxhc3QpCisgICAgeworICAgICAgICAvLyBtYWtlIHN1cmUgaXRlcmF0b3IgZml0cyB0aGUgY3VycmVudCB2YWx1ZQorICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWSh0aGlzICE9IGZpcnN0Lm1fb2JqZWN0IG9yIHRoaXMgIT0gbGFzdC5tX29iamVjdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMywgIml0ZXJhdG9ycyBkbyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKSk7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvclR5cGUgcmVzdWx0ID0gZW5kKCk7CisKKyAgICAgICAgc3dpdGNoIChtX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgorICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEpTT05fTElLRUxZKG5vdCBmaXJzdC5tX2l0LnByaW1pdGl2ZV9pdGVyYXRvci5pc19iZWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5vdCBsYXN0Lm1faXQucHJpbWl0aXZlX2l0ZXJhdG9yLmlzX2VuZCgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwNCwgIml0ZXJhdG9ycyBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yVHlwZTxzdHJpbmdfdD4gYWxsb2M7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZXN0cm95KGFsbG9jLCBtX3ZhbHVlLnN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxkZWNsdHlwZShhbGxvYyk+OjpkZWFsbG9jYXRlKGFsbG9jLCBtX3ZhbHVlLnN0cmluZywgMSk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFsdWUuc3RyaW5nID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjpudWxsOworICAgICAgICAgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1faXQub2JqZWN0X2l0ZXJhdG9yID0gbV92YWx1ZS5vYmplY3QtPmVyYXNlKGZpcnN0Lm1faXQub2JqZWN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5vYmplY3RfaXRlcmF0b3IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tX2l0LmFycmF5X2l0ZXJhdG9yID0gbV92YWx1ZS5hcnJheS0+ZXJhc2UoZmlyc3QubV9pdC5hcnJheV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5hcnJheV9pdGVyYXRvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA3LCAiY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmVtb3ZlIGVsZW1lbnQgZnJvbSBhIEpTT04gb2JqZWN0IGdpdmVuIGEga2V5CisKKyAgICBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYSBKU09OIG9iamVjdCB3aXRoIHRoZSBrZXkgdmFsdWUgQGEga2V5LgorCisgICAgQHBhcmFtW2luXSBrZXkgdmFsdWUgb2YgdGhlIGVsZW1lbnRzIHRvIHJlbW92ZQorCisgICAgQHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgcmVtb3ZlZC4gSWYgQGEgT2JqZWN0VHlwZSBpcyB0aGUgZGVmYXVsdAorICAgIGBzdGQ6Om1hcGAgdHlwZSwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBgMGAgKEBhIGtleSB3YXMgbm90CisgICAgZm91bmQpIG9yIGAxYCAoQGEga2V5IHdhcyBmb3VuZCkuCisKKyAgICBAcG9zdCBSZWZlcmVuY2VzIGFuZCBpdGVyYXRvcnMgdG8gdGhlIGVyYXNlZCBlbGVtZW50cyBhcmUgaW52YWxpZGF0ZWQuCisgICAgT3RoZXIgcmVmZXJlbmNlcyBhbmQgaXRlcmF0b3JzIGFyZSBub3QgYWZmZWN0ZWQuCisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDcgd2hlbiBjYWxsZWQgb24gYSB0eXBlIG90aGVyIHRoYW4gSlNPTiBvYmplY3Q7CisgICAgZXhhbXBsZTogYCJjYW5ub3QgdXNlIGVyYXNlKCkgd2l0aCBudWxsImAKKworICAgIEBjb21wbGV4aXR5IGBsb2coc2l6ZSgpKSArIGNvdW50KGtleSlgCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIGVmZmVjdCBvZiBgZXJhc2UoKWAuLGVyYXNlX19rZXlfdHlwZX0KKworICAgIEBzYSBAcmVmIGVyYXNlKEl0ZXJhdG9yVHlwZSkgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uCisgICAgQHNhIEByZWYgZXJhc2UoSXRlcmF0b3JUeXBlLCBJdGVyYXRvclR5cGUpIC0tIHJlbW92ZXMgdGhlIGVsZW1lbnRzIGluCisgICAgdGhlIGdpdmVuIHJhbmdlCisgICAgQHNhIEByZWYgZXJhc2UoY29uc3Qgc2l6ZV90eXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gYW4gYXJyYXkgYXQKKyAgICB0aGUgZ2l2ZW4gaW5kZXgKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBzaXplX3R5cGUgZXJhc2UoY29uc3QgdHlwZW5hbWUgb2JqZWN0X3Q6OmtleV90eXBlJiBrZXkpCisgICAgeworICAgICAgICAvLyB0aGlzIGVyYXNlIG9ubHkgd29ya3MgZm9yIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5lcmFzZShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA3LCAiY2Fubm90IHVzZSBlcmFzZSgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZW1vdmUgZWxlbWVudCBmcm9tIGEgSlNPTiBhcnJheSBnaXZlbiBhbiBpbmRleAorCisgICAgUmVtb3ZlcyBlbGVtZW50IGZyb20gYSBKU09OIGFycmF5IGF0IHRoZSBpbmRleCBAYSBpZHguCisKKyAgICBAcGFyYW1baW5dIGlkeCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwNyB3aGVuIGNhbGxlZCBvbiBhIHR5cGUgb3RoZXIgdGhhbiBKU09OIG9iamVjdDsKKyAgICBleGFtcGxlOiBgImNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoIG51bGwiYAorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAxIHdoZW4gYGlkeCA+PSBzaXplKClgOyBleGFtcGxlOiBgImFycmF5IGluZGV4IDE3CisgICAgaXMgb3V0IG9mIHJhbmdlImAKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiBkaXN0YW5jZSBiZXR3ZWVuIEBhIGlkeCBhbmQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBlZmZlY3Qgb2YgYGVyYXNlKClgLixlcmFzZV9fc2l6ZV90eXBlfQorCisgICAgQHNhIEByZWYgZXJhc2UoSXRlcmF0b3JUeXBlKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50IGF0IGEgZ2l2ZW4gcG9zaXRpb24KKyAgICBAc2EgQHJlZiBlcmFzZShJdGVyYXRvclR5cGUsIEl0ZXJhdG9yVHlwZSkgLS0gcmVtb3ZlcyB0aGUgZWxlbWVudHMgaW4KKyAgICB0aGUgZ2l2ZW4gcmFuZ2UKKyAgICBAc2EgQHJlZiBlcmFzZShjb25zdCB0eXBlbmFtZSBvYmplY3RfdDo6a2V5X3R5cGUmKSAtLSByZW1vdmVzIHRoZSBlbGVtZW50CisgICAgZnJvbSBhbiBvYmplY3QgYXQgdGhlIGdpdmVuIGtleQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHZvaWQgZXJhc2UoY29uc3Qgc2l6ZV90eXBlIGlkeCkKKyAgICB7CisgICAgICAgIC8vIHRoaXMgZXJhc2Ugb25seSB3b3JrcyBmb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoaWR4ID49IHNpemUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDEsICJhcnJheSBpbmRleCAiICsgc3RkOjp0b19zdHJpbmcoaWR4KSArICIgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3ZhbHVlLmFycmF5LT5lcmFzZShtX3ZhbHVlLmFycmF5LT5iZWdpbigpICsgc3RhdGljX2Nhc3Q8ZGlmZmVyZW5jZV90eXBlPihpZHgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwNywgImNhbm5vdCB1c2UgZXJhc2UoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBAfQorCisKKyAgICAvLy8vLy8vLy8vLy8KKyAgICAvLyBsb29rdXAgLy8KKyAgICAvLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBsb29rdXAKKyAgICAvLy8gQHsKKworICAgIC8qIQorICAgIEBicmllZiBmaW5kIGFuIGVsZW1lbnQgaW4gYSBKU09OIG9iamVjdAorCisgICAgRmluZHMgYW4gZWxlbWVudCBpbiBhIEpTT04gb2JqZWN0IHdpdGgga2V5IGVxdWl2YWxlbnQgdG8gQGEga2V5LiBJZiB0aGUKKyAgICBlbGVtZW50IGlzIG5vdCBmb3VuZCBvciB0aGUgSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LCBlbmQoKSBpcworICAgIHJldHVybmVkLgorCisgICAgQG5vdGUgVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgQHJlZiBlbmQoKSB3aGVuIGV4ZWN1dGVkIG9uIGEgSlNPTiB0eXBlCisgICAgICAgICAgdGhhdCBpcyBub3QgYW4gb2JqZWN0LgorCisgICAgQHBhcmFtW2luXSBrZXkga2V5IHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIHNlYXJjaCBmb3IuCisKKyAgICBAcmV0dXJuIEl0ZXJhdG9yIHRvIGFuIGVsZW1lbnQgd2l0aCBrZXkgZXF1aXZhbGVudCB0byBAYSBrZXkuIElmIG5vIHN1Y2gKKyAgICBlbGVtZW50IGlzIGZvdW5kIG9yIHRoZSBKU09OIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QsIHBhc3QtdGhlLWVuZCAoc2VlCisgICAgQHJlZiBlbmQoKSkgaXRlcmF0b3IgaXMgcmV0dXJuZWQuCisKKyAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgSlNPTiBvYmplY3QuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBmaW5kKClgIGlzIHVzZWQuLGZpbmRfX2tleV90eXBlfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleVQ+CisgICAgaXRlcmF0b3IgZmluZChLZXlUJiYga2V5KQorICAgIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBlbmQoKTsKKworICAgICAgICBpZiAoaXNfb2JqZWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC5tX2l0Lm9iamVjdF9pdGVyYXRvciA9IG1fdmFsdWUub2JqZWN0LT5maW5kKHN0ZDo6Zm9yd2FyZDxLZXlUPihrZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGZpbmQgYW4gZWxlbWVudCBpbiBhIEpTT04gb2JqZWN0CisgICAgQGNvcHlkb2MgZmluZChLZXlUJiYpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlUPgorICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoS2V5VCYmIGtleSkgY29uc3QKKyAgICB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2VuZCgpOworCisgICAgICAgIGlmIChpc19vYmplY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0Lm1faXQub2JqZWN0X2l0ZXJhdG9yID0gbV92YWx1ZS5vYmplY3QtPmZpbmQoc3RkOjpmb3J3YXJkPEtleVQ+KGtleSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGEga2V5IGluIGEgSlNPTiBvYmplY3QKKworICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGtleSBAYSBrZXkuIElmIE9iamVjdFR5cGUgaXMgdGhlCisgICAgZGVmYXVsdCBgc3RkOjptYXBgIHR5cGUsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHdheXMgYmUgYDBgIChAYSBrZXkgd2FzCisgICAgbm90IGZvdW5kKSBvciBgMWAgKEBhIGtleSB3YXMgZm91bmQpLgorCisgICAgQG5vdGUgVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYDBgIHdoZW4gZXhlY3V0ZWQgb24gYSBKU09OIHR5cGUgdGhhdCBpcworICAgICAgICAgIG5vdCBhbiBvYmplY3QuCisKKyAgICBAcGFyYW1baW5dIGtleSBrZXkgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gY291bnQKKworICAgIEByZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGgga2V5IEBhIGtleS4gSWYgdGhlIEpTT04gdmFsdWUgaXMgbm90IGFuCisgICAgb2JqZWN0LCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYDBgLgorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIEpTT04gb2JqZWN0LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgY291bnQoKWAgaXMgdXNlZC4sY291bnR9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5VD4KKyAgICBzaXplX3R5cGUgY291bnQoS2V5VCYmIGtleSkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIHJldHVybiAwIGZvciBhbGwgbm9ub2JqZWN0IHR5cGVzCisgICAgICAgIHJldHVybiBpc19vYmplY3QoKSA/IG1fdmFsdWUub2JqZWN0LT5jb3VudChzdGQ6OmZvcndhcmQ8S2V5VD4oa2V5KSkgOiAwOworICAgIH0KKworICAgIC8vLyBAfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpdGVyYXRvcnMgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBpdGVyYXRvcnMKKyAgICAvLy8gQHsKKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50CisKKyAgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorCisgICAgQGltYWdlIGh0bWwgcmFuZ2UtYmVnaW4tZW5kLnN2ZyAiSWxsdXN0cmF0aW9uIGZyb20gY3BwcmVmZXJlbmNlLmNvbSIKKworICAgIEByZXR1cm4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGJhc2ljX2pzb25gIHNhdGlzZnlpbmcgdGhlCisgICAgW0NvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db250YWluZXIpCisgICAgcmVxdWlyZW1lbnRzOgorICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBiZWdpbigpYC4sYmVnaW59CisKKyAgICBAc2EgQHJlZiBjYmVnaW4oKSAtLSByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIGVuZCgpIC0tIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZAorICAgIEBzYSBAcmVmIGNlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGVuZAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGl0ZXJhdG9yIGJlZ2luKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGl0ZXJhdG9yIHJlc3VsdCh0aGlzKTsKKyAgICAgICAgcmVzdWx0LnNldF9iZWdpbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OmNiZWdpbigpCisgICAgKi8KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gY2JlZ2luKCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorCisgICAgQGltYWdlIGh0bWwgcmFuZ2UtYmVnaW4tZW5kLnN2ZyAiSWxsdXN0cmF0aW9uIGZyb20gY3BwcmVmZXJlbmNlLmNvbSIKKworICAgIEByZXR1cm4gY29uc3QgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGJhc2ljX2pzb25gIHNhdGlzZnlpbmcgdGhlCisgICAgW0NvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9Db250YWluZXIpCisgICAgcmVxdWlyZW1lbnRzOgorICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCisgICAgLSBIYXMgdGhlIHNlbWFudGljcyBvZiBgY29uc3RfY2FzdDxjb25zdCBiYXNpY19qc29uJj4oKnRoaXMpLmJlZ2luKClgLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciBgY2JlZ2luKClgLixjYmVnaW59CisKKyAgICBAc2EgQHJlZiBiZWdpbigpIC0tIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIGVuZCgpIC0tIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZAorICAgIEBzYSBAcmVmIGNlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGVuZAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBjb25zdF9pdGVyYXRvciByZXN1bHQodGhpcyk7CisgICAgICAgIHJlc3VsdC5zZXRfYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyBhbiBpdGVyYXRvciB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50CisKKyAgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQuCisKKyAgICBAaW1hZ2UgaHRtbCByYW5nZS1iZWdpbi1lbmQuc3ZnICJJbGx1c3RyYXRpb24gZnJvbSBjcHByZWZlcmVuY2UuY29tIgorCisgICAgQHJldHVybiBpdGVyYXRvciBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50CisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciBgZW5kKClgLixlbmR9CisKKyAgICBAc2EgQHJlZiBjZW5kKCkgLS0gcmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIHRoZSBlbmQKKyAgICBAc2EgQHJlZiBiZWdpbigpIC0tIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIGNiZWdpbigpIC0tIHJldHVybnMgYSBjb25zdCBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgaXRlcmF0b3IgZW5kKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGl0ZXJhdG9yIHJlc3VsdCh0aGlzKTsKKyAgICAgICAgcmVzdWx0LnNldF9lbmQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAY29weWRvYyBiYXNpY19qc29uOjpjZW5kKCkKKyAgICAqLworICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gY2VuZCgpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQuCisKKyAgICBAaW1hZ2UgaHRtbCByYW5nZS1iZWdpbi1lbmQuc3ZnICJJbGx1c3RyYXRpb24gZnJvbSBjcHByZWZlcmVuY2UuY29tIgorCisgICAgQHJldHVybiBjb25zdCBpdGVyYXRvciBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50CisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgorICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgYGNvbnN0X2Nhc3Q8Y29uc3QgYmFzaWNfanNvbiY+KCp0aGlzKS5lbmQoKWAuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBjZW5kKClgLixjZW5kfQorCisgICAgQHNhIEByZWYgZW5kKCkgLS0gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kCisgICAgQHNhIEByZWYgYmVnaW4oKSAtLSByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcKKyAgICBAc2EgQHJlZiBjYmVnaW4oKSAtLSByZXR1cm5zIGEgY29uc3QgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgcmVzdWx0KHRoaXMpOworICAgICAgICByZXN1bHQuc2V0X2VuZCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSByZXZlcnNlLWJlZ2lubmluZworCisgICAgUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgcmV2ZXJzZS1iZWdpbm5pbmc7IHRoYXQgaXMsIHRoZSBsYXN0IGVsZW1lbnQuCisKKyAgICBAaW1hZ2UgaHRtbCByYW5nZS1yYmVnaW4tcmVuZC5zdmcgIklsbHVzdHJhdGlvbiBmcm9tIGNwcHJlZmVyZW5jZS5jb20iCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtSZXZlcnNpYmxlQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L1JldmVyc2libGVDb250YWluZXIpCisgICAgcmVxdWlyZW1lbnRzOgorICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCisgICAgLSBIYXMgdGhlIHNlbWFudGljcyBvZiBgcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSlgLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbiBleGFtcGxlIGZvciBgcmJlZ2luKClgLixyYmVnaW59CisKKyAgICBAc2EgQHJlZiBjcmJlZ2luKCkgLS0gcmV0dXJucyBhIGNvbnN0IHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIHJlbmQoKSAtLSByZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisgICAgQHNhIEByZWYgY3JlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OmNyYmVnaW4oKQorICAgICovCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyYmVnaW4oKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgcmV2ZXJzZS1lbmQKKworICAgIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIHJldmVyc2UtZW5kOyB0aGF0IGlzLCBvbmUgYmVmb3JlIHRoZSBmaXJzdAorICAgIGVsZW1lbnQuCisKKyAgICBAaW1hZ2UgaHRtbCByYW5nZS1yYmVnaW4tcmVuZC5zdmcgIklsbHVzdHJhdGlvbiBmcm9tIGNwcHJlZmVyZW5jZS5jb20iCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtSZXZlcnNpYmxlQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L1JldmVyc2libGVDb250YWluZXIpCisgICAgcmVxdWlyZW1lbnRzOgorICAgIC0gVGhlIGNvbXBsZXhpdHkgaXMgY29uc3RhbnQuCisgICAgLSBIYXMgdGhlIHNlbWFudGljcyBvZiBgcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKWAuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGByZW5kKClgLixyZW5kfQorCisgICAgQHNhIEByZWYgY3JlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisgICAgQHNhIEByZWYgcmJlZ2luKCkgLS0gcmV0dXJucyBhIHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIGNyYmVnaW4oKSAtLSByZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb246OmNyZW5kKCkKKyAgICAqLworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gY3JlbmQoKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyBhIGNvbnN0IHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIGxhc3QgZWxlbWVudAorCisgICAgUmV0dXJucyBhIGNvbnN0IGl0ZXJhdG9yIHRvIHRoZSByZXZlcnNlLWJlZ2lubmluZzsgdGhhdCBpcywgdGhlIGxhc3QKKyAgICBlbGVtZW50LgorCisgICAgQGltYWdlIGh0bWwgcmFuZ2UtcmJlZ2luLXJlbmQuc3ZnICJJbGx1c3RyYXRpb24gZnJvbSBjcHByZWZlcmVuY2UuY29tIgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBgYmFzaWNfanNvbmAgc2F0aXNmeWluZyB0aGUKKyAgICBbUmV2ZXJzaWJsZUNvbnRhaW5lcl0oaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvY29uY2VwdC9SZXZlcnNpYmxlQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgorICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgYGNvbnN0X2Nhc3Q8Y29uc3QgYmFzaWNfanNvbiY+KCp0aGlzKS5yYmVnaW4oKWAuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuIGV4YW1wbGUgZm9yIGBjcmJlZ2luKClgLixjcmJlZ2lufQorCisgICAgQHNhIEByZWYgcmJlZ2luKCkgLS0gcmV0dXJucyBhIHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIHJlbmQoKSAtLSByZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisgICAgQHNhIEByZWYgY3JlbmQoKSAtLSByZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGNlbmQoKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybnMgYSBjb25zdCByZXZlcnNlIGl0ZXJhdG9yIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0CisKKyAgICBSZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgcmV2ZXJzZS1lbmQ7IHRoYXQgaXMsIG9uZSBiZWZvcmUKKyAgICB0aGUgZmlyc3QgZWxlbWVudC4KKworICAgIEBpbWFnZSBodG1sIHJhbmdlLXJiZWdpbi1yZW5kLnN2ZyAiSWxsdXN0cmF0aW9uIGZyb20gY3BwcmVmZXJlbmNlLmNvbSIKKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQHJlcXVpcmVtZW50IFRoaXMgZnVuY3Rpb24gaGVscHMgYGJhc2ljX2pzb25gIHNhdGlzZnlpbmcgdGhlCisgICAgW1JldmVyc2libGVDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvUmV2ZXJzaWJsZUNvbnRhaW5lcikKKyAgICByZXF1aXJlbWVudHM6CisgICAgLSBUaGUgY29tcGxleGl0eSBpcyBjb25zdGFudC4KKyAgICAtIEhhcyB0aGUgc2VtYW50aWNzIG9mIGBjb25zdF9jYXN0PGNvbnN0IGJhc2ljX2pzb24mPigqdGhpcykucmVuZCgpYC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYW4gZXhhbXBsZSBmb3IgYGNyZW5kKClgLixjcmVuZH0KKworICAgIEBzYSBAcmVmIHJlbmQoKSAtLSByZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgZW5kCisgICAgQHNhIEByZWYgcmJlZ2luKCkgLS0gcmV0dXJucyBhIHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZworICAgIEBzYSBAcmVmIGNyYmVnaW4oKSAtLSByZXR1cm5zIGEgY29uc3QgcmV2ZXJzZSBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmVuZCgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihjYmVnaW4oKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvKiEKKyAgICBAYnJpZWYgd3JhcHBlciB0byBhY2Nlc3MgaXRlcmF0b3IgbWVtYmVyIGZ1bmN0aW9ucyBpbiByYW5nZS1iYXNlZCBmb3IKKworICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIGFjY2VzcyBAcmVmIGl0ZXJhdG9yOjprZXkoKSBhbmQgQHJlZgorICAgIGl0ZXJhdG9yOjp2YWx1ZSgpIGR1cmluZyByYW5nZS1iYXNlZCBmb3IgbG9vcHMuIEluIHRoZXNlIGxvb3BzLCBhCisgICAgcmVmZXJlbmNlIHRvIHRoZSBKU09OIHZhbHVlcyBpcyByZXR1cm5lZCwgc28gdGhlcmUgaXMgbm8gYWNjZXNzIHRvIHRoZQorICAgIHVuZGVybHlpbmcgaXRlcmF0b3IuCisKKyAgICBGb3IgbG9vcCB3aXRob3V0IGl0ZXJhdG9yX3dyYXBwZXI6CisKKyAgICBAY29kZXtjcHB9CisgICAgZm9yIChhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsgaXQgIT0gal9vYmplY3QuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImtleTogIiA8PCBpdC5rZXkoKSA8PCAiLCB2YWx1ZToiIDw8IGl0LnZhbHVlKCkgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIFJhbmdlLWJhc2VkIGZvciBsb29wIHdpdGhvdXQgaXRlcmF0b3IgcHJveHk6CisKKyAgICBAY29kZXtjcHB9CisgICAgZm9yIChhdXRvIGl0IDogal9vYmplY3QpCisgICAgeworICAgICAgICAvLyAiaXQiIGlzIG9mIHR5cGUganNvbjo6cmVmZXJlbmNlIGFuZCBoYXMgbm8ga2V5KCkgbWVtYmVyCisgICAgICAgIHN0ZDo6Y291dCA8PCAidmFsdWU6ICIgPDwgaXQgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIFJhbmdlLWJhc2VkIGZvciBsb29wIHdpdGggaXRlcmF0b3IgcHJveHk6CisKKyAgICBAY29kZXtjcHB9CisgICAgZm9yIChhdXRvIGl0IDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqX29iamVjdCkpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImtleTogIiA8PCBpdC5rZXkoKSA8PCAiLCB2YWx1ZToiIDw8IGl0LnZhbHVlKCkgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIEBub3RlIFdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXksIGBrZXkoKWAgd2lsbCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQorICAgICAgICAgIGVsZW1lbnQgYXMgc3RyaW5nIChzZWUgZXhhbXBsZSkuCisKKyAgICBAcGFyYW1baW5dIHJlZiAgcmVmZXJlbmNlIHRvIGEgSlNPTiB2YWx1ZQorICAgIEByZXR1cm4gaXRlcmF0aW9uIHByb3h5IG9iamVjdCB3cmFwcGluZyBAYSByZWYgd2l0aCBhbiBpbnRlcmZhY2UgdG8gdXNlIGluCisgICAgICAgICAgICByYW5nZS1iYXNlZCBmb3IgbG9vcHMKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRoZSB3cmFwcGVyIGlzIHVzZWQsaXRlcmF0b3Jfd3JhcHBlcn0KKworICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCisgICAgY2hhbmdlcyBpbiB0aGUgSlNPTiB2YWx1ZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQG5vdGUgVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGZpbmFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZQorICAgIGZ1dHVyZS4KKworICAgIEBkZXByZWNhdGVkIFRoaXMgc3RyZWFtIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgorICAgICAgICAgICAgICAgIGZ1dHVyZSA0LjAuMCBvZiB0aGUgbGlicmFyeS4gUGxlYXNlIHVzZSBAcmVmIGl0ZW1zKCkgaW5zdGVhZDsKKyAgICAgICAgICAgICAgICB0aGF0IGlzLCByZXBsYWNlIGBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopYCB3aXRoIGBqLml0ZW1zKClgLgorICAgICovCisgICAgSlNPTl9ERVBSRUNBVEVECisgICAgc3RhdGljIGl0ZXJhdGlvbl9wcm94eTxpdGVyYXRvcj4gaXRlcmF0b3Jfd3JhcHBlcihyZWZlcmVuY2UgcmVmKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZi5pdGVtcygpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGl0ZXJhdG9yX3dyYXBwZXIocmVmZXJlbmNlKQorICAgICovCisgICAgSlNPTl9ERVBSRUNBVEVECisgICAgc3RhdGljIGl0ZXJhdGlvbl9wcm94eTxjb25zdF9pdGVyYXRvcj4gaXRlcmF0b3Jfd3JhcHBlcihjb25zdF9yZWZlcmVuY2UgcmVmKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlZi5pdGVtcygpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBoZWxwZXIgdG8gYWNjZXNzIGl0ZXJhdG9yIG1lbWJlciBmdW5jdGlvbnMgaW4gcmFuZ2UtYmFzZWQgZm9yCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBhY2Nlc3MgQHJlZiBpdGVyYXRvcjo6a2V5KCkgYW5kIEByZWYKKyAgICBpdGVyYXRvcjo6dmFsdWUoKSBkdXJpbmcgcmFuZ2UtYmFzZWQgZm9yIGxvb3BzLiBJbiB0aGVzZSBsb29wcywgYQorICAgIHJlZmVyZW5jZSB0byB0aGUgSlNPTiB2YWx1ZXMgaXMgcmV0dXJuZWQsIHNvIHRoZXJlIGlzIG5vIGFjY2VzcyB0byB0aGUKKyAgICB1bmRlcmx5aW5nIGl0ZXJhdG9yLgorCisgICAgRm9yIGxvb3Agd2l0aG91dCBgaXRlbXMoKWAgZnVuY3Rpb246CisKKyAgICBAY29kZXtjcHB9CisgICAgZm9yIChhdXRvIGl0ID0gal9vYmplY3QuYmVnaW4oKTsgaXQgIT0gal9vYmplY3QuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImtleTogIiA8PCBpdC5rZXkoKSA8PCAiLCB2YWx1ZToiIDw8IGl0LnZhbHVlKCkgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIFJhbmdlLWJhc2VkIGZvciBsb29wIHdpdGhvdXQgYGl0ZW1zKClgIGZ1bmN0aW9uOgorCisgICAgQGNvZGV7Y3BwfQorICAgIGZvciAoYXV0byBpdCA6IGpfb2JqZWN0KQorICAgIHsKKyAgICAgICAgLy8gIml0IiBpcyBvZiB0eXBlIGpzb246OnJlZmVyZW5jZSBhbmQgaGFzIG5vIGtleSgpIG1lbWJlcgorICAgICAgICBzdGQ6OmNvdXQgPDwgInZhbHVlOiAiIDw8IGl0IDw8ICdcbic7CisgICAgfQorICAgIEBlbmRjb2RlCisKKyAgICBSYW5nZS1iYXNlZCBmb3IgbG9vcCB3aXRoIGBpdGVtcygpYCBmdW5jdGlvbjoKKworICAgIEBjb2Rle2NwcH0KKyAgICBmb3IgKGF1dG8gaXQgOiBqX29iamVjdC5pdGVtcygpKQorICAgIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJrZXk6ICIgPDwgaXQua2V5KCkgPDwgIiwgdmFsdWU6IiA8PCBpdC52YWx1ZSgpIDw8ICdcbic7CisgICAgfQorICAgIEBlbmRjb2RlCisKKyAgICBAbm90ZSBXaGVuIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5LCBga2V5KClgIHdpbGwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKKyAgICAgICAgICBlbGVtZW50IGFzIHN0cmluZyAoc2VlIGV4YW1wbGUpLiBGb3IgcHJpbWl0aXZlIHR5cGVzIChlLmcuLCBudW1iZXJzKSwKKyAgICAgICAgICBga2V5KClgIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgQHJldHVybiBpdGVyYXRpb24gcHJveHkgb2JqZWN0IHdyYXBwaW5nIEBhIHJlZiB3aXRoIGFuIGludGVyZmFjZSB0byB1c2UgaW4KKyAgICAgICAgICAgIHJhbmdlLWJhc2VkIGZvciBsb29wcworCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIGZ1bmN0aW9uIGlzIHVzZWQuLGl0ZW1zfQorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBTdHJvbmcgZ3VhcmFudGVlOiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVyZSBhcmUgbm8KKyAgICBjaGFuZ2VzIGluIHRoZSBKU09OIHZhbHVlLgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAc2luY2UgdmVyc2lvbiAzLngueC4KKyAgICAqLworICAgIGl0ZXJhdGlvbl9wcm94eTxpdGVyYXRvcj4gaXRlbXMoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdGlvbl9wcm94eTxpdGVyYXRvcj4oKnRoaXMpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGl0ZW1zKCkKKyAgICAqLworICAgIGl0ZXJhdGlvbl9wcm94eTxjb25zdF9pdGVyYXRvcj4gaXRlbXMoKSBjb25zdCBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdGlvbl9wcm94eTxjb25zdF9pdGVyYXRvcj4oKnRoaXMpOworICAgIH0KKworICAgIC8vLyBAfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLworICAgIC8vIGNhcGFjaXR5IC8vCisgICAgLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBjYXBhY2l0eQorICAgIC8vLyBAeworCisgICAgLyohCisgICAgQGJyaWVmIGNoZWNrcyB3aGV0aGVyIHRoZSBjb250YWluZXIgaXMgZW1wdHkuCisKKyAgICBDaGVja3MgaWYgYSBKU09OIHZhbHVlIGhhcyBubyBlbGVtZW50cyAoaS5lLiB3aGV0aGVyIGl0cyBAcmVmIHNpemUgaXMgYDBgKS4KKworICAgIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkaWZmZXJlbnQgdHlwZXMgYW5kIGlzCisgICAgICAgICAgICBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICBWYWx1ZSB0eXBlICB8IHJldHVybiB2YWx1ZQorICAgICAgICAgICAgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBudWxsICAgICAgICB8IGB0cnVlYAorICAgICAgICAgICAgYm9vbGVhbiAgICAgfCBgZmFsc2VgCisgICAgICAgICAgICBzdHJpbmcgICAgICB8IGBmYWxzZWAKKyAgICAgICAgICAgIG51bWJlciAgICAgIHwgYGZhbHNlYAorICAgICAgICAgICAgb2JqZWN0ICAgICAgfCByZXN1bHQgb2YgZnVuY3Rpb24gYG9iamVjdF90OjplbXB0eSgpYAorICAgICAgICAgICAgYXJyYXkgICAgICAgfCByZXN1bHQgb2YgZnVuY3Rpb24gYGFycmF5X3Q6OmVtcHR5KClgCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHVzZXMgYGVtcHR5KClgIHRvIGNoZWNrIGlmIGEgSlNPTgorICAgIG9iamVjdCBjb250YWlucyBhbnkgZWxlbWVudHMuLGVtcHR5fQorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQsIGFzIGxvbmcgYXMgQHJlZiBhcnJheV90IGFuZCBAcmVmIG9iamVjdF90IHNhdGlzZnkKKyAgICB0aGUgQ29udGFpbmVyIGNvbmNlcHQ7IHRoYXQgaXMsIHRoZWlyIGBlbXB0eSgpYCBmdW5jdGlvbnMgaGF2ZSBjb25zdGFudAorICAgIGNvbXBsZXhpdHkuCisKKyAgICBAaXRlcmF0b3JzIE5vIGNoYW5nZXMuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBmdW5jdGlvbiBuZXZlciB0aHJvd3MgZXhjZXB0aW9ucy4KKworICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHdoZXRoZXIgYSBzdHJpbmcgc3RvcmVkIGFzIEpTT04gdmFsdWUKKyAgICBpcyBlbXB0eSAtIGl0IHJldHVybnMgd2hldGhlciB0aGUgSlNPTiBjb250YWluZXIgaXRzZWxmIGlzIGVtcHR5IHdoaWNoIGlzCisgICAgZmFsc2UgaW4gdGhlIGNhc2Ugb2YgYSBzdHJpbmcuCisKKyAgICBAcmVxdWlyZW1lbnQgVGhpcyBmdW5jdGlvbiBoZWxwcyBgYmFzaWNfanNvbmAgc2F0aXNmeWluZyB0aGUKKyAgICBbQ29udGFpbmVyXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9jb25jZXB0L0NvbnRhaW5lcikKKyAgICByZXF1aXJlbWVudHM6CisgICAgLSBUaGUgY29tcGxleGl0eSBpcyBjb25zdGFudC4KKyAgICAtIEhhcyB0aGUgc2VtYW50aWNzIG9mIGBiZWdpbigpID09IGVuZCgpYC4KKworICAgIEBzYSBAcmVmIHNpemUoKSAtLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBib29sIGVtcHR5KCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbnVsbCB2YWx1ZXMgYXJlIGVtcHR5CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBhcnJheV90OjplbXB0eSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPmVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlbGVnYXRlIGNhbGwgdG8gb2JqZWN0X3Q6OmVtcHR5KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5vYmplY3QtPmVtcHR5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHR5cGVzIGFyZSBub25lbXB0eQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKworICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIEpTT04gdmFsdWUuCisKKyAgICBAcmV0dXJuIFRoZSByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGlmZmVyZW50IHR5cGVzIGFuZCBpcworICAgICAgICAgICAgZGVmaW5lZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgVmFsdWUgdHlwZSAgfCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgbnVsbCAgICAgICAgfCBgMGAKKyAgICAgICAgICAgIGJvb2xlYW4gICAgIHwgYDFgCisgICAgICAgICAgICBzdHJpbmcgICAgICB8IGAxYAorICAgICAgICAgICAgbnVtYmVyICAgICAgfCBgMWAKKyAgICAgICAgICAgIG9iamVjdCAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIG9iamVjdF90OjpzaXplKCkKKyAgICAgICAgICAgIGFycmF5ICAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIGFycmF5X3Q6OnNpemUoKQorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBjYWxscyBgc2l6ZSgpYCBvbiB0aGUgZGlmZmVyZW50IHZhbHVlCisgICAgdHlwZXMuLHNpemV9CisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudCwgYXMgbG9uZyBhcyBAcmVmIGFycmF5X3QgYW5kIEByZWYgb2JqZWN0X3Qgc2F0aXNmeQorICAgIHRoZSBDb250YWluZXIgY29uY2VwdDsgdGhhdCBpcywgdGhlaXIgc2l6ZSgpIGZ1bmN0aW9ucyBoYXZlIGNvbnN0YW50CisgICAgY29tcGxleGl0eS4KKworICAgIEBpdGVyYXRvcnMgTm8gY2hhbmdlcy4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGZ1bmN0aW9uIG5ldmVyIHRocm93cyBleGNlcHRpb25zLgorCisgICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBzdG9yZWQgYXMgSlNPTgorICAgIHZhbHVlIC0gaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBKU09OIHZhbHVlIHdoaWNoIGlzIDEgaW4KKyAgICB0aGUgY2FzZSBvZiBhIHN0cmluZy4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgorICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgYHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpYC4KKworICAgIEBzYSBAcmVmIGVtcHR5KCkgLS0gY2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBlbXB0eQorICAgIEBzYSBAcmVmIG1heF9zaXplKCkgLS0gcmV0dXJucyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgZWxlbWVudHMKKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudWxsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG51bGwgdmFsdWVzIGFyZSBlbXB0eQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlbGVnYXRlIGNhbGwgdG8gYXJyYXlfdDo6c2l6ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUuYXJyYXktPnNpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBvYmplY3RfdDo6c2l6ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdmFsdWUub2JqZWN0LT5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHR5cGVzIGhhdmUgc2l6ZSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyB0aGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgZWxlbWVudHMKKworICAgIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGEgSlNPTiB2YWx1ZSBpcyBhYmxlIHRvIGhvbGQgZHVlIHRvCisgICAgc3lzdGVtIG9yIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMsIGkuZS4gYHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwKKyAgICBlbmQoKSlgIGZvciB0aGUgSlNPTiB2YWx1ZS4KKworICAgIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkaWZmZXJlbnQgdHlwZXMgYW5kIGlzCisgICAgICAgICAgICBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICBWYWx1ZSB0eXBlICB8IHJldHVybiB2YWx1ZQorICAgICAgICAgICAgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBudWxsICAgICAgICB8IGAwYCAoc2FtZSBhcyBgc2l6ZSgpYCkKKyAgICAgICAgICAgIGJvb2xlYW4gICAgIHwgYDFgIChzYW1lIGFzIGBzaXplKClgKQorICAgICAgICAgICAgc3RyaW5nICAgICAgfCBgMWAgKHNhbWUgYXMgYHNpemUoKWApCisgICAgICAgICAgICBudW1iZXIgICAgICB8IGAxYCAoc2FtZSBhcyBgc2l6ZSgpYCkKKyAgICAgICAgICAgIG9iamVjdCAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIGBvYmplY3RfdDo6bWF4X3NpemUoKWAKKyAgICAgICAgICAgIGFycmF5ICAgICAgIHwgcmVzdWx0IG9mIGZ1bmN0aW9uIGBhcnJheV90OjptYXhfc2l6ZSgpYAorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBjYWxscyBgbWF4X3NpemUoKWAgb24gdGhlIGRpZmZlcmVudCB2YWx1ZQorICAgIHR5cGVzLiBOb3RlIHRoZSBvdXRwdXQgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuLG1heF9zaXplfQorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQsIGFzIGxvbmcgYXMgQHJlZiBhcnJheV90IGFuZCBAcmVmIG9iamVjdF90IHNhdGlzZnkKKyAgICB0aGUgQ29udGFpbmVyIGNvbmNlcHQ7IHRoYXQgaXMsIHRoZWlyIGBtYXhfc2l6ZSgpYCBmdW5jdGlvbnMgaGF2ZSBjb25zdGFudAorICAgIGNvbXBsZXhpdHkuCisKKyAgICBAaXRlcmF0b3JzIE5vIGNoYW5nZXMuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBmdW5jdGlvbiBuZXZlciB0aHJvd3MgZXhjZXB0aW9ucy4KKworICAgIEByZXF1aXJlbWVudCBUaGlzIGZ1bmN0aW9uIGhlbHBzIGBiYXNpY19qc29uYCBzYXRpc2Z5aW5nIHRoZQorICAgIFtDb250YWluZXJdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2NvbmNlcHQvQ29udGFpbmVyKQorICAgIHJlcXVpcmVtZW50czoKKyAgICAtIFRoZSBjb21wbGV4aXR5IGlzIGNvbnN0YW50LgorICAgIC0gSGFzIHRoZSBzZW1hbnRpY3Mgb2YgcmV0dXJuaW5nIGBiLnNpemUoKWAgd2hlcmUgYGJgIGlzIHRoZSBsYXJnZXN0CisgICAgICBwb3NzaWJsZSBKU09OIHZhbHVlLgorCisgICAgQHNhIEByZWYgc2l6ZSgpIC0tIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cworCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxlZ2F0ZSBjYWxsIHRvIGFycmF5X3Q6Om1heF9zaXplKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbV92YWx1ZS5hcnJheS0+bWF4X3NpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVsZWdhdGUgY2FsbCB0byBvYmplY3RfdDo6bWF4X3NpemUoKQorICAgICAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlLm9iamVjdC0+bWF4X3NpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgdHlwZXMgaGF2ZSBtYXhfc2l6ZSgpID09IHNpemUoKQorICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQH0KKworCisgICAgLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gbW9kaWZpZXJzIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgbW9kaWZpZXJzCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY2xlYXJzIHRoZSBjb250ZW50cworCisgICAgQ2xlYXJzIHRoZSBjb250ZW50IG9mIGEgSlNPTiB2YWx1ZSBhbmQgcmVzZXRzIGl0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGFzCisgICAgaWYgQHJlZiBiYXNpY19qc29uKHZhbHVlX3QpIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZQorICAgIHR5cGUgZnJvbSBAcmVmIHR5cGUoKToKKworICAgIFZhbHVlIHR5cGUgIHwgaW5pdGlhbCB2YWx1ZQorICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorICAgIG51bGwgICAgICAgIHwgYG51bGxgCisgICAgYm9vbGVhbiAgICAgfCBgZmFsc2VgCisgICAgc3RyaW5nICAgICAgfCBgIiJgCisgICAgbnVtYmVyICAgICAgfCBgMGAKKyAgICBvYmplY3QgICAgICB8IGB7fWAKKyAgICBhcnJheSAgICAgICB8IGBbXWAKKworICAgIEBwb3N0IEhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZworICAgIEBjb2RlIHsuY3BwfQorICAgICp0aGlzID0gYmFzaWNfanNvbih0eXBlKCkpOworICAgIEBlbmRjb2RlCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgdGhlIGVmZmVjdCBvZiBgY2xlYXIoKWAgdG8gZGlmZmVyZW50CisgICAgSlNPTiB0eXBlcy4sY2xlYXJ9CisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIEpTT04gdmFsdWUuCisKKyAgICBAaXRlcmF0b3JzIEFsbCBpdGVyYXRvcnMsIHBvaW50ZXJzIGFuZCByZWZlcmVuY2VzIHJlbGF0ZWQgdG8gdGhpcyBjb250YWluZXIKKyAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkYXRlZC4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGZ1bmN0aW9uIG5ldmVyIHRocm93cyBleGNlcHRpb25zLgorCisgICAgQHNhIEByZWYgYmFzaWNfanNvbih2YWx1ZV90KSAtLSBjb25zdHJ1Y3RvciB0aGF0IGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlCisgICAgICAgIHNhbWUgdmFsdWUgdGhhbiBjYWxsaW5nIGBjbGVhcigpYAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHZvaWQgY2xlYXIoKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgc3dpdGNoIChtX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZS5udW1iZXJfaW50ZWdlciA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZS5udW1iZXJfZmxvYXQgPSAwLjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3ZhbHVlLmJvb2xlYW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZS5zdHJpbmctPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZS5hcnJheS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBhcnJheQorCisgICAgQXBwZW5kcyB0aGUgZ2l2ZW4gZWxlbWVudCBAYSB2YWwgdG8gdGhlIGVuZCBvZiB0aGUgSlNPTiB2YWx1ZS4gSWYgdGhlCisgICAgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGEgSlNPTiBudWxsIHZhbHVlLCBhbiBlbXB0eSBhcnJheSBpcyBjcmVhdGVkIGJlZm9yZQorICAgIGFwcGVuZGluZyBAYSB2YWwuCisKKyAgICBAcGFyYW1baW5dIHZhbCB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBKU09OIGFycmF5CisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDggd2hlbiBjYWxsZWQgb24gYSB0eXBlIG90aGVyIHRoYW4gSlNPTiBhcnJheSBvcgorICAgIG51bGw7IGV4YW1wbGU6IGAiY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIG51bWJlciJgCisKKyAgICBAY29tcGxleGl0eSBBbW9ydGl6ZWQgY29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBwdXNoX2JhY2soKWAgYW5kIGArPWAgY2FuIGJlIHVzZWQgdG8KKyAgICBhZGQgZWxlbWVudHMgdG8gYSBKU09OIGFycmF5LiBOb3RlIGhvdyB0aGUgYG51bGxgIHZhbHVlIHdhcyBzaWxlbnRseQorICAgIGNvbnZlcnRlZCB0byBhIEpTT04gYXJyYXkuLHB1c2hfYmFja30KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB2b2lkIHB1c2hfYmFjayhiYXNpY19qc29uJiYgdmFsKQorICAgIHsKKyAgICAgICAgLy8gcHVzaF9iYWNrIG9ubHkgd29ya3MgZm9yIG51bGwgb2JqZWN0cyBvciBhcnJheXMKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90KGlzX251bGwoKSBvciBpc19hcnJheSgpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwOCwgImNhbm5vdCB1c2UgcHVzaF9iYWNrKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFuc2Zvcm0gbnVsbCBvYmplY3QgaW50byBhbiBhcnJheQorICAgICAgICBpZiAoaXNfbnVsbCgpKQorICAgICAgICB7CisgICAgICAgICAgICBtX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIGFycmF5IChtb3ZlIHNlbWFudGljcykKKyAgICAgICAgbV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh2YWwpKTsKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBvYmplY3QKKyAgICAgICAgdmFsLm1fdHlwZSA9IHZhbHVlX3Q6Om51bGw7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gYXJyYXkKKyAgICBAY29weWRvYyBwdXNoX2JhY2soYmFzaWNfanNvbiYmKQorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKz0oYmFzaWNfanNvbiYmIHZhbCkKKyAgICB7CisgICAgICAgIHB1c2hfYmFjayhzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBhcnJheQorICAgIEBjb3B5ZG9jIHB1c2hfYmFjayhiYXNpY19qc29uJiYpCisgICAgKi8KKyAgICB2b2lkIHB1c2hfYmFjayhjb25zdCBiYXNpY19qc29uJiB2YWwpCisgICAgeworICAgICAgICAvLyBwdXNoX2JhY2sgb25seSB3b3JrcyBmb3IgbnVsbCBvYmplY3RzIG9yIGFycmF5cworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QoaXNfbnVsbCgpIG9yIGlzX2FycmF5KCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA4LCAiY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYW5zZm9ybSBudWxsIG9iamVjdCBpbnRvIGFuIGFycmF5CisgICAgICAgIGlmIChpc19udWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgbV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gYXJyYXkKKyAgICAgICAgbV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHZhbCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gYXJyYXkKKyAgICBAY29weWRvYyBwdXNoX2JhY2soYmFzaWNfanNvbiYmKQorICAgICovCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKz0oY29uc3QgYmFzaWNfanNvbiYgdmFsKQorICAgIHsKKyAgICAgICAgcHVzaF9iYWNrKHZhbCk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWRkIGFuIG9iamVjdCB0byBhbiBvYmplY3QKKworICAgIEluc2VydHMgdGhlIGdpdmVuIGVsZW1lbnQgQGEgdmFsIHRvIHRoZSBKU09OIG9iamVjdC4gSWYgdGhlIGZ1bmN0aW9uIGlzCisgICAgY2FsbGVkIG9uIGEgSlNPTiBudWxsIHZhbHVlLCBhbiBlbXB0eSBvYmplY3QgaXMgY3JlYXRlZCBiZWZvcmUgaW5zZXJ0aW5nCisgICAgQGEgdmFsLgorCisgICAgQHBhcmFtW2luXSB2YWwgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgSlNPTiBvYmplY3QKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwOCB3aGVuIGNhbGxlZCBvbiBhIHR5cGUgb3RoZXIgdGhhbiBKU09OIG9iamVjdCBvcgorICAgIG51bGw7IGV4YW1wbGU6IGAiY2Fubm90IHVzZSBwdXNoX2JhY2soKSB3aXRoIG51bWJlciJgCisKKyAgICBAY29tcGxleGl0eSBMb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBPKGxvZyhgc2l6ZSgpYCkpLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgcHVzaF9iYWNrKClgIGFuZCBgKz1gIGNhbiBiZSB1c2VkIHRvCisgICAgYWRkIGVsZW1lbnRzIHRvIGEgSlNPTiBvYmplY3QuIE5vdGUgaG93IHRoZSBgbnVsbGAgdmFsdWUgd2FzIHNpbGVudGx5CisgICAgY29udmVydGVkIHRvIGEgSlNPTiBvYmplY3QuLHB1c2hfYmFja19fb2JqZWN0X3RfX3ZhbHVlfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90Ojp2YWx1ZV90eXBlJiB2YWwpCisgICAgeworICAgICAgICAvLyBwdXNoX2JhY2sgb25seSB3b3JrcyBmb3IgbnVsbCBvYmplY3RzIG9yIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90KGlzX251bGwoKSBvciBpc19vYmplY3QoKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDgsICJjYW5ub3QgdXNlIHB1c2hfYmFjaygpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhbnNmb3JtIG51bGwgb2JqZWN0IGludG8gYW4gb2JqZWN0CisgICAgICAgIGlmIChpc19udWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZV90OjpvYmplY3Q7CisgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBhcnJheQorICAgICAgICBtX3ZhbHVlLm9iamVjdC0+aW5zZXJ0KHZhbCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gb2JqZWN0CisgICAgQGNvcHlkb2MgcHVzaF9iYWNrKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90Ojp2YWx1ZV90eXBlJikKKyAgICAqLworICAgIHJlZmVyZW5jZSBvcGVyYXRvcis9KGNvbnN0IHR5cGVuYW1lIG9iamVjdF90Ojp2YWx1ZV90eXBlJiB2YWwpCisgICAgeworICAgICAgICBwdXNoX2JhY2sodmFsKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIG9iamVjdAorCisgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gdXNlIGBwdXNoX2JhY2tgIHdpdGggYW4gaW5pdGlhbGl6ZXIgbGlzdC4gSW4gY2FzZQorCisgICAgMS4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgYW4gb2JqZWN0LAorICAgIDIuIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIGluaXQgY29udGFpbnMgb25seSB0d28gZWxlbWVudHMsIGFuZAorICAgIDMuIHRoZSBmaXJzdCBlbGVtZW50IG9mIEBhIGluaXQgaXMgYSBzdHJpbmcsCisKKyAgICBAYSBpbml0IGlzIGNvbnZlcnRlZCBpbnRvIGFuIG9iamVjdCBlbGVtZW50IGFuZCBhZGRlZCB1c2luZworICAgIEByZWYgcHVzaF9iYWNrKGNvbnN0IHR5cGVuYW1lIG9iamVjdF90Ojp2YWx1ZV90eXBlJikuIE90aGVyd2lzZSwgQGEgaW5pdAorICAgIGlzIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUgYW5kIGFkZGVkIHVzaW5nIEByZWYgcHVzaF9iYWNrKGJhc2ljX2pzb24mJikuCisKKyAgICBAcGFyYW1baW5dIGluaXQgIGFuIGluaXRpYWxpemVyIGxpc3QKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgaW5pdGlhbGl6ZXIgbGlzdCBAYSBpbml0LgorCisgICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byByZXNvbHZlIGFuIGFtYmlndW91cyBvdmVybG9hZCBlcnJvciwKKyAgICAgICAgICBiZWNhdXNlIHBhaXJzIGxpa2UgYHsia2V5IiwgInZhbHVlIn1gIGNhbiBiZSBib3RoIGludGVycHJldGVkIGFzCisgICAgICAgICAgYG9iamVjdF90Ojp2YWx1ZV90eXBlYCBvciBgc3RkOjppbml0aWFsaXplcl9saXN0PGJhc2ljX2pzb24+YCwgc2VlCisgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vaXNzdWVzLzIzNSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgaW5pdGlhbGl6ZXIgbGlzdHMgYXJlIHRyZWF0ZWQgYXMKKyAgICBvYmplY3RzIHdoZW4gcG9zc2libGUuLHB1c2hfYmFja19faW5pdGlhbGl6ZXJfbGlzdH0KKyAgICAqLworICAgIHZvaWQgcHVzaF9iYWNrKGluaXRpYWxpemVyX2xpc3RfdCBpbml0KQorICAgIHsKKyAgICAgICAgaWYgKGlzX29iamVjdCgpIGFuZCBpbml0LnNpemUoKSA9PSAyIGFuZCAoKmluaXQuYmVnaW4oKSktPmlzX3N0cmluZygpKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNpY19qc29uJiYga2V5ID0gaW5pdC5iZWdpbigpLT5tb3ZlZF9vcl9jb3BpZWQoKTsKKyAgICAgICAgICAgIHB1c2hfYmFjayh0eXBlbmFtZSBvYmplY3RfdDo6dmFsdWVfdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGtleS5nZXRfcmVmPHN0cmluZ190Jj4oKSksIChpbml0LmJlZ2luKCkgKyAxKS0+bW92ZWRfb3JfY29waWVkKCkpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hfYmFjayhiYXNpY19qc29uKGluaXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIG9iamVjdAorICAgIEBjb3B5ZG9jIHB1c2hfYmFjayhpbml0aWFsaXplcl9saXN0X3QpCisgICAgKi8KKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IrPShpbml0aWFsaXplcl9saXN0X3QgaW5pdCkKKyAgICB7CisgICAgICAgIHB1c2hfYmFjayhpbml0KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBhZGQgYW4gb2JqZWN0IHRvIGFuIGFycmF5CisKKyAgICBDcmVhdGVzIGEgSlNPTiB2YWx1ZSBmcm9tIHRoZSBwYXNzZWQgcGFyYW1ldGVycyBAYSBhcmdzIHRvIHRoZSBlbmQgb2YgdGhlCisgICAgSlNPTiB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBhIEpTT04gbnVsbCB2YWx1ZSwgYW4gZW1wdHkgYXJyYXkKKyAgICBpcyBjcmVhdGVkIGJlZm9yZSBhcHBlbmRpbmcgdGhlIHZhbHVlIGNyZWF0ZWQgZnJvbSBAYSBhcmdzLgorCisgICAgQHBhcmFtW2luXSBhcmdzIGFyZ3VtZW50cyB0byBmb3J3YXJkIHRvIGEgY29uc3RydWN0b3Igb2YgQHJlZiBiYXNpY19qc29uCisgICAgQHRwYXJhbSBBcmdzIGNvbXBhdGlibGUgdHlwZXMgdG8gY3JlYXRlIGEgQHJlZiBiYXNpY19qc29uIG9iamVjdAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzExIHdoZW4gY2FsbGVkIG9uIGEgdHlwZSBvdGhlciB0aGFuIEpTT04gYXJyYXkgb3IKKyAgICBudWxsOyBleGFtcGxlOiBgImNhbm5vdCB1c2UgZW1wbGFjZV9iYWNrKCkgd2l0aCBudW1iZXIiYAorCisgICAgQGNvbXBsZXhpdHkgQW1vcnRpemVkIGNvbnN0YW50LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgcHVzaF9iYWNrKClgIGNhbiBiZSB1c2VkIHRvIGFkZAorICAgIGVsZW1lbnRzIHRvIGEgSlNPTiBhcnJheS4gTm90ZSBob3cgdGhlIGBudWxsYCB2YWx1ZSB3YXMgc2lsZW50bHkgY29udmVydGVkCisgICAgdG8gYSBKU09OIGFycmF5LixlbXBsYWNlX2JhY2t9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuOAorICAgICovCisgICAgdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4KKyAgICB2b2lkIGVtcGxhY2VfYmFjayhBcmdzJiYgLi4uIGFyZ3MpCisgICAgeworICAgICAgICAvLyBlbXBsYWNlX2JhY2sgb25seSB3b3JrcyBmb3IgbnVsbCBvYmplY3RzIG9yIGFycmF5cworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QoaXNfbnVsbCgpIG9yIGlzX2FycmF5KCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzExLCAiY2Fubm90IHVzZSBlbXBsYWNlX2JhY2soKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYW5zZm9ybSBudWxsIG9iamVjdCBpbnRvIGFuIGFycmF5CisgICAgICAgIGlmIChpc19udWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgbV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gYXJyYXkgKHBlcmZlY3QgZm9yd2FyZGluZykKKyAgICAgICAgbV92YWx1ZS5hcnJheS0+ZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFkZCBhbiBvYmplY3QgdG8gYW4gb2JqZWN0IGlmIGtleSBkb2VzIG5vdCBleGlzdAorCisgICAgSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGludG8gYSBKU09OIG9iamVjdCBjb25zdHJ1Y3RlZCBpbi1wbGFjZSB3aXRoIHRoZQorICAgIGdpdmVuIEBhIGFyZ3MgaWYgdGhlcmUgaXMgbm8gZWxlbWVudCB3aXRoIHRoZSBrZXkgaW4gdGhlIGNvbnRhaW5lci4gSWYgdGhlCisgICAgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGEgSlNPTiBudWxsIHZhbHVlLCBhbiBlbXB0eSBvYmplY3QgaXMgY3JlYXRlZCBiZWZvcmUKKyAgICBhcHBlbmRpbmcgdGhlIHZhbHVlIGNyZWF0ZWQgZnJvbSBAYSBhcmdzLgorCisgICAgQHBhcmFtW2luXSBhcmdzIGFyZ3VtZW50cyB0byBmb3J3YXJkIHRvIGEgY29uc3RydWN0b3Igb2YgQHJlZiBiYXNpY19qc29uCisgICAgQHRwYXJhbSBBcmdzIGNvbXBhdGlibGUgdHlwZXMgdG8gY3JlYXRlIGEgQHJlZiBiYXNpY19qc29uIG9iamVjdAorCisgICAgQHJldHVybiBhIHBhaXIgY29uc2lzdGluZyBvZiBhbiBpdGVyYXRvciB0byB0aGUgaW5zZXJ0ZWQgZWxlbWVudCwgb3IgdGhlCisgICAgICAgICAgICBhbHJlYWR5LWV4aXN0aW5nIGVsZW1lbnQgaWYgbm8gaW5zZXJ0aW9uIGhhcHBlbmVkLCBhbmQgYSBib29sCisgICAgICAgICAgICBkZW5vdGluZyB3aGV0aGVyIHRoZSBpbnNlcnRpb24gdG9vayBwbGFjZS4KKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxMSB3aGVuIGNhbGxlZCBvbiBhIHR5cGUgb3RoZXIgdGhhbiBKU09OIG9iamVjdCBvcgorICAgIG51bGw7IGV4YW1wbGU6IGAiY2Fubm90IHVzZSBlbXBsYWNlKCkgd2l0aCBudW1iZXIiYAorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lciwgTyhsb2coYHNpemUoKWApKS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYGVtcGxhY2UoKWAgY2FuIGJlIHVzZWQgdG8gYWRkIGVsZW1lbnRzCisgICAgdG8gYSBKU09OIG9iamVjdC4gTm90ZSBob3cgdGhlIGBudWxsYCB2YWx1ZSB3YXMgc2lsZW50bHkgY29udmVydGVkIHRvIGEKKyAgICBKU09OIG9iamVjdC4gRnVydGhlciBub3RlIGhvdyBubyB2YWx1ZSBpcyBhZGRlZCBpZiB0aGVyZSB3YXMgYWxyZWFkeSBvbmUKKyAgICB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUgc2FtZSBrZXkuLGVtcGxhY2V9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuOAorICAgICovCisgICAgdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4KKyAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGVtcGxhY2UoQXJncyYmIC4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgLy8gZW1wbGFjZSBvbmx5IHdvcmtzIGZvciBudWxsIG9iamVjdHMgb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdChpc19udWxsKCkgb3IgaXNfb2JqZWN0KCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzExLCAiY2Fubm90IHVzZSBlbXBsYWNlKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmFuc2Zvcm0gbnVsbCBvYmplY3QgaW50byBhbiBvYmplY3QKKyAgICAgICAgaWYgKGlzX251bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgbV92YWx1ZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIGFycmF5IChwZXJmZWN0IGZvcndhcmRpbmcpCisgICAgICAgIGF1dG8gcmVzID0gbV92YWx1ZS5vYmplY3QtPmVtcGxhY2Uoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgICAgLy8gY3JlYXRlIHJlc3VsdCBpdGVyYXRvciBhbmQgc2V0IGl0ZXJhdG9yIHRvIHRoZSByZXN1bHQgb2YgZW1wbGFjZQorICAgICAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICAgICAgaXQubV9pdC5vYmplY3RfaXRlcmF0b3IgPSByZXMuZmlyc3Q7CisKKyAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgaXRlcmF0b3IgYW5kIGJvb2xlYW4KKyAgICAgICAgcmV0dXJuIHtpdCwgcmVzLnNlY29uZH07CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGluc2VydHMgZWxlbWVudAorCisgICAgSW5zZXJ0cyBlbGVtZW50IEBhIHZhbCBiZWZvcmUgaXRlcmF0b3IgQGEgcG9zLgorCisgICAgQHBhcmFtW2luXSBwb3MgaXRlcmF0b3IgYmVmb3JlIHdoaWNoIHRoZSBjb250ZW50IHdpbGwgYmUgaW5zZXJ0ZWQ7IG1heSBiZQorICAgIHRoZSBlbmQoKSBpdGVyYXRvcgorICAgIEBwYXJhbVtpbl0gdmFsIGVsZW1lbnQgdG8gaW5zZXJ0CisgICAgQHJldHVybiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgaW5zZXJ0ZWQgQGEgdmFsLgorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA5IGlmIGNhbGxlZCBvbiBKU09OIHZhbHVlcyBvdGhlciB0aGFuIGFycmF5czsKKyAgICBleGFtcGxlOiBgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBzdHJpbmciYAorICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBAYSBwb3MgaXMgbm90IGFuIGl0ZXJhdG9yIG9mICp0aGlzOworICAgIGV4YW1wbGU6IGAiaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiYAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQgcGx1cyBsaW5lYXIgaW4gdGhlIGRpc3RhbmNlIGJldHdlZW4gQGEgcG9zIGFuZCBlbmQgb2YKKyAgICB0aGUgY29udGFpbmVyLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgaW5zZXJ0KClgIGlzIHVzZWQuLGluc2VydH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBjb25zdCBiYXNpY19qc29uJiB2YWwpCisgICAgeworICAgICAgICAvLyBpbnNlcnQgb25seSB3b3JrcyBmb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXRlcmF0b3IgcG9zIGZpdHMgdG8gdGhpcyBKU09OIHZhbHVlCisgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShwb3MubV9vYmplY3QgIT0gdGhpcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjAyLCAiaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluc2VydCB0byBhcnJheSBhbmQgcmV0dXJuIGl0ZXJhdG9yCisgICAgICAgICAgICBpdGVyYXRvciByZXN1bHQodGhpcyk7CisgICAgICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgdmFsKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMDksICJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnQKKyAgICBAY29weWRvYyBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IGJhc2ljX2pzb24mKQorICAgICovCisgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywgYmFzaWNfanNvbiYmIHZhbCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbnNlcnQocG9zLCB2YWwpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnRzCisKKyAgICBJbnNlcnRzIEBhIGNudCBjb3BpZXMgb2YgQGEgdmFsIGJlZm9yZSBpdGVyYXRvciBAYSBwb3MuCisKKyAgICBAcGFyYW1baW5dIHBvcyBpdGVyYXRvciBiZWZvcmUgd2hpY2ggdGhlIGNvbnRlbnQgd2lsbCBiZSBpbnNlcnRlZDsgbWF5IGJlCisgICAgdGhlIGVuZCgpIGl0ZXJhdG9yCisgICAgQHBhcmFtW2luXSBjbnQgbnVtYmVyIG9mIGNvcGllcyBvZiBAYSB2YWwgdG8gaW5zZXJ0CisgICAgQHBhcmFtW2luXSB2YWwgZWxlbWVudCB0byBpbnNlcnQKKyAgICBAcmV0dXJuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluc2VydGVkLCBvciBAYSBwb3MgaWYKKyAgICBgY250PT0wYAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzA5IGlmIGNhbGxlZCBvbiBKU09OIHZhbHVlcyBvdGhlciB0aGFuIGFycmF5czsgZXhhbXBsZToKKyAgICBgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBzdHJpbmciYAorICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBAYSBwb3MgaXMgbm90IGFuIGl0ZXJhdG9yIG9mICp0aGlzOworICAgIGV4YW1wbGU6IGAiaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiYAorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIEBhIGNudCBwbHVzIGxpbmVhciBpbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBAYSBwb3MKKyAgICBhbmQgZW5kIG9mIHRoZSBjb250YWluZXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBpbnNlcnQoKWAgaXMgdXNlZC4saW5zZXJ0X19jb3VudH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgY250LCBjb25zdCBiYXNpY19qc29uJiB2YWwpCisgICAgeworICAgICAgICAvLyBpbnNlcnQgb25seSB3b3JrcyBmb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgaXRlcmF0b3IgcG9zIGZpdHMgdG8gdGhpcyBKU09OIHZhbHVlCisgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShwb3MubV9vYmplY3QgIT0gdGhpcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjAyLCAiaXRlcmF0b3IgZG9lcyBub3QgZml0IGN1cnJlbnQgdmFsdWUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluc2VydCB0byBhcnJheSBhbmQgcmV0dXJuIGl0ZXJhdG9yCisgICAgICAgICAgICBpdGVyYXRvciByZXN1bHQodGhpcyk7CisgICAgICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgY250LCB2YWwpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwOSwgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGluc2VydHMgZWxlbWVudHMKKworICAgIEluc2VydHMgZWxlbWVudHMgZnJvbSByYW5nZSBgW2ZpcnN0LCBsYXN0KWAgYmVmb3JlIGl0ZXJhdG9yIEBhIHBvcy4KKworICAgIEBwYXJhbVtpbl0gcG9zIGl0ZXJhdG9yIGJlZm9yZSB3aGljaCB0aGUgY29udGVudCB3aWxsIGJlIGluc2VydGVkOyBtYXkgYmUKKyAgICB0aGUgZW5kKCkgaXRlcmF0b3IKKyAgICBAcGFyYW1baW5dIGZpcnN0IGJlZ2luIG9mIHRoZSByYW5nZSBvZiBlbGVtZW50cyB0byBpbnNlcnQKKyAgICBAcGFyYW1baW5dIGxhc3QgZW5kIG9mIHRoZSByYW5nZSBvZiBlbGVtZW50cyB0byBpbnNlcnQKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwOSBpZiBjYWxsZWQgb24gSlNPTiB2YWx1ZXMgb3RoZXIgdGhhbiBhcnJheXM7IGV4YW1wbGU6CisgICAgYCJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggc3RyaW5nImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDIgaWYgQGEgcG9zIGlzIG5vdCBhbiBpdGVyYXRvciBvZiAqdGhpczsKKyAgICBleGFtcGxlOiBgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTAgaWYgQGEgZmlyc3QgYW5kIEBhIGxhc3QgZG8gbm90IGJlbG9uZyB0byB0aGUKKyAgICBzYW1lIEpTT04gdmFsdWU7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGRvIG5vdCBmaXQiYAorICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIxMSBpZiBAYSBmaXJzdCBvciBAYSBsYXN0IGFyZSBpdGVyYXRvcnMgaW50bworICAgIGNvbnRhaW5lciBmb3Igd2hpY2ggaW5zZXJ0IGlzIGNhbGxlZDsgZXhhbXBsZTogYCJwYXNzZWQgaXRlcmF0b3JzIG1heSBub3QKKyAgICBiZWxvbmcgdG8gY29udGFpbmVyImAKKworICAgIEByZXR1cm4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW5zZXJ0ZWQsIG9yIEBhIHBvcyBpZgorICAgIGBmaXJzdD09bGFzdGAKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiBgc3RkOjpkaXN0YW5jZShmaXJzdCwgbGFzdClgIHBsdXMgbGluZWFyIGluIHRoZQorICAgIGRpc3RhbmNlIGJldHdlZW4gQGEgcG9zIGFuZCBlbmQgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyBob3cgYGluc2VydCgpYCBpcyB1c2VkLixpbnNlcnRfX3JhbmdlfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3MsIGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KQorICAgIHsKKyAgICAgICAgLy8gaW5zZXJ0IG9ubHkgd29ya3MgZm9yIGFycmF5cworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgaXNfYXJyYXkoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMwOSwgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiBpdGVyYXRvciBwb3MgZml0cyB0byB0aGlzIEpTT04gdmFsdWUKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocG9zLm1fb2JqZWN0ICE9IHRoaXMpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvciBkb2VzIG5vdCBmaXQgY3VycmVudCB2YWx1ZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIHJhbmdlIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgSlNPTiBvYmplY3QKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZmlyc3QubV9vYmplY3QgIT0gbGFzdC5tX29iamVjdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMCwgIml0ZXJhdG9ycyBkbyBub3QgZml0IikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZmlyc3QubV9vYmplY3QgPT0gdGhpcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMSwgInBhc3NlZCBpdGVyYXRvcnMgbWF5IG5vdCBiZWxvbmcgdG8gY29udGFpbmVyIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5zZXJ0IHRvIGFycmF5IGFuZCByZXR1cm4gaXRlcmF0b3IKKyAgICAgICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOworICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLm1faXQuYXJyYXlfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Lm1faXQuYXJyYXlfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QubV9pdC5hcnJheV9pdGVyYXRvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGluc2VydHMgZWxlbWVudHMKKworICAgIEluc2VydHMgZWxlbWVudHMgZnJvbSBpbml0aWFsaXplciBsaXN0IEBhIGlsaXN0IGJlZm9yZSBpdGVyYXRvciBAYSBwb3MuCisKKyAgICBAcGFyYW1baW5dIHBvcyBpdGVyYXRvciBiZWZvcmUgd2hpY2ggdGhlIGNvbnRlbnQgd2lsbCBiZSBpbnNlcnRlZDsgbWF5IGJlCisgICAgdGhlIGVuZCgpIGl0ZXJhdG9yCisgICAgQHBhcmFtW2luXSBpbGlzdCBpbml0aWFsaXplciBsaXN0IHRvIGluc2VydCB0aGUgdmFsdWVzIGZyb20KKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMwOSBpZiBjYWxsZWQgb24gSlNPTiB2YWx1ZXMgb3RoZXIgdGhhbiBhcnJheXM7IGV4YW1wbGU6CisgICAgYCJjYW5ub3QgdXNlIGluc2VydCgpIHdpdGggc3RyaW5nImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDIgaWYgQGEgcG9zIGlzIG5vdCBhbiBpdGVyYXRvciBvZiAqdGhpczsKKyAgICBleGFtcGxlOiBgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlImAKKworICAgIEByZXR1cm4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW5zZXJ0ZWQsIG9yIEBhIHBvcyBpZgorICAgIGBpbGlzdGAgaXMgZW1wdHkKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiBgaWxpc3Quc2l6ZSgpYCBwbHVzIGxpbmVhciBpbiB0aGUgZGlzdGFuY2UgYmV0d2VlbgorICAgIEBhIHBvcyBhbmQgZW5kIG9mIHRoZSBjb250YWluZXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGBpbnNlcnQoKWAgaXMgdXNlZC4saW5zZXJ0X19pbGlzdH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBpdGVyYXRvciBpbnNlcnQoY29uc3RfaXRlcmF0b3IgcG9zLCBpbml0aWFsaXplcl9saXN0X3QgaWxpc3QpCisgICAgeworICAgICAgICAvLyBpbnNlcnQgb25seSB3b3JrcyBmb3IgYXJyYXlzCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBpc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA5LCAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIGl0ZXJhdG9yIHBvcyBmaXRzIHRvIHRoaXMgSlNPTiB2YWx1ZQorICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShwb3MubV9vYmplY3QgIT0gdGhpcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIwMiwgIml0ZXJhdG9yIGRvZXMgbm90IGZpdCBjdXJyZW50IHZhbHVlIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaW5zZXJ0IHRvIGFycmF5IGFuZCByZXR1cm4gaXRlcmF0b3IKKyAgICAgICAgaXRlcmF0b3IgcmVzdWx0KHRoaXMpOworICAgICAgICByZXN1bHQubV9pdC5hcnJheV9pdGVyYXRvciA9IG1fdmFsdWUuYXJyYXktPmluc2VydChwb3MubV9pdC5hcnJheV9pdGVyYXRvciwgaWxpc3QuYmVnaW4oKSwgaWxpc3QuZW5kKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBpbnNlcnRzIGVsZW1lbnRzCisKKyAgICBJbnNlcnRzIGVsZW1lbnRzIGZyb20gcmFuZ2UgYFtmaXJzdCwgbGFzdClgLgorCisgICAgQHBhcmFtW2luXSBmaXJzdCBiZWdpbiBvZiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgdG8gaW5zZXJ0CisgICAgQHBhcmFtW2luXSBsYXN0IGVuZCBvZiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgdG8gaW5zZXJ0CisKKyAgICBAdGhyb3cgdHlwZV9lcnJvci4zMDkgaWYgY2FsbGVkIG9uIEpTT04gdmFsdWVzIG90aGVyIHRoYW4gb2JqZWN0czsgZXhhbXBsZToKKyAgICBgImNhbm5vdCB1c2UgaW5zZXJ0KCkgd2l0aCBzdHJpbmciYAorICAgIEB0aHJvdyBpbnZhbGlkX2l0ZXJhdG9yLjIwMiBpZiBpdGVyYXRvciBAYSBmaXJzdCBvciBAYSBsYXN0IGRvZXMgZG9lcyBub3QKKyAgICBwb2ludCB0byBhbiBvYmplY3Q7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGZpcnN0IGFuZCBsYXN0IG11c3QgcG9pbnQgdG8KKyAgICBvYmplY3RzImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMTAgaWYgQGEgZmlyc3QgYW5kIEBhIGxhc3QgZG8gbm90IGJlbG9uZyB0byB0aGUKKyAgICBzYW1lIEpTT04gdmFsdWU7IGV4YW1wbGU6IGAiaXRlcmF0b3JzIGRvIG5vdCBmaXQiYAorCisgICAgQGNvbXBsZXhpdHkgTG9nYXJpdGhtaWM6IGBPKE4qbG9nKHNpemUoKSArIE4pKWAsIHdoZXJlIGBOYCBpcyB0aGUgbnVtYmVyCisgICAgb2YgZWxlbWVudHMgdG8gaW5zZXJ0LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgaW5zZXJ0KClgIGlzIHVzZWQuLGluc2VydF9fcmFuZ2Vfb2JqZWN0fQorCisgICAgQHNpbmNlIHZlcnNpb24gMy4wLjAKKyAgICAqLworICAgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KQorICAgIHsKKyAgICAgICAgLy8gaW5zZXJ0IG9ubHkgd29ya3MgZm9yIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzA5LCAiY2Fubm90IHVzZSBpbnNlcnQoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyh0eXBlX25hbWUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIHJhbmdlIGl0ZXJhdG9ycyBiZWxvbmcgdG8gdGhlIHNhbWUgSlNPTiBvYmplY3QKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoZmlyc3QubV9vYmplY3QgIT0gbGFzdC5tX29iamVjdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1coaW52YWxpZF9pdGVyYXRvcjo6Y3JlYXRlKDIxMCwgIml0ZXJhdG9ycyBkbyBub3QgZml0IikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGFzc2VkIGl0ZXJhdG9ycyBtdXN0IGJlbG9uZyB0byBvYmplY3RzCisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBmaXJzdC5tX29iamVjdC0+aXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKGludmFsaWRfaXRlcmF0b3I6OmNyZWF0ZSgyMDIsICJpdGVyYXRvcnMgZmlyc3QgYW5kIGxhc3QgbXVzdCBwb2ludCB0byBvYmplY3RzIikpOworICAgICAgICB9CisKKyAgICAgICAgbV92YWx1ZS5vYmplY3QtPmluc2VydChmaXJzdC5tX2l0Lm9iamVjdF9pdGVyYXRvciwgbGFzdC5tX2l0Lm9iamVjdF9pdGVyYXRvcik7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIHVwZGF0ZXMgYSBKU09OIG9iamVjdCBmcm9tIGFub3RoZXIgb2JqZWN0LCBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzCisKKyAgICBJbnNlcnRzIGFsbCB2YWx1ZXMgZnJvbSBKU09OIG9iamVjdCBAYSBqIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nIGtleXMuCisKKyAgICBAcGFyYW1baW5dIGogIEpTT04gb2JqZWN0IHRvIHJlYWQgdmFsdWVzIGZyb20KKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxMiBpZiBjYWxsZWQgb24gSlNPTiB2YWx1ZXMgb3RoZXIgdGhhbiBvYmplY3RzOyBleGFtcGxlOgorICAgIGAiY2Fubm90IHVzZSB1cGRhdGUoKSB3aXRoIHN0cmluZyJgCisKKyAgICBAY29tcGxleGl0eSBPKE4qbG9nKHNpemUoKSArIE4pKSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvCisgICAgICAgICAgICAgICAgaW5zZXJ0LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIGhvdyBgdXBkYXRlKClgIGlzIHVzZWQuLHVwZGF0ZX0KKworICAgIEBzYSBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS9zdGR0eXBlcy5odG1sI2RpY3QudXBkYXRlCisKKyAgICBAc2luY2UgdmVyc2lvbiAzLjAuMAorICAgICovCisgICAgdm9pZCB1cGRhdGUoY29uc3RfcmVmZXJlbmNlIGopCisgICAgeworICAgICAgICAvLyBpbXBsaWNpdGx5IGNvbnZlcnQgbnVsbCB2YWx1ZSB0byBhbiBlbXB0eSBvYmplY3QKKyAgICAgICAgaWYgKGlzX251bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QgPSBjcmVhdGU8b2JqZWN0X3Q+KCk7CisgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTIsICJjYW5ub3QgdXNlIHVwZGF0ZSgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBqLmlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzEyLCAiY2Fubm90IHVzZSB1cGRhdGUoKSB3aXRoICIgKyBzdGQ6OnN0cmluZyhqLnR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gai5jYmVnaW4oKTsgaXQgIT0gai5jZW5kKCk7ICsraXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdmFsdWUub2JqZWN0LT5vcGVyYXRvcltdKGl0LmtleSgpKSA9IGl0LnZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgdXBkYXRlcyBhIEpTT04gb2JqZWN0IGZyb20gYW5vdGhlciBvYmplY3QsIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMKKworICAgIEluc2VydHMgYWxsIHZhbHVlcyBmcm9tIGZyb20gcmFuZ2UgYFtmaXJzdCwgbGFzdClgIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nCisgICAga2V5cy4KKworICAgIEBwYXJhbVtpbl0gZmlyc3QgYmVnaW4gb2YgdGhlIHJhbmdlIG9mIGVsZW1lbnRzIHRvIGluc2VydAorICAgIEBwYXJhbVtpbl0gbGFzdCBlbmQgb2YgdGhlIHJhbmdlIG9mIGVsZW1lbnRzIHRvIGluc2VydAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzEyIGlmIGNhbGxlZCBvbiBKU09OIHZhbHVlcyBvdGhlciB0aGFuIG9iamVjdHM7IGV4YW1wbGU6CisgICAgYCJjYW5ub3QgdXNlIHVwZGF0ZSgpIHdpdGggc3RyaW5nImAKKyAgICBAdGhyb3cgaW52YWxpZF9pdGVyYXRvci4yMDIgaWYgaXRlcmF0b3IgQGEgZmlyc3Qgb3IgQGEgbGFzdCBkb2VzIGRvZXMgbm90CisgICAgcG9pbnQgdG8gYW4gb2JqZWN0OyBleGFtcGxlOiBgIml0ZXJhdG9ycyBmaXJzdCBhbmQgbGFzdCBtdXN0IHBvaW50IHRvCisgICAgb2JqZWN0cyJgCisgICAgQHRocm93IGludmFsaWRfaXRlcmF0b3IuMjEwIGlmIEBhIGZpcnN0IGFuZCBAYSBsYXN0IGRvIG5vdCBiZWxvbmcgdG8gdGhlCisgICAgc2FtZSBKU09OIHZhbHVlOyBleGFtcGxlOiBgIml0ZXJhdG9ycyBkbyBub3QgZml0ImAKKworICAgIEBjb21wbGV4aXR5IE8oTipsb2coc2l6ZSgpICsgTikpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8KKyAgICAgICAgICAgICAgICBpbnNlcnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgaG93IGB1cGRhdGUoKWAgaXMgdXNlZF9fcmFuZ2UuLHVwZGF0ZX0KKworICAgIEBzYSBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS9zdGR0eXBlcy5odG1sI2RpY3QudXBkYXRlCisKKyAgICBAc2luY2UgdmVyc2lvbiAzLjAuMAorICAgICovCisgICAgdm9pZCB1cGRhdGUoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpCisgICAgeworICAgICAgICAvLyBpbXBsaWNpdGx5IGNvbnZlcnQgbnVsbCB2YWx1ZSB0byBhbiBlbXB0eSBvYmplY3QKKyAgICAgICAgaWYgKGlzX251bGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICAgICAgbV92YWx1ZS5vYmplY3QgPSBjcmVhdGU8b2JqZWN0X3Q+KCk7CisgICAgICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QgaXNfb2JqZWN0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTIsICJjYW5ub3QgdXNlIHVwZGF0ZSgpIHdpdGggIiArIHN0ZDo6c3RyaW5nKHR5cGVfbmFtZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgcmFuZ2UgaXRlcmF0b3JzIGJlbG9uZyB0byB0aGUgc2FtZSBKU09OIG9iamVjdAorICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShmaXJzdC5tX29iamVjdCAhPSBsYXN0Lm1fb2JqZWN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjEwLCAiaXRlcmF0b3JzIGRvIG5vdCBmaXQiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXNzZWQgaXRlcmF0b3JzIG11c3QgYmVsb25nIHRvIG9iamVjdHMKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGZpcnN0Lm1fb2JqZWN0LT5pc19vYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgZmlyc3QubV9vYmplY3QtPmlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhpbnZhbGlkX2l0ZXJhdG9yOjpjcmVhdGUoMjAyLCAiaXRlcmF0b3JzIGZpcnN0IGFuZCBsYXN0IG11c3QgcG9pbnQgdG8gb2JqZWN0cyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byBpdCA9IGZpcnN0OyBpdCAhPSBsYXN0OyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ZhbHVlLm9iamVjdC0+b3BlcmF0b3JbXShpdC5rZXkoKSkgPSBpdC52YWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGV4Y2hhbmdlcyB0aGUgdmFsdWVzCisKKyAgICBFeGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBKU09OIHZhbHVlIHdpdGggdGhvc2Ugb2YgQGEgb3RoZXIuIERvZXMgbm90CisgICAgaW52b2tlIGFueSBtb3ZlLCBjb3B5LCBvciBzd2FwIG9wZXJhdGlvbnMgb24gaW5kaXZpZHVhbCBlbGVtZW50cy4gQWxsCisgICAgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzIHJlbWFpbiB2YWxpZC4gVGhlIHBhc3QtdGhlLWVuZCBpdGVyYXRvciBpcworICAgIGludmFsaWRhdGVkLgorCisgICAgQHBhcmFtW2luLG91dF0gb3RoZXIgSlNPTiB2YWx1ZSB0byBleGNoYW5nZSB0aGUgY29udGVudHMgd2l0aAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IEpTT04gdmFsdWVzIGNhbiBiZSBzd2FwcGVkIHdpdGgKKyAgICBgc3dhcCgpYC4sc3dhcF9fcmVmZXJlbmNlfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHZvaWQgc3dhcChyZWZlcmVuY2Ugb3RoZXIpIG5vZXhjZXB0ICgKKyAgICAgICAgc3RkOjppc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTx2YWx1ZV90Pjo6dmFsdWUgYW5kCisgICAgICAgIHN0ZDo6aXNfbm90aHJvd19tb3ZlX2Fzc2lnbmFibGU8dmFsdWVfdD46OnZhbHVlIGFuZAorICAgICAgICBzdGQ6OmlzX25vdGhyb3dfbW92ZV9jb25zdHJ1Y3RpYmxlPGpzb25fdmFsdWU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgc3RkOjppc19ub3Rocm93X21vdmVfYXNzaWduYWJsZTxqc29uX3ZhbHVlPjo6dmFsdWUKKyAgICApCisgICAgeworICAgICAgICBzdGQ6OnN3YXAobV90eXBlLCBvdGhlci5tX3R5cGUpOworICAgICAgICBzdGQ6OnN3YXAobV92YWx1ZSwgb3RoZXIubV92YWx1ZSk7CisgICAgICAgIGFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMKKworICAgIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgYSBKU09OIGFycmF5IHdpdGggdGhvc2Ugb2YgQGEgb3RoZXIuIERvZXMgbm90CisgICAgaW52b2tlIGFueSBtb3ZlLCBjb3B5LCBvciBzd2FwIG9wZXJhdGlvbnMgb24gaW5kaXZpZHVhbCBlbGVtZW50cy4gQWxsCisgICAgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzIHJlbWFpbiB2YWxpZC4gVGhlIHBhc3QtdGhlLWVuZCBpdGVyYXRvciBpcworICAgIGludmFsaWRhdGVkLgorCisgICAgQHBhcmFtW2luLG91dF0gb3RoZXIgYXJyYXkgdG8gZXhjaGFuZ2UgdGhlIGNvbnRlbnRzIHdpdGgKKworICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxMCB3aGVuIEpTT04gdmFsdWUgaXMgbm90IGFuIGFycmF5OyBleGFtcGxlOiBgImNhbm5vdAorICAgIHVzZSBzd2FwKCkgd2l0aCBzdHJpbmciYAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IGFycmF5cyBjYW4gYmUgc3dhcHBlZCB3aXRoCisgICAgYHN3YXAoKWAuLHN3YXBfX2FycmF5X3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgdm9pZCBzd2FwKGFycmF5X3QmIG90aGVyKQorICAgIHsKKyAgICAgICAgLy8gc3dhcCBvbmx5IHdvcmtzIGZvciBhcnJheXMKKyAgICAgICAgaWYgKEpTT05fTElLRUxZKGlzX2FycmF5KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN3YXAoKihtX3ZhbHVlLmFycmF5KSwgb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzEwLCAiY2Fubm90IHVzZSBzd2FwKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMKKworICAgIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgYSBKU09OIG9iamVjdCB3aXRoIHRob3NlIG9mIEBhIG90aGVyLiBEb2VzIG5vdAorICAgIGludm9rZSBhbnkgbW92ZSwgY29weSwgb3Igc3dhcCBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgZWxlbWVudHMuIEFsbAorICAgIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyByZW1haW4gdmFsaWQuIFRoZSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IgaXMKKyAgICBpbnZhbGlkYXRlZC4KKworICAgIEBwYXJhbVtpbixvdXRdIG90aGVyIG9iamVjdCB0byBleGNoYW5nZSB0aGUgY29udGVudHMgd2l0aAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzEwIHdoZW4gSlNPTiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0OyBleGFtcGxlOgorICAgIGAiY2Fubm90IHVzZSBzd2FwKCkgd2l0aCBzdHJpbmciYAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IG9iamVjdHMgY2FuIGJlIHN3YXBwZWQgd2l0aAorICAgIGBzd2FwKClgLixzd2FwX19vYmplY3RfdH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB2b2lkIHN3YXAob2JqZWN0X3QmIG90aGVyKQorICAgIHsKKyAgICAgICAgLy8gc3dhcCBvbmx5IHdvcmtzIGZvciBvYmplY3RzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19vYmplY3QoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3dhcCgqKG1fdmFsdWUub2JqZWN0KSwgb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzEwLCAiY2Fubm90IHVzZSBzd2FwKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMKKworICAgIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgYSBKU09OIHN0cmluZyB3aXRoIHRob3NlIG9mIEBhIG90aGVyLiBEb2VzIG5vdAorICAgIGludm9rZSBhbnkgbW92ZSwgY29weSwgb3Igc3dhcCBvcGVyYXRpb25zIG9uIGluZGl2aWR1YWwgZWxlbWVudHMuIEFsbAorICAgIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcyByZW1haW4gdmFsaWQuIFRoZSBwYXN0LXRoZS1lbmQgaXRlcmF0b3IgaXMKKyAgICBpbnZhbGlkYXRlZC4KKworICAgIEBwYXJhbVtpbixvdXRdIG90aGVyIHN0cmluZyB0byBleGNoYW5nZSB0aGUgY29udGVudHMgd2l0aAorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzEwIHdoZW4gSlNPTiB2YWx1ZSBpcyBub3QgYSBzdHJpbmc7IGV4YW1wbGU6IGAiY2Fubm90CisgICAgdXNlIHN3YXAoKSB3aXRoIGJvb2xlYW4iYAorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHN0cmluZ3MgY2FuIGJlIHN3YXBwZWQgd2l0aAorICAgIGBzd2FwKClgLixzd2FwX19zdHJpbmdfdH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICB2b2lkIHN3YXAoc3RyaW5nX3QmIG90aGVyKQorICAgIHsKKyAgICAgICAgLy8gc3dhcCBvbmx5IHdvcmtzIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChKU09OX0xJS0VMWShpc19zdHJpbmcoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3dhcCgqKG1fdmFsdWUuc3RyaW5nKSwgb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyh0eXBlX2Vycm9yOjpjcmVhdGUoMzEwLCAiY2Fubm90IHVzZSBzd2FwKCkgd2l0aCAiICsgc3RkOjpzdHJpbmcodHlwZV9uYW1lKCkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQH0KKworICBwdWJsaWM6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gb3BlcmF0b3JzIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogZXF1YWwKKworICAgIENvbXBhcmVzIHR3byBKU09OIHZhbHVlcyBmb3IgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgLSBUd28gSlNPTiB2YWx1ZXMgYXJlIGVxdWFsIGlmICgxKSB0aGV5IGFyZSBmcm9tIHRoZSBzYW1lIHR5cGUgYW5kICgyKQorICAgICAgdGhlaXIgc3RvcmVkIHZhbHVlcyBhcmUgdGhlIHNhbWUgYWNjb3JkaW5nIHRvIHRoZWlyIHJlc3BlY3RpdmUKKyAgICAgIGBvcGVyYXRvcj09YC4KKyAgICAtIEludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGJlZm9yZQorICAgICAgY29tcGFyaXNvbi4gTm90ZSB0aGFuIHR3byBOYU4gdmFsdWVzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyB1bmVxdWFsLgorICAgIC0gVHdvIEpTT04gbnVsbCB2YWx1ZXMgYXJlIGVxdWFsLgorCisgICAgQG5vdGUgRmxvYXRpbmctcG9pbnQgaW5zaWRlIEpTT04gdmFsdWVzIG51bWJlcnMgYXJlIGNvbXBhcmVkIHdpdGgKKyAgICBganNvbjo6bnVtYmVyX2Zsb2F0X3Q6Om9wZXJhdG9yPT1gIHdoaWNoIGlzIGBkb3VibGU6Om9wZXJhdG9yPT1gIGJ5CisgICAgZGVmYXVsdC4gVG8gY29tcGFyZSBmbG9hdGluZy1wb2ludCB3aGlsZSByZXNwZWN0aW5nIGFuIGVwc2lsb24sIGFuIGFsdGVybmF0aXZlCisgICAgW2NvbXBhcmlzb24gZnVuY3Rpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpb2tvbnJhZC9tYXJuYXYvYmxvYi9tYXN0ZXIvc3JjL21hcm5hdi9tYXRoL2Zsb2F0aW5ncG9pbnQuaHBwI0wzNC0jTDM5KQorICAgIGNvdWxkIGJlIHVzZWQsIGZvciBpbnN0YW5jZQorICAgIEBjb2RlIHsuY3BwfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUsIFQ+Ojp0eXBlPgorICAgIGlubGluZSBib29sIGlzX3NhbWUoVCBhLCBUIGIsIFQgZXBzaWxvbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmVwc2lsb24oKSkgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBzdGQ6OmFicyhhIC0gYikgPD0gZXBzaWxvbjsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIEBub3RlIE5hTiB2YWx1ZXMgbmV2ZXIgY29tcGFyZSBlcXVhbCB0byB0aGVtc2VsdmVzIG9yIHRvIG90aGVyIE5hTiB2YWx1ZXMuCisKKyAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgorICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgorICAgIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIEBhIGxocyBhbmQgQGEgcmhzIGFyZSBlcXVhbAorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzIGV4Y2VwdGlvbnMuCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGNvbXBhcmluZyBzZXZlcmFsIEpTT04KKyAgICB0eXBlcy4sb3BlcmF0b3JfX2VxdWFsfQorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGNvbnN0IGF1dG8gbGhzX3R5cGUgPSBsaHMudHlwZSgpOworICAgICAgICBjb25zdCBhdXRvIHJoc190eXBlID0gcmhzLnR5cGUoKTsKKworICAgICAgICBpZiAobGhzX3R5cGUgPT0gcmhzX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobGhzX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgqbGhzLm1fdmFsdWUuYXJyYXkgPT0gKnJocy5tX3ZhbHVlLmFycmF5KTsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCpsaHMubV92YWx1ZS5vYmplY3QgPT0gKnJocy5tX3ZhbHVlLm9iamVjdCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKmxocy5tX3ZhbHVlLnN0cmluZyA9PSAqcmhzLm1fdmFsdWUuc3RyaW5nKTsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsaHMubV92YWx1ZS5ib29sZWFuID09IHJocy5tX3ZhbHVlLmJvb2xlYW4pOworCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsaHMubV92YWx1ZS5udW1iZXJfaW50ZWdlciA9PSByaHMubV92YWx1ZS5udW1iZXJfaW50ZWdlcik7CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPT0gcmhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKTsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGxocy5tX3ZhbHVlLm51bWJlcl9mbG9hdCA9PSByaHMubV92YWx1ZS5udW1iZXJfZmxvYXQpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyIGFuZCByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfZmxvYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8bnVtYmVyX2Zsb2F0X3Q+KGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyKSA9PSByaHMubV92YWx1ZS5udW1iZXJfZmxvYXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9mbG9hdCBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobGhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0ID09IHN0YXRpY19jYXN0PG51bWJlcl9mbG9hdF90PihyaHMubV92YWx1ZS5udW1iZXJfaW50ZWdlcikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PG51bWJlcl9mbG9hdF90PihsaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpID09IHJocy5tX3ZhbHVlLm51bWJlcl9mbG9hdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0IGFuZCByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobGhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0ID09IHN0YXRpY19jYXN0PG51bWJlcl9mbG9hdF90PihyaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQgYW5kIHJoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PG51bWJlcl9pbnRlZ2VyX3Q+KGxocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCkgPT0gcmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyIGFuZCByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobGhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPT0gc3RhdGljX2Nhc3Q8bnVtYmVyX2ludGVnZXJfdD4ocmhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmlzb246IGVxdWFsCisgICAgQGNvcHlkb2Mgb3BlcmF0b3I9PShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3QgU2NhbGFyVHlwZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGxocyA9PSBiYXNpY19qc29uKHJocykpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBlcXVhbAorICAgIEBjb3B5ZG9jIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNjYWxhclR5cGUgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChiYXNpY19qc29uKGxocykgPT0gcmhzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogbm90IGVxdWFsCisKKyAgICBDb21wYXJlcyB0d28gSlNPTiB2YWx1ZXMgZm9yIGluZXF1YWxpdHkgYnkgY2FsY3VsYXRpbmcgYG5vdCAobGhzID09IHJocylgLgorCisgICAgQHBhcmFtW2luXSBsaHMgIGZpcnN0IEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcGFyYW1baW5dIHJocyAgc2Vjb25kIEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBAYSBsaHMgYW5kIEBhIHJocyBhcmUgbm90IGVxdWFsCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBmdW5jdGlvbiBuZXZlciB0aHJvd3MgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgY29tcGFyaW5nIHNldmVyYWwgSlNPTgorICAgIHR5cGVzLixvcGVyYXRvcl9fbm90ZXF1YWx9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vdCAobGhzID09IHJocyk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmlzb246IG5vdCBlcXVhbAorICAgIEBjb3B5ZG9jIG9wZXJhdG9yIT0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChsaHMgIT0gYmFzaWNfanNvbihyaHMpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogbm90IGVxdWFsCisgICAgQGNvcHlkb2Mgb3BlcmF0b3IhPShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGJhc2ljX2pzb24obGhzKSAhPSByaHMpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBsZXNzIHRoYW4KKworICAgIENvbXBhcmVzIHdoZXRoZXIgb25lIEpTT04gdmFsdWUgQGEgbGhzIGlzIGxlc3MgdGhhbiBhbm90aGVyIEpTT04gdmFsdWUgQGEKKyAgICByaHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgICAgLSBJZiBAYSBsaHMgYW5kIEBhIHJocyBoYXZlIHRoZSBzYW1lIHR5cGUsIHRoZSB2YWx1ZXMgYXJlIGNvbXBhcmVkIHVzaW5nCisgICAgICB0aGUgZGVmYXVsdCBgPGAgb3BlcmF0b3IuCisgICAgLSBJbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBiZWZvcmUKKyAgICAgIGNvbXBhcmlzb24KKyAgICAtIEluIGNhc2UgQGEgbGhzIGFuZCBAYSByaHMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMsIHRoZSB2YWx1ZXMgYXJlIGlnbm9yZWQKKyAgICAgIGFuZCB0aGUgb3JkZXIgb2YgdGhlIHR5cGVzIGlzIGNvbnNpZGVyZWQsIHNlZQorICAgICAgQHJlZiBvcGVyYXRvcjwoY29uc3QgdmFsdWVfdCwgY29uc3QgdmFsdWVfdCkuCisKKyAgICBAcGFyYW1baW5dIGxocyAgZmlyc3QgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgorICAgIEBwYXJhbVtpbl0gcmhzICBzZWNvbmQgSlNPTiB2YWx1ZSB0byBjb25zaWRlcgorICAgIEByZXR1cm4gd2hldGhlciBAYSBsaHMgaXMgbGVzcyB0aGFuIEBhIHJocworCisgICAgQGNvbXBsZXhpdHkgTGluZWFyLgorCisgICAgQGV4Y2VwdGlvbnNhZmV0eSBOby10aHJvdyBndWFyYW50ZWU6IHRoaXMgZnVuY3Rpb24gbmV2ZXIgdGhyb3dzIGV4Y2VwdGlvbnMuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGNvbXBhcmluZyBzZXZlcmFsIEpTT04KKyAgICB0eXBlcy4sb3BlcmF0b3JfX2xlc3N9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICBjb25zdCBhdXRvIGxoc190eXBlID0gbGhzLnR5cGUoKTsKKyAgICAgICAgY29uc3QgYXV0byByaHNfdHlwZSA9IHJocy50eXBlKCk7CisKKyAgICAgICAgaWYgKGxoc190eXBlID09IHJoc190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGxoc190eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKmxocy5tX3ZhbHVlLmFycmF5KSA8ICgqcmhzLm1fdmFsdWUuYXJyYXkpOworCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqbGhzLm1fdmFsdWUub2JqZWN0IDwgKnJocy5tX3ZhbHVlLm9iamVjdDsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpzdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAqbGhzLm1fdmFsdWUuc3RyaW5nIDwgKnJocy5tX3ZhbHVlLnN0cmluZzsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLmJvb2xlYW4gPCByaHMubV92YWx1ZS5ib29sZWFuOworCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDwgcmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXI7CisKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8IHJocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZDsKKworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2Zsb2F0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0IDwgcmhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0OworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyIGFuZCByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfZmxvYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxudW1iZXJfZmxvYXRfdD4obGhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpIDwgcmhzLm1fdmFsdWUubnVtYmVyX2Zsb2F0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl9mbG9hdCBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfZmxvYXQgPCBzdGF0aWNfY2FzdDxudW1iZXJfZmxvYXRfdD4ocmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bnVtYmVyX2Zsb2F0X3Q+KGxocy5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCkgPCByaHMubV92YWx1ZS5udW1iZXJfZmxvYXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2Zsb2F0IGFuZCByaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZS5udW1iZXJfZmxvYXQgPCBzdGF0aWNfY2FzdDxudW1iZXJfZmxvYXRfdD4ocmhzLm1fdmFsdWUubnVtYmVyX3Vuc2lnbmVkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsaHNfdHlwZSA9PSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlciBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPCBzdGF0aWNfY2FzdDxudW1iZXJfaW50ZWdlcl90PihyaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxoc190eXBlID09IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZCBhbmQgcmhzX3R5cGUgPT0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxudW1iZXJfaW50ZWdlcl90PihsaHMubV92YWx1ZS5udW1iZXJfdW5zaWduZWQpIDwgcmhzLm1fdmFsdWUubnVtYmVyX2ludGVnZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBvbmx5IHJlYWNoIHRoaXMgbGluZSBpZiB3ZSBjYW5ub3QgY29tcGFyZSB2YWx1ZXMuIEluIHRoYXQgY2FzZSwKKyAgICAgICAgLy8gd2UgY29tcGFyZSB0eXBlcy4gTm90ZSB3ZSBoYXZlIHRvIGNhbGwgdGhlIG9wZXJhdG9yIGV4cGxpY2l0bHksCisgICAgICAgIC8vIGJlY2F1c2UgTVNWQyBoYXMgcHJvYmxlbXMgb3RoZXJ3aXNlLgorICAgICAgICByZXR1cm4gb3BlcmF0b3I8KGxoc190eXBlLCByaHNfdHlwZSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmlzb246IGxlc3MgdGhhbgorICAgIEBjb3B5ZG9jIG9wZXJhdG9yPChjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdCBTY2FsYXJUeXBlIHJocykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiAobGhzIDwgYmFzaWNfanNvbihyaHMpKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogbGVzcyB0aGFuCisgICAgQGNvcHlkb2Mgb3BlcmF0b3I8KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNjYWxhclR5cGUgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChiYXNpY19qc29uKGxocykgPCByaHMpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBsZXNzIHRoYW4gb3IgZXF1YWwKKworICAgIENvbXBhcmVzIHdoZXRoZXIgb25lIEpTT04gdmFsdWUgQGEgbGhzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyCisgICAgSlNPTiB2YWx1ZSBieSBjYWxjdWxhdGluZyBgbm90IChyaHMgPCBsaHMpYC4KKworICAgIEBwYXJhbVtpbl0gbGhzICBmaXJzdCBKU09OIHZhbHVlIHRvIGNvbnNpZGVyCisgICAgQHBhcmFtW2luXSByaHMgIHNlY29uZCBKU09OIHZhbHVlIHRvIGNvbnNpZGVyCisgICAgQHJldHVybiB3aGV0aGVyIEBhIGxocyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gQGEgcmhzCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBmdW5jdGlvbiBuZXZlciB0aHJvd3MgZXhjZXB0aW9ucy4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgY29tcGFyaW5nIHNldmVyYWwgSlNPTgorICAgIHR5cGVzLixvcGVyYXRvcl9fZ3JlYXRlcn0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCisgICAgKi8KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gbm90IChyaHMgPCBsaHMpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICBAY29weWRvYyBvcGVyYXRvcjw9KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdCBTY2FsYXJUeXBlIHJocykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiAobGhzIDw9IGJhc2ljX2pzb24ocmhzKSk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmlzb246IGxlc3MgdGhhbiBvciBlcXVhbAorICAgIEBjb3B5ZG9jIG9wZXJhdG9yPD0oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFNjYWxhclR5cGUgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChiYXNpY19qc29uKGxocykgPD0gcmhzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuCisKKyAgICBDb21wYXJlcyB3aGV0aGVyIG9uZSBKU09OIHZhbHVlIEBhIGxocyBpcyBncmVhdGVyIHRoYW4gYW5vdGhlcgorICAgIEpTT04gdmFsdWUgYnkgY2FsY3VsYXRpbmcgYG5vdCAobGhzIDw9IHJocylgLgorCisgICAgQHBhcmFtW2luXSBsaHMgIGZpcnN0IEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcGFyYW1baW5dIHJocyAgc2Vjb25kIEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcmV0dXJuIHdoZXRoZXIgQGEgbGhzIGlzIGdyZWF0ZXIgdGhhbiB0byBAYSByaHMKKworICAgIEBjb21wbGV4aXR5IExpbmVhci4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGZ1bmN0aW9uIG5ldmVyIHRocm93cyBleGNlcHRpb25zLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBjb21wYXJpbmcgc2V2ZXJhbCBKU09OCisgICAgdHlwZXMuLG9wZXJhdG9yX19sZXNzZXF1YWx9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gbm90IChsaHMgPD0gcmhzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuCisgICAgQGNvcHlkb2Mgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0X3JlZmVyZW5jZSBsaHMsIGNvbnN0IFNjYWxhclR5cGUgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChsaHMgPiBiYXNpY19qc29uKHJocykpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4KKyAgICBAY29weWRvYyBvcGVyYXRvcj4oY29uc3RfcmVmZXJlbmNlLCBjb25zdF9yZWZlcmVuY2UpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19zY2FsYXI8U2NhbGFyVHlwZT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2NhbGFyVHlwZSBsaHMsIGNvbnN0X3JlZmVyZW5jZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGJhc2ljX2pzb24obGhzKSA+IHJocyk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmlzb246IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorCisgICAgQ29tcGFyZXMgd2hldGhlciBvbmUgSlNPTiB2YWx1ZSBAYSBsaHMgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGFub3RoZXIKKyAgICBKU09OIHZhbHVlIGJ5IGNhbGN1bGF0aW5nIGBub3QgKGxocyA8IHJocylgLgorCisgICAgQHBhcmFtW2luXSBsaHMgIGZpcnN0IEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcGFyYW1baW5dIHJocyAgc2Vjb25kIEpTT04gdmFsdWUgdG8gY29uc2lkZXIKKyAgICBAcmV0dXJuIHdoZXRoZXIgQGEgbGhzIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBAYSByaHMKKworICAgIEBjb21wbGV4aXR5IExpbmVhci4KKworICAgIEBleGNlcHRpb25zYWZldHkgTm8tdGhyb3cgZ3VhcmFudGVlOiB0aGlzIGZ1bmN0aW9uIG5ldmVyIHRocm93cyBleGNlcHRpb25zLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBjb21wYXJpbmcgc2V2ZXJhbCBKU09OCisgICAgdHlwZXMuLG9wZXJhdG9yX19ncmVhdGVyZXF1YWx9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdF9yZWZlcmVuY2UgbGhzLCBjb25zdF9yZWZlcmVuY2UgcmhzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vdCAobGhzIDwgcmhzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29tcGFyaXNvbjogZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgQGNvcHlkb2Mgb3BlcmF0b3I+PShjb25zdF9yZWZlcmVuY2UsIGNvbnN0X3JlZmVyZW5jZSkKKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhclR5cGUsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NjYWxhcjxTY2FsYXJUeXBlPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3RfcmVmZXJlbmNlIGxocywgY29uc3QgU2NhbGFyVHlwZSByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGxocyA+PSBiYXNpY19qc29uKHJocykpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjb21wYXJpc29uOiBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICBAY29weWRvYyBvcGVyYXRvcj49KGNvbnN0X3JlZmVyZW5jZSwgY29uc3RfcmVmZXJlbmNlKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2NhbGFyPFNjYWxhclR5cGU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDA+CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBTY2FsYXJUeXBlIGxocywgY29uc3RfcmVmZXJlbmNlIHJocykgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiAoYmFzaWNfanNvbihsaHMpID49IHJocyk7CisgICAgfQorCisgICAgLy8vIEB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gc2VyaWFsaXphdGlvbiAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBzZXJpYWxpemF0aW9uCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgc2VyaWFsaXplIHRvIHN0cmVhbQorCisgICAgU2VyaWFsaXplIHRoZSBnaXZlbiBKU09OIHZhbHVlIEBhIGogdG8gdGhlIG91dHB1dCBzdHJlYW0gQGEgby4gVGhlIEpTT04KKyAgICB2YWx1ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdXNpbmcgdGhlIEByZWYgZHVtcCBtZW1iZXIgZnVuY3Rpb24uCisKKyAgICAtIFRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIG1lbWJlciB2YXJpYWJsZQorICAgICAgYHdpZHRoYCBvZiB0aGUgb3V0cHV0IHN0cmVhbSBAYSBvLiBGb3IgaW5zdGFuY2UsIHVzaW5nIHRoZSBtYW5pcHVsYXRvcgorICAgICAgYHN0ZDo6c2V0dyg0KWAgb24gQGEgbyBzZXRzIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCB0byBgNGAgYW5kIHRoZQorICAgICAgc2VyaWFsaXphdGlvbiByZXN1bHQgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBgZHVtcCg0KWAuCisKKyAgICAtIFRoZSBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgbWVtYmVyIHZhcmlhYmxlCisgICAgICBgZmlsbGAgb2YgdGhlIG91dHB1dCBzdHJlYW0gQGEgby4gRm9yIGluc3RhbmNlLCB0aGUgbWFuaXB1bGF0b3IKKyAgICAgIGBzdGQ6OnNldGZpbGwoJ1xcdCcpYCBzZXRzIGluZGVudGF0aW9uIHRvIHVzZSBhIHRhYiBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4KKyAgICAgIHRoZSBkZWZhdWx0IHNwYWNlIGNoYXJhY3Rlci4KKworICAgIEBwYXJhbVtpbixvdXRdIG8gIHN0cmVhbSB0byBzZXJpYWxpemUgdG8KKyAgICBAcGFyYW1baW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCisKKyAgICBAcmV0dXJuIHRoZSBzdHJlYW0gQGEgbworCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzE2IGlmIGEgc3RyaW5nIHN0b3JlZCBpbnNpZGUgdGhlIEpTT04gdmFsdWUgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04IGVuY29kZWQKKworICAgIEBjb21wbGV4aXR5IExpbmVhci4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyB0aGUgc2VyaWFsaXphdGlvbiB3aXRoIGRpZmZlcmVudAorICAgIHBhcmFtZXRlcnMgdG8gYHdpZHRoYCB0byBhZGp1c3QgdGhlIGluZGVudGF0aW9uIGxldmVsLixvcGVyYXRvcl9zZXJpYWxpemV9CisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMDsgaW5kZW50YXRpb24gY2hhcmFjdGVyIGFkZGVkIGluIHZlcnNpb24gMy4wLjAKKyAgICAqLworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBjb25zdCBiYXNpY19qc29uJiBqKQorICAgIHsKKyAgICAgICAgLy8gcmVhZCB3aWR0aCBtZW1iZXIgYW5kIHVzZSBpdCBhcyBpbmRlbnRhdGlvbiBwYXJhbWV0ZXIgaWYgbm9uemVybworICAgICAgICBjb25zdCBib29sIHByZXR0eV9wcmludCA9IChvLndpZHRoKCkgPiAwKTsKKyAgICAgICAgY29uc3QgYXV0byBpbmRlbnRhdGlvbiA9IChwcmV0dHlfcHJpbnQgPyBvLndpZHRoKCkgOiAwKTsKKworICAgICAgICAvLyByZXNldCB3aWR0aCB0byAwIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgc3RyZWFtCisgICAgICAgIG8ud2lkdGgoMCk7CisKKyAgICAgICAgLy8gZG8gdGhlIGFjdHVhbCBzZXJpYWxpemF0aW9uCisgICAgICAgIHNlcmlhbGl6ZXIgcyhkZXRhaWw6Om91dHB1dF9hZGFwdGVyPGNoYXI+KG8pLCBvLmZpbGwoKSk7CisgICAgICAgIHMuZHVtcChqLCBwcmV0dHlfcHJpbnQsIGZhbHNlLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGluZGVudGF0aW9uKSk7CisgICAgICAgIHJldHVybiBvOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBzZXJpYWxpemUgdG8gc3RyZWFtCisgICAgQGRlcHJlY2F0ZWQgVGhpcyBzdHJlYW0gb3BlcmF0b3IgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluCisgICAgICAgICAgICAgICAgZnV0dXJlIDQuMC4wIG9mIHRoZSBsaWJyYXJ5LiBQbGVhc2UgdXNlCisgICAgICAgICAgICAgICAgQHJlZiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYsIGNvbnN0IGJhc2ljX2pzb24mKQorICAgICAgICAgICAgICAgIGluc3RlYWQ7IHRoYXQgaXMsIHJlcGxhY2UgY2FsbHMgbGlrZSBgaiA+PiBvO2Agd2l0aCBgbyA8PCBqO2AuCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjA7IGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAzLjAuMAorICAgICovCisgICAgSlNPTl9ERVBSRUNBVEVECisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I+Pihjb25zdCBiYXNpY19qc29uJiBqLCBzdGQ6Om9zdHJlYW0mIG8pCisgICAgeworICAgICAgICByZXR1cm4gbyA8PCBqOworICAgIH0KKworICAgIC8vLyBAfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBkZXNlcmlhbGl6YXRpb24gLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBkZXNlcmlhbGl6YXRpb24KKyAgICAvLy8gQHsKKworICAgIC8qIQorICAgIEBicmllZiBkZXNlcmlhbGl6ZSBmcm9tIGEgY29tcGF0aWJsZSBpbnB1dAorCisgICAgVGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIGEgY29tcGF0aWJsZSBpbnB1dC4gRXhhbXBsZXMgYXJlOgorICAgIC0gYW4gYXJyYXkgb2YgMS1ieXRlIHZhbHVlcworICAgIC0gc3RyaW5ncyB3aXRoIGNoYXJhY3Rlci9saXRlcmFsIHR5cGUgd2l0aCBzaXplIG9mIDEgYnl0ZQorICAgIC0gaW5wdXQgc3RyZWFtcworICAgIC0gY29udGFpbmVyIHdpdGggY29udGlndW91cyBzdG9yYWdlIG9mIDEtYnl0ZSB2YWx1ZXMuIENvbXBhdGlibGUgY29udGFpbmVyCisgICAgICB0eXBlcyBpbmNsdWRlIGBzdGQ6OnZlY3RvcmAsIGBzdGQ6OnN0cmluZ2AsIGBzdGQ6OmFycmF5YCwKKyAgICAgIGBzdGQ6OnZhbGFycmF5YCwgYW5kIGBzdGQ6OmluaXRpYWxpemVyX2xpc3RgLiBGdXJ0aGVybW9yZSwgQy1zdHlsZQorICAgICAgYXJyYXlzIGNhbiBiZSB1c2VkIHdpdGggYHN0ZDo6YmVnaW4oKWAvYHN0ZDo6ZW5kKClgLiBVc2VyLWRlZmluZWQKKyAgICAgIGNvbnRhaW5lcnMgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyB0aGV5IGltcGxlbWVudCByYW5kb20tYWNjZXNzIGl0ZXJhdG9ycworICAgICAgYW5kIGEgY29udGlndW91cyBzdG9yYWdlLgorCisgICAgQHByZSBFYWNoIGVsZW1lbnQgb2YgdGhlIGNvbnRhaW5lciBoYXMgYSBzaXplIG9mIDEgYnl0ZS4gVmlvbGF0aW5nIHRoaXMKKyAgICBwcmVjb25kaXRpb24geWllbGRzIHVuZGVmaW5lZCBiZWhhdmlvci4gKipUaGlzIHByZWNvbmRpdGlvbiBpcyBlbmZvcmNlZAorICAgIHdpdGggYSBzdGF0aWMgYXNzZXJ0aW9uLioqCisKKyAgICBAcHJlIFRoZSBjb250YWluZXIgc3RvcmFnZSBpcyBjb250aWd1b3VzLiBWaW9sYXRpbmcgdGhpcyBwcmVjb25kaXRpb24KKyAgICB5aWVsZHMgdW5kZWZpbmVkIGJlaGF2aW9yLiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzIGVuZm9yY2VkIHdpdGggYW4KKyAgICBhc3NlcnRpb24uKioKKyAgICBAcHJlIEVhY2ggZWxlbWVudCBvZiB0aGUgY29udGFpbmVyIGhhcyBhIHNpemUgb2YgMSBieXRlLiBWaW9sYXRpbmcgdGhpcworICAgIHByZWNvbmRpdGlvbiB5aWVsZHMgdW5kZWZpbmVkIGJlaGF2aW9yLiAqKlRoaXMgcHJlY29uZGl0aW9uIGlzIGVuZm9yY2VkCisgICAgd2l0aCBhIHN0YXRpYyBhc3NlcnRpb24uKioKKworICAgIEB3YXJuaW5nIFRoZXJlIGlzIG5vIHdheSB0byBlbmZvcmNlIGFsbCBwcmVjb25kaXRpb25zIGF0IGNvbXBpbGUtdGltZS4gSWYKKyAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBub25jb21wbGlhbnQgY29udGFpbmVyIGFuZCB3aXRoCisgICAgICAgICAgICAgYXNzZXJ0aW9ucyBzd2l0Y2hlZCBvZmYsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgYW5kIHdpbGwgbW9zdAorICAgICAgICAgICAgIGxpa2VseSB5aWVsZCBzZWdtZW50YXRpb24gdmlvbGF0aW9uLgorCisgICAgQHBhcmFtW2luXSBpICBpbnB1dCB0byByZWFkIGZyb20KKyAgICBAcGFyYW1baW5dIGNiICBhIHBhcnNlciBjYWxsYmFjayBmdW5jdGlvbiBvZiB0eXBlIEByZWYgcGFyc2VyX2NhbGxiYWNrX3QKKyAgICB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRlc2VyaWFsaXphdGlvbiBieSBmaWx0ZXJpbmcgdW53YW50ZWQgdmFsdWVzCisgICAgKG9wdGlvbmFsKQorCisgICAgQHJldHVybiByZXN1bHQgb2YgdGhlIGRlc2VyaWFsaXphdGlvbgorCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMSBpZiBhIHBhcnNlIGVycm9yIG9jY3VyczsgZXhhbXBsZTogYCIidW5leHBlY3RlZCBlbmQKKyAgICBvZiBpbnB1dDsgZXhwZWN0ZWQgc3RyaW5nIGxpdGVyYWwiImAKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAyIGlmIHRvX3VuaWNvZGUgZmFpbHMgb3Igc3Vycm9nYXRlIGVycm9yCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwMyBpZiB0b191bmljb2RlIGZhaWxzCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQuIFRoZSBwYXJzZXIgaXMgYSBwcmVkaWN0aXZlCisgICAgTEwoMSkgcGFyc2VyLiBUaGUgY29tcGxleGl0eSBjYW4gYmUgaGlnaGVyIGlmIHRoZSBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICBAYSBjYiBoYXMgYSBzdXBlci1saW5lYXIgY29tcGxleGl0eS4KKworICAgIEBub3RlIEEgVVRGLTggYnl0ZSBvcmRlciBtYXJrIGlzIHNpbGVudGx5IGlnbm9yZWQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSBgcGFyc2UoKWAgZnVuY3Rpb24gcmVhZGluZworICAgIGZyb20gYW4gYXJyYXkuLHBhcnNlX19hcnJheV9fcGFyc2VyX2NhbGxiYWNrX3R9CisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSBgcGFyc2UoKWAgZnVuY3Rpb24gd2l0aAorICAgIGFuZCB3aXRob3V0IGNhbGxiYWNrIGZ1bmN0aW9uLixwYXJzZV9fc3RyaW5nX19wYXJzZXJfY2FsbGJhY2tfdH0KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIGBwYXJzZSgpYCBmdW5jdGlvbiB3aXRoCisgICAgYW5kIHdpdGhvdXQgY2FsbGJhY2sgZnVuY3Rpb24uLHBhcnNlX19pc3RyZWFtX19wYXJzZXJfY2FsbGJhY2tfdH0KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIGBwYXJzZSgpYCBmdW5jdGlvbiByZWFkaW5nCisgICAgZnJvbSBhIGNvbnRpZ3VvdXMgY29udGFpbmVyLixwYXJzZV9fY29udGlndW91c2NvbnRhaW5lcl9fcGFyc2VyX2NhbGxiYWNrX3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuMyAoY29udGlndW91cyBjb250YWluZXJzKQorICAgICovCisgICAgc3RhdGljIGJhc2ljX2pzb24gcGFyc2UoZGV0YWlsOjppbnB1dF9hZGFwdGVyIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyX2NhbGxiYWNrX3QgY2IgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYWxsb3dfZXhjZXB0aW9ucyA9IHRydWUpCisgICAgeworICAgICAgICBiYXNpY19qc29uIHJlc3VsdDsKKyAgICAgICAgcGFyc2VyKGksIGNiLCBhbGxvd19leGNlcHRpb25zKS5wYXJzZSh0cnVlLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGJhc2ljX2pzb24gcGFyc2UoZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCkKKyAgICAqLworICAgIHN0YXRpYyBiYXNpY19qc29uIHBhcnNlKGRldGFpbDo6aW5wdXRfYWRhcHRlciYgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCBjYiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBhbGxvd19leGNlcHRpb25zID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIGJhc2ljX2pzb24gcmVzdWx0OworICAgICAgICBwYXJzZXIoaSwgY2IsIGFsbG93X2V4Y2VwdGlvbnMpLnBhcnNlKHRydWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgYWNjZXB0KGRldGFpbDo6aW5wdXRfYWRhcHRlciBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlcihpKS5hY2NlcHQodHJ1ZSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgYWNjZXB0KGRldGFpbDo6aW5wdXRfYWRhcHRlciYgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZXIoaSkuYWNjZXB0KHRydWUpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXNlcmlhbGl6ZSBmcm9tIGFuIGl0ZXJhdG9yIHJhbmdlIHdpdGggY29udGlndW91cyBzdG9yYWdlCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gYW4gaXRlcmF0b3IgcmFuZ2Ugb2YgYSBjb250YWluZXIgd2l0aCBjb250aWd1b3VzCisgICAgc3RvcmFnZSBvZiAxLWJ5dGUgdmFsdWVzLiBDb21wYXRpYmxlIGNvbnRhaW5lciB0eXBlcyBpbmNsdWRlCisgICAgYHN0ZDo6dmVjdG9yYCwgYHN0ZDo6c3RyaW5nYCwgYHN0ZDo6YXJyYXlgLCBgc3RkOjp2YWxhcnJheWAsIGFuZAorICAgIGBzdGQ6OmluaXRpYWxpemVyX2xpc3RgLiBGdXJ0aGVybW9yZSwgQy1zdHlsZSBhcnJheXMgY2FuIGJlIHVzZWQgd2l0aAorICAgIGBzdGQ6OmJlZ2luKClgL2BzdGQ6OmVuZCgpYC4gVXNlci1kZWZpbmVkIGNvbnRhaW5lcnMgY2FuIGJlIHVzZWQgYXMgbG9uZworICAgIGFzIHRoZXkgaW1wbGVtZW50IHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIGFuZCBhIGNvbnRpZ3VvdXMgc3RvcmFnZS4KKworICAgIEBwcmUgVGhlIGl0ZXJhdG9yIHJhbmdlIGlzIGNvbnRpZ3VvdXMuIFZpb2xhdGluZyB0aGlzIHByZWNvbmRpdGlvbiB5aWVsZHMKKyAgICB1bmRlZmluZWQgYmVoYXZpb3IuICoqVGhpcyBwcmVjb25kaXRpb24gaXMgZW5mb3JjZWQgd2l0aCBhbiBhc3NlcnRpb24uKioKKyAgICBAcHJlIEVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgaGFzIGEgc2l6ZSBvZiAxIGJ5dGUuIFZpb2xhdGluZyB0aGlzCisgICAgcHJlY29uZGl0aW9uIHlpZWxkcyB1bmRlZmluZWQgYmVoYXZpb3IuICoqVGhpcyBwcmVjb25kaXRpb24gaXMgZW5mb3JjZWQKKyAgICB3aXRoIGEgc3RhdGljIGFzc2VydGlvbi4qKgorCisgICAgQHdhcm5pbmcgVGhlcmUgaXMgbm8gd2F5IHRvIGVuZm9yY2UgYWxsIHByZWNvbmRpdGlvbnMgYXQgY29tcGlsZS10aW1lLiBJZgorICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBub25jb21wbGlhbnQgaXRlcmF0b3JzIGFuZCB3aXRoCisgICAgICAgICAgICAgYXNzZXJ0aW9ucyBzd2l0Y2hlZCBvZmYsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgYW5kIHdpbGwgbW9zdAorICAgICAgICAgICAgIGxpa2VseSB5aWVsZCBzZWdtZW50YXRpb24gdmlvbGF0aW9uLgorCisgICAgQHRwYXJhbSBJdGVyYXRvclR5cGUgaXRlcmF0b3Igb2YgY29udGFpbmVyIHdpdGggY29udGlndW91cyBzdG9yYWdlCisgICAgQHBhcmFtW2luXSBmaXJzdCAgYmVnaW4gb2YgdGhlIHJhbmdlIHRvIHBhcnNlIChpbmNsdWRlZCkKKyAgICBAcGFyYW1baW5dIGxhc3QgIGVuZCBvZiB0aGUgcmFuZ2UgdG8gcGFyc2UgKGV4Y2x1ZGVkKQorICAgIEBwYXJhbVtpbl0gY2IgIGEgcGFyc2VyIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHR5cGUgQHJlZiBwYXJzZXJfY2FsbGJhY2tfdAorICAgIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgZGVzZXJpYWxpemF0aW9uIGJ5IGZpbHRlcmluZyB1bndhbnRlZCB2YWx1ZXMKKyAgICAob3B0aW9uYWwpCisgICAgQHBhcmFtW2luXSBhbGxvd19leGNlcHRpb25zICB3aGV0aGVyIHRvIHRocm93IGV4Y2VwdGlvbnMgaW4gY2FzZSBvZiBhCisgICAgcGFyc2UgZXJyb3IgKG9wdGlvbmFsLCB0cnVlIGJ5IGRlZmF1bHQpCisKKyAgICBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgZGVzZXJpYWxpemF0aW9uCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAxIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCB0b2tlbgorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDIgaWYgdG9fdW5pY29kZSBmYWlscyBvciBzdXJyb2dhdGUgZXJyb3IKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAzIGlmIHRvX3VuaWNvZGUgZmFpbHMKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4gVGhlIHBhcnNlciBpcyBhIHByZWRpY3RpdmUKKyAgICBMTCgxKSBwYXJzZXIuIFRoZSBjb21wbGV4aXR5IGNhbiBiZSBoaWdoZXIgaWYgdGhlIHBhcnNlciBjYWxsYmFjayBmdW5jdGlvbgorICAgIEBhIGNiIGhhcyBhIHN1cGVyLWxpbmVhciBjb21wbGV4aXR5LgorCisgICAgQG5vdGUgQSBVVEYtOCBieXRlIG9yZGVyIG1hcmsgaXMgc2lsZW50bHkgaWdub3JlZC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIGBwYXJzZSgpYCBmdW5jdGlvbiByZWFkaW5nCisgICAgZnJvbSBhbiBpdGVyYXRvciByYW5nZS4scGFyc2VfX2l0ZXJhdG9ydHlwZV9fcGFyc2VyX2NhbGxiYWNrX3R9CisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuMworICAgICovCisgICAgdGVtcGxhdGU8Y2xhc3MgSXRlcmF0b3JUeXBlLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yVHlwZT46Oml0ZXJhdG9yX2NhdGVnb3J5Pjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgorICAgIHN0YXRpYyBiYXNpY19qc29uIHBhcnNlKEl0ZXJhdG9yVHlwZSBmaXJzdCwgSXRlcmF0b3JUeXBlIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyX2NhbGxiYWNrX3QgY2IgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYWxsb3dfZXhjZXB0aW9ucyA9IHRydWUpCisgICAgeworICAgICAgICBiYXNpY19qc29uIHJlc3VsdDsKKyAgICAgICAgcGFyc2VyKGRldGFpbDo6aW5wdXRfYWRhcHRlcihmaXJzdCwgbGFzdCksIGNiLCBhbGxvd19leGNlcHRpb25zKS5wYXJzZSh0cnVlLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHlwZSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvclR5cGU+OjppdGVyYXRvcl9jYXRlZ29yeT46OnZhbHVlLCBpbnQ+Ojp0eXBlID0gMD4KKyAgICBzdGF0aWMgYm9vbCBhY2NlcHQoSXRlcmF0b3JUeXBlIGZpcnN0LCBJdGVyYXRvclR5cGUgbGFzdCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyKGZpcnN0LCBsYXN0KSkuYWNjZXB0KHRydWUpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXNlcmlhbGl6ZSBmcm9tIHN0cmVhbQorICAgIEBkZXByZWNhdGVkIFRoaXMgc3RyZWFtIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgorICAgICAgICAgICAgICAgIHZlcnNpb24gNC4wLjAgb2YgdGhlIGxpYnJhcnkuIFBsZWFzZSB1c2UKKyAgICAgICAgICAgICAgICBAcmVmIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiwgYmFzaWNfanNvbiYpCisgICAgICAgICAgICAgICAgaW5zdGVhZDsgdGhhdCBpcywgcmVwbGFjZSBjYWxscyBsaWtlIGBqIDw8IGk7YCB3aXRoIGBpID4+IGo7YC4KKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMDsgZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMC4wCisgICAgKi8KKyAgICBKU09OX0RFUFJFQ0FURUQKKyAgICBmcmllbmQgc3RkOjppc3RyZWFtJiBvcGVyYXRvcjw8KGJhc2ljX2pzb24mIGosIHN0ZDo6aXN0cmVhbSYgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBvcGVyYXRvcj4+KGksIGopOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXNlcmlhbGl6ZSBmcm9tIHN0cmVhbQorCisgICAgRGVzZXJpYWxpemVzIGFuIGlucHV0IHN0cmVhbSB0byBhIEpTT04gdmFsdWUuCisKKyAgICBAcGFyYW1baW4sb3V0XSBpICBpbnB1dCBzdHJlYW0gdG8gcmVhZCBhIHNlcmlhbGl6ZWQgSlNPTiB2YWx1ZSBmcm9tCisgICAgQHBhcmFtW2luLG91dF0gaiAgSlNPTiB2YWx1ZSB0byB3cml0ZSB0aGUgZGVzZXJpYWxpemVkIGlucHV0IHRvCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAxIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCB0b2tlbgorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDIgaWYgdG9fdW5pY29kZSBmYWlscyBvciBzdXJyb2dhdGUgZXJyb3IKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTAzIGlmIHRvX3VuaWNvZGUgZmFpbHMKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4gVGhlIHBhcnNlciBpcyBhIHByZWRpY3RpdmUKKyAgICBMTCgxKSBwYXJzZXIuCisKKyAgICBAbm90ZSBBIFVURi04IGJ5dGUgb3JkZXIgbWFyayBpcyBzaWxlbnRseSBpZ25vcmVkLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyBhIEpTT04gdmFsdWUgaXMgY29uc3RydWN0ZWQgYnkKKyAgICByZWFkaW5nIGEgc2VyaWFsaXphdGlvbiBmcm9tIGEgc3RyZWFtLixvcGVyYXRvcl9kZXNlcmlhbGl6ZX0KKworICAgIEBzYSBwYXJzZShzdGQ6OmlzdHJlYW0mLCBjb25zdCBwYXJzZXJfY2FsbGJhY2tfdCkgZm9yIGEgdmFyaWFudCB3aXRoIGEKKyAgICBwYXJzZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmlsdGVyIHZhbHVlcyB3aGlsZSBwYXJzaW5nCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMAorICAgICovCisgICAgZnJpZW5kIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mIGksIGJhc2ljX2pzb24mIGopCisgICAgeworICAgICAgICBwYXJzZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyKGkpKS5wYXJzZShmYWxzZSwgaik7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIC8vLyBAfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gY29udmVuaWVuY2UgZnVuY3Rpb25zIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIHRoZSB0eXBlIGFzIHN0cmluZworCisgICAgUmV0dXJucyB0aGUgdHlwZSBuYW1lIGFzIHN0cmluZyB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIC0gdXN1YWxseSB0bworICAgIGluZGljYXRlIHRoYXQgYSBmdW5jdGlvbiB3YXMgY2FsbGVkIG9uIGEgd3JvbmcgSlNPTiB0eXBlLgorCisgICAgQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRoZSBAYSBtX3R5cGUgbWVtYmVyOgorICAgICAgICAgICAgVmFsdWUgdHlwZSAgfCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgbnVsbCAgICAgICAgfCBgIm51bGwiYAorICAgICAgICAgICAgYm9vbGVhbiAgICAgfCBgImJvb2xlYW4iYAorICAgICAgICAgICAgc3RyaW5nICAgICAgfCBgInN0cmluZyJgCisgICAgICAgICAgICBudW1iZXIgICAgICB8IGAibnVtYmVyImAgKGZvciBhbGwgbnVtYmVyIHR5cGVzKQorICAgICAgICAgICAgb2JqZWN0ICAgICAgfCBgIm9iamVjdCJgCisgICAgICAgICAgICBhcnJheSAgICAgICB8IGAiYXJyYXkiYAorICAgICAgICAgICAgZGlzY2FyZGVkICAgfCBgImRpc2NhcmRlZCJgCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IE5vLXRocm93IGd1YXJhbnRlZTogdGhpcyBmdW5jdGlvbiBuZXZlciB0aHJvd3MgZXhjZXB0aW9ucy4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQGxpdmVleGFtcGxle1RoZSBmb2xsb3dpbmcgY29kZSBleGVtcGxpZmllcyBgdHlwZV9uYW1lKClgIGZvciBhbGwgSlNPTgorICAgIHR5cGVzLix0eXBlX25hbWV9CisKKyAgICBAc2EgQHJlZiB0eXBlKCkgLS0gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBKU09OIHZhbHVlCisgICAgQHNhIEByZWYgb3BlcmF0b3IgdmFsdWVfdCgpIC0tIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgSlNPTiB2YWx1ZSAoaW1wbGljaXQpCisKKyAgICBAc2luY2UgdmVyc2lvbiAxLjAuMCwgcHVibGljIHNpbmNlIDIuMS4wLCBgY29uc3QgY2hhcipgIGFuZCBgbm9leGNlcHRgCisgICAgc2luY2UgMy4wLjAKKyAgICAqLworICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSgpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKG1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAib2JqZWN0IjsKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImFycmF5IjsKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6Ym9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKKyAgICAgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmRpc2NhcmRlZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNjYXJkZWQiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgIHByaXZhdGU6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAorICAgIHZhbHVlX3QgbV90eXBlID0gdmFsdWVfdDo6bnVsbDsKKworICAgIC8vLyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZWxlbWVudAorICAgIGpzb25fdmFsdWUgbV92YWx1ZSA9IHt9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gYmluYXJ5IHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLy8gQG5hbWUgYmluYXJ5IHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHN1cHBvcnQKKyAgICAvLy8gQHsKKworICBwdWJsaWM6CisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIENCT1Igc2VyaWFsaXphdGlvbiBvZiBhIGdpdmVuIEpTT04gdmFsdWUKKworICAgIFNlcmlhbGl6ZXMgYSBnaXZlbiBKU09OIHZhbHVlIEBhIGogdG8gYSBieXRlIHZlY3RvciB1c2luZyB0aGUgQ0JPUiAoQ29uY2lzZQorICAgIEJpbmFyeSBPYmplY3QgUmVwcmVzZW50YXRpb24pIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBDQk9SIGlzIGEgYmluYXJ5CisgICAgc2VyaWFsaXphdGlvbiBmb3JtYXQgd2hpY2ggYWltcyB0byBiZSBtb3JlIGNvbXBhY3QgdGhhbiBKU09OIGl0c2VsZiwgeWV0CisgICAgbW9yZSBlZmZpY2llbnQgdG8gcGFyc2UuCisKKyAgICBUaGUgbGlicmFyeSB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIEpTT04gdmFsdWVzIHR5cGVzIHRvCisgICAgQ0JPUiB0eXBlcyBhY2NvcmRpbmcgdG8gdGhlIENCT1Igc3BlY2lmaWNhdGlvbiAoUkZDIDcwNDkpOgorCisgICAgSlNPTiB2YWx1ZSB0eXBlIHwgdmFsdWUvcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0JPUiB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpcnN0IGJ5dGUKKyAgICAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tCisgICAgbnVsbCAgICAgICAgICAgIHwgYG51bGxgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4RjYKKyAgICBib29sZWFuICAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUcnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHhGNQorICAgIGJvb2xlYW4gICAgICAgICB8IGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweEY0CisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTkyMjMzNzIwMzY4NTQ3NzU4MDguLi0yMTQ3NDgzNjQ5ICAgICAgICAgIHwgTmVnYXRpdmUgaW50ZWdlciAoOCBieXRlcyBmb2xsb3cpICB8IDB4M0IKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtMjE0NzQ4MzY0OC4uLTMyNzY5ICAgICAgICAgICAgICAgICAgICAgICAgfCBOZWdhdGl2ZSBpbnRlZ2VyICg0IGJ5dGVzIGZvbGxvdykgIHwgMHgzQQorICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMjc2OC4uLTEyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5lZ2F0aXZlIGludGVnZXIgKDIgYnl0ZXMgZm9sbG93KSAgfCAweDM5CisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTEyOC4uLTI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmVnYXRpdmUgaW50ZWdlciAoMSBieXRlIGZvbGxvdykgICB8IDB4MzgKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtMjQuLi0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgICAgICAgICAgICAgIHwgMHgyMC4uMHgzNworICAgIG51bWJlcl9pbnRlZ2VyICB8IDAuLjIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweDAwLi4weDE3CisgICAgbnVtYmVyX2ludGVnZXIgIHwgMjQuLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoMSBieXRlIGZvbGxvdykgICB8IDB4MTgKKyAgICBudW1iZXJfaW50ZWdlciAgfCAyNTYuLjY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZCBpbnRlZ2VyICgyIGJ5dGVzIGZvbGxvdykgIHwgMHgxOQorICAgIG51bWJlcl9pbnRlZ2VyICB8IDY1NTM2Li40Mjk0OTY3Mjk1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDQgYnl0ZXMgZm9sbG93KSAgfCAweDFBCisgICAgbnVtYmVyX2ludGVnZXIgIHwgNDI5NDk2NzI5Ni4uMTg0NDY3NDQwNzM3MDk1NTE2MTUgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoOCBieXRlcyBmb2xsb3cpICB8IDB4MUIKKyAgICBudW1iZXJfdW5zaWduZWQgfCAwLi4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHgwMC4uMHgxNworICAgIG51bWJlcl91bnNpZ25lZCB8IDI0Li4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDEgYnl0ZSBmb2xsb3cpICAgfCAweDE4CisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMjU2Li42NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5zaWduZWQgaW50ZWdlciAoMiBieXRlcyBmb2xsb3cpICB8IDB4MTkKKyAgICBudW1iZXJfdW5zaWduZWQgfCA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbnNpZ25lZCBpbnRlZ2VyICg0IGJ5dGVzIGZvbGxvdykgIHwgMHgxQQorICAgIG51bWJlcl91bnNpZ25lZCB8IDQyOTQ5NjcyOTYuLjE4NDQ2NzQ0MDczNzA5NTUxNjE1ICAgICAgICAgICB8IFVuc2lnbmVkIGludGVnZXIgKDggYnl0ZXMgZm9sbG93KSAgfCAweDFCCisgICAgbnVtYmVyX2Zsb2F0ICAgIHwgKmFueSB2YWx1ZSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG91YmxlLVByZWNpc2lvbiBGbG9hdCAgICAgICAgICAgICB8IDB4RkIKKyAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogMC4uMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVVEYtOCBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHwgMHg2MC4uMHg3NworICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiAyMy4uMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVURi04IHN0cmluZyAoMSBieXRlIGZvbGxvdykgICAgICAgfCAweDc4CisgICAgc3RyaW5nICAgICAgICAgIHwgKmxlbmd0aCo6IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgIHwgVVRGLTggc3RyaW5nICgyIGJ5dGVzIGZvbGxvdykgICAgICB8IDB4NzkKKyAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgfCBVVEYtOCBzdHJpbmcgKDQgYnl0ZXMgZm9sbG93KSAgICAgIHwgMHg3QQorICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSB8IFVURi04IHN0cmluZyAoOCBieXRlcyBmb2xsb3cpICAgICAgfCAweDdCCisgICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiAwLi4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ODAuLjB4OTcKKyAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDIzLi4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcnJheSAoMSBieXRlIGZvbGxvdykgICAgICAgICAgICAgIHwgMHg5OAorICAgIGFycmF5ICAgICAgICAgICB8ICpzaXplKjogMjU2Li42NTUzNSAgICAgICAgICAgICAgICAgICAgICAgICB8IGFycmF5ICgyIGJ5dGVzIGZvbGxvdykgICAgICAgICAgICAgfCAweDk5CisgICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgKDQgYnl0ZXMgZm9sbG93KSAgICAgICAgICAgICB8IDB4OUEKKyAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDQyOTQ5NjcyOTYuLjE4NDQ2NzQ0MDczNzA5NTUxNjE1ICAgfCBhcnJheSAoOCBieXRlcyBmb2xsb3cpICAgICAgICAgICAgIHwgMHg5QgorICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogMC4uMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAweEEwLi4weEI3CisgICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiAyMy4uMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFwICgxIGJ5dGUgZm9sbG93KSAgICAgICAgICAgICAgICB8IDB4QjgKKyAgICBvYmplY3QgICAgICAgICAgfCAqc2l6ZSo6IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgICAgfCBtYXAgKDIgYnl0ZXMgZm9sbG93KSAgICAgICAgICAgICAgIHwgMHhCOQorICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgICB8IG1hcCAoNCBieXRlcyBmb2xsb3cpICAgICAgICAgICAgICAgfCAweEJBCisgICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSAgIHwgbWFwICg4IGJ5dGVzIGZvbGxvdykgICAgICAgICAgICAgICB8IDB4QkIKKworICAgIEBub3RlIFRoZSBtYXBwaW5nIGlzICoqY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBhbnkgSlNPTiB2YWx1ZSB0eXBlCisgICAgICAgICAgY2FuIGJlIGNvbnZlcnRlZCB0byBhIENCT1IgdmFsdWUuCisKKyAgICBAbm90ZSBJZiBOYU4gb3IgSW5maW5pdHkgYXJlIHN0b3JlZCBpbnNpZGUgYSBKU09OIG51bWJlciwgdGhleSBhcmUKKyAgICAgICAgICBzZXJpYWxpemVkIHByb3Blcmx5LiBUaGlzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGUgQHJlZiBkdW1wKCkKKyAgICAgICAgICBmdW5jdGlvbiB3aGljaCBzZXJpYWxpemVzIE5hTiBvciBJbmZpbml0eSB0byBgbnVsbGAuCisKKyAgICBAbm90ZSBUaGUgZm9sbG93aW5nIENCT1IgdHlwZXMgYXJlIG5vdCB1c2VkIGluIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgIC0gYnl0ZSBzdHJpbmdzICgweDQwLi4weDVGKQorICAgICAgICAgIC0gVVRGLTggc3RyaW5ncyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIgKDB4N0YpCisgICAgICAgICAgLSBhcnJheXMgdGVybWluYXRlZCBieSAiYnJlYWsiICgweDlGKQorICAgICAgICAgIC0gbWFwcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIgKDB4QkYpCisgICAgICAgICAgLSBkYXRlL3RpbWUgKDB4QzAuLjB4QzEpCisgICAgICAgICAgLSBiaWdudW0gKDB4QzIuLjB4QzMpCisgICAgICAgICAgLSBkZWNpbWFsIGZyYWN0aW9uICgweEM0KQorICAgICAgICAgIC0gYmlnZmxvYXQgKDB4QzUpCisgICAgICAgICAgLSB0YWdnZWQgaXRlbXMgKDB4QzYuLjB4RDQsIDB4RDguLjB4REIpCisgICAgICAgICAgLSBleHBlY3RlZCBjb252ZXJzaW9ucyAoMHhENS4uMHhENykKKyAgICAgICAgICAtIHNpbXBsZSB2YWx1ZXMgKDB4RTAuLjB4RjMsIDB4RjgpCisgICAgICAgICAgLSB1bmRlZmluZWQgKDB4RjcpCisgICAgICAgICAgLSBoYWxmIGFuZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cyAoMHhGOS0weEZBKQorICAgICAgICAgIC0gYnJlYWsgKDB4RkYpCisKKyAgICBAcGFyYW1baW5dIGogIEpTT04gdmFsdWUgdG8gc2VyaWFsaXplCisgICAgQHJldHVybiBNZXNzYWdlUGFjayBzZXJpYWxpemF0aW9uIGFzIGJ5dGUgdmVjdG9yCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIEpTT04gdmFsdWUgQGEgai4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgc2VyaWFsaXphdGlvbiBvZiBhIEpTT04gdmFsdWUgdG8gYSBieXRlCisgICAgdmVjdG9yIGluIENCT1IgZm9ybWF0Lix0b19jYm9yfQorCisgICAgQHNhIGh0dHA6Ly9jYm9yLmlvCisgICAgQHNhIEByZWYgZnJvbV9jYm9yKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCBzdHJpY3QpIGZvciB0aGUKKyAgICAgICAgYW5hbG9nb3VzIGRlc2VyaWFsaXphdGlvbgorICAgIEBzYSBAcmVmIHRvX21zZ3BhY2soY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgcmVsYXRlZCBNZXNzYWdlUGFjayBmb3JtYXQKKyAgICBAc2EgQHJlZiB0b191Ympzb24oY29uc3QgYmFzaWNfanNvbiYsIGNvbnN0IGJvb2wsIGNvbnN0IGJvb2wpIGZvciB0aGUKKyAgICAgICAgICAgICByZWxhdGVkIFVCSlNPTiBmb3JtYXQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45CisgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9fY2Jvcihjb25zdCBiYXNpY19qc29uJiBqKQorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzdWx0OworICAgICAgICB0b19jYm9yKGosIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdG9fY2Jvcihjb25zdCBiYXNpY19qc29uJiBqLCBkZXRhaWw6Om91dHB1dF9hZGFwdGVyPHVpbnQ4X3Q+IG8pCisgICAgeworICAgICAgICBiaW5hcnlfd3JpdGVyPHVpbnQ4X3Q+KG8pLndyaXRlX2Nib3Ioaik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdG9fY2Jvcihjb25zdCBiYXNpY19qc29uJiBqLCBkZXRhaWw6Om91dHB1dF9hZGFwdGVyPGNoYXI+IG8pCisgICAgeworICAgICAgICBiaW5hcnlfd3JpdGVyPGNoYXI+KG8pLndyaXRlX2Nib3Ioaik7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIE1lc3NhZ2VQYWNrIHNlcmlhbGl6YXRpb24gb2YgYSBnaXZlbiBKU09OIHZhbHVlCisKKyAgICBTZXJpYWxpemVzIGEgZ2l2ZW4gSlNPTiB2YWx1ZSBAYSBqIHRvIGEgYnl0ZSB2ZWN0b3IgdXNpbmcgdGhlIE1lc3NhZ2VQYWNrCisgICAgc2VyaWFsaXphdGlvbiBmb3JtYXQuIE1lc3NhZ2VQYWNrIGlzIGEgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9ybWF0IHdoaWNoCisgICAgYWltcyB0byBiZSBtb3JlIGNvbXBhY3QgdGhhbiBKU09OIGl0c2VsZiwgeWV0IG1vcmUgZWZmaWNpZW50IHRvIHBhcnNlLgorCisgICAgVGhlIGxpYnJhcnkgdXNlcyB0aGUgZm9sbG93aW5nIG1hcHBpbmcgZnJvbSBKU09OIHZhbHVlcyB0eXBlcyB0bworICAgIE1lc3NhZ2VQYWNrIHR5cGVzIGFjY29yZGluZyB0byB0aGUgTWVzc2FnZVBhY2sgc3BlY2lmaWNhdGlvbjoKKworICAgIEpTT04gdmFsdWUgdHlwZSB8IHZhbHVlL3JhbmdlICAgICAgICAgICAgICAgICAgICAgICB8IE1lc3NhZ2VQYWNrIHR5cGUgfCBmaXJzdCBieXRlCisgICAgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0KKyAgICBudWxsICAgICAgICAgICAgfCBgbnVsbGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuaWwgICAgICAgICAgICAgIHwgMHhDMAorICAgIGJvb2xlYW4gICAgICAgICB8IGB0cnVlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRydWUgICAgICAgICAgICAgfCAweEMzCisgICAgYm9vbGVhbiAgICAgICAgIHwgYGZhbHNlYCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICB8IDB4QzIKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtOTIyMzM3MjAzNjg1NDc3NTgwOC4uLTIxNDc0ODM2NDkgfCBpbnQ2NCAgICAgICAgICAgIHwgMHhEMworICAgIG51bWJlcl9pbnRlZ2VyICB8IC0yMTQ3NDgzNjQ4Li4tMzI3NjkgICAgICAgICAgICAgICB8IGludDMyICAgICAgICAgICAgfCAweEQyCisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTMyNzY4Li4tMTI5ICAgICAgICAgICAgICAgICAgICAgIHwgaW50MTYgICAgICAgICAgICB8IDB4RDEKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtMTI4Li4tMzMgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQ4ICAgICAgICAgICAgIHwgMHhEMAorICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMi4uLTEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5lZ2F0aXZlIGZpeGludCAgfCAweEUwLi4weEZGCisgICAgbnVtYmVyX2ludGVnZXIgIHwgMC4uMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcG9zaXRpdmUgZml4aW50ICB8IDB4MDAuLjB4N0YKKyAgICBudW1iZXJfaW50ZWdlciAgfCAxMjguLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50IDggICAgICAgICAgIHwgMHhDQworICAgIG51bWJlcl9pbnRlZ2VyICB8IDI1Ni4uNjU1MzUgICAgICAgICAgICAgICAgICAgICAgICB8IHVpbnQgMTYgICAgICAgICAgfCAweENECisgICAgbnVtYmVyX2ludGVnZXIgIHwgNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICAgICAgICAgIHwgdWludCAzMiAgICAgICAgICB8IDB4Q0UKKyAgICBudW1iZXJfaW50ZWdlciAgfCA0Mjk0OTY3Mjk2Li4xODQ0Njc0NDA3MzcwOTU1MTYxNSAgfCB1aW50IDY0ICAgICAgICAgIHwgMHhDRgorICAgIG51bWJlcl91bnNpZ25lZCB8IDAuLjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBvc2l0aXZlIGZpeGludCAgfCAweDAwLi4weDdGCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMTI4Li4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdWludCA4ICAgICAgICAgICB8IDB4Q0MKKyAgICBudW1iZXJfdW5zaWduZWQgfCAyNTYuLjY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50IDE2ICAgICAgICAgIHwgMHhDRAorICAgIG51bWJlcl91bnNpZ25lZCB8IDY1NTM2Li40Mjk0OTY3Mjk1ICAgICAgICAgICAgICAgICB8IHVpbnQgMzIgICAgICAgICAgfCAweENFCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgNDI5NDk2NzI5Ni4uMTg0NDY3NDQwNzM3MDk1NTE2MTUgIHwgdWludCA2NCAgICAgICAgICB8IDB4Q0YKKyAgICBudW1iZXJfZmxvYXQgICAgfCAqYW55IHZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdCA2NCAgICAgICAgIHwgMHhDQgorICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiAwLi4zMSAgICAgICAgICAgICAgICAgICB8IGZpeHN0ciAgICAgICAgICAgfCAweEEwLi4weEJGCisgICAgc3RyaW5nICAgICAgICAgIHwgKmxlbmd0aCo6IDMyLi4yNTUgICAgICAgICAgICAgICAgIHwgc3RyIDggICAgICAgICAgICB8IDB4RDkKKyAgICBzdHJpbmcgICAgICAgICAgfCAqbGVuZ3RoKjogMjU2Li42NTUzNSAgICAgICAgICAgICAgfCBzdHIgMTYgICAgICAgICAgIHwgMHhEQQorICAgIHN0cmluZyAgICAgICAgICB8ICpsZW5ndGgqOiA2NTUzNi4uNDI5NDk2NzI5NSAgICAgICB8IHN0ciAzMiAgICAgICAgICAgfCAweERCCisgICAgYXJyYXkgICAgICAgICAgIHwgKnNpemUqOiAwLi4xNSAgICAgICAgICAgICAgICAgICAgIHwgZml4YXJyYXkgICAgICAgICB8IDB4OTAuLjB4OUYKKyAgICBhcnJheSAgICAgICAgICAgfCAqc2l6ZSo6IDE2Li42NTUzNSAgICAgICAgICAgICAgICAgfCBhcnJheSAxNiAgICAgICAgIHwgMHhEQworICAgIGFycmF5ICAgICAgICAgICB8ICpzaXplKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICB8IGFycmF5IDMyICAgICAgICAgfCAweERECisgICAgb2JqZWN0ICAgICAgICAgIHwgKnNpemUqOiAwLi4xNSAgICAgICAgICAgICAgICAgICAgIHwgZml4IG1hcCAgICAgICAgICB8IDB4ODAuLjB4OEYKKyAgICBvYmplY3QgICAgICAgICAgfCAqc2l6ZSo6IDE2Li42NTUzNSAgICAgICAgICAgICAgICAgfCBtYXAgMTYgICAgICAgICAgIHwgMHhERQorICAgIG9iamVjdCAgICAgICAgICB8ICpzaXplKjogNjU1MzYuLjQyOTQ5NjcyOTUgICAgICAgICB8IG1hcCAzMiAgICAgICAgICAgfCAweERGCisKKyAgICBAbm90ZSBUaGUgbWFwcGluZyBpcyAqKmNvbXBsZXRlKiogaW4gdGhlIHNlbnNlIHRoYXQgYW55IEpTT04gdmFsdWUgdHlwZQorICAgICAgICAgIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBNZXNzYWdlUGFjayB2YWx1ZS4KKworICAgIEBub3RlIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGNhbiAqKm5vdCoqIGJlIGNvbnZlcnRlZCB0byBhIE1lc3NhZ2VQYWNrIHZhbHVlOgorICAgICAgICAgIC0gc3RyaW5ncyB3aXRoIG1vcmUgdGhhbiA0Mjk0OTY3Mjk1IGJ5dGVzCisgICAgICAgICAgLSBhcnJheXMgd2l0aCBtb3JlIHRoYW4gNDI5NDk2NzI5NSBlbGVtZW50cworICAgICAgICAgIC0gb2JqZWN0cyB3aXRoIG1vcmUgdGhhbiA0Mjk0OTY3Mjk1IGVsZW1lbnRzCisKKyAgICBAbm90ZSBUaGUgZm9sbG93aW5nIE1lc3NhZ2VQYWNrIHR5cGVzIGFyZSBub3QgdXNlZCBpbiB0aGUgY29udmVyc2lvbjoKKyAgICAgICAgICAtIGJpbiA4IC0gYmluIDMyICgweEM0Li4weEM2KQorICAgICAgICAgIC0gZXh0IDggLSBleHQgMzIgKDB4QzcuLjB4QzkpCisgICAgICAgICAgLSBmbG9hdCAzMiAoMHhDQSkKKyAgICAgICAgICAtIGZpeGV4dCAxIC0gZml4ZXh0IDE2ICgweEQ0Li4weEQ4KQorCisgICAgQG5vdGUgQW55IE1lc3NhZ2VQYWNrIG91dHB1dCBjcmVhdGVkIEByZWYgdG9fbXNncGFjayBjYW4gYmUgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgcGFyc2VkIGJ5IEByZWYgZnJvbV9tc2dwYWNrLgorCisgICAgQG5vdGUgSWYgTmFOIG9yIEluZmluaXR5IGFyZSBzdG9yZWQgaW5zaWRlIGEgSlNPTiBudW1iZXIsIHRoZXkgYXJlCisgICAgICAgICAgc2VyaWFsaXplZCBwcm9wZXJseS4gVGhpcyBiZWhhdmlvciBkaWZmZXJzIGZyb20gdGhlIEByZWYgZHVtcCgpCisgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggc2VyaWFsaXplcyBOYU4gb3IgSW5maW5pdHkgdG8gYG51bGxgLgorCisgICAgQHBhcmFtW2luXSBqICBKU09OIHZhbHVlIHRvIHNlcmlhbGl6ZQorICAgIEByZXR1cm4gTWVzc2FnZVBhY2sgc2VyaWFsaXphdGlvbiBhcyBieXRlIHZlY3RvcgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBKU09OIHZhbHVlIEBhIGouCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIHNlcmlhbGl6YXRpb24gb2YgYSBKU09OIHZhbHVlIHRvIGEgYnl0ZQorICAgIHZlY3RvciBpbiBNZXNzYWdlUGFjayBmb3JtYXQuLHRvX21zZ3BhY2t9CisKKyAgICBAc2EgaHR0cDovL21zZ3BhY2sub3JnCisgICAgQHNhIEByZWYgZnJvbV9tc2dwYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiwgY29uc3Qgc2l6ZV90KSBmb3IgdGhlCisgICAgICAgIGFuYWxvZ291cyBkZXNlcmlhbGl6YXRpb24KKyAgICBAc2EgQHJlZiB0b19jYm9yKGNvbnN0IGJhc2ljX2pzb24mIGZvciB0aGUgcmVsYXRlZCBDQk9SIGZvcm1hdAorICAgIEBzYSBAcmVmIHRvX3VianNvbihjb25zdCBiYXNpY19qc29uJiwgY29uc3QgYm9vbCwgY29uc3QgYm9vbCkgZm9yIHRoZQorICAgICAgICAgICAgIHJlbGF0ZWQgVUJKU09OIGZvcm1hdAorCisgICAgQHNpbmNlIHZlcnNpb24gMi4wLjkKKyAgICAqLworICAgIHN0YXRpYyBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0b19tc2dwYWNrKGNvbnN0IGJhc2ljX2pzb24mIGopCisgICAgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgICAgIHRvX21zZ3BhY2soaiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0b19tc2dwYWNrKGNvbnN0IGJhc2ljX2pzb24mIGosIGRldGFpbDo6b3V0cHV0X2FkYXB0ZXI8dWludDhfdD4gbykKKyAgICB7CisgICAgICAgIGJpbmFyeV93cml0ZXI8dWludDhfdD4obykud3JpdGVfbXNncGFjayhqKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0b19tc2dwYWNrKGNvbnN0IGJhc2ljX2pzb24mIGosIGRldGFpbDo6b3V0cHV0X2FkYXB0ZXI8Y2hhcj4gbykKKyAgICB7CisgICAgICAgIGJpbmFyeV93cml0ZXI8Y2hhcj4obykud3JpdGVfbXNncGFjayhqKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgVUJKU09OIHNlcmlhbGl6YXRpb24gb2YgYSBnaXZlbiBKU09OIHZhbHVlCisKKyAgICBTZXJpYWxpemVzIGEgZ2l2ZW4gSlNPTiB2YWx1ZSBAYSBqIHRvIGEgYnl0ZSB2ZWN0b3IgdXNpbmcgdGhlIFVCSlNPTgorICAgIChVbml2ZXJzYWwgQmluYXJ5IEpTT04pIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBVQkpTT04gYWltcyB0byBiZSBtb3JlIGNvbXBhY3QKKyAgICB0aGFuIEpTT04gaXRzZWxmLCB5ZXQgbW9yZSBlZmZpY2llbnQgdG8gcGFyc2UuCisKKyAgICBUaGUgbGlicmFyeSB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIEpTT04gdmFsdWVzIHR5cGVzIHRvCisgICAgVUJKU09OIHR5cGVzIGFjY29yZGluZyB0byB0aGUgVUJKU09OIHNwZWNpZmljYXRpb246CisKKyAgICBKU09OIHZhbHVlIHR5cGUgfCB2YWx1ZS9yYW5nZSAgICAgICAgICAgICAgICAgICAgICAgfCBVQkpTT04gdHlwZSB8IG1hcmtlcgorICAgIC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tCisgICAgbnVsbCAgICAgICAgICAgIHwgYG51bGxgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbnVsbCAgICAgICAgfCBgWmAKKyAgICBib29sZWFuICAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cnVlICAgICAgICB8IGBUYAorICAgIGJvb2xlYW4gICAgICAgICB8IGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgIHwgYEZgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTkyMjMzNzIwMzY4NTQ3NzU4MDguLi0yMTQ3NDgzNjQ5IHwgaW50NjQgICAgICAgfCBgTGAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtMjE0NzQ4MzY0OC4uLTMyNzY5ICAgICAgICAgICAgICAgfCBpbnQzMiAgICAgICB8IGBsYAorICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMjc2OC4uLTEyOSAgICAgICAgICAgICAgICAgICAgICB8IGludDE2ICAgICAgIHwgYElgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTEyOC4uMTI3ICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50OCAgICAgICAgfCBgaWAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAxMjguLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OCAgICAgICB8IGBVYAorICAgIG51bWJlcl9pbnRlZ2VyICB8IDI1Ni4uMzI3NjcgICAgICAgICAgICAgICAgICAgICAgICB8IGludDE2ICAgICAgIHwgYElgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgMzI3NjguLjIxNDc0ODM2NDcgICAgICAgICAgICAgICAgIHwgaW50MzIgICAgICAgfCBgbGAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAyMTQ3NDgzNjQ4Li45MjIzMzcyMDM2ODU0Nzc1ODA3ICAgfCBpbnQ2NCAgICAgICB8IGBMYAorICAgIG51bWJlcl91bnNpZ25lZCB8IDAuLjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludDggICAgICAgIHwgYGlgCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMTI4Li4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdWludDggICAgICAgfCBgVWAKKyAgICBudW1iZXJfdW5zaWduZWQgfCAyNTYuLjMyNzY3ICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQxNiAgICAgICB8IGBJYAorICAgIG51bWJlcl91bnNpZ25lZCB8IDMyNzY4Li4yMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICB8IGludDMyICAgICAgIHwgYGxgCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMjE0NzQ4MzY0OC4uOTIyMzM3MjAzNjg1NDc3NTgwNyAgIHwgaW50NjQgICAgICAgfCBgTGAKKyAgICBudW1iZXJfZmxvYXQgICAgfCAqYW55IHZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICB8IGBEYAorICAgIHN0cmluZyAgICAgICAgICB8ICp3aXRoIHNob3J0ZXN0IGxlbmd0aCBpbmRpY2F0b3IqICB8IHN0cmluZyAgICAgIHwgYFNgCisgICAgYXJyYXkgICAgICAgICAgIHwgKnNlZSBub3RlcyBvbiBvcHRpbWl6ZWQgZm9ybWF0KiAgIHwgYXJyYXkgICAgICAgfCBgW2AKKyAgICBvYmplY3QgICAgICAgICAgfCAqc2VlIG5vdGVzIG9uIG9wdGltaXplZCBmb3JtYXQqICAgfCBtYXAgICAgICAgICB8IGB7YAorCisgICAgQG5vdGUgVGhlIG1hcHBpbmcgaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBKU09OIHZhbHVlIHR5cGUKKyAgICAgICAgICBjYW4gYmUgY29udmVydGVkIHRvIGEgVUJKU09OIHZhbHVlLgorCisgICAgQG5vdGUgVGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuICoqbm90KiogYmUgY29udmVydGVkIHRvIGEgVUJKU09OIHZhbHVlOgorICAgICAgICAgIC0gc3RyaW5ncyB3aXRoIG1vcmUgdGhhbiA5MjIzMzcyMDM2ODU0Nzc1ODA3IGJ5dGVzICh0aGVvcmV0aWNhbCkKKyAgICAgICAgICAtIHVuc2lnbmVkIGludGVnZXIgbnVtYmVycyBhYm92ZSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisKKyAgICBAbm90ZSBUaGUgZm9sbG93aW5nIG1hcmtlcnMgYXJlIG5vdCB1c2VkIGluIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgIC0gYFpgOiBuby1vcCB2YWx1ZXMgYXJlIG5vdCBjcmVhdGVkLgorICAgICAgICAgIC0gYENgOiBzaW5nbGUtYnl0ZSBzdHJpbmdzIGFyZSBzZXJpYWxpemVkIHdpdGggYFNgIG1hcmtlcnMuCisKKyAgICBAbm90ZSBBbnkgVUJKU09OIG91dHB1dCBjcmVhdGVkIEByZWYgdG9fdWJqc29uIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkCisgICAgICAgICAgYnkgQHJlZiBmcm9tX3VianNvbi4KKworICAgIEBub3RlIElmIE5hTiBvciBJbmZpbml0eSBhcmUgc3RvcmVkIGluc2lkZSBhIEpTT04gbnVtYmVyLCB0aGV5IGFyZQorICAgICAgICAgIHNlcmlhbGl6ZWQgcHJvcGVybHkuIFRoaXMgYmVoYXZpb3IgZGlmZmVycyBmcm9tIHRoZSBAcmVmIGR1bXAoKQorICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHNlcmlhbGl6ZXMgTmFOIG9yIEluZmluaXR5IHRvIGBudWxsYC4KKworICAgIEBub3RlIFRoZSBvcHRpbWl6ZWQgZm9ybWF0cyBmb3IgY29udGFpbmVycyBhcmUgc3VwcG9ydGVkOiBQYXJhbWV0ZXIKKyAgICAgICAgICBAYSB1c2Vfc2l6ZSBhZGRzIHNpemUgaW5mb3JtYXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhIGNvbnRhaW5lciBhbmQKKyAgICAgICAgICByZW1vdmVzIHRoZSBjbG9zaW5nIG1hcmtlci4gUGFyYW1ldGVyIEBhIHVzZV90eXBlIGZ1cnRoZXIgY2hlY2tzCisgICAgICAgICAgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBjb250YWluZXIgaGF2ZSB0aGUgc2FtZSB0eXBlIGFuZCBhZGRzIHRoZQorICAgICAgICAgIHR5cGUgbWFya2VyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5lci4gVGhlIEBhIHVzZV90eXBlCisgICAgICAgICAgcGFyYW1ldGVyIG11c3Qgb25seSBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggQGEgdXNlX3NpemUgPSB0cnVlLiBOb3RlCisgICAgICAgICAgdGhhdCBAYSB1c2Vfc2l6ZSA9IHRydWUgYWxvbmUgbWF5IHJlc3VsdCBpbiBsYXJnZXIgcmVwcmVzZW50YXRpb25zIC0KKyAgICAgICAgICB0aGUgYmVuZWZpdCBvZiB0aGlzIHBhcmFtZXRlciBpcyB0aGF0IHRoZSByZWNlaXZpbmcgc2lkZSBpcworICAgICAgICAgIGltbWVkaWF0ZWx5IGluZm9ybWVkIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBwYXJhbVtpbl0gaiAgSlNPTiB2YWx1ZSB0byBzZXJpYWxpemUKKyAgICBAcGFyYW1baW5dIHVzZV9zaXplICB3aGV0aGVyIHRvIGFkZCBzaXplIGFubm90YXRpb25zIHRvIGNvbnRhaW5lciB0eXBlcworICAgIEBwYXJhbVtpbl0gdXNlX3R5cGUgIHdoZXRoZXIgdG8gYWRkIHR5cGUgYW5ub3RhdGlvbnMgdG8gY29udGFpbmVyIHR5cGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgKG11c3QgYmUgY29tYmluZWQgd2l0aCBAYSB1c2Vfc2l6ZSA9IHRydWUpCisgICAgQHJldHVybiBVQkpTT04gc2VyaWFsaXphdGlvbiBhcyBieXRlIHZlY3RvcgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBKU09OIHZhbHVlIEBhIGouCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIHNlcmlhbGl6YXRpb24gb2YgYSBKU09OIHZhbHVlIHRvIGEgYnl0ZQorICAgIHZlY3RvciBpbiBVQkpTT04gZm9ybWF0Lix0b191Ympzb259CisKKyAgICBAc2EgaHR0cDovL3VianNvbi5vcmcKKyAgICBAc2EgQHJlZiBmcm9tX3VianNvbihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wgc3RyaWN0KSBmb3IgdGhlCisgICAgICAgIGFuYWxvZ291cyBkZXNlcmlhbGl6YXRpb24KKyAgICBAc2EgQHJlZiB0b19jYm9yKGNvbnN0IGJhc2ljX2pzb24mIGZvciB0aGUgcmVsYXRlZCBDQk9SIGZvcm1hdAorICAgIEBzYSBAcmVmIHRvX21zZ3BhY2soY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgcmVsYXRlZCBNZXNzYWdlUGFjayBmb3JtYXQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDMuMS4wCisgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9fdWJqc29uKGNvbnN0IGJhc2ljX2pzb24mIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZV9zaXplID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZV90eXBlID0gZmFsc2UpCisgICAgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgICAgIHRvX3VianNvbihqLCByZXN1bHQsIHVzZV9zaXplLCB1c2VfdHlwZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdG9fdWJqc29uKGNvbnN0IGJhc2ljX2pzb24mIGosIGRldGFpbDo6b3V0cHV0X2FkYXB0ZXI8dWludDhfdD4gbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2Vfc2l6ZSA9IGZhbHNlLCBjb25zdCBib29sIHVzZV90eXBlID0gZmFsc2UpCisgICAgeworICAgICAgICBiaW5hcnlfd3JpdGVyPHVpbnQ4X3Q+KG8pLndyaXRlX3VianNvbihqLCB1c2Vfc2l6ZSwgdXNlX3R5cGUpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRvX3VianNvbihjb25zdCBiYXNpY19qc29uJiBqLCBkZXRhaWw6Om91dHB1dF9hZGFwdGVyPGNoYXI+IG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlX3NpemUgPSBmYWxzZSwgY29uc3QgYm9vbCB1c2VfdHlwZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgYmluYXJ5X3dyaXRlcjxjaGFyPihvKS53cml0ZV91Ympzb24oaiwgdXNlX3NpemUsIHVzZV90eXBlKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGlucHV0IGluIENCT1IgZm9ybWF0CisKKyAgICBEZXNlcmlhbGl6ZXMgYSBnaXZlbiBpbnB1dCBAYSBpIHRvIGEgSlNPTiB2YWx1ZSB1c2luZyB0aGUgQ0JPUiAoQ29uY2lzZQorICAgIEJpbmFyeSBPYmplY3QgUmVwcmVzZW50YXRpb24pIHNlcmlhbGl6YXRpb24gZm9ybWF0LgorCisgICAgVGhlIGxpYnJhcnkgbWFwcyBDQk9SIHR5cGVzIHRvIEpTT04gdmFsdWUgdHlwZXMgYXMgZm9sbG93czoKKworICAgIENCT1IgdHlwZSAgICAgICAgICAgICAgfCBKU09OIHZhbHVlIHR5cGUgfCBmaXJzdCBieXRlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0KKyAgICBJbnRlZ2VyICAgICAgICAgICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHgwMC4uMHgxNworICAgIFVuc2lnbmVkIGludGVnZXIgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweDE4CisgICAgVW5zaWduZWQgaW50ZWdlciAgICAgICB8IG51bWJlcl91bnNpZ25lZCB8IDB4MTkKKyAgICBVbnNpZ25lZCBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHgxQQorICAgIFVuc2lnbmVkIGludGVnZXIgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweDFCCisgICAgTmVnYXRpdmUgaW50ZWdlciAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4MjAuLjB4MzcKKyAgICBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHgzOAorICAgIE5lZ2F0aXZlIGludGVnZXIgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweDM5CisgICAgTmVnYXRpdmUgaW50ZWdlciAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4M0EKKyAgICBOZWdhdGl2ZSBpbnRlZ2VyICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHgzQgorICAgIE5lZ2F0aXZlIGludGVnZXIgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweDQwLi4weDU3CisgICAgVVRGLTggc3RyaW5nICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4NjAuLjB4NzcKKyAgICBVVEYtOCBzdHJpbmcgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHg3OAorICAgIFVURi04IHN0cmluZyAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweDc5CisgICAgVVRGLTggc3RyaW5nICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4N0EKKyAgICBVVEYtOCBzdHJpbmcgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHg3QgorICAgIFVURi04IHN0cmluZyAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweDdGCisgICAgYXJyYXkgICAgICAgICAgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4ODAuLjB4OTcKKyAgICBhcnJheSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHg5OAorICAgIGFycmF5ICAgICAgICAgICAgICAgICAgfCBhcnJheSAgICAgICAgICAgfCAweDk5CisgICAgYXJyYXkgICAgICAgICAgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4OUEKKyAgICBhcnJheSAgICAgICAgICAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHg5QgorICAgIGFycmF5ICAgICAgICAgICAgICAgICAgfCBhcnJheSAgICAgICAgICAgfCAweDlGCisgICAgbWFwICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4QTAuLjB4QjcKKyAgICBtYXAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgIHwgMHhCOAorICAgIG1hcCAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweEI5CisgICAgbWFwICAgICAgICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4QkEKKyAgICBtYXAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICAgIHwgMHhCQgorICAgIG1hcCAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweEJGCisgICAgRmFsc2UgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAgICAgICAgICB8IDB4RjQKKyAgICBUcnVlICAgICAgICAgICAgICAgICAgIHwgYHRydWVgICAgICAgICAgIHwgMHhGNQorICAgIE5pbGwgICAgICAgICAgICAgICAgICAgfCBgbnVsbGAgICAgICAgICAgfCAweEY2CisgICAgSGFsZi1QcmVjaXNpb24gRmxvYXQgICB8IG51bWJlcl9mbG9hdCAgICB8IDB4RjkKKyAgICBTaW5nbGUtUHJlY2lzaW9uIEZsb2F0IHwgbnVtYmVyX2Zsb2F0ICAgIHwgMHhGQQorICAgIERvdWJsZS1QcmVjaXNpb24gRmxvYXQgfCBudW1iZXJfZmxvYXQgICAgfCAweEZCCisKKyAgICBAd2FybmluZyBUaGUgbWFwcGluZyBpcyAqKmluY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBub3QgYWxsIENCT1IKKyAgICAgICAgICAgICB0eXBlcyBjYW4gYmUgY29udmVydGVkIHRvIGEgSlNPTiB2YWx1ZS4gVGhlIGZvbGxvd2luZyBDQk9SIHR5cGVzCisgICAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgeWllbGQgcGFyc2UgZXJyb3JzIChwYXJzZV9lcnJvci4xMTIpOgorICAgICAgICAgICAgIC0gYnl0ZSBzdHJpbmdzICgweDQwLi4weDVGKQorICAgICAgICAgICAgIC0gZGF0ZS90aW1lICgweEMwLi4weEMxKQorICAgICAgICAgICAgIC0gYmlnbnVtICgweEMyLi4weEMzKQorICAgICAgICAgICAgIC0gZGVjaW1hbCBmcmFjdGlvbiAoMHhDNCkKKyAgICAgICAgICAgICAtIGJpZ2Zsb2F0ICgweEM1KQorICAgICAgICAgICAgIC0gdGFnZ2VkIGl0ZW1zICgweEM2Li4weEQ0LCAweEQ4Li4weERCKQorICAgICAgICAgICAgIC0gZXhwZWN0ZWQgY29udmVyc2lvbnMgKDB4RDUuLjB4RDcpCisgICAgICAgICAgICAgLSBzaW1wbGUgdmFsdWVzICgweEUwLi4weEYzLCAweEY4KQorICAgICAgICAgICAgIC0gdW5kZWZpbmVkICgweEY3KQorCisgICAgQHdhcm5pbmcgQ0JPUiBhbGxvd3MgbWFwIGtleXMgb2YgYW55IHR5cGUsIHdoZXJlYXMgSlNPTiBvbmx5IGFsbG93cworICAgICAgICAgICAgIHN0cmluZ3MgYXMga2V5cyBpbiBvYmplY3QgdmFsdWVzLiBUaGVyZWZvcmUsIENCT1IgbWFwcyB3aXRoIGtleXMKKyAgICAgICAgICAgICBvdGhlciB0aGFuIFVURi04IHN0cmluZ3MgYXJlIHJlamVjdGVkIChwYXJzZV9lcnJvci4xMTMpLgorCisgICAgQG5vdGUgQW55IENCT1Igb3V0cHV0IGNyZWF0ZWQgQHJlZiB0b19jYm9yIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGJ5CisgICAgICAgICAgQHJlZiBmcm9tX2Nib3IuCisKKyAgICBAcGFyYW1baW5dIGkgIGFuIGlucHV0IGluIENCT1IgZm9ybWF0IGNvbnZlcnRpYmxlIHRvIGFuIGlucHV0IGFkYXB0ZXIKKyAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGlucHV0IHRvIGJlIGNvbnN1bWVkIHVudGlsIEVPRgorICAgICAgICAgICAgICAgICAgICAgICAodHJ1ZSBieSBkZWZhdWx0KQorICAgIEByZXR1cm4gZGVzZXJpYWxpemVkIEpTT04gdmFsdWUKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgdGhlIGdpdmVuIGlucHV0IGVuZHMgcHJlbWF0dXJlbHkgb3IgdGhlIGVuZCBvZgorICAgIGZpbGUgd2FzIG5vdCByZWFjaGVkIHdoZW4gQGEgc3RyaWN0IHdhcyBzZXQgdG8gdHJ1ZQorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgZmVhdHVyZXMgZnJvbSBDQk9SIHdlcmUKKyAgICB1c2VkIGluIHRoZSBnaXZlbiBpbnB1dCBAYSB2IG9yIGlmIHRoZSBpbnB1dCBpcyBub3QgdmFsaWQgQ0JPUgorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTMgaWYgYSBzdHJpbmcgd2FzIGV4cGVjdGVkIGFzIG1hcCBrZXksIGJ1dCBub3QgZm91bmQKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgQGEgaS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgYnl0ZSB2ZWN0b3IgaW4gQ0JPUgorICAgIGZvcm1hdCB0byBhIEpTT04gdmFsdWUuLGZyb21fY2Jvcn0KKworICAgIEBzYSBodHRwOi8vY2Jvci5pbworICAgIEBzYSBAcmVmIHRvX2Nib3IoY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgYW5hbG9nb3VzIHNlcmlhbGl6YXRpb24KKyAgICBAc2EgQHJlZiBmcm9tX21zZ3BhY2soZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBib29sKSBmb3IgdGhlCisgICAgICAgIHJlbGF0ZWQgTWVzc2FnZVBhY2sgZm9ybWF0CisgICAgQHNhIEByZWYgZnJvbV91Ympzb24oZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBib29sKSBmb3IgdGhlIHJlbGF0ZWQKKyAgICAgICAgVUJKU09OIGZvcm1hdAorCisgICAgQHNpbmNlIHZlcnNpb24gMi4wLjk7IHBhcmFtZXRlciBAYSBzdGFydF9pbmRleCBzaW5jZSAyLjEuMTsgY2hhbmdlZCB0bworICAgICAgICAgICBjb25zdW1lIGlucHV0IGFkYXB0ZXJzLCByZW1vdmVkIHN0YXJ0X2luZGV4IHBhcmFtZXRlciwgYW5kIGFkZGVkCisgICAgICAgICAgIEBhIHN0cmljdCBwYXJhbWV0ZXIgc2luY2UgMy4wLjAKKyAgICAqLworICAgIHN0YXRpYyBiYXNpY19qc29uIGZyb21fY2JvcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzdHJpY3QgPSB0cnVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9yZWFkZXIoaSkucGFyc2VfY2JvcihzdHJpY3QpOworICAgIH0KKworICAgIC8qIQorICAgIEBjb3B5ZG9jIGZyb21fY2JvcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsCisgICAgICAgICAgICAgZGV0YWlsOjplbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBBMSwgQTI+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgc3RhdGljIGJhc2ljX2pzb24gZnJvbV9jYm9yKEExICYmIGExLCBBMiAmJiBhMiwgY29uc3QgYm9vbCBzdHJpY3QgPSB0cnVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9yZWFkZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyKHN0ZDo6Zm9yd2FyZDxBMT4oYTEpLCBzdGQ6OmZvcndhcmQ8QTI+KGEyKSkpLnBhcnNlX2Nib3Ioc3RyaWN0KTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGlucHV0IGluIE1lc3NhZ2VQYWNrIGZvcm1hdAorCisgICAgRGVzZXJpYWxpemVzIGEgZ2l2ZW4gaW5wdXQgQGEgaSB0byBhIEpTT04gdmFsdWUgdXNpbmcgdGhlIE1lc3NhZ2VQYWNrCisgICAgc2VyaWFsaXphdGlvbiBmb3JtYXQuCisKKyAgICBUaGUgbGlicmFyeSBtYXBzIE1lc3NhZ2VQYWNrIHR5cGVzIHRvIEpTT04gdmFsdWUgdHlwZXMgYXMgZm9sbG93czoKKworICAgIE1lc3NhZ2VQYWNrIHR5cGUgfCBKU09OIHZhbHVlIHR5cGUgfCBmaXJzdCBieXRlCisgICAgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0KKyAgICBwb3NpdGl2ZSBmaXhpbnQgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHgwMC4uMHg3RgorICAgIGZpeG1hcCAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweDgwLi4weDhGCisgICAgZml4YXJyYXkgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4OTAuLjB4OUYKKyAgICBmaXhzdHIgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHhBMC4uMHhCRgorICAgIG5pbCAgICAgICAgICAgICAgfCBgbnVsbGAgICAgICAgICAgfCAweEMwCisgICAgZmFsc2UgICAgICAgICAgICB8IGBmYWxzZWAgICAgICAgICB8IDB4QzIKKyAgICB0cnVlICAgICAgICAgICAgIHwgYHRydWVgICAgICAgICAgIHwgMHhDMworICAgIGZsb2F0IDMyICAgICAgICAgfCBudW1iZXJfZmxvYXQgICAgfCAweENBCisgICAgZmxvYXQgNjQgICAgICAgICB8IG51bWJlcl9mbG9hdCAgICB8IDB4Q0IKKyAgICB1aW50IDggICAgICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHhDQworICAgIHVpbnQgMTYgICAgICAgICAgfCBudW1iZXJfdW5zaWduZWQgfCAweENECisgICAgdWludCAzMiAgICAgICAgICB8IG51bWJlcl91bnNpZ25lZCB8IDB4Q0UKKyAgICB1aW50IDY0ICAgICAgICAgIHwgbnVtYmVyX3Vuc2lnbmVkIHwgMHhDRgorICAgIGludCA4ICAgICAgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweEQwCisgICAgaW50IDE2ICAgICAgICAgICB8IG51bWJlcl9pbnRlZ2VyICB8IDB4RDEKKyAgICBpbnQgMzIgICAgICAgICAgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHhEMgorICAgIGludCA2NCAgICAgICAgICAgfCBudW1iZXJfaW50ZWdlciAgfCAweEQzCisgICAgc3RyIDggICAgICAgICAgICB8IHN0cmluZyAgICAgICAgICB8IDB4RDkKKyAgICBzdHIgMTYgICAgICAgICAgIHwgc3RyaW5nICAgICAgICAgIHwgMHhEQQorICAgIHN0ciAzMiAgICAgICAgICAgfCBzdHJpbmcgICAgICAgICAgfCAweERCCisgICAgYXJyYXkgMTYgICAgICAgICB8IGFycmF5ICAgICAgICAgICB8IDB4REMKKyAgICBhcnJheSAzMiAgICAgICAgIHwgYXJyYXkgICAgICAgICAgIHwgMHhERAorICAgIG1hcCAxNiAgICAgICAgICAgfCBvYmplY3QgICAgICAgICAgfCAweERFCisgICAgbWFwIDMyICAgICAgICAgICB8IG9iamVjdCAgICAgICAgICB8IDB4REYKKyAgICBuZWdhdGl2ZSBmaXhpbnQgIHwgbnVtYmVyX2ludGVnZXIgIHwgMHhFMC0weEZGCisKKyAgICBAd2FybmluZyBUaGUgbWFwcGluZyBpcyAqKmluY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBub3QgYWxsCisgICAgICAgICAgICAgTWVzc2FnZVBhY2sgdHlwZXMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUuIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICBNZXNzYWdlUGFjayB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCB5aWVsZCBwYXJzZSBlcnJvcnM6CisgICAgICAgICAgICAgIC0gYmluIDggLSBiaW4gMzIgKDB4QzQuLjB4QzYpCisgICAgICAgICAgICAgIC0gZXh0IDggLSBleHQgMzIgKDB4QzcuLjB4QzkpCisgICAgICAgICAgICAgIC0gZml4ZXh0IDEgLSBmaXhleHQgMTYgKDB4RDQuLjB4RDgpCisKKyAgICBAbm90ZSBBbnkgTWVzc2FnZVBhY2sgb3V0cHV0IGNyZWF0ZWQgQHJlZiB0b19tc2dwYWNrIGNhbiBiZSBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBwYXJzZWQgYnkgQHJlZiBmcm9tX21zZ3BhY2suCisKKyAgICBAcGFyYW1baW5dIGkgIGFuIGlucHV0IGluIE1lc3NhZ2VQYWNrIGZvcm1hdCBjb252ZXJ0aWJsZSB0byBhbiBpbnB1dAorICAgICAgICAgICAgICAgICAgYWRhcHRlcgorICAgIEBwYXJhbVtpbl0gc3RyaWN0ICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgaW5wdXQgdG8gYmUgY29uc3VtZWQgdW50aWwgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICh0cnVlIGJ5IGRlZmF1bHQpCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIHRoZSBnaXZlbiBpbnB1dCBlbmRzIHByZW1hdHVyZWx5IG9yIHRoZSBlbmQgb2YKKyAgICBmaWxlIHdhcyBub3QgcmVhY2hlZCB3aGVuIEBhIHN0cmljdCB3YXMgc2V0IHRvIHRydWUKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEyIGlmIHVuc3VwcG9ydGVkIGZlYXR1cmVzIGZyb20gTWVzc2FnZVBhY2sgd2VyZQorICAgIHVzZWQgaW4gdGhlIGdpdmVuIGlucHV0IEBhIGkgb3IgaWYgdGhlIGlucHV0IGlzIG5vdCB2YWxpZCBNZXNzYWdlUGFjaworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTMgaWYgYSBzdHJpbmcgd2FzIGV4cGVjdGVkIGFzIG1hcCBrZXksIGJ1dCBub3QgZm91bmQKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgQGEgaS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgYnl0ZSB2ZWN0b3IgaW4KKyAgICBNZXNzYWdlUGFjayBmb3JtYXQgdG8gYSBKU09OIHZhbHVlLixmcm9tX21zZ3BhY2t9CisKKyAgICBAc2EgaHR0cDovL21zZ3BhY2sub3JnCisgICAgQHNhIEByZWYgdG9fbXNncGFjayhjb25zdCBiYXNpY19qc29uJikgZm9yIHRoZSBhbmFsb2dvdXMgc2VyaWFsaXphdGlvbgorICAgIEBzYSBAcmVmIGZyb21fY2JvcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wpIGZvciB0aGUgcmVsYXRlZCBDQk9SCisgICAgICAgIGZvcm1hdAorICAgIEBzYSBAcmVmIGZyb21fdWJqc29uKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCkgZm9yIHRoZSByZWxhdGVkCisgICAgICAgIFVCSlNPTiBmb3JtYXQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45OyBwYXJhbWV0ZXIgQGEgc3RhcnRfaW5kZXggc2luY2UgMi4xLjE7IGNoYW5nZWQgdG8KKyAgICAgICAgICAgY29uc3VtZSBpbnB1dCBhZGFwdGVycywgcmVtb3ZlZCBzdGFydF9pbmRleCBwYXJhbWV0ZXIsIGFuZCBhZGRlZAorICAgICAgICAgICBAYSBzdHJpY3QgcGFyYW1ldGVyIHNpbmNlIDMuMC4wCisgICAgKi8KKyAgICBzdGF0aWMgYmFzaWNfanNvbiBmcm9tX21zZ3BhY2soZGV0YWlsOjppbnB1dF9hZGFwdGVyIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc3RyaWN0ID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBiaW5hcnlfcmVhZGVyKGkpLnBhcnNlX21zZ3BhY2soc3RyaWN0KTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAY29weWRvYyBmcm9tX21zZ3BhY2soZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBib29sKQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLAorICAgICAgICAgICAgIGRldGFpbDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRldGFpbDo6aW5wdXRfYWRhcHRlciwgQTEsIEEyPjo6dmFsdWUsIGludD4gPSAwPgorICAgIHN0YXRpYyBiYXNpY19qc29uIGZyb21fbXNncGFjayhBMSAmJiBhMSwgQTIgJiYgYTIsIGNvbnN0IGJvb2wgc3RyaWN0ID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBiaW5hcnlfcmVhZGVyKGRldGFpbDo6aW5wdXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8QTE+KGExKSwgc3RkOjpmb3J3YXJkPEEyPihhMikpKS5wYXJzZV9tc2dwYWNrKHN0cmljdCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBhbiBpbnB1dCBpbiBVQkpTT04gZm9ybWF0CisKKyAgICBEZXNlcmlhbGl6ZXMgYSBnaXZlbiBpbnB1dCBAYSBpIHRvIGEgSlNPTiB2YWx1ZSB1c2luZyB0aGUgVUJKU09OIChVbml2ZXJzYWwKKyAgICBCaW5hcnkgSlNPTikgc2VyaWFsaXphdGlvbiBmb3JtYXQuCisKKyAgICBUaGUgbGlicmFyeSBtYXBzIFVCSlNPTiB0eXBlcyB0byBKU09OIHZhbHVlIHR5cGVzIGFzIGZvbGxvd3M6CisKKyAgICBVQkpTT04gdHlwZSB8IEpTT04gdmFsdWUgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcmtlcgorICAgIC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tCisgICAgbm8tb3AgICAgICAgfCAqbm8gdmFsdWUsIG5leHQgdmFsdWUgaXMgcmVhZCogICAgICAgICAgfCBgTmAKKyAgICBudWxsICAgICAgICB8IGBudWxsYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBaYAorICAgIGZhbHNlICAgICAgIHwgYGZhbHNlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYEZgCisgICAgdHJ1ZSAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgVGAKKyAgICBmbG9hdDMyICAgICB8IG51bWJlcl9mbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBkYAorICAgIGZsb2F0NjQgICAgIHwgbnVtYmVyX2Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYERgCisgICAgdWludDggICAgICAgfCBudW1iZXJfdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgfCBgVWAKKyAgICBpbnQ4ICAgICAgICB8IG51bWJlcl9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBpYAorICAgIGludDE2ICAgICAgIHwgbnVtYmVyX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYElgCisgICAgaW50MzIgICAgICAgfCBudW1iZXJfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgbGAKKyAgICBpbnQ2NCAgICAgICB8IG51bWJlcl9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBMYAorICAgIHN0cmluZyAgICAgIHwgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYFNgCisgICAgY2hhciAgICAgICAgfCBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgQ2AKKyAgICBhcnJheSAgICAgICB8IGFycmF5IChvcHRpbWl6ZWQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQpICB8IGBbYAorICAgIG9iamVjdCAgICAgIHwgb2JqZWN0IChvcHRpbWl6ZWQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQpIHwgYHtgCisKKyAgICBAbm90ZSBUaGUgbWFwcGluZyBpcyAqKmNvbXBsZXRlKiogaW4gdGhlIHNlbnNlIHRoYXQgYW55IFVCSlNPTiB2YWx1ZSBjYW4KKyAgICAgICAgICBiZSBjb252ZXJ0ZWQgdG8gYSBKU09OIHZhbHVlLgorCisgICAgQHBhcmFtW2luXSBpICBhbiBpbnB1dCBpbiBVQkpTT04gZm9ybWF0IGNvbnZlcnRpYmxlIHRvIGFuIGlucHV0IGFkYXB0ZXIKKyAgICBAcGFyYW1baW5dIHN0cmljdCAgd2hldGhlciB0byBleHBlY3QgdGhlIGlucHV0IHRvIGJlIGNvbnN1bWVkIHVudGlsIEVPRgorICAgICAgICAgICAgICAgICAgICAgICAodHJ1ZSBieSBkZWZhdWx0KQorCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiB0aGUgZ2l2ZW4gaW5wdXQgZW5kcyBwcmVtYXR1cmVseSBvciB0aGUgZW5kIG9mCisgICAgZmlsZSB3YXMgbm90IHJlYWNoZWQgd2hlbiBAYSBzdHJpY3Qgd2FzIHNldCB0byB0cnVlCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMiBpZiBhIHBhcnNlIGVycm9yIG9jY3VycworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTMgaWYgYSBzdHJpbmcgY291bGQgbm90IGJlIHBhcnNlZCBzdWNjZXNzZnVsbHkKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgQGEgaS4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZXhhbXBsZSBzaG93cyB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgYnl0ZSB2ZWN0b3IgaW4KKyAgICBVQkpTT04gZm9ybWF0IHRvIGEgSlNPTiB2YWx1ZS4sZnJvbV91Ympzb259CisKKyAgICBAc2EgaHR0cDovL3VianNvbi5vcmcKKyAgICBAc2EgQHJlZiB0b191Ympzb24oY29uc3QgYmFzaWNfanNvbiYsIGNvbnN0IGJvb2wsIGNvbnN0IGJvb2wpIGZvciB0aGUKKyAgICAgICAgICAgICBhbmFsb2dvdXMgc2VyaWFsaXphdGlvbgorICAgIEBzYSBAcmVmIGZyb21fY2JvcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wpIGZvciB0aGUgcmVsYXRlZCBDQk9SCisgICAgICAgIGZvcm1hdAorICAgIEBzYSBAcmVmIGZyb21fbXNncGFjayhkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wpIGZvciB0aGUgcmVsYXRlZAorICAgICAgICBNZXNzYWdlUGFjayBmb3JtYXQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDMuMS4wCisgICAgKi8KKyAgICBzdGF0aWMgYmFzaWNfanNvbiBmcm9tX3VianNvbihkZXRhaWw6OmlucHV0X2FkYXB0ZXIgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHN0cmljdCA9IHRydWUpCisgICAgeworICAgICAgICByZXR1cm4gYmluYXJ5X3JlYWRlcihpKS5wYXJzZV91Ympzb24oc3RyaWN0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsCisgICAgICAgICAgICAgZGV0YWlsOjplbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBBMSwgQTI+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgc3RhdGljIGJhc2ljX2pzb24gZnJvbV91Ympzb24oQTEgJiYgYTEsIEEyICYmIGEyLCBjb25zdCBib29sIHN0cmljdCA9IHRydWUpCisgICAgeworICAgICAgICByZXR1cm4gYmluYXJ5X3JlYWRlcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPEExPihhMSksIHN0ZDo6Zm9yd2FyZDxBMj4oYTIpKSkucGFyc2VfdWJqc29uKHN0cmljdCk7CisgICAgfQorCisgICAgLy8vIEB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpTT04gUG9pbnRlciBzdXBwb3J0IC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBKU09OIFBvaW50ZXIgZnVuY3Rpb25zCisgICAgLy8vIEB7CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKKworICAgIFVzZXMgYSBKU09OIHBvaW50ZXIgdG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc3BlY3RpdmUgSlNPTiB2YWx1ZS4KKyAgICBObyBib3VuZCBjaGVja2luZyBpcyBwZXJmb3JtZWQuIFNpbWlsYXIgdG8gQHJlZiBvcGVyYXRvcltdKGNvbnN0IHR5cGVuYW1lCisgICAgb2JqZWN0X3Q6OmtleV90eXBlJiksIGBudWxsYCB2YWx1ZXMgYXJlIGNyZWF0ZWQgaW4gYXJyYXlzIGFuZCBvYmplY3RzIGlmCisgICAgbmVjZXNzYXJ5LgorCisgICAgSW4gcGFydGljdWxhcjoKKyAgICAtIElmIHRoZSBKU09OIHBvaW50ZXIgcG9pbnRzIHRvIGFuIG9iamVjdCBrZXkgdGhhdCBkb2VzIG5vdCBleGlzdCwgaXQKKyAgICAgIGlzIGNyZWF0ZWQgYW4gZmlsbGVkIHdpdGggYSBgbnVsbGAgdmFsdWUgYmVmb3JlIGEgcmVmZXJlbmNlIHRvIGl0CisgICAgICBpcyByZXR1cm5lZC4KKyAgICAtIElmIHRoZSBKU09OIHBvaW50ZXIgcG9pbnRzIHRvIGFuIGFycmF5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QsIGl0CisgICAgICBpcyBjcmVhdGVkIGFuIGZpbGxlZCB3aXRoIGEgYG51bGxgIHZhbHVlIGJlZm9yZSBhIHJlZmVyZW5jZSB0byBpdAorICAgICAgaXMgcmV0dXJuZWQuIEFsbCBpbmRpY2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgbWF4aW11bSBhbmQgdGhlIGdpdmVuCisgICAgICBpbmRleCBhcmUgYWxzbyBmaWxsZWQgd2l0aCBgbnVsbGAuCisgICAgLSBUaGUgc3BlY2lhbCB2YWx1ZSBgLWAgaXMgdHJlYXRlZCBhcyBhIHN5bm9ueW0gZm9yIHRoZSBpbmRleCBwYXN0IHRoZQorICAgICAgZW5kLgorCisgICAgQHBhcmFtW2luXSBwdHIgIGEgSlNPTiBwb2ludGVyCisKKyAgICBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5IEBhIHB0cgorCisgICAgQGNvbXBsZXhpdHkgQ29uc3RhbnQuCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA2ICAgaWYgYW4gYXJyYXkgaW5kZXggYmVnaW5zIHdpdGggJzAnCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSAgIGlmIGFuIGFycmF5IGluZGV4IHdhcyBub3QgYSBudW1iZXIKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGJlaGF2aW9yIGlzIHNob3duIGluIHRoZSBleGFtcGxlLixvcGVyYXRvcmpzb25fcG9pbnRlcn0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShjb25zdCBqc29uX3BvaW50ZXImIHB0cikKKyAgICB7CisgICAgICAgIHJldHVybiBwdHIuZ2V0X3VuY2hlY2tlZCh0aGlzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKKworICAgIFVzZXMgYSBKU09OIHBvaW50ZXIgdG8gcmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc3BlY3RpdmUgSlNPTiB2YWx1ZS4KKyAgICBObyBib3VuZCBjaGVja2luZyBpcyBwZXJmb3JtZWQuIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIEpTT04KKyAgICB2YWx1ZTsgbm8gYG51bGxgIHZhbHVlcyBhcmUgY3JlYXRlZC4gSW4gcGFydGljdWxhciwgdGhlIHRoZSBzcGVjaWFsIHZhbHVlCisgICAgYC1gIHlpZWxkcyBhbiBleGNlcHRpb24uCisKKyAgICBAcGFyYW1baW5dIHB0ciAgSlNPTiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVsZW1lbnQKKworICAgIEByZXR1cm4gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgcHRyCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5ICAgaWYgYW4gYXJyYXkgaW5kZXggd2FzIG5vdCBhIG51bWJlcgorICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAyICBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGJlaGF2aW9yIGlzIHNob3duIGluIHRoZSBleGFtcGxlLixvcGVyYXRvcmpzb25fcG9pbnRlcl9jb25zdH0KKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShjb25zdCBqc29uX3BvaW50ZXImIHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBwdHIuZ2V0X3VuY2hlY2tlZCh0aGlzKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgYWNjZXNzIHNwZWNpZmllZCBlbGVtZW50IHZpYSBKU09OIFBvaW50ZXIKKworICAgIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgd2l0aCBzcGVjaWZpZWQgSlNPTiBwb2ludGVyIEBhIHB0ciwKKyAgICB3aXRoIGJvdW5kcyBjaGVja2luZy4KKworICAgIEBwYXJhbVtpbl0gcHRyICBKU09OIHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZWxlbWVudAorCisgICAgQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSBAYSBwdHIKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCisgICAgYmVnaW5zIHdpdGggJzAnLiBTZWUgZXhhbXBsZSBiZWxvdy4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDkgaWYgYW4gYXJyYXkgaW5kZXggaW4gdGhlIHBhc3NlZCBKU09OIHBvaW50ZXIgQGEgcHRyCisgICAgaXMgbm90IGEgbnVtYmVyLiBTZWUgZXhhbXBsZSBiZWxvdy4KKworICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAxIGlmIGFuIGFycmF5IGluZGV4IGluIHRoZSBwYXNzZWQgSlNPTiBwb2ludGVyIEBhIHB0cgorICAgIGlzIG91dCBvZiByYW5nZS4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMiBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQgaW4gdGhlIHBhc3NlZCBKU09OCisgICAgcG9pbnRlciBAYSBwdHIuIEFzIGBhdGAgcHJvdmlkZXMgY2hlY2tlZCBhY2Nlc3MgKGFuZCBubyBlbGVtZW50cyBhcmUKKyAgICBpbXBsaWNpdGx5IGluc2VydGVkKSwgdGhlIGluZGV4ICctJyBpcyBhbHdheXMgaW52YWxpZC4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMyBpZiB0aGUgSlNPTiBwb2ludGVyIGRlc2NyaWJlcyBhIGtleSBvZiBhbiBvYmplY3QKKyAgICB3aGljaCBjYW5ub3QgYmUgZm91bmQuIFNlZSBleGFtcGxlIGJlbG93LgorCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDQgaWYgdGhlIEpTT04gcG9pbnRlciBAYSBwdHIgY2FuIG5vdCBiZSByZXNvbHZlZC4KKyAgICBTZWUgZXhhbXBsZSBiZWxvdy4KKworICAgIEBleGNlcHRpb25zYWZldHkgU3Ryb25nIGd1YXJhbnRlZTogaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biwgdGhlcmUgYXJlIG5vCisgICAgY2hhbmdlcyBpbiB0aGUgSlNPTiB2YWx1ZS4KKworICAgIEBjb21wbGV4aXR5IENvbnN0YW50LgorCisgICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKKworICAgIEBsaXZlZXhhbXBsZXtUaGUgYmVoYXZpb3IgaXMgc2hvd24gaW4gdGhlIGV4YW1wbGUuLGF0X2pzb25fcG9pbnRlcn0KKyAgICAqLworICAgIHJlZmVyZW5jZSBhdChjb25zdCBqc29uX3BvaW50ZXImIHB0cikKKyAgICB7CisgICAgICAgIHJldHVybiBwdHIuZ2V0X2NoZWNrZWQodGhpcyk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGFjY2VzcyBzcGVjaWZpZWQgZWxlbWVudCB2aWEgSlNPTiBQb2ludGVyCisKKyAgICBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHdpdGggc3BlY2lmaWVkIEpTT04gcG9pbnRlciBAYQorICAgIHB0ciwgd2l0aCBib3VuZHMgY2hlY2tpbmcuCisKKyAgICBAcGFyYW1baW5dIHB0ciAgSlNPTiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVsZW1lbnQKKworICAgIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgcHRyCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA2IGlmIGFuIGFycmF5IGluZGV4IGluIHRoZSBwYXNzZWQgSlNPTiBwb2ludGVyIEBhIHB0cgorICAgIGJlZ2lucyB3aXRoICcwJy4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5IGlmIGFuIGFycmF5IGluZGV4IGluIHRoZSBwYXNzZWQgSlNPTiBwb2ludGVyIEBhIHB0cgorICAgIGlzIG5vdCBhIG51bWJlci4gU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMSBpZiBhbiBhcnJheSBpbmRleCBpbiB0aGUgcGFzc2VkIEpTT04gcG9pbnRlciBAYSBwdHIKKyAgICBpcyBvdXQgb2YgcmFuZ2UuIFNlZSBleGFtcGxlIGJlbG93LgorCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDIgaWYgdGhlIGFycmF5IGluZGV4ICctJyBpcyB1c2VkIGluIHRoZSBwYXNzZWQgSlNPTgorICAgIHBvaW50ZXIgQGEgcHRyLiBBcyBgYXRgIHByb3ZpZGVzIGNoZWNrZWQgYWNjZXNzIChhbmQgbm8gZWxlbWVudHMgYXJlCisgICAgaW1wbGljaXRseSBpbnNlcnRlZCksIHRoZSBpbmRleCAnLScgaXMgYWx3YXlzIGludmFsaWQuIFNlZSBleGFtcGxlIGJlbG93LgorCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDMgaWYgdGhlIEpTT04gcG9pbnRlciBkZXNjcmliZXMgYSBrZXkgb2YgYW4gb2JqZWN0CisgICAgd2hpY2ggY2Fubm90IGJlIGZvdW5kLiBTZWUgZXhhbXBsZSBiZWxvdy4KKworICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0IGlmIHRoZSBKU09OIHBvaW50ZXIgQGEgcHRyIGNhbiBub3QgYmUgcmVzb2x2ZWQuCisgICAgU2VlIGV4YW1wbGUgYmVsb3cuCisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGJlaGF2aW9yIGlzIHNob3duIGluIHRoZSBleGFtcGxlLixhdF9qc29uX3BvaW50ZXJfY29uc3R9CisgICAgKi8KKyAgICBjb25zdF9yZWZlcmVuY2UgYXQoY29uc3QganNvbl9wb2ludGVyJiBwdHIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gcHRyLmdldF9jaGVja2VkKHRoaXMpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiByZXR1cm4gZmxhdHRlbmVkIEpTT04gdmFsdWUKKworICAgIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGEgSlNPTiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgSlNPTiBwb2ludGVycyAoc2VlIFtSRkMKKyAgICA2OTAxXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSkpIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIGFsbAorICAgIHByaW1pdGl2ZS4gVGhlIG9yaWdpbmFsIEpTT04gdmFsdWUgY2FuIGJlIHJlc3RvcmVkIHVzaW5nIHRoZSBAcmVmCisgICAgdW5mbGF0dGVuKCkgZnVuY3Rpb24uCisKKyAgICBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hcHMgSlNPTiBwb2ludGVycyB0byBwcmltaXRpdmUgdmFsdWVzCisKKyAgICBAbm90ZSBFbXB0eSBvYmplY3RzIGFuZCBhcnJheXMgYXJlIGZsYXR0ZW5lZCB0byBgbnVsbGAgYW5kIHdpbGwgbm90IGJlCisgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBjb3JyZWN0bHkgYnkgdGhlIEByZWYgdW5mbGF0dGVuKCkgZnVuY3Rpb24uCisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIHNpemUgdGhlIEpTT04gdmFsdWUuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhIEpTT04gb2JqZWN0IGlzIGZsYXR0ZW5lZCB0byBhbgorICAgIG9iamVjdCB3aG9zZSBrZXlzIGNvbnNpc3Qgb2YgSlNPTiBwb2ludGVycy4sZmxhdHRlbn0KKworICAgIEBzYSBAcmVmIHVuZmxhdHRlbigpIGZvciB0aGUgcmV2ZXJzZSBmdW5jdGlvbgorCisgICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKKyAgICAqLworICAgIGJhc2ljX2pzb24gZmxhdHRlbigpIGNvbnN0CisgICAgeworICAgICAgICBiYXNpY19qc29uIHJlc3VsdCh2YWx1ZV90OjpvYmplY3QpOworICAgICAgICBqc29uX3BvaW50ZXI6OmZsYXR0ZW4oIiIsICp0aGlzLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiB1bmZsYXR0ZW4gYSBwcmV2aW91c2x5IGZsYXR0ZW5lZCBKU09OIHZhbHVlCisKKyAgICBUaGUgZnVuY3Rpb24gcmVzdG9yZXMgdGhlIGFyYml0cmFyeSBuZXN0aW5nIG9mIGEgSlNPTiB2YWx1ZSB0aGF0IGhhcyBiZWVuCisgICAgZmxhdHRlbmVkIGJlZm9yZSB1c2luZyB0aGUgQHJlZiBmbGF0dGVuKCkgZnVuY3Rpb24uIFRoZSBKU09OIHZhbHVlIG11c3QKKyAgICBtZWV0IGNlcnRhaW4gY29uc3RyYWludHM6CisgICAgMS4gVGhlIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0LgorICAgIDIuIFRoZSBrZXlzIG11c3QgYmUgSlNPTiBwb2ludGVycyAoc2VlCisgICAgICAgW1JGQyA2OTAxXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSkpCisgICAgMy4gVGhlIG1hcHBlZCB2YWx1ZXMgbXVzdCBiZSBwcmltaXRpdmUgSlNPTiB0eXBlcy4KKworICAgIEByZXR1cm4gdGhlIG9yaWdpbmFsIEpTT04gZnJvbSBhIGZsYXR0ZW5lZCB2ZXJzaW9uCisKKyAgICBAbm90ZSBFbXB0eSBvYmplY3RzIGFuZCBhcnJheXMgYXJlIGZsYXR0ZW5lZCBieSBAcmVmIGZsYXR0ZW4oKSB0byBgbnVsbGAKKyAgICAgICAgICB2YWx1ZXMgYW5kIGNhbiBub3QgdW5mbGF0dGVuZWQgdG8gdGhlaXIgb3JpZ2luYWwgdHlwZS4gQXBhcnQgZnJvbQorICAgICAgICAgIHRoaXMgZXhhbXBsZSwgZm9yIGEgSlNPTiB2YWx1ZSBgamAsIHRoZSBmb2xsb3dpbmcgaXMgYWx3YXlzIHRydWU6CisgICAgICAgICAgYGogPT0gai5mbGF0dGVuKCkudW5mbGF0dGVuKClgLgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIHRoZSBKU09OIHZhbHVlLgorCisgICAgQHRocm93IHR5cGVfZXJyb3IuMzE0ICBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0CisgICAgQHRocm93IHR5cGVfZXJyb3IuMzE1ICBpZiBvYmplY3QgdmFsdWVzIGFyZSBub3QgcHJpbWl0aXZlCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhIGZsYXR0ZW5lZCBKU09OIG9iamVjdCBpcworICAgIHVuZmxhdHRlbmVkIGludG8gdGhlIG9yaWdpbmFsIG5lc3RlZCBKU09OIG9iamVjdC4sdW5mbGF0dGVufQorCisgICAgQHNhIEByZWYgZmxhdHRlbigpIGZvciB0aGUgcmV2ZXJzZSBmdW5jdGlvbgorCisgICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKKyAgICAqLworICAgIGJhc2ljX2pzb24gdW5mbGF0dGVuKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBqc29uX3BvaW50ZXI6OnVuZmxhdHRlbigqdGhpcyk7CisgICAgfQorCisgICAgLy8vIEB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpTT04gUGF0Y2ggZnVuY3Rpb25zIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBKU09OIFBhdGNoIGZ1bmN0aW9ucworICAgIC8vLyBAeworCisgICAgLyohCisgICAgQGJyaWVmIGFwcGxpZXMgYSBKU09OIHBhdGNoCisKKyAgICBbSlNPTiBQYXRjaF0oaHR0cDovL2pzb25wYXRjaC5jb20pIGRlZmluZXMgYSBKU09OIGRvY3VtZW50IHN0cnVjdHVyZSBmb3IKKyAgICBleHByZXNzaW5nIGEgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyB0byBhcHBseSB0byBhIEpTT04pIGRvY3VtZW50LiBXaXRoCisgICAgdGhpcyBmdW5jdGlvbiwgYSBKU09OIFBhdGNoIGlzIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgSlNPTiB2YWx1ZSBieQorICAgIGV4ZWN1dGluZyBhbGwgb3BlcmF0aW9ucyBmcm9tIHRoZSBwYXRjaC4KKworICAgIEBwYXJhbVtpbl0ganNvbl9wYXRjaCAgSlNPTiBwYXRjaCBkb2N1bWVudAorICAgIEByZXR1cm4gcGF0Y2hlZCBkb2N1bWVudAorCisgICAgQG5vdGUgVGhlIGFwcGxpY2F0aW9uIG9mIGEgcGF0Y2ggaXMgYXRvbWljOiBFaXRoZXIgYWxsIG9wZXJhdGlvbnMgc3VjY2VlZAorICAgICAgICAgIGFuZCB0aGUgcGF0Y2hlZCBkb2N1bWVudCBpcyByZXR1cm5lZCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLiBJbgorICAgICAgICAgIGFueSBjYXNlLCB0aGUgb3JpZ2luYWwgdmFsdWUgaXMgbm90IGNoYW5nZWQ6IHRoZSBwYXRjaCBpcyBhcHBsaWVkCisgICAgICAgICAgdG8gYSBjb3B5IG9mIHRoZSB2YWx1ZS4KKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDQgaWYgdGhlIEpTT04gcGF0Y2ggZG9lcyBub3QgY29uc2lzdCBvZiBhbiBhcnJheSBvZgorICAgIG9iamVjdHMKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDUgaWYgdGhlIEpTT04gcGF0Y2ggaXMgbWFsZm9ybWVkIChlLmcuLCBtYW5kYXRvcnkKKyAgICBhdHRyaWJ1dGVzIGFyZSBtaXNzaW5nKTsgZXhhbXBsZTogYCJvcGVyYXRpb24gYWRkIG11c3QgaGF2ZSBtZW1iZXIgcGF0aCJgCisKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMSBpZiBhbiBhcnJheSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisKKyAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMyBpZiBhIEpTT04gcG9pbnRlciBpbnNpZGUgdGhlIHBhdGNoIGNvdWxkIG5vdCBiZQorICAgIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSBpbiB0aGUgY3VycmVudCBKU09OIHZhbHVlOyBleGFtcGxlOiBgImtleSBiYXogbm90CisgICAgZm91bmQiYAorCisgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDUgaWYgSlNPTiBwb2ludGVyIGhhcyBubyBwYXJlbnQgKCJhZGQiLCAicmVtb3ZlIiwKKyAgICAibW92ZSIpCisKKyAgICBAdGhyb3cgb3RoZXJfZXJyb3IuNTAxIGlmICJ0ZXN0IiBvcGVyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bAorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBKU09OIHZhbHVlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZQorICAgIEpTT04gcGF0Y2guIEFzIHVzdWFsbHkgb25seSBhIGZyYWN0aW9uIG9mIHRoZSBKU09OIHZhbHVlIGlzIGFmZmVjdGVkIGJ5CisgICAgdGhlIHBhdGNoLCB0aGUgY29tcGxleGl0eSBjYW4gdXN1YWxseSBiZSBuZWdsZWN0ZWQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhIEpTT04gcGF0Y2ggaXMgYXBwbGllZCB0byBhCisgICAgdmFsdWUuLHBhdGNofQorCisgICAgQHNhIEByZWYgZGlmZiAtLSBjcmVhdGUgYSBKU09OIHBhdGNoIGJ5IGNvbXBhcmluZyB0d28gSlNPTiB2YWx1ZXMKKworICAgIEBzYSBbUkZDIDY5MDIgKEpTT04gUGF0Y2gpXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMikKKyAgICBAc2EgW1JGQyA2OTAxIChKU09OIFBvaW50ZXIpXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSkKKworICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC4wCisgICAgKi8KKyAgICBiYXNpY19qc29uIHBhdGNoKGNvbnN0IGJhc2ljX2pzb24mIGpzb25fcGF0Y2gpIGNvbnN0CisgICAgeworICAgICAgICAvLyBtYWtlIGEgd29ya2luZyBjb3B5IHRvIGFwcGx5IHRoZSBwYXRjaCB0bworICAgICAgICBiYXNpY19qc29uIHJlc3VsdCA9ICp0aGlzOworCisgICAgICAgIC8vIHRoZSB2YWxpZCBKU09OIFBhdGNoIG9wZXJhdGlvbnMKKyAgICAgICAgZW51bSBjbGFzcyBwYXRjaF9vcGVyYXRpb25zIHthZGQsIHJlbW92ZSwgcmVwbGFjZSwgbW92ZSwgY29weSwgdGVzdCwgaW52YWxpZH07CisKKyAgICAgICAgY29uc3QgYXV0byBnZXRfb3AgPSBbXShjb25zdCBzdGQ6OnN0cmluZyAmIG9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3AgPT0gImFkZCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGNoX29wZXJhdGlvbnM6OmFkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcCA9PSAicmVtb3ZlIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hfb3BlcmF0aW9uczo6cmVtb3ZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wID09ICJyZXBsYWNlIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hfb3BlcmF0aW9uczo6cmVwbGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcCA9PSAibW92ZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGNoX29wZXJhdGlvbnM6Om1vdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3AgPT0gImNvcHkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXRjaF9vcGVyYXRpb25zOjpjb3B5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wID09ICJ0ZXN0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hfb3BlcmF0aW9uczo6dGVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHBhdGNoX29wZXJhdGlvbnM6OmludmFsaWQ7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gd3JhcHBlciBmb3IgImFkZCIgb3BlcmF0aW9uOyBhZGQgdmFsdWUgYXQgcHRyCisgICAgICAgIGNvbnN0IGF1dG8gb3BlcmF0aW9uX2FkZCA9IFsmcmVzdWx0XShqc29uX3BvaW50ZXIgJiBwdHIsIGJhc2ljX2pzb24gdmFsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhZGRpbmcgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhcmdldCBkb2N1bWVudCBtZWFucyByZXBsYWNpbmcgaXQKKyAgICAgICAgICAgIGlmIChwdHIuaXNfcm9vdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSBwb2ludGVyIGV4aXN0cworICAgICAgICAgICAgICAgIGpzb25fcG9pbnRlciB0b3BfcG9pbnRlciA9IHB0ci50b3AoKTsKKyAgICAgICAgICAgICAgICBpZiAodG9wX3BvaW50ZXIgIT0gcHRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmF0KHRvcF9wb2ludGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBnZXQgcmVmZXJlbmNlIHRvIHBhcmVudCBvZiBKU09OIHBvaW50ZXIgcHRyCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBsYXN0X3BhdGggPSBwdHIucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBiYXNpY19qc29uJiBwYXJlbnQgPSByZXN1bHRbcHRyXTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50Lm1fdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVsbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBvcGVyYXRvcltdIHRvIGFkZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50W2xhc3RfcGF0aF0gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3BhdGggPT0gIi0iKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogYXBwZW5kIHRvIGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucHVzaF9iYWNrKHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBpZHggPSBqc29uX3BvaW50ZXI6OmFycmF5X2luZGV4KGxhc3RfcGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihpZHgpID4gcGFyZW50LnNpemUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDEsICJhcnJheSBpbmRleCAiICsgc3RkOjp0b19zdHJpbmcoaWR4KSArICIgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNhc2U6IGluc2VydCBhZGQgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnQocGFyZW50LmJlZ2luKCkgKyBzdGF0aWNfY2FzdDxkaWZmZXJlbmNlX3R5cGU+KGlkeCksIHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBleGlzdHMgYSBwYXJlbnQgaXQgY2Fubm90IGJlIHByaW1pdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgIC8vIExDT1ZfRVhDTF9MSU5FCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gd3JhcHBlciBmb3IgInJlbW92ZSIgb3BlcmF0aW9uOyByZW1vdmUgdmFsdWUgYXQgcHRyCisgICAgICAgIGNvbnN0IGF1dG8gb3BlcmF0aW9uX3JlbW92ZSA9IFsmcmVzdWx0XShqc29uX3BvaW50ZXIgJiBwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGdldCByZWZlcmVuY2UgdG8gcGFyZW50IG9mIEpTT04gcG9pbnRlciBwdHIKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gbGFzdF9wYXRoID0gcHRyLnBvcF9iYWNrKCk7CisgICAgICAgICAgICBiYXNpY19qc29uJiBwYXJlbnQgPSByZXN1bHQuYXQocHRyKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIGNoaWxkCisgICAgICAgICAgICBpZiAocGFyZW50LmlzX29iamVjdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gcGFyZW50LmZpbmQobGFzdF9wYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoSlNPTl9MSUtFTFkoaXQgIT0gcGFyZW50LmVuZCgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDAzLCAia2V5ICciICsgbGFzdF9wYXRoICsgIicgbm90IGZvdW5kIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5pc19hcnJheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGUgZXJhc2UgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICBwYXJlbnQuZXJhc2Uoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihqc29uX3BvaW50ZXI6OmFycmF5X2luZGV4KGxhc3RfcGF0aCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyB0eXBlIGNoZWNrOiB0b3AgbGV2ZWwgdmFsdWUgbXVzdCBiZSBhbiBhcnJheQorICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShub3QganNvbl9wYXRjaC5pc19hcnJheSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNCwgMCwgIkpTT04gcGF0Y2ggbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgdGhlIG9wZXJhdGlvbnMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB2YWwgOiBqc29uX3BhdGNoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3cmFwcGVyIHRvIGdldCBhIHZhbHVlIGZvciBhbiBvcGVyYXRpb24KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gZ2V0X3ZhbHVlID0gWyZ2YWxdKGNvbnN0IHN0ZDo6c3RyaW5nICYgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaW5nX3R5cGUpIC0+IGJhc2ljX2pzb24gJgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGZpbmQgdmFsdWUKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gdmFsLm1fdmFsdWUub2JqZWN0LT5maW5kKG1lbWJlcik7CisKKyAgICAgICAgICAgICAgICAvLyBjb250ZXh0LXNlbnNpdGl2ZSBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBlcnJvcl9tc2cgPSAob3AgPT0gIm9wIikgPyAib3BlcmF0aW9uIiA6ICJvcGVyYXRpb24gJyIgKyBvcCArICInIjsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGRlc2lyZWQgdmFsdWUgaXMgcHJlc2VudAorICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKGl0ID09IHZhbC5tX3ZhbHVlLm9iamVjdC0+ZW5kKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNSwgMCwgZXJyb3JfbXNnICsgIiBtdXN0IGhhdmUgbWVtYmVyICciICsgbWVtYmVyICsgIiciKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVzdWx0IGlzIG9mIHR5cGUgc3RyaW5nCisgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoc3RyaW5nX3R5cGUgYW5kIG5vdCBpdC0+c2Vjb25kLmlzX3N0cmluZygpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDUsIDAsIGVycm9yX21zZyArICIgbXVzdCBoYXZlIHN0cmluZyBtZW1iZXIgJyIgKyBtZW1iZXIgKyAiJyIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBubyBlcnJvcjogcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyB0eXBlIGNoZWNrOiBldmVyeSBlbGVtZW50IG9mIHRoZSBhcnJheSBtdXN0IGJlIGFuIG9iamVjdAorICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IHZhbC5pc19vYmplY3QoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNCwgMCwgIkpTT04gcGF0Y2ggbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb2xsZWN0IG1hbmRhdG9yeSBtZW1iZXJzCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvcCA9IGdldF92YWx1ZSgib3AiLCAib3AiLCB0cnVlKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSBnZXRfdmFsdWUob3AsICJwYXRoIiwgdHJ1ZSk7CisgICAgICAgICAgICBqc29uX3BvaW50ZXIgcHRyKHBhdGgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGdldF9vcChvcCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBwYXRjaF9vcGVyYXRpb25zOjphZGQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25fYWRkKHB0ciwgZ2V0X3ZhbHVlKCJhZGQiLCAidmFsdWUiLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHBhdGNoX29wZXJhdGlvbnM6OnJlbW92ZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbl9yZW1vdmUocHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBwYXRjaF9vcGVyYXRpb25zOjpyZXBsYWNlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlICJwYXRoIiBsb2NhdGlvbiBtdXN0IGV4aXN0IC0gdXNlIGF0KCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmF0KHB0cikgPSBnZXRfdmFsdWUoInJlcGxhY2UiLCAidmFsdWUiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgcGF0Y2hfb3BlcmF0aW9uczo6bW92ZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyb21fcGF0aCA9IGdldF92YWx1ZSgibW92ZSIsICJmcm9tIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGpzb25fcG9pbnRlciBmcm9tX3B0cihmcm9tX3BhdGgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSAiZnJvbSIgbG9jYXRpb24gbXVzdCBleGlzdCAtIHVzZSBhdCgpCisgICAgICAgICAgICAgICAgICAgIGJhc2ljX2pzb24gdiA9IHJlc3VsdC5hdChmcm9tX3B0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1vdmUgb3BlcmF0aW9uIGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYQorICAgICAgICAgICAgICAgICAgICAvLyAicmVtb3ZlIiBvcGVyYXRpb24gb24gdGhlICJmcm9tIiBsb2NhdGlvbiwgZm9sbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgYW4gImFkZCIgb3BlcmF0aW9uIGF0IHRoZSB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gd2l0aCB0aGUgdmFsdWUgdGhhdCB3YXMganVzdCByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25fcmVtb3ZlKGZyb21fcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2FkZChwdHIsIHYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHBhdGNoX29wZXJhdGlvbnM6OmNvcHk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmcm9tX3BhdGggPSBnZXRfdmFsdWUoImNvcHkiLCAiZnJvbSIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uX3BvaW50ZXIgZnJvbV9wdHIoZnJvbV9wYXRoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgImZyb20iIGxvY2F0aW9uIG11c3QgZXhpc3QgLSB1c2UgYXQoKQorICAgICAgICAgICAgICAgICAgICBiYXNpY19qc29uIHYgPSByZXN1bHQuYXQoZnJvbV9wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3B5IGlzIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYW4gImFkZCIKKyAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIGF0IHRoZSB0YXJnZXQgbG9jYXRpb24gdXNpbmcgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIG1lbWJlci4KKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX2FkZChwdHIsIHYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIHBhdGNoX29wZXJhdGlvbnM6OnRlc3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgInZhbHVlIiBtYXRjaGVzIHRoZSBvbmUgYXQgInBhdGgiCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgInBhdGgiIGxvY2F0aW9uIG11c3QgZXhpc3QgLSB1c2UgYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IChyZXN1bHQuYXQocHRyKSA9PSBnZXRfdmFsdWUoInRlc3QiLCAidmFsdWUiLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0ggKG91dF9vZl9yYW5nZSYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvdXQgb2YgcmFuZ2UgZXJyb3JzOiBzdWNjZXNzIHJlbWFpbnMgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0ZXN0IGZhaWxzCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCBzdWNjZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdGhlcl9lcnJvcjo6Y3JlYXRlKDUwMSwgInVuc3VjY2Vzc2Z1bDogIiArIHZhbC5kdW1wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgcGF0Y2hfb3BlcmF0aW9uczo6aW52YWxpZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9wIG11c3QgYmUgImFkZCIsICJyZW1vdmUiLCAicmVwbGFjZSIsICJtb3ZlIiwgImNvcHkiLCBvcgorICAgICAgICAgICAgICAgICAgICAvLyAidGVzdCIKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNSwgMCwgIm9wZXJhdGlvbiB2YWx1ZSAnIiArIG9wICsgIicgaXMgaW52YWxpZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBjcmVhdGVzIGEgZGlmZiBhcyBhIEpTT04gcGF0Y2gKKworICAgIENyZWF0ZXMgYSBbSlNPTiBQYXRjaF0oaHR0cDovL2pzb25wYXRjaC5jb20pIHNvIHRoYXQgdmFsdWUgQGEgc291cmNlIGNhbgorICAgIGJlIGNoYW5nZWQgaW50byB0aGUgdmFsdWUgQGEgdGFyZ2V0IGJ5IGNhbGxpbmcgQHJlZiBwYXRjaCBmdW5jdGlvbi4KKworICAgIEBpbnZhcmlhbnQgRm9yIHR3byBKU09OIHZhbHVlcyBAYSBzb3VyY2UgYW5kIEBhIHRhcmdldCwgdGhlIGZvbGxvd2luZyBjb2RlCisgICAgeWllbGRzIGFsd2F5cyBgdHJ1ZWA6CisgICAgQGNvZGUgey5jcHB9CisgICAgc291cmNlLnBhdGNoKGRpZmYoc291cmNlLCB0YXJnZXQpKSA9PSB0YXJnZXQ7CisgICAgQGVuZGNvZGUKKworICAgIEBub3RlIEN1cnJlbnRseSwgb25seSBgcmVtb3ZlYCwgYGFkZGAsIGFuZCBgcmVwbGFjZWAgb3BlcmF0aW9ucyBhcmUKKyAgICAgICAgICBnZW5lcmF0ZWQuCisKKyAgICBAcGFyYW1baW5dIHNvdXJjZSAgSlNPTiB2YWx1ZSB0byBjb21wYXJlIGZyb20KKyAgICBAcGFyYW1baW5dIHRhcmdldCAgSlNPTiB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QKKyAgICBAcGFyYW1baW5dIHBhdGggICAgaGVscGVyIHZhbHVlIHRvIGNyZWF0ZSBKU09OIHBvaW50ZXJzCisKKyAgICBAcmV0dXJuIGEgSlNPTiBwYXRjaCB0byBjb252ZXJ0IHRoZSBAYSBzb3VyY2UgdG8gQGEgdGFyZ2V0CisKKyAgICBAY29tcGxleGl0eSBMaW5lYXIgaW4gdGhlIGxlbmd0aHMgb2YgQGEgc291cmNlIGFuZCBAYSB0YXJnZXQuCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhIEpTT04gcGF0Y2ggaXMgY3JlYXRlZCBhcyBhCisgICAgZGlmZiBmb3IgdHdvIEpTT04gdmFsdWVzLixkaWZmfQorCisgICAgQHNhIEByZWYgcGF0Y2ggLS0gYXBwbHkgYSBKU09OIHBhdGNoCisgICAgQHNhIEByZWYgbWVyZ2VfcGF0Y2ggLS0gYXBwbHkgYSBKU09OIE1lcmdlIFBhdGNoCisKKyAgICBAc2EgW1JGQyA2OTAyIChKU09OIFBhdGNoKV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDIpCisKKyAgICBAc2luY2UgdmVyc2lvbiAyLjAuMAorICAgICovCisgICAgc3RhdGljIGJhc2ljX2pzb24gZGlmZihjb25zdCBiYXNpY19qc29uJiBzb3VyY2UsIGNvbnN0IGJhc2ljX2pzb24mIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoID0gIiIpCisgICAgeworICAgICAgICAvLyB0aGUgcGF0Y2gKKyAgICAgICAgYmFzaWNfanNvbiByZXN1bHQodmFsdWVfdDo6YXJyYXkpOworCisgICAgICAgIC8vIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lLCByZXR1cm4gZW1wdHkgcGF0Y2gKKyAgICAgICAgaWYgKHNvdXJjZSA9PSB0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlLnR5cGUoKSAhPSB0YXJnZXQudHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgdHlwZXM6IHJlcGxhY2UgdmFsdWUKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeyJvcCIsICJyZXBsYWNlIn0sIHsicGF0aCIsIHBhdGh9LCB7InZhbHVlIiwgdGFyZ2V0fQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZS50eXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHBhc3M6IHRyYXZlcnNlIGNvbW1vbiBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBzb3VyY2Uuc2l6ZSgpIGFuZCBpIDwgdGFyZ2V0LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlIGNhbGwgdG8gY29tcGFyZSBhcnJheSB2YWx1ZXMgYXQgaW5kZXggaQorICAgICAgICAgICAgICAgICAgICAgICAgYXV0byB0ZW1wX2RpZmYgPSBkaWZmKHNvdXJjZVtpXSwgdGFyZ2V0W2ldLCBwYXRoICsgIi8iICsgc3RkOjp0b19zdHJpbmcoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmluc2VydChyZXN1bHQuZW5kKCksIHRlbXBfZGlmZi5iZWdpbigpLCB0ZW1wX2RpZmYuZW5kKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaSBub3cgcmVhY2hlZCB0aGUgZW5kIG9mIGF0IGxlYXN0IG9uZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAvLyBpbiBhIHNlY29uZCBwYXNzLCB0cmF2ZXJzZSB0aGUgcmVtYWluaW5nIGVsZW1lbnRzCisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG15IHJlbWFpbmluZyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGVuZF9pbmRleCA9IHN0YXRpY19jYXN0PGRpZmZlcmVuY2VfdHlwZT4ocmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgc291cmNlLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9wZXJhdGlvbnMgaW4gcmV2ZXJzZSBvcmRlciB0byBhdm9pZCBpbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5iZWdpbigpICsgZW5kX2luZGV4LCBvYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJvcCIsICJyZW1vdmUifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InBhdGgiLCBwYXRoICsgIi8iICsgc3RkOjp0b19zdHJpbmcoaSl9CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgb3RoZXIgcmVtYWluaW5nIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgdGFyZ2V0LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9wIiwgImFkZCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsicGF0aCIsIHBhdGggKyAiLyIgKyBzdGQ6OnRvX3N0cmluZyhpKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2YWx1ZSIsIHRhcmdldFtpXX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBwYXNzOiB0cmF2ZXJzZSB0aGlzIG9iamVjdCdzIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHNvdXJjZS5jYmVnaW4oKTsgaXQgIT0gc291cmNlLmNlbmQoKTsgKytpdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHRoZSBrZXkgbmFtZSB0byBiZSB1c2VkIGluIGEgSlNPTiBwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBrZXkgPSBqc29uX3BvaW50ZXI6OmVzY2FwZShpdC5rZXkoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZmluZChpdC5rZXkoKSkgIT0gdGFyZ2V0LmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBjYWxsIHRvIGNvbXBhcmUgb2JqZWN0IHZhbHVlcyBhdCBrZXkgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHRlbXBfZGlmZiA9IGRpZmYoaXQudmFsdWUoKSwgdGFyZ2V0W2l0LmtleSgpXSwgcGF0aCArICIvIiArIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmluc2VydChyZXN1bHQuZW5kKCksIHRlbXBfZGlmZi5iZWdpbigpLCB0ZW1wX2RpZmYuZW5kKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEga2V5IHRoYXQgaXMgbm90IGluIG8gLT4gcmVtb3ZlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhvYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9wIiwgInJlbW92ZSJ9LCB7InBhdGgiLCBwYXRoICsgIi8iICsga2V5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCBwYXNzOiB0cmF2ZXJzZSBvdGhlciBvYmplY3QncyBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSB0YXJnZXQuY2JlZ2luKCk7IGl0ICE9IHRhcmdldC5jZW5kKCk7ICsraXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZmluZChpdC5rZXkoKSkgPT0gc291cmNlLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEga2V5IHRoYXQgaXMgbm90IGluIHRoaXMgLT4gYWRkIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBrZXkgPSBqc29uX3BvaW50ZXI6OmVzY2FwZShpdC5rZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsib3AiLCAiYWRkIn0sIHsicGF0aCIsIHBhdGggKyAiLyIgKyBrZXl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InZhbHVlIiwgaXQudmFsdWUoKX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHByaW1pdGl2ZSB0eXBlOiByZXBsYWNlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsib3AiLCAicmVwbGFjZSJ9LCB7InBhdGgiLCBwYXRofSwgeyJ2YWx1ZSIsIHRhcmdldH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8vIEB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpTT04gTWVyZ2UgUGF0Y2ggZnVuY3Rpb25zIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBKU09OIE1lcmdlIFBhdGNoIGZ1bmN0aW9ucworICAgIC8vLyBAeworCisgICAgLyohCisgICAgQGJyaWVmIGFwcGxpZXMgYSBKU09OIE1lcmdlIFBhdGNoCisKKyAgICBUaGUgbWVyZ2UgcGF0Y2ggZm9ybWF0IGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIEhUVFAgUEFUQ0gKKyAgICBtZXRob2QgYXMgYSBtZWFucyBvZiBkZXNjcmliaW5nIGEgc2V0IG9mIG1vZGlmaWNhdGlvbnMgdG8gYSB0YXJnZXQKKyAgICByZXNvdXJjZSdzIGNvbnRlbnQuIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBhIG1lcmdlIHBhdGNoIHRvIHRoZSBjdXJyZW50CisgICAgSlNPTiB2YWx1ZS4KKworICAgIFRoZSBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGZyb20gU2VjdGlvbiAyIG9mCisgICAgW1JGQyA3Mzk2IChKU09OIE1lcmdlIFBhdGNoKV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzczOTYpOgorCisgICAgYGBgCisgICAgZGVmaW5lIE1lcmdlUGF0Y2goVGFyZ2V0LCBQYXRjaCk6CisgICAgICBpZiBQYXRjaCBpcyBhbiBPYmplY3Q6CisgICAgICAgIGlmIFRhcmdldCBpcyBub3QgYW4gT2JqZWN0OgorICAgICAgICAgIFRhcmdldCA9IHt9IC8vIElnbm9yZSB0aGUgY29udGVudHMgYW5kIHNldCBpdCB0byBhbiBlbXB0eSBPYmplY3QKKyAgICAgICAgZm9yIGVhY2ggTmFtZS9WYWx1ZSBwYWlyIGluIFBhdGNoOgorICAgICAgICAgIGlmIFZhbHVlIGlzIG51bGw6CisgICAgICAgICAgICBpZiBOYW1lIGV4aXN0cyBpbiBUYXJnZXQ6CisgICAgICAgICAgICAgIHJlbW92ZSB0aGUgTmFtZS9WYWx1ZSBwYWlyIGZyb20gVGFyZ2V0CisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRhcmdldFtOYW1lXSA9IE1lcmdlUGF0Y2goVGFyZ2V0W05hbWVdLCBWYWx1ZSkKKyAgICAgICAgcmV0dXJuIFRhcmdldAorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFBhdGNoCisgICAgYGBgCisKKyAgICBUaGVyZWJ5LCBgVGFyZ2V0YCBpcyB0aGUgY3VycmVudCBvYmplY3Q7IHRoYXQgaXMsIHRoZSBwYXRjaCBpcyBhcHBsaWVkIHRvCisgICAgdGhlIGN1cnJlbnQgdmFsdWUuCisKKyAgICBAcGFyYW1baW5dIHBhdGNoICB0aGUgcGF0Y2ggdG8gYXBwbHkKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RocyBvZiBAYSBwYXRjaC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IGEgSlNPTiBNZXJnZSBQYXRjaCBpcyBhcHBsaWVkIHRvCisgICAgYSBKU09OIGRvY3VtZW50LixtZXJnZV9wYXRjaH0KKworICAgIEBzYSBAcmVmIHBhdGNoIC0tIGFwcGx5IGEgSlNPTiBwYXRjaAorICAgIEBzYSBbUkZDIDczOTYgKEpTT04gTWVyZ2UgUGF0Y2gpXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzM5NikKKworICAgIEBzaW5jZSB2ZXJzaW9uIDMuMC4wCisgICAgKi8KKyAgICB2b2lkIG1lcmdlX3BhdGNoKGNvbnN0IGJhc2ljX2pzb24mIHBhdGNoKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoLmlzX29iamVjdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm90IGlzX29iamVjdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICp0aGlzID0gb2JqZWN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXRjaC5iZWdpbigpOyBpdCAhPSBwYXRjaC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUoKS5pc19udWxsKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcmFzZShpdC5rZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaXQua2V5KCkpLm1lcmdlX3BhdGNoKGl0LnZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICp0aGlzID0gcGF0Y2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQH0KK307Cit9IC8vIG5hbWVzcGFjZSBubG9obWFubgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gbm9ubWVtYmVyIHN1cHBvcnQgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIHNwZWNpYWxpemF0aW9uIG9mIHN0ZDo6c3dhcCwgYW5kIHN0ZDo6aGFzaAorbmFtZXNwYWNlIHN0ZAoreworLyohCitAYnJpZWYgZXhjaGFuZ2VzIHRoZSB2YWx1ZXMgb2YgdHdvIEpTT04gb2JqZWN0cworCitAc2luY2UgdmVyc2lvbiAxLjAuMAorKi8KK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIHN3YXAobmxvaG1hbm46Ompzb24mIGoxLAorICAgICAgICAgICAgICAgICBubG9obWFubjo6anNvbiYgajIpIG5vZXhjZXB0KAorICAgICAgICAgICAgICAgICAgICAgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8bmxvaG1hbm46Ompzb24+Ojp2YWx1ZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlPG5sb2htYW5uOjpqc29uPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgKQoreworICAgIGoxLnN3YXAoajIpOworfQorCisvLy8gaGFzaCB2YWx1ZSBmb3IgSlNPTiBvYmplY3RzCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaGFzaDxubG9obWFubjo6anNvbj4KK3sKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJuIGEgaGFzaCB2YWx1ZSBmb3IgYSBKU09OIG9iamVjdAorCisgICAgQHNpbmNlIHZlcnNpb24gMS4wLjAKKyAgICAqLworICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgbmxvaG1hbm46Ompzb24mIGopIGNvbnN0CisgICAgeworICAgICAgICAvLyBhIG5haXZlIGhhc2hpbmcgdmlhIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgY29uc3QgYXV0byYgaCA9IGhhc2g8bmxvaG1hbm46Ompzb246OnN0cmluZ190PigpOworICAgICAgICByZXR1cm4gaChqLmR1bXAoKSk7CisgICAgfQorfTsKKworLy8vIHNwZWNpYWxpemF0aW9uIGZvciBzdGQ6Omxlc3M8dmFsdWVfdD4KKy8vLyBAbm90ZTogZG8gbm90IHJlbW92ZSB0aGUgc3BhY2UgYWZ0ZXIgJzwnLAorLy8vICAgICAgICBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24vcHVsbC82NzkKK3RlbXBsYXRlPD4KK3N0cnVjdCBsZXNzPCA6Om5sb2htYW5uOjpkZXRhaWw6OnZhbHVlX3Q+Cit7CisgICAgLyohCisgICAgQGJyaWVmIGNvbXBhcmUgdHdvIHZhbHVlX3QgZW51bSB2YWx1ZXMKKyAgICBAc2luY2UgdmVyc2lvbiAzLjAuMAorICAgICovCisgICAgYm9vbCBvcGVyYXRvcigpKG5sb2htYW5uOjpkZXRhaWw6OnZhbHVlX3QgbGhzLAorICAgICAgICAgICAgICAgICAgICBubG9obWFubjo6ZGV0YWlsOjp2YWx1ZV90IHJocykgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHJldHVybiBubG9obWFubjo6ZGV0YWlsOjpvcGVyYXRvcjwobGhzLCByaHMpOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvKiEKK0BicmllZiB1c2VyLWRlZmluZWQgc3RyaW5nIGxpdGVyYWwgZm9yIEpTT04gdmFsdWVzCisKK1RoaXMgb3BlcmF0b3IgaW1wbGVtZW50cyBhIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBvYmplY3RzLiBJdAorY2FuIGJlIHVzZWQgYnkgYWRkaW5nIGAiX2pzb24iYCB0byBhIHN0cmluZyBsaXRlcmFsIGFuZCByZXR1cm5zIGEgSlNPTiBvYmplY3QKK2lmIG5vIHBhcnNlIGVycm9yIG9jY3VycmVkLgorCitAcGFyYW1baW5dIHMgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNPTiBvYmplY3QKK0BwYXJhbVtpbl0gbiAgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGEgcworQHJldHVybiBhIEpTT04gb2JqZWN0CisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisqLworaW5saW5lIG5sb2htYW5uOjpqc29uIG9wZXJhdG9yICIiIF9qc29uKGNvbnN0IGNoYXIqIHMsIHN0ZDo6c2l6ZV90IG4pCit7CisgICAgcmV0dXJuIG5sb2htYW5uOjpqc29uOjpwYXJzZShzLCBzICsgbik7Cit9CisKKy8qIQorQGJyaWVmIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBwb2ludGVyCisKK1RoaXMgb3BlcmF0b3IgaW1wbGVtZW50cyBhIHVzZXItZGVmaW5lZCBzdHJpbmcgbGl0ZXJhbCBmb3IgSlNPTiBQb2ludGVycy4gSXQKK2NhbiBiZSB1c2VkIGJ5IGFkZGluZyBgIl9qc29uX3BvaW50ZXIiYCB0byBhIHN0cmluZyBsaXRlcmFsIGFuZCByZXR1cm5zIGEgSlNPTiBwb2ludGVyCitvYmplY3QgaWYgbm8gcGFyc2UgZXJyb3Igb2NjdXJyZWQuCisKK0BwYXJhbVtpbl0gcyAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBKU09OIFBvaW50ZXIKK0BwYXJhbVtpbl0gbiAgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGEgcworQHJldHVybiBhIEpTT04gcG9pbnRlciBvYmplY3QKKworQHNpbmNlIHZlcnNpb24gMi4wLjAKKyovCitpbmxpbmUgbmxvaG1hbm46Ompzb246Ompzb25fcG9pbnRlciBvcGVyYXRvciAiIiBfanNvbl9wb2ludGVyKGNvbnN0IGNoYXIqIHMsIHN0ZDo6c2l6ZV90IG4pCit7CisgICAgcmV0dXJuIG5sb2htYW5uOjpqc29uOjpqc29uX3BvaW50ZXIoc3RkOjpzdHJpbmcocywgbikpOworfQorCisjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21hY3JvX3Vuc2NvcGUuaHBwPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxvaG1hbm4vanNvbl9md2QuaHBwIGIvaW5jbHVkZS9ubG9obWFubi9qc29uX2Z3ZC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwYWRiNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmxvaG1hbm4vanNvbl9md2QuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgTkxPSE1BTk5fSlNPTl9GV0RfSFBQCisjZGVmaW5lIE5MT0hNQU5OX0pTT05fRldEX0hQUAorCisjaW5jbHVkZSA8Y3N0ZGludD4gLy8gaW50NjRfdCwgdWludDY0X3QKKyNpbmNsdWRlIDxtYXA+IC8vIG1hcAorI2luY2x1ZGUgPG1lbW9yeT4gLy8gYWxsb2NhdG9yCisjaW5jbHVkZSA8c3RyaW5nPiAvLyBzdHJpbmcKKyNpbmNsdWRlIDx2ZWN0b3I+IC8vIHZlY3RvcgorCisvKiEKK0BicmllZiBuYW1lc3BhY2UgZm9yIE5pZWxzIExvaG1hbm4KK0BzZWUgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uCitAc2luY2UgdmVyc2lvbiAxLjAuMAorKi8KK25hbWVzcGFjZSBubG9obWFubgoreworLyohCitAYnJpZWYgZGVmYXVsdCBKU09OU2VyaWFsaXplciB0ZW1wbGF0ZSBhcmd1bWVudAorCitUaGlzIHNlcmlhbGl6ZXIgaWdub3JlcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB1c2VzIEFETAorKFthcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9hZGwpKQorZm9yIHNlcmlhbGl6YXRpb24uCisqLwordGVtcGxhdGU8dHlwZW5hbWUgPSB2b2lkLCB0eXBlbmFtZSA9IHZvaWQ+CitzdHJ1Y3QgYWRsX3NlcmlhbGl6ZXI7CisKK3RlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFYsIHR5cGVuYW1lLi4uIEFyZ3M+IGNsYXNzIE9iamVjdFR5cGUgPQorICAgICAgICAgc3RkOjptYXAsCisgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBBcmdzPiBjbGFzcyBBcnJheVR5cGUgPSBzdGQ6OnZlY3RvciwKKyAgICAgICAgIGNsYXNzIFN0cmluZ1R5cGUgPSBzdGQ6OnN0cmluZywgY2xhc3MgQm9vbGVhblR5cGUgPSBib29sLAorICAgICAgICAgY2xhc3MgTnVtYmVySW50ZWdlclR5cGUgPSBzdGQ6OmludDY0X3QsCisgICAgICAgICBjbGFzcyBOdW1iZXJVbnNpZ25lZFR5cGUgPSBzdGQ6OnVpbnQ2NF90LAorICAgICAgICAgY2xhc3MgTnVtYmVyRmxvYXRUeXBlID0gZG91YmxlLAorICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gY2xhc3MgQWxsb2NhdG9yVHlwZSA9IHN0ZDo6YWxsb2NhdG9yLAorICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgU0ZJTkFFID0gdm9pZD4gY2xhc3MgSlNPTlNlcmlhbGl6ZXIgPQorICAgICAgICAgYWRsX3NlcmlhbGl6ZXI+CitjbGFzcyBiYXNpY19qc29uOworCisvKiEKK0BicmllZiBKU09OIFBvaW50ZXIKKworQSBKU09OIHBvaW50ZXIgZGVmaW5lcyBhIHN0cmluZyBzeW50YXggZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgdmFsdWUKK3dpdGhpbiBhIEpTT04gZG9jdW1lbnQuIEl0IGNhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zIGBhdGAgYW5kCitgb3BlcmF0b3JbXWAuIEZ1cnRoZXJtb3JlLCBKU09OIHBvaW50ZXJzIGFyZSB0aGUgYmFzZSBmb3IgSlNPTiBwYXRjaGVzLgorCitAc2EgW1JGQyA2OTAxXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjkwMSkKKworQHNpbmNlIHZlcnNpb24gMi4wLjAKKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorY2xhc3MganNvbl9wb2ludGVyOworCisvKiEKK0BicmllZiBkZWZhdWx0IEpTT04gY2xhc3MKKworVGhpcyB0eXBlIGlzIHRoZSBkZWZhdWx0IHNwZWNpYWxpemF0aW9uIG9mIHRoZSBAcmVmIGJhc2ljX2pzb24gY2xhc3Mgd2hpY2gKK3VzZXMgdGhlIHN0YW5kYXJkIHRlbXBsYXRlIHR5cGVzLgorCitAc2luY2UgdmVyc2lvbiAxLjAuMAorKi8KK3VzaW5nIGpzb24gPSBiYXNpY19qc29uPD47Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVzb24uYnVpbGQgYi9tZXNvbi5idWlsZAppbmRleCAyY2ZjOTYyLi5jZGJhYWQ5IDEwMDY0NAotLS0gYS9tZXNvbi5idWlsZAorKysgYi9tZXNvbi5idWlsZApAQCAtMSw2ICsxLDYgQEAKIHByb2plY3QoJ25sb2htYW5uX2pzb24nLCAnY3BwJykKIAotbmxvaG1hbm5fanNvbl9pbmMgPSBpbmNsdWRlX2RpcmVjdG9yaWVzKCdzcmMnKQorbmxvaG1hbm5fanNvbl9pbmMgPSBpbmNsdWRlX2RpcmVjdG9yaWVzKCdzaW5nbGVfaW5jbHVkZS9ubG9obWFubicpCiAKIG5sb2htYW5uX2pzb25fZGVwID0gZGVjbGFyZV9kZXBlbmRlbmN5KAogICBpbmNsdWRlX2RpcmVjdG9yaWVzIDogbmxvaG1hbm5fanNvbl9pbmMKZGlmZiAtLWdpdCBhL3NyYy9qc29uLmhwcCBiL3NpbmdsZV9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHNyYy9qc29uLmhwcApyZW5hbWUgdG8gc2luZ2xlX2luY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHAKaW5kZXggNWIwYjBlYS4uOWIzOGVmYiAxMDA2NDQKLS0tIGEvc3JjL2pzb24uaHBwCisrKyBiL3NpbmdsZV9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOSwzNCArMjksOTQgQEAKICNpZm5kZWYgTkxPSE1BTk5fSlNPTl9IUFAKICNkZWZpbmUgTkxPSE1BTk5fSlNPTl9IUFAKIAotI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gYWxsX29mLCBjb3B5LCBmaWxsLCBmaW5kLCBmb3JfZWFjaCwgZ2VuZXJhdGVfbiwgbm9uZV9vZiwgcmVtb3ZlLCByZXZlcnNlLCB0cmFuc2Zvcm0KLSNpbmNsdWRlIDxhcnJheT4gLy8gYXJyYXkKKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9WRVJTSU9OX01BSk9SIDMKKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9WRVJTSU9OX01JTk9SIDEKKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9WRVJTSU9OX1BBVENIIDAKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gYWxsX29mLCBmaW5kLCBmb3JfZWFjaAogI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGFzc2VydAogI2luY2x1ZGUgPGNpc282NDY+IC8vIGFuZCwgbm90LCBvcgotI2luY2x1ZGUgPGNsb2NhbGU+IC8vIGxjb252LCBsb2NhbGVjb252Ci0jaW5jbHVkZSA8Y21hdGg+IC8vIGlzZmluaXRlLCBsYWJzLCBsZGV4cCwgc2lnbmJpdAogI2luY2x1ZGUgPGNzdGRkZWY+IC8vIG51bGxwdHJfdCwgcHRyZGlmZl90LCBzaXplX3QKLSNpbmNsdWRlIDxjc3RkaW50PiAvLyBpbnQ2NF90LCB1aW50NjRfdAotI2luY2x1ZGUgPGNzdGRsaWI+IC8vIGFib3J0LCBzdHJ0b2QsIHN0cnRvZiwgc3RydG9sZCwgc3RydG91bCwgc3RydG9sbCwgc3RydG91bGwKLSNpbmNsdWRlIDxjc3RyaW5nPiAvLyBtZW1jcHksIHN0cmxlbgotI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4gLy8gZm9yd2FyZF9saXN0Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gZnVuY3Rpb24sIGhhc2gsIGxlc3MKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBoYXNoLCBsZXNzCiAjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4gLy8gaW5pdGlhbGl6ZXJfbGlzdAotI2luY2x1ZGUgPGlvbWFuaXA+IC8vIGhleAotI2luY2x1ZGUgPGlvc2Z3ZD4gICAvLyBpc3RyZWFtLCBvc3RyZWFtCi0jaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGFkdmFuY2UsIGJlZ2luLCBiYWNrX2luc2VydGVyLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgZGlzdGFuY2UsIGVuZCwgaW5zZXJ0ZXIsIGl0ZXJhdG9yLCBpdGVyYXRvcl90cmFpdHMsIG5leHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCByZXZlcnNlX2l0ZXJhdG9yCi0jaW5jbHVkZSA8bGltaXRzPiAvLyBudW1lcmljX2xpbWl0cwotI2luY2x1ZGUgPGxvY2FsZT4gLy8gbG9jYWxlCi0jaW5jbHVkZSA8bWFwPiAvLyBtYXAKLSNpbmNsdWRlIDxtZW1vcnk+IC8vIGFkZHJlc3NvZiwgYWxsb2NhdG9yLCBhbGxvY2F0b3JfdHJhaXRzLCB1bmlxdWVfcHRyCisjaW5jbHVkZSA8aW9zZndkPiAvLyBpc3RyZWFtLCBvc3RyZWFtCisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGl0ZXJhdG9yX3RyYWl0cywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcKICNpbmNsdWRlIDxudW1lcmljPiAvLyBhY2N1bXVsYXRlCi0jaW5jbHVkZSA8c3N0cmVhbT4gLy8gc3RyaW5nc3RyZWFtCi0jaW5jbHVkZSA8c3RyaW5nPiAvLyBnZXRsaW5lLCBzdG9pLCBzdHJpbmcsIHRvX3N0cmluZwotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBhZGRfcG9pbnRlciwgY29uZGl0aW9uYWwsIGRlY2F5LCBlbmFibGVfaWYsIGZhbHNlX3R5cGUsIGludGVncmFsX2NvbnN0YW50LCBpc19hcml0aG1ldGljLCBpc19iYXNlX29mLCBpc19jb25zdCwgaXNfY29uc3RydWN0aWJsZSwgaXNfY29udmVydGlibGUsIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZSwgaXNfZW51bSwgaXNfZmxvYXRpbmdfcG9pbnQsIGlzX2ludGVncmFsLCBpc19ub3Rocm93X21vdmVfYXNzaWduYWJsZSwgaXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGUsIGlzX3BvaW50ZXIsIGlzX3JlZmVyZW5jZSwgaXNfc2FtZSwgaXNfc2NhbGFyLCBpc19zaWduZWQsIHJlbW92ZV9jb25zdCwgcmVtb3ZlX2N2LCByZW1vdmVfcG9pbnRlciwgcmVtb3ZlX3JlZmVyZW5jZSwgdHJ1ZV90eXBlLCB1bmRlcmx5aW5nX3R5cGUKLSNpbmNsdWRlIDx1dGlsaXR5PiAvLyBkZWNsdmFsLCBmb3J3YXJkLCBtYWtlX3BhaXIsIG1vdmUsIHBhaXIsIHN3YXAKLSNpbmNsdWRlIDx2YWxhcnJheT4gLy8gdmFsYXJyYXkKKyNpbmNsdWRlIDxzdHJpbmc+IC8vIHN0cmluZywgc3RvaSwgdG9fc3RyaW5nCisjaW5jbHVkZSA8dXRpbGl0eT4gLy8gZGVjbHZhbCwgZm9yd2FyZCwgbW92ZSwgcGFpciwgc3dhcAorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vanNvbl9md2QuaHBwPgorI2lmbmRlZiBOTE9ITUFOTl9KU09OX0ZXRF9IUFAKKyNkZWZpbmUgTkxPSE1BTk5fSlNPTl9GV0RfSFBQCisKKyNpbmNsdWRlIDxjc3RkaW50PiAvLyBpbnQ2NF90LCB1aW50NjRfdAorI2luY2x1ZGUgPG1hcD4gLy8gbWFwCisjaW5jbHVkZSA8bWVtb3J5PiAvLyBhbGxvY2F0b3IKKyNpbmNsdWRlIDxzdHJpbmc+IC8vIHN0cmluZwogI2luY2x1ZGUgPHZlY3Rvcj4gLy8gdmVjdG9yCiAKKy8qIQorQGJyaWVmIG5hbWVzcGFjZSBmb3IgTmllbHMgTG9obWFubgorQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4KK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisqLworbmFtZXNwYWNlIG5sb2htYW5uCit7CisvKiEKK0BicmllZiBkZWZhdWx0IEpTT05TZXJpYWxpemVyIHRlbXBsYXRlIGFyZ3VtZW50CisKK1RoaXMgc2VyaWFsaXplciBpZ25vcmVzIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHVzZXMgQURMCisoW2FyZ3VtZW50LWRlcGVuZGVudCBsb29rdXBdKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2FkbCkpCitmb3Igc2VyaWFsaXphdGlvbi4KKyovCit0ZW1wbGF0ZTx0eXBlbmFtZSA9IHZvaWQsIHR5cGVuYW1lID0gdm9pZD4KK3N0cnVjdCBhZGxfc2VyaWFsaXplcjsKKwordGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgViwgdHlwZW5hbWUuLi4gQXJncz4gY2xhc3MgT2JqZWN0VHlwZSA9CisgICAgICAgICBzdGQ6Om1hcCwKKyAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIEFyZ3M+IGNsYXNzIEFycmF5VHlwZSA9IHN0ZDo6dmVjdG9yLAorICAgICAgICAgY2xhc3MgU3RyaW5nVHlwZSA9IHN0ZDo6c3RyaW5nLCBjbGFzcyBCb29sZWFuVHlwZSA9IGJvb2wsCisgICAgICAgICBjbGFzcyBOdW1iZXJJbnRlZ2VyVHlwZSA9IHN0ZDo6aW50NjRfdCwKKyAgICAgICAgIGNsYXNzIE51bWJlclVuc2lnbmVkVHlwZSA9IHN0ZDo6dWludDY0X3QsCisgICAgICAgICBjbGFzcyBOdW1iZXJGbG9hdFR5cGUgPSBkb3VibGUsCisgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBjbGFzcyBBbGxvY2F0b3JUeXBlID0gc3RkOjphbGxvY2F0b3IsCisgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTRklOQUUgPSB2b2lkPiBjbGFzcyBKU09OU2VyaWFsaXplciA9CisgICAgICAgICBhZGxfc2VyaWFsaXplcj4KK2NsYXNzIGJhc2ljX2pzb247CisKKy8qIQorQGJyaWVmIEpTT04gUG9pbnRlcgorCitBIEpTT04gcG9pbnRlciBkZWZpbmVzIGEgc3RyaW5nIHN5bnRheCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyB2YWx1ZQord2l0aGluIGEgSlNPTiBkb2N1bWVudC4gSXQgY2FuIGJlIHVzZWQgd2l0aCBmdW5jdGlvbnMgYGF0YCBhbmQKK2BvcGVyYXRvcltdYC4gRnVydGhlcm1vcmUsIEpTT04gcG9pbnRlcnMgYXJlIHRoZSBiYXNlIGZvciBKU09OIHBhdGNoZXMuCisKK0BzYSBbUkZDIDY5MDFdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxKQorCitAc2luY2UgdmVyc2lvbiAyLjAuMAorKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CitjbGFzcyBqc29uX3BvaW50ZXI7CisKKy8qIQorQGJyaWVmIGRlZmF1bHQgSlNPTiBjbGFzcworCitUaGlzIHR5cGUgaXMgdGhlIGRlZmF1bHQgc3BlY2lhbGl6YXRpb24gb2YgdGhlIEByZWYgYmFzaWNfanNvbiBjbGFzcyB3aGljaAordXNlcyB0aGUgc3RhbmRhcmQgdGVtcGxhdGUgdHlwZXMuCisKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wCisqLwordXNpbmcganNvbiA9IGJhc2ljX2pzb248PjsKK30KKworI2VuZGlmCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCisKKy8vIFRoaXMgZmlsZSBjb250YWlucyBhbGwgaW50ZXJuYWwgbWFjcm8gZGVmaW5pdGlvbnMKKy8vIFlvdSBNVVNUIGluY2x1ZGUgbWFjcm9fdW5zY29wZS5ocHAgYXQgdGhlIGVuZCBvZiBqc29uLmhwcCB0byB1bmRlZiBhbGwgb2YgdGhlbQorCiAvLyBleGNsdWRlIHVuc3VwcG9ydGVkIGNvbXBpbGVycwogI2lmIGRlZmluZWQoX19jbGFuZ19fKQogICAgICNpZiAoX19jbGFuZ19tYWpvcl9fICogMTAwMDAgKyBfX2NsYW5nX21pbm9yX18gKiAxMDAgKyBfX2NsYW5nX3BhdGNobGV2ZWxfXykgPCAzMDQwMApAQCAtOTAsNyArMTUwLDcgQEAKICNlbmRpZgogCiAvLyBhbGxvdyB0byBkaXNhYmxlIGV4Y2VwdGlvbnMKLSNpZiAoZGVmaW5lZChfX2NwcF9leGNlcHRpb25zKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykgfHwgZGVmaW5lZChfQ1BQVU5XSU5EKSkgJiYgbm90IGRlZmluZWQoSlNPTl9OT0VYQ0VQVElPTikKKyNpZiAoZGVmaW5lZChfX2NwcF9leGNlcHRpb25zKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykgfHwgZGVmaW5lZChfQ1BQVU5XSU5EKSkgJiYgIWRlZmluZWQoSlNPTl9OT0VYQ0VQVElPTikKICAgICAjZGVmaW5lIEpTT05fVEhST1coZXhjZXB0aW9uKSB0aHJvdyBleGNlcHRpb24KICAgICAjZGVmaW5lIEpTT05fVFJZIHRyeQogICAgICNkZWZpbmUgSlNPTl9DQVRDSChleGNlcHRpb24pIGNhdGNoKGV4Y2VwdGlvbikKQEAgLTEwMCw2ICsxNjAsMjAgQEAKICAgICAjZGVmaW5lIEpTT05fQ0FUQ0goZXhjZXB0aW9uKSBpZihmYWxzZSkKICNlbmRpZgogCisvLyBvdmVycmlkZSBleGNlcHRpb24gbWFjcm9zCisjaWYgZGVmaW5lZChKU09OX1RIUk9XX1VTRVIpCisgICAgI3VuZGVmIEpTT05fVEhST1cKKyAgICAjZGVmaW5lIEpTT05fVEhST1cgSlNPTl9USFJPV19VU0VSCisjZW5kaWYKKyNpZiBkZWZpbmVkKEpTT05fVFJZX1VTRVIpCisgICAgI3VuZGVmIEpTT05fVFJZCisgICAgI2RlZmluZSBKU09OX1RSWSBKU09OX1RSWV9VU0VSCisjZW5kaWYKKyNpZiBkZWZpbmVkKEpTT05fQ0FUQ0hfVVNFUikKKyAgICAjdW5kZWYgSlNPTl9DQVRDSAorICAgICNkZWZpbmUgSlNPTl9DQVRDSCBKU09OX0NBVENIX1VTRVIKKyNlbmRpZgorCiAvLyBtYW51YWwgYnJhbmNoIHByZWRpY3Rpb24KICNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0dOVUdfXykKICAgICAjZGVmaW5lIEpTT05fTElLRUxZKHgpICAgICAgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKQEAgLTExNywyNyArMTkxLDYgQEAKICAgICAjZGVmaW5lIEpTT05fSEFTX0NQUF8xNAogI2VuZGlmCiAKLS8qIQotQGJyaWVmIG5hbWVzcGFjZSBmb3IgTmllbHMgTG9obWFubgotQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4KLUBzaW5jZSB2ZXJzaW9uIDEuMC4wCi0qLwotbmFtZXNwYWNlIG5sb2htYW5uCi17Ci10ZW1wbGF0ZTx0eXBlbmFtZSA9IHZvaWQsIHR5cGVuYW1lID0gdm9pZD4KLXN0cnVjdCBhZGxfc2VyaWFsaXplcjsKLQotLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBiYXNpY19qc29uIChyZXF1aXJlZCB0byBzcGxpdCB0aGUgY2xhc3MpCi10ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lLi4uPiBjbGFzcyBPYmplY3RUeXBlID0gc3RkOjptYXAsCi0gICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+IGNsYXNzIEFycmF5VHlwZSA9IHN0ZDo6dmVjdG9yLAotICAgICAgICAgY2xhc3MgU3RyaW5nVHlwZSA9IHN0ZDo6c3RyaW5nLCBjbGFzcyBCb29sZWFuVHlwZSA9IGJvb2wsCi0gICAgICAgICBjbGFzcyBOdW1iZXJJbnRlZ2VyVHlwZSA9IHN0ZDo6aW50NjRfdCwKLSAgICAgICAgIGNsYXNzIE51bWJlclVuc2lnbmVkVHlwZSA9IHN0ZDo6dWludDY0X3QsCi0gICAgICAgICBjbGFzcyBOdW1iZXJGbG9hdFR5cGUgPSBkb3VibGUsCi0gICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgQWxsb2NhdG9yVHlwZSA9IHN0ZDo6YWxsb2NhdG9yLAotICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lID0gdm9pZD4gY2xhc3MgSlNPTlNlcmlhbGl6ZXIgPSBhZGxfc2VyaWFsaXplcj4KLWNsYXNzIGJhc2ljX2pzb247Ci0KIC8vIFVnbHkgbWFjcm9zIHRvIGF2b2lkIHVnbGllciBjb3B5LXBhc3RlIHdoZW4gc3BlY2lhbGl6aW5nIGJhc2ljX2pzb24uIFRoZXkKIC8vIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgb25jZSB0aGUgY2xhc3MgaXMgc3BsaXQuCiAKQEAgLTE1NCwxNyArMjA3LDMwMCBAQAogICAgIE51bWJlckludGVnZXJUeXBlLCBOdW1iZXJVbnNpZ25lZFR5cGUsIE51bWJlckZsb2F0VHlwZSwgICAgICAgICAgICAgICAgXAogICAgIEFsbG9jYXRvclR5cGUsIEpTT05TZXJpYWxpemVyPgogCi0KIC8qIQotQGJyaWVmIHVubmFtZWQgbmFtZXNwYWNlIHdpdGggaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucworQGJyaWVmIEhlbHBlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSdzIGEga2V5X3R5cGUgZm9yIFQuCiAKLVRoaXMgbmFtZXNwYWNlIGNvbGxlY3RzIHNvbWUgZnVuY3Rpb25zIHRoYXQgY291bGQgbm90IGJlIGRlZmluZWQgaW5zaWRlIHRoZQotQHJlZiBiYXNpY19qc29uIGNsYXNzLgorVGhpcyBoZWxwZXIgaXMgdXNlZCB0byB0ZWxsIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMgYXBhcnQgZnJvbSBvdGhlciBjb250YWluZXJzCitzdWNoIGFzIHNlcXVlbmNlIGNvbnRhaW5lcnMuIEZvciBpbnN0YW5jZSwgYHN0ZDo6bWFwYCBwYXNzZXMgdGhlIHRlc3QgYXMgaXQKK2NvbnRhaW5zIGEgYG1hcHBlZF90eXBlYCwgd2hlcmVhcyBgc3RkOjp2ZWN0b3JgIGZhaWxzIHRoZSB0ZXN0LgorCitAc2EgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzcyODcyOC8yNjYzNzgKK0BzaW5jZSB2ZXJzaW9uIDEuMC4wLCBvdmVyd29ya2VkIGluIHZlcnNpb24gMi4wLjYKKyovCisjZGVmaW5lIE5MT0hNQU5OX0pTT05fSEFTX0hFTFBFUih0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGhhc18jI3R5cGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lID0gdHlwZW5hbWUgVTo6dHlwZT4gICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBpbnQgZGV0ZWN0KFUgJiYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB2b2lkIGRldGVjdCguLi4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZShkZXRlY3Qoc3RkOjpkZWNsdmFsPFQ+KCkpKT46OnZhbHVlOyBcCisgICAgfQorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwPgorCisKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBub3QKKyNpbmNsdWRlIDxjc3RkZGVmPiAvLyBzaXplX3QKKyNpbmNsdWRlIDxsaW1pdHM+IC8vIG51bWVyaWNfbGltaXRzCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGNvbmRpdGlvbmFsLCBlbmFibGVfaWYsIGZhbHNlX3R5cGUsIGludGVncmFsX2NvbnN0YW50LCBpc19jb25zdHJ1Y3RpYmxlLCBpc19pbnRlZ3JhbCwgaXNfc2FtZSwgcmVtb3ZlX2N2LCByZW1vdmVfcmVmZXJlbmNlLCB0cnVlX3R5cGUKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBkZWNsdmFsCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9qc29uX2Z3ZC5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCisKK25hbWVzcGFjZSBubG9obWFubgoreworLyohCitAYnJpZWYgZGV0YWlsIG5hbWVzcGFjZSB3aXRoIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMKKworVGhpcyBuYW1lc3BhY2UgY29sbGVjdHMgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkLAoraW1wbGVtZW50YXRpb25zIG9mIHNvbWUgQHJlZiBiYXNpY19qc29uIG1ldGhvZHMsIGFuZCBtZXRhLXByb2dyYW1taW5nIGhlbHBlcnMuCiAKIEBzaW5jZSB2ZXJzaW9uIDIuMS4wCiAqLwogbmFtZXNwYWNlIGRldGFpbAogeworLy8vLy8vLy8vLy8vLworLy8gaGVscGVycyAvLworLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IGlzX2Jhc2ljX2pzb24gOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK05MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCitzdHJ1Y3QgaXNfYmFzaWNfanNvbjxOTE9ITUFOTl9CQVNJQ19KU09OX1RQTD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworLy8gYWxpYXMgdGVtcGxhdGVzIHRvIHJlZHVjZSBib2lsZXJwbGF0ZQordGVtcGxhdGU8Ym9vbCBCLCB0eXBlbmFtZSBUID0gdm9pZD4KK3VzaW5nIGVuYWJsZV9pZl90ID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8QiwgVD46OnR5cGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyB1bmN2cmVmX3QgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBlOworCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBDKysxNCBpbmRleF9zZXF1ZW5jZSBhbmQgYWZmaWxpYXRlcworLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzIyMjMzNDMKK3RlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uIEludHM+CitzdHJ1Y3QgaW5kZXhfc2VxdWVuY2UKK3sKKyAgICB1c2luZyB0eXBlID0gaW5kZXhfc2VxdWVuY2U7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHN0ZDo6c2l6ZV90OworICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpzaXplX3Qgc2l6ZSgpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gc2l6ZW9mLi4uKEludHMpOworICAgIH0KK307CisKK3RlbXBsYXRlPGNsYXNzIFNlcXVlbmNlMSwgY2xhc3MgU2VxdWVuY2UyPgorc3RydWN0IG1lcmdlX2FuZF9yZW51bWJlcjsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QuLi4gSTEsIHN0ZDo6c2l6ZV90Li4uIEkyPgorc3RydWN0IG1lcmdlX2FuZF9yZW51bWJlcjxpbmRleF9zZXF1ZW5jZTxJMS4uLj4sIGluZGV4X3NlcXVlbmNlPEkyLi4uPj4KKyAgICAgICAgOiBpbmRleF9zZXF1ZW5jZSA8IEkxLi4uLCAoc2l6ZW9mLi4uKEkxKSArIEkyKS4uLiA+IHt9OworCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBOPgorc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2UKKyAgICA6IG1lcmdlX2FuZF9yZW51bWJlciA8IHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2UgPCBOIC8gMiA+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZSA8IE4gLSBOIC8gMiA+Ojp0eXBlID4ge307CisKK3RlbXBsYXRlPD4gc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2U8MD4gOiBpbmRleF9zZXF1ZW5jZTw+IHt9OwordGVtcGxhdGU8PiBzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZTwxPiA6IGluZGV4X3NlcXVlbmNlPDA+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4KK3VzaW5nIGluZGV4X3NlcXVlbmNlX2ZvciA9IG1ha2VfaW5kZXhfc2VxdWVuY2U8c2l6ZW9mLi4uKFRzKT47CisKKy8qCitJbXBsZW1lbnRhdGlvbiBvZiB0d28gQysrMTcgY29uc3RydWN0czogY29uanVuY3Rpb24sIG5lZ2F0aW9uLiBUaGlzIGlzIG5lZWRlZAordG8gYXZvaWQgZXZhbHVhdGluZyBhbGwgdGhlIHRyYWl0cyBpbiBhIGNvbmRpdGlvbgorCitGb3IgZXhhbXBsZTogbm90IHN0ZDo6aXNfc2FtZTx2b2lkLCBUPjo6dmFsdWUgYW5kIGhhc192YWx1ZV90eXBlPFQ+Ojp2YWx1ZQord2lsbCBub3QgY29tcGlsZSB3aGVuIFQgPSB2b2lkIChvbiBNU1ZDIGF0IGxlYXN0KS4gV2hlcmVhcworY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIFQ+PiwgaGFzX3ZhbHVlX3R5cGU8VD4+Ojp2YWx1ZSB3aWxsCitzdG9wIGV2YWx1YXRpbmcgaWYgbmVnYXRpb248Li4uPjo6dmFsdWUgPT0gZmFsc2UKKworUGxlYXNlIG5vdGUgdGhhdCB0aG9zZSBjb25zdHJ1Y3RzIG11c3QgYmUgdXNlZCB3aXRoIGNhdXRpb24sIHNpbmNlIHN5bWJvbHMgY2FuCitiZWNvbWUgdmVyeSBsb25nIHF1aWNrbHkgKHdoaWNoIGNhbiBzbG93IGRvd24gY29tcGlsYXRpb24gYW5kIGNhdXNlIE1TVkMKK2ludGVybmFsIGNvbXBpbGVyIGVycm9ycykuIE9ubHkgdXNlIGl0IHdoZW4geW91IGhhdmUgdG8gKHNlZSBleGFtcGxlIGFoZWFkKS4KKyovCit0ZW1wbGF0ZTxjbGFzcy4uLj4gc3RydWN0IGNvbmp1bmN0aW9uIDogc3RkOjp0cnVlX3R5cGUge307Cit0ZW1wbGF0ZTxjbGFzcyBCMT4gc3RydWN0IGNvbmp1bmN0aW9uPEIxPiA6IEIxIHt9OwordGVtcGxhdGU8Y2xhc3MgQjEsIGNsYXNzLi4uIEJuPgorc3RydWN0IGNvbmp1bmN0aW9uPEIxLCBCbi4uLj4gOiBzdGQ6OmNvbmRpdGlvbmFsPGJvb2woQjE6OnZhbHVlKSwgY29uanVuY3Rpb248Qm4uLi4+LCBCMT46OnR5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIEI+IHN0cnVjdCBuZWdhdGlvbiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm90IEI6OnZhbHVlPiB7fTsKKworLy8gZGlzcGF0Y2ggdXRpbGl0eSAodGFrZW4gZnJvbSByYW5nZXMtdjMpCit0ZW1wbGF0ZTx1bnNpZ25lZCBOPiBzdHJ1Y3QgcHJpb3JpdHlfdGFnIDogcHJpb3JpdHlfdGFnIDwgTiAtIDEgPiB7fTsKK3RlbXBsYXRlPD4gc3RydWN0IHByaW9yaXR5X3RhZzwwPiB7fTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBoYXNfL2lzXyBmdW5jdGlvbnMgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNzE5MzA4OS80MTE2NDUzCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHZvaWQ+CitzdHJ1Y3QgaXNfY29tcGxldGVfdHlwZSA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfY29tcGxldGVfdHlwZTxULCBkZWNsdHlwZSh2b2lkKHNpemVvZihUKSkpPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCitOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIobWFwcGVkX3R5cGUpOworTkxPSE1BTk5fSlNPTl9IQVNfSEVMUEVSKGtleV90eXBlKTsKK05MT0hNQU5OX0pTT05fSEFTX0hFTFBFUih2YWx1ZV90eXBlKTsKK05MT0hNQU5OX0pTT05fSEFTX0hFTFBFUihpdGVyYXRvcik7CisKK3RlbXBsYXRlPGJvb2wgQiwgY2xhc3MgUmVhbFR5cGUsIGNsYXNzIENvbXBhdGlibGVPYmplY3RUeXBlPgorc3RydWN0IGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGVfaW1wbCA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGU8Y2xhc3MgUmVhbFR5cGUsIGNsYXNzIENvbXBhdGlibGVPYmplY3RUeXBlPgorc3RydWN0IGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGVfaW1wbDx0cnVlLCBSZWFsVHlwZSwgQ29tcGF0aWJsZU9iamVjdFR5cGU+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0KKyAgICAgICAgc3RkOjppc19jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIFJlYWxUeXBlOjprZXlfdHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGU6OmtleV90eXBlPjo6dmFsdWUgYW5kCisgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBSZWFsVHlwZTo6bWFwcGVkX3R5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlOjptYXBwZWRfdHlwZT46OnZhbHVlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgQmFzaWNKc29uVHlwZSwgY2xhc3MgQ29tcGF0aWJsZU9iamVjdFR5cGU+CitzdHJ1Y3QgaXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZQoreworICAgIHN0YXRpYyBhdXRvIGNvbnN0ZXhwciB2YWx1ZSA9IGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGVfaW1wbCA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIENvbXBhdGlibGVPYmplY3RUeXBlPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21hcHBlZF90eXBlPENvbXBhdGlibGVPYmplY3RUeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfa2V5X3R5cGU8Q29tcGF0aWJsZU9iamVjdFR5cGU+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QsIENvbXBhdGlibGVPYmplY3RUeXBlID46OnZhbHVlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KK3N0cnVjdCBpc19iYXNpY19qc29uX25lc3RlZF90eXBlCit7CisgICAgc3RhdGljIGF1dG8gY29uc3RleHByIHZhbHVlID0gc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Oml0ZXJhdG9yPjo6dmFsdWUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpyZXZlcnNlX2l0ZXJhdG9yPjo6dmFsdWUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcj46OnZhbHVlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgQmFzaWNKc29uVHlwZSwgY2xhc3MgQ29tcGF0aWJsZUFycmF5VHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX2FycmF5X3R5cGUKK3sKKyAgICBzdGF0aWMgYXV0byBjb25zdGV4cHIgdmFsdWUgPQorICAgICAgICBjb25qdW5jdGlvbjxuZWdhdGlvbjxzdGQ6OmlzX3NhbWU8dm9pZCwgQ29tcGF0aWJsZUFycmF5VHlwZT4+LAorICAgICAgICBuZWdhdGlvbjxpc19jb21wYXRpYmxlX29iamVjdF90eXBlPAorICAgICAgICBCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCisgICAgICAgIG5lZ2F0aW9uPHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzdHJpbmdfdCwKKyAgICAgICAgQ29tcGF0aWJsZUFycmF5VHlwZT4+LAorICAgICAgICBuZWdhdGlvbjxpc19iYXNpY19qc29uX25lc3RlZF90eXBlPEJhc2ljSnNvblR5cGUsIENvbXBhdGlibGVBcnJheVR5cGU+PiwKKyAgICAgICAgaGFzX3ZhbHVlX3R5cGU8Q29tcGF0aWJsZUFycmF5VHlwZT4sCisgICAgICAgIGhhc19pdGVyYXRvcjxDb21wYXRpYmxlQXJyYXlUeXBlPj46OnZhbHVlOworfTsKKwordGVtcGxhdGU8Ym9vbCwgdHlwZW5hbWUsIHR5cGVuYW1lPgorc3RydWN0IGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlX2ltcGwgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxJbnRlZ2VyVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPgorc3RydWN0IGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlX2ltcGw8dHJ1ZSwgUmVhbEludGVnZXJUeXBlLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Cit7CisgICAgLy8gaXMgdGhlcmUgYW4gYXNzZXJ0IHNvbWV3aGVyZSBvbiBvdmVyZmxvd3M/CisgICAgdXNpbmcgUmVhbExpbWl0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbEludGVnZXJUeXBlPjsKKyAgICB1c2luZyBDb21wYXRpYmxlTGltaXRzID0gc3RkOjpudW1lcmljX2xpbWl0czxDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0KKyAgICAgICAgc3RkOjppc19jb25zdHJ1Y3RpYmxlPFJlYWxJbnRlZ2VyVHlwZSwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjo6dmFsdWUgYW5kCisgICAgICAgIENvbXBhdGlibGVMaW1pdHM6OmlzX2ludGVnZXIgYW5kCisgICAgICAgIFJlYWxMaW1pdHM6OmlzX3NpZ25lZCA9PSBDb21wYXRpYmxlTGltaXRzOjppc19zaWduZWQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsSW50ZWdlclR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZQoreworICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9CisgICAgICAgIGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlX2ltcGwgPAorICAgICAgICBzdGQ6OmlzX2ludGVncmFsPENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlIGFuZAorICAgICAgICBub3Qgc3RkOjppc19zYW1lPGJvb2wsIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlLAorICAgICAgICBSZWFsSW50ZWdlclR5cGUsIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZSA+IDo6dmFsdWU7Cit9OworCisvLyB0cmFpdCBjaGVja2luZyBpZiBKU09OU2VyaWFsaXplcjxUPjo6ZnJvbV9qc29uKGpzb24gY29uc3QmLCB1ZHQmKSBleGlzdHMKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaGFzX2Zyb21fanNvbgoreworICBwcml2YXRlOgorICAgIC8vIGFsc28gY2hlY2sgdGhlIHJldHVybiB0eXBlIG9mIGZyb21fanNvbgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lID0gZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHZvaWQsIGRlY2x0eXBlKHVuY3ZyZWZfdDxVPjo6ZnJvbV9qc29uKAorICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8QmFzaWNKc29uVHlwZT4oKSwgc3RkOjpkZWNsdmFsPFQmPigpKSk+Ojp2YWx1ZT4+CisgICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKKyAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0KHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOworfTsKKworLy8gVGhpcyB0cmFpdCBjaGVja3MgaWYgSlNPTlNlcmlhbGl6ZXI8VD46OmZyb21fanNvbihqc29uIGNvbnN0JikgZXhpc3RzCisvLyB0aGlzIG92ZXJsb2FkIGlzIHVzZWQgZm9yIG5vbi1kZWZhdWx0LWNvbnN0cnVjdGlibGUgdXNlci1kZWZpbmVkLXR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgorc3RydWN0IGhhc19ub25fZGVmYXVsdF9mcm9tX2pzb24KK3sKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIFUsCisgICAgICAgIHR5cGVuYW1lID0gZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBkZWNsdHlwZSh1bmN2cmVmX3Q8VT46OmZyb21fanNvbihzdGQ6OmRlY2x2YWw8QmFzaWNKc29uVHlwZT4oKSkpPjo6dmFsdWUgPj4KKyAgICBzdGF0aWMgaW50IGRldGVjdChVJiYpOworICAgIHN0YXRpYyB2b2lkIGRldGVjdCguLi4pOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBzdGQ6OmlzX2ludGVncmFsPGRlY2x0eXBlKGRldGVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnRlbXBsYXRlIGpzb25fc2VyaWFsaXplcjxULCB2b2lkPj4oKSkpPjo6dmFsdWU7Cit9OworCisvLyBUaGlzIHRyYWl0IGNoZWNrcyBpZiBCYXNpY0pzb25UeXBlOjpqc29uX3NlcmlhbGl6ZXI8VD46OnRvX2pzb24gZXhpc3RzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgorc3RydWN0IGhhc190b19qc29uCit7CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgPSBkZWNsdHlwZSh1bmN2cmVmX3Q8VT46OnRvX2pzb24oCisgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDxCYXNpY0pzb25UeXBlJj4oKSwgc3RkOjpkZWNsdmFsPFQ+KCkpKT4KKyAgICBzdGF0aWMgaW50IGRldGVjdChVJiYpOworICAgIHN0YXRpYyB2b2lkIGRldGVjdCguLi4pOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBzdGQ6OmlzX2ludGVncmFsPGRlY2x0eXBlKGRldGVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnRlbXBsYXRlIGpzb25fc2VyaWFsaXplcjxULCB2b2lkPj4oKSkpPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUNvbXBsZXRlVHlwZT4KK3N0cnVjdCBpc19jb21wYXRpYmxlX2NvbXBsZXRlX3R5cGUKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPQorICAgICAgICBub3Qgc3RkOjppc19iYXNlX29mPHN0ZDo6aXN0cmVhbSwgQ29tcGF0aWJsZUNvbXBsZXRlVHlwZT46OnZhbHVlIGFuZAorICAgICAgICBub3Qgc3RkOjppc19zYW1lPEJhc2ljSnNvblR5cGUsIENvbXBhdGlibGVDb21wbGV0ZVR5cGU+Ojp2YWx1ZSBhbmQKKyAgICAgICAgbm90IGlzX2Jhc2ljX2pzb25fbmVzdGVkX3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUNvbXBsZXRlVHlwZT46OnZhbHVlIGFuZAorICAgICAgICBoYXNfdG9fanNvbjxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQ29tcGxldGVUeXBlPjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZVR5cGU+CitzdHJ1Y3QgaXNfY29tcGF0aWJsZV90eXBlCisgICAgOiBjb25qdW5jdGlvbjxpc19jb21wbGV0ZV90eXBlPENvbXBhdGlibGVUeXBlPiwKKyAgICAgIGlzX2NvbXBhdGlibGVfY29tcGxldGVfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlVHlwZT4+Cit7Cit9OworCisvLyB0YWtlbiBmcm9tIHJhbmdlcy12MwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGF0aWNfY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIFQgdmFsdWV7fTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdGV4cHIgVCBzdGF0aWNfY29uc3Q8VD46OnZhbHVlOworfQorfQorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2V4Y2VwdGlvbnMuaHBwPgorCisKKyNpbmNsdWRlIDxleGNlcHRpb24+IC8vIGV4Y2VwdGlvbgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4gLy8gcnVudGltZV9lcnJvcgorI2luY2x1ZGUgPHN0cmluZz4gLy8gdG9fc3RyaW5nCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAorewogLy8vLy8vLy8vLy8vLy8vLwogLy8gZXhjZXB0aW9ucyAvLwogLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDE5LDYgKzc1NSw3IEBACiBqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA0IHwgdW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJ2ZvbycgfCBBIHJlZmVyZW5jZSB0b2tlbiBpbiBhIEpTT04gUG9pbnRlciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuCiBqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA1IHwgSlNPTiBwb2ludGVyIGhhcyBubyBwYXJlbnQgfCBUaGUgSlNPTiBQYXRjaCBvcGVyYXRpb25zICdyZW1vdmUnIGFuZCAnYWRkJyBjYW4gbm90IGJlIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgSlNPTiB2YWx1ZS4KIGpzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDYgfCBudW1iZXIgb3ZlcmZsb3cgcGFyc2luZyAnMTBFMTAwMCcgfCBBIHBhcnNlZCBudW1iZXIgY291bGQgbm90IGJlIHN0b3JlZCBhcyB3aXRob3V0IGNoYW5naW5nIGl0IHRvIE5hTiBvciBJTkYuCitqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA3IHwgbnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICc5MjIzMzcyMDM2ODU0Nzc1ODA4JyB8IFVCSlNPTiBvbmx5IHN1cHBvcnRzIGludGVnZXJzIG51bWJlcnMgdXAgdG8gOTIyMzM3MjAzNjg1NDc3NTgwNy4gfAogCiBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyBhbiBgb3V0X29mX3JhbmdlYCBleGNlcHRpb24gY2FuIGJlCiBjYXVnaHQuLG91dF9vZl9yYW5nZX0KQEAgLTQ4MSw5ICs4MTgsMjEgQEAKICAgcHJpdmF0ZToKICAgICBvdGhlcl9lcnJvcihpbnQgaWRfLCBjb25zdCBjaGFyKiB3aGF0X2FyZykgOiBleGNlcHRpb24oaWRfLCB3aGF0X2FyZykge30KIH07Cit9Cit9CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CiAKIAorI2luY2x1ZGUgPGFycmF5PiAvLyBhcnJheQorI2luY2x1ZGUgPGNpc282NDY+IC8vIGFuZAorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIHVpbnQ4X3QKIAorbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIEpTT04gdHlwZSBlbnVtZXJhdGlvbiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01MTIsNyArODYxLDcgQEAKIAogQHNpbmNlIHZlcnNpb24gMS4wLjAKICovCi1lbnVtIGNsYXNzIHZhbHVlX3QgOiB1aW50OF90CitlbnVtIGNsYXNzIHZhbHVlX3QgOiBzdGQ6OnVpbnQ4X3QKIHsKICAgICBudWxsLCAgICAgICAgICAgICAvLy88IG51bGwgdmFsdWUKICAgICBvYmplY3QsICAgICAgICAgICAvLy88IG9iamVjdCAodW5vcmRlcmVkIHNldCBvZiBuYW1lL3ZhbHVlIHBhaXJzKQpAQCAtNTM3LDcgKzg4Niw3IEBACiAqLwogaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHZhbHVlX3QgbGhzLCBjb25zdCB2YWx1ZV90IHJocykgbm9leGNlcHQKIHsKLSAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gb3JkZXIgPSB7eworICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjphcnJheTxzdGQ6OnVpbnQ4X3QsIDg+IG9yZGVyID0ge3sKICAgICAgICAgICAgIDAgLyogbnVsbCAqLywgMyAvKiBvYmplY3QgKi8sIDQgLyogYXJyYXkgKi8sIDUgLyogc3RyaW5nICovLAogICAgICAgICAgICAgMSAvKiBib29sZWFuICovLCAyIC8qIGludGVnZXIgKi8sIDIgLyogdW5zaWduZWQgKi8sIDIgLyogZmxvYXQgKi8KICAgICAgICAgfQpAQCAtNTQ3LDUxOCArODk2LDM2IEBACiAgICAgY29uc3QgYXV0byByX2luZGV4ID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJocyk7CiAgICAgcmV0dXJuIGxfaW5kZXggPCBvcmRlci5zaXplKCkgYW5kIHJfaW5kZXggPCBvcmRlci5zaXplKCkgYW5kIG9yZGVyW2xfaW5kZXhdIDwgb3JkZXJbcl9pbmRleF07CiB9Ci0KLQotLy8vLy8vLy8vLy8vLwotLy8gaGVscGVycyAvLwotLy8vLy8vLy8vLy8vLwotCi10ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IGlzX2Jhc2ljX2pzb24gOiBzdGQ6OmZhbHNlX3R5cGUge307Ci0KLU5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCi1zdHJ1Y3QgaXNfYmFzaWNfanNvbjxOTE9ITUFOTl9CQVNJQ19KU09OX1RQTD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKLQotLy8gYWxpYXMgdGVtcGxhdGVzIHRvIHJlZHVjZSBib2lsZXJwbGF0ZQotdGVtcGxhdGU8Ym9vbCBCLCB0eXBlbmFtZSBUID0gdm9pZD4KLXVzaW5nIGVuYWJsZV9pZl90ID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8QiwgVD46OnR5cGU7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci11c2luZyB1bmN2cmVmX3QgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU+Ojp0eXBlOwotCi0vLyBpbXBsZW1lbnRhdGlvbiBvZiBDKysxNCBpbmRleF9zZXF1ZW5jZSBhbmQgYWZmaWxpYXRlcwotLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzIyMjMzNDMKLXRlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uIEludHM+Ci1zdHJ1Y3QgaW5kZXhfc2VxdWVuY2UKLXsKLSAgICB1c2luZyB0eXBlID0gaW5kZXhfc2VxdWVuY2U7Ci0gICAgdXNpbmcgdmFsdWVfdHlwZSA9IHN0ZDo6c2l6ZV90OwotICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpzaXplX3Qgc2l6ZSgpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICByZXR1cm4gc2l6ZW9mLi4uKEludHMpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFNlcXVlbmNlMSwgY2xhc3MgU2VxdWVuY2UyPgotc3RydWN0IG1lcmdlX2FuZF9yZW51bWJlcjsKLQotdGVtcGxhdGU8c3RkOjpzaXplX3QuLi4gSTEsIHN0ZDo6c2l6ZV90Li4uIEkyPgotc3RydWN0IG1lcmdlX2FuZF9yZW51bWJlcjxpbmRleF9zZXF1ZW5jZTxJMS4uLj4sIGluZGV4X3NlcXVlbmNlPEkyLi4uPj4KLSAgICAgICAgOiBpbmRleF9zZXF1ZW5jZSA8IEkxLi4uLCAoc2l6ZW9mLi4uKEkxKSArIEkyKS4uLiA+IHt9OwotCi10ZW1wbGF0ZTxzdGQ6OnNpemVfdCBOPgotc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2UKLSAgICA6IG1lcmdlX2FuZF9yZW51bWJlciA8IHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2UgPCBOIC8gMiA+Ojp0eXBlLAotICAgICAgdHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZSA8IE4gLSBOIC8gMiA+Ojp0eXBlID4ge307Ci0KLXRlbXBsYXRlPD4gc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2U8MD4gOiBpbmRleF9zZXF1ZW5jZTw+IHt9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZTwxPiA6IGluZGV4X3NlcXVlbmNlPDA+IHt9OwotCi10ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4KLXVzaW5nIGluZGV4X3NlcXVlbmNlX2ZvciA9IG1ha2VfaW5kZXhfc2VxdWVuY2U8c2l6ZW9mLi4uKFRzKT47Ci0KLS8qCi1JbXBsZW1lbnRhdGlvbiBvZiB0d28gQysrMTcgY29uc3RydWN0czogY29uanVuY3Rpb24sIG5lZ2F0aW9uLiBUaGlzIGlzIG5lZWRlZAotdG8gYXZvaWQgZXZhbHVhdGluZyBhbGwgdGhlIHRyYWl0cyBpbiBhIGNvbmRpdGlvbgotCi1Gb3IgZXhhbXBsZTogbm90IHN0ZDo6aXNfc2FtZTx2b2lkLCBUPjo6dmFsdWUgYW5kIGhhc192YWx1ZV90eXBlPFQ+Ojp2YWx1ZQotd2lsbCBub3QgY29tcGlsZSB3aGVuIFQgPSB2b2lkIChvbiBNU1ZDIGF0IGxlYXN0KS4gV2hlcmVhcwotY29uanVuY3Rpb248bmVnYXRpb248c3RkOjppc19zYW1lPHZvaWQsIFQ+PiwgaGFzX3ZhbHVlX3R5cGU8VD4+Ojp2YWx1ZSB3aWxsCi1zdG9wIGV2YWx1YXRpbmcgaWYgbmVnYXRpb248Li4uPjo6dmFsdWUgPT0gZmFsc2UKLQotUGxlYXNlIG5vdGUgdGhhdCB0aG9zZSBjb25zdHJ1Y3RzIG11c3QgYmUgdXNlZCB3aXRoIGNhdXRpb24sIHNpbmNlIHN5bWJvbHMgY2FuCi1iZWNvbWUgdmVyeSBsb25nIHF1aWNrbHkgKHdoaWNoIGNhbiBzbG93IGRvd24gY29tcGlsYXRpb24gYW5kIGNhdXNlIE1TVkMKLWludGVybmFsIGNvbXBpbGVyIGVycm9ycykuIE9ubHkgdXNlIGl0IHdoZW4geW91IGhhdmUgdG8gKHNlZSBleGFtcGxlIGFoZWFkKS4KLSovCi10ZW1wbGF0ZTxjbGFzcy4uLj4gc3RydWN0IGNvbmp1bmN0aW9uIDogc3RkOjp0cnVlX3R5cGUge307Ci10ZW1wbGF0ZTxjbGFzcyBCMT4gc3RydWN0IGNvbmp1bmN0aW9uPEIxPiA6IEIxIHt9OwotdGVtcGxhdGU8Y2xhc3MgQjEsIGNsYXNzLi4uIEJuPgotc3RydWN0IGNvbmp1bmN0aW9uPEIxLCBCbi4uLj4gOiBzdGQ6OmNvbmRpdGlvbmFsPGJvb2woQjE6OnZhbHVlKSwgY29uanVuY3Rpb248Qm4uLi4+LCBCMT46OnR5cGUge307Ci0KLXRlbXBsYXRlPGNsYXNzIEI+IHN0cnVjdCBuZWdhdGlvbiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgbm90IEI6OnZhbHVlPiB7fTsKLQotLy8gZGlzcGF0Y2ggdXRpbGl0eSAodGFrZW4gZnJvbSByYW5nZXMtdjMpCi10ZW1wbGF0ZTx1bnNpZ25lZCBOPiBzdHJ1Y3QgcHJpb3JpdHlfdGFnIDogcHJpb3JpdHlfdGFnIDwgTiAtIDEgPiB7fTsKLXRlbXBsYXRlPD4gc3RydWN0IHByaW9yaXR5X3RhZzwwPiB7fTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGNvbnN0cnVjdG9ycyAvLwotLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXRlbXBsYXRlPHZhbHVlX3Q+IHN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3RvcjsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmJvb2xlYW4+Ci17Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Ym9vbGVhbl90IGIpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmJvb2xlYW47Ci0gICAgICAgIGoubV92YWx1ZSA9IGI7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpzdHJpbmc+Ci17Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QmIHMpCi0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OnN0cmluZzsKLSAgICAgICAgai5tX3ZhbHVlID0gczsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QmJiBzKQotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpzdHJpbmc7Ci0gICAgICAgIGoubV92YWx1ZSA9IHN0ZDo6bW92ZShzKTsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9mbG9hdD4KLXsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfZmxvYXRfdCB2YWwpIG5vZXhjZXB0Ci0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl9mbG9hdDsKLSAgICAgICAgai5tX3ZhbHVlID0gdmFsOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkPgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl91bnNpZ25lZF90IHZhbCkgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6bnVtYmVyX3Vuc2lnbmVkOwotICAgICAgICBqLm1fdmFsdWUgPSB2YWw7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfaW50ZWdlcj4KLXsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90IHZhbCkgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI7Ci0gICAgICAgIGoubV92YWx1ZSA9IHZhbDsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmFycmF5PgotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmIGFycikKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIGoubV92YWx1ZSA9IGFycjsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdCYmIGFycikKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIGoubV92YWx1ZSA9IHN0ZDo6bW92ZShhcnIpOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlQXJyYXlUeXBlLAotICAgICAgICAgICAgIGVuYWJsZV9pZl90PG5vdCBzdGQ6OmlzX3NhbWU8Q29tcGF0aWJsZUFycmF5VHlwZSwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBDb21wYXRpYmxlQXJyYXlUeXBlJiBhcnIpCi0gICAgewotICAgICAgICB1c2luZyBzdGQ6OmJlZ2luOwotICAgICAgICB1c2luZyBzdGQ6OmVuZDsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgai5tX3ZhbHVlLmFycmF5ID0gai50ZW1wbGF0ZSBjcmVhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdD4oYmVnaW4oYXJyKSwgZW5kKGFycikpOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgYXJyKQotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgai5tX3ZhbHVlID0gdmFsdWVfdDo6YXJyYXk7Ci0gICAgICAgIGoubV92YWx1ZS5hcnJheS0+cmVzZXJ2ZShhcnIuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChjb25zdCBib29sIHggOiBhcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGoubV92YWx1ZS5hcnJheS0+cHVzaF9iYWNrKHgpOwotICAgICAgICB9Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsCi0gICAgICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19jb252ZXJ0aWJsZTxULCBCYXNpY0pzb25UeXBlPjo6dmFsdWUsIGludD4gPSAwPgotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnZhbGFycmF5PFQ+JiBhcnIpCi0gICAgewotICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OwotICAgICAgICBqLm1fdmFsdWUgPSB2YWx1ZV90OjphcnJheTsKLSAgICAgICAgai5tX3ZhbHVlLmFycmF5LT5yZXNpemUoYXJyLnNpemUoKSk7Ci0gICAgICAgIHN0ZDo6Y29weShzdGQ6OmJlZ2luKGFyciksIHN0ZDo6ZW5kKGFyciksIGoubV92YWx1ZS5hcnJheS0+YmVnaW4oKSk7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ci17Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3QmIG9iaikKLSAgICB7Ci0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICBqLm1fdmFsdWUgPSBvYmo7Ci0gICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci0gICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90JiYgb2JqKQotICAgIHsKLSAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpvYmplY3Q7Ci0gICAgICAgIGoubV92YWx1ZSA9IHN0ZDo6bW92ZShvYmopOwotICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlT2JqZWN0VHlwZSwKLSAgICAgICAgICAgICBlbmFibGVfaWZfdDxub3Qgc3RkOjppc19zYW1lPENvbXBhdGlibGVPYmplY3RUeXBlLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdD46OnZhbHVlLCBpbnQ+ID0gMD4KLSAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZU9iamVjdFR5cGUmIG9iaikKLSAgICB7Ci0gICAgICAgIHVzaW5nIHN0ZDo6YmVnaW47Ci0gICAgICAgIHVzaW5nIHN0ZDo6ZW5kOwotCi0gICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OwotICAgICAgICBqLm1fdmFsdWUub2JqZWN0ID0gai50ZW1wbGF0ZSBjcmVhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q+KGJlZ2luKG9iaiksIGVuZChvYmopKTsKLSAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7Ci0gICAgfQotfTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGhhc18vaXNfIGZ1bmN0aW9ucyAvLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8qIQotQGJyaWVmIEhlbHBlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSdzIGEga2V5X3R5cGUgZm9yIFQuCi0KLVRoaXMgaGVscGVyIGlzIHVzZWQgdG8gdGVsbCBhc3NvY2lhdGl2ZSBjb250YWluZXJzIGFwYXJ0IGZyb20gb3RoZXIgY29udGFpbmVycwotc3VjaCBhcyBzZXF1ZW5jZSBjb250YWluZXJzLiBGb3IgaW5zdGFuY2UsIGBzdGQ6Om1hcGAgcGFzc2VzIHRoZSB0ZXN0IGFzIGl0Ci1jb250YWlucyBhIGBtYXBwZWRfdHlwZWAsIHdoZXJlYXMgYHN0ZDo6dmVjdG9yYCBmYWlscyB0aGUgdGVzdC4KLQotQHNhIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzc3Mjg3MjgvMjY2Mzc4Ci1Ac2luY2UgdmVyc2lvbiAxLjAuMCwgb3ZlcndvcmtlZCBpbiB2ZXJzaW9uIDIuMC42Ci0qLwotI2RlZmluZSBOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBoYXNfIyN0eXBlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaXZhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSA9IHR5cGVuYW1lIFU6OnR5cGU+ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgaW50IGRldGVjdChVICYmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8ZGVjbHR5cGUoZGV0ZWN0KHN0ZDo6ZGVjbHZhbDxUPigpKSk+Ojp2YWx1ZTsgXAotICAgIH0KLQotTkxPSE1BTk5fSlNPTl9IQVNfSEVMUEVSKG1hcHBlZF90eXBlKTsKLU5MT0hNQU5OX0pTT05fSEFTX0hFTFBFUihrZXlfdHlwZSk7Ci1OTE9ITUFOTl9KU09OX0hBU19IRUxQRVIodmFsdWVfdHlwZSk7Ci1OTE9ITUFOTl9KU09OX0hBU19IRUxQRVIoaXRlcmF0b3IpOwotCi0jdW5kZWYgTkxPSE1BTk5fSlNPTl9IQVNfSEVMUEVSCi0KLQotdGVtcGxhdGU8Ym9vbCBCLCBjbGFzcyBSZWFsVHlwZSwgY2xhc3MgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZV9pbXBsIDogc3RkOjpmYWxzZV90eXBlIHt9OwotCi10ZW1wbGF0ZTxjbGFzcyBSZWFsVHlwZSwgY2xhc3MgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZV9pbXBsPHRydWUsIFJlYWxUeXBlLCBDb21wYXRpYmxlT2JqZWN0VHlwZT4KLXsKLSAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPQotICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgUmVhbFR5cGU6OmtleV90eXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlT2JqZWN0VHlwZTo6a2V5X3R5cGU+Ojp2YWx1ZSBhbmQKLSAgICAgICAgc3RkOjppc19jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIFJlYWxUeXBlOjptYXBwZWRfdHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGU6Om1hcHBlZF90eXBlPjo6dmFsdWU7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBCYXNpY0pzb25UeXBlLCBjbGFzcyBDb21wYXRpYmxlT2JqZWN0VHlwZT4KLXN0cnVjdCBpc19jb21wYXRpYmxlX29iamVjdF90eXBlCi17Ci0gICAgc3RhdGljIGF1dG8gY29uc3RleHByIHZhbHVlID0gaXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZV9pbXBsIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25qdW5jdGlvbjxuZWdhdGlvbjxzdGQ6OmlzX3NhbWU8dm9pZCwgQ29tcGF0aWJsZU9iamVjdFR5cGU+PiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfbWFwcGVkX3R5cGU8Q29tcGF0aWJsZU9iamVjdFR5cGU+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19rZXlfdHlwZTxDb21wYXRpYmxlT2JqZWN0VHlwZT4+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCwgQ29tcGF0aWJsZU9iamVjdFR5cGUgPjo6dmFsdWU7Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgotc3RydWN0IGlzX2Jhc2ljX2pzb25fbmVzdGVkX3R5cGUKLXsKLSAgICBzdGF0aWMgYXV0byBjb25zdGV4cHIgdmFsdWUgPSBzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6aXRlcmF0b3I+Ojp2YWx1ZSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpjb25zdF9pdGVyYXRvcj46OnZhbHVlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnJldmVyc2VfaXRlcmF0b3I+Ojp2YWx1ZSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yPjo6dmFsdWU7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBCYXNpY0pzb25UeXBlLCBjbGFzcyBDb21wYXRpYmxlQXJyYXlUeXBlPgotc3RydWN0IGlzX2NvbXBhdGlibGVfYXJyYXlfdHlwZQotewotICAgIHN0YXRpYyBhdXRvIGNvbnN0ZXhwciB2YWx1ZSA9Ci0gICAgICAgIGNvbmp1bmN0aW9uPG5lZ2F0aW9uPHN0ZDo6aXNfc2FtZTx2b2lkLCBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCi0gICAgICAgIG5lZ2F0aW9uPGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGU8Ci0gICAgICAgIEJhc2ljSnNvblR5cGUsIENvbXBhdGlibGVBcnJheVR5cGU+PiwKLSAgICAgICAgbmVnYXRpb248c3RkOjppc19jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190LAotICAgICAgICBDb21wYXRpYmxlQXJyYXlUeXBlPj4sCi0gICAgICAgIG5lZ2F0aW9uPGlzX2Jhc2ljX2pzb25fbmVzdGVkX3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT4+LAotICAgICAgICBoYXNfdmFsdWVfdHlwZTxDb21wYXRpYmxlQXJyYXlUeXBlPiwKLSAgICAgICAgaGFzX2l0ZXJhdG9yPENvbXBhdGlibGVBcnJheVR5cGU+Pjo6dmFsdWU7Ci19OwotCi10ZW1wbGF0ZTxib29sLCB0eXBlbmFtZSwgdHlwZW5hbWU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGVfaW1wbCA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgUmVhbEludGVnZXJUeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ci1zdHJ1Y3QgaXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGVfaW1wbDx0cnVlLCBSZWFsSW50ZWdlclR5cGUsIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT4KLXsKLSAgICAvLyBpcyB0aGVyZSBhbiBhc3NlcnQgc29tZXdoZXJlIG9uIG92ZXJmbG93cz8KLSAgICB1c2luZyBSZWFsTGltaXRzID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsSW50ZWdlclR5cGU+OwotICAgIHVzaW5nIENvbXBhdGlibGVMaW1pdHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT47Ci0KLSAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPQotICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8UmVhbEludGVnZXJUeXBlLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSBhbmQKLSAgICAgICAgQ29tcGF0aWJsZUxpbWl0czo6aXNfaW50ZWdlciBhbmQKLSAgICAgICAgUmVhbExpbWl0czo6aXNfc2lnbmVkID09IENvbXBhdGlibGVMaW1pdHM6OmlzX3NpZ25lZDsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFJlYWxJbnRlZ2VyVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPgotc3RydWN0IGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlCi17Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0KLSAgICAgICAgaXNfY29tcGF0aWJsZV9pbnRlZ2VyX3R5cGVfaW1wbCA8Ci0gICAgICAgIHN0ZDo6aXNfaW50ZWdyYWw8Q29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjo6dmFsdWUgYW5kCi0gICAgICAgIG5vdCBzdGQ6OmlzX3NhbWU8Ym9vbCwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlPjo6dmFsdWUsCi0gICAgICAgIFJlYWxJbnRlZ2VyVHlwZSwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlID46OnZhbHVlOwotfTsKLQotCi0vLyB0cmFpdCBjaGVja2luZyBpZiBKU09OU2VyaWFsaXplcjxUPjo6ZnJvbV9qc29uKGpzb24gY29uc3QmLCB1ZHQmKSBleGlzdHMKLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgaGFzX2Zyb21fanNvbgotewotICBwcml2YXRlOgotICAgIC8vIGFsc28gY2hlY2sgdGhlIHJldHVybiB0eXBlIG9mIGZyb21fanNvbgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lID0gZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHZvaWQsIGRlY2x0eXBlKHVuY3ZyZWZfdDxVPjo6ZnJvbV9qc29uKAotICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8QmFzaWNKc29uVHlwZT4oKSwgc3RkOjpkZWNsdmFsPFQmPigpKSk+Ojp2YWx1ZT4+Ci0gICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKLSAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKLQotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0KHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOwotfTsKLQotLy8gVGhpcyB0cmFpdCBjaGVja3MgaWYgSlNPTlNlcmlhbGl6ZXI8VD46OmZyb21fanNvbihqc29uIGNvbnN0JikgZXhpc3RzCi0vLyB0aGlzIG92ZXJsb2FkIGlzIHVzZWQgZm9yIG5vbi1kZWZhdWx0LWNvbnN0cnVjdGlibGUgdXNlci1kZWZpbmVkLXR5cGVzCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgotc3RydWN0IGhhc19ub25fZGVmYXVsdF9mcm9tX2pzb24KLXsKLSAgcHJpdmF0ZToKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSA9Ci0gICAgICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGRlY2x0eXBlKHVuY3ZyZWZfdDxVPjo6ZnJvbV9qc29uKHN0ZDo6ZGVjbHZhbDxCYXNpY0pzb25UeXBlPigpKSk+Ojp2YWx1ZT4+Ci0gICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKLSAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKLQotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZShkZXRlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOwotfTsKLQotLy8gVGhpcyB0cmFpdCBjaGVja3MgaWYgQmFzaWNKc29uVHlwZTo6anNvbl9zZXJpYWxpemVyPFQ+Ojp0b19qc29uIGV4aXN0cwotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBoYXNfdG9fanNvbgotewotICBwcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lID0gZGVjbHR5cGUodW5jdnJlZl90PFU+Ojp0b19qc29uKAotICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8QmFzaWNKc29uVHlwZSY+KCksIHN0ZDo6ZGVjbHZhbDxUPigpKSk+Ci0gICAgc3RhdGljIGludCBkZXRlY3QoVSYmKTsKLSAgICBzdGF0aWMgdm9pZCBkZXRlY3QoLi4uKTsKLQotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlID0gc3RkOjppc19pbnRlZ3JhbDxkZWNsdHlwZShkZXRlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjp0ZW1wbGF0ZSBqc29uX3NlcmlhbGl6ZXI8VCwgdm9pZD4+KCkpKT46OnZhbHVlOwotfTsKLQotCi0vLy8vLy8vLy8vLy8vCi0vLyB0b19qc29uIC8vCi0vLy8vLy8vLy8vLy8vCi0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsCi0gICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6Ym9vbGVhbl90Pjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIFQgYikgbm9leGNlcHQKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90Ojpib29sZWFuPjo6Y29uc3RydWN0KGosIGIpOworfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlU3RyaW5nLAotICAgICAgICAgZW5hYmxlX2lmX3Q8c3RkOjppc19jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190LCBDb21wYXRpYmxlU3RyaW5nPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IENvbXBhdGlibGVTdHJpbmcmIHMpCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL2Zyb21fanNvbi5ocHA+CisKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gdHJhbnNmb3JtCisjaW5jbHVkZSA8YXJyYXk+IC8vIGFycmF5CisjaW5jbHVkZSA8Y2lzbzY0Nj4gLy8gYW5kLCBub3QKKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+IC8vIGZvcndhcmRfbGlzdAorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBpbnNlcnRlciwgZnJvbnRfaW5zZXJ0ZXIsIGVuZAorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nCisjaW5jbHVkZSA8dHVwbGU+IC8vIHR1cGxlLCBtYWtlX3R1cGxlCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGlzX2FyaXRobWV0aWMsIGlzX3NhbWUsIGlzX2VudW0sIHVuZGVybHlpbmdfdHlwZSwgaXNfY29udmVydGlibGUKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBwYWlyLCBkZWNsdmFsCisjaW5jbHVkZSA8dmFsYXJyYXk+IC8vIHZhbGFycmF5CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL3ZhbHVlX3QuaHBwPgorCisKK25hbWVzcGFjZSBubG9obWFubgogewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OnN0cmluZz46OmNvbnN0cnVjdChqLCBzKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzdHJpbmdfdCYmIHMpCituYW1lc3BhY2UgZGV0YWlsCiB7Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6c3RyaW5nPjo6Y29uc3RydWN0KGosIHN0ZDo6bW92ZShzKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIEZsb2F0VHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8RmxvYXRUeXBlPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIEZsb2F0VHlwZSB2YWwpIG5vZXhjZXB0Ci17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2Zsb2F0Pjo6Y29uc3RydWN0KGosIHN0YXRpY19jYXN0PHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9mbG9hdF90Pih2YWwpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU51bWJlclVuc2lnbmVkVHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl91bnNpZ25lZF90LCBDb21wYXRpYmxlTnVtYmVyVW5zaWduZWRUeXBlPjo6dmFsdWUsIGludD4gPSAwPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIENvbXBhdGlibGVOdW1iZXJVbnNpZ25lZFR5cGUgdmFsKSBub2V4Y2VwdAotewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZD46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdD4odmFsKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfaW50ZWdlcl90eXBlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9pbnRlZ2VyX3QsIENvbXBhdGlibGVOdW1iZXJJbnRlZ2VyVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUgdmFsKSBub2V4Y2VwdAotewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyPjo6Y29uc3RydWN0KGosIHN0YXRpY19jYXN0PHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9pbnRlZ2VyX3Q+KHZhbCkpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBFbnVtVHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfZW51bTxFbnVtVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBFbnVtVHlwZSBlKSBub2V4Y2VwdAotewotICAgIHVzaW5nIHVuZGVybHlpbmdfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEVudW1UeXBlPjo6dHlwZTsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfaW50ZWdlcj46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx1bmRlcmx5aW5nX3R5cGU+KGUpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgZSkKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBlKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZSwKLSAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfYXJyYXlfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlQXJyYXlUeXBlPjo6dmFsdWUgb3IKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90LCBDb21wYXRpYmxlQXJyYXlUeXBlPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBDb21wYXRpYmxlQXJyYXlUeXBlJiBhcnIpCi17Ci0gICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVCwKLSAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfY29udmVydGlibGU8VCwgQmFzaWNKc29uVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBzdGQ6OnZhbGFycmF5PFQ+IGFycikKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBzdGQ6Om1vdmUoYXJyKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Ci12b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdCYmIGFycikKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBzdGQ6Om1vdmUoYXJyKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVPYmplY3RUeXBlLAotICAgICAgICAgZW5hYmxlX2lmX3Q8aXNfY29tcGF0aWJsZV9vYmplY3RfdHlwZTxCYXNpY0pzb25UeXBlLCBDb21wYXRpYmxlT2JqZWN0VHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBDb21wYXRpYmxlT2JqZWN0VHlwZSYgb2JqKQotewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om9iamVjdD46OmNvbnN0cnVjdChqLCBvYmopOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90JiYgb2JqKQotewotICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om9iamVjdD46OmNvbnN0cnVjdChqLCBzdGQ6Om1vdmUob2JqKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4sCi0gICAgICAgICBlbmFibGVfaWZfdDxub3Qgc3RkOjppc19jb25zdHJ1Y3RpYmxlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190LCBUICgmKVtOXT46OnZhbHVlLCBpbnQ+ID0gMD4KLXZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBUICgmYXJyKVtOXSkKLXsKLSAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT46OmNvbnN0cnVjdChqLCBhcnIpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZS4uLiBBcmdzPgotdm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHN0ZDo6cGFpcjxBcmdzLi4uPiYgcCkKLXsKLSAgICBqID0ge3AuZmlyc3QsIHAuc2Vjb25kfTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVHVwbGUsIHN0ZDo6c2l6ZV90Li4uIElkeD4KLXZvaWQgdG9fanNvbl90dXBsZV9pbXBsKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IFR1cGxlJiB0LCBpbmRleF9zZXF1ZW5jZTxJZHguLi4+KQotewotICAgIGogPSB7c3RkOjpnZXQ8SWR4Pih0KS4uLn07Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lLi4uIEFyZ3M+Ci12b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp0dXBsZTxBcmdzLi4uPiYgdCkKLXsKLSAgICB0b19qc29uX3R1cGxlX2ltcGwoaiwgdCwgaW5kZXhfc2VxdWVuY2VfZm9yPEFyZ3MuLi4+IHt9KTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vCi0vLyBmcm9tX2pzb24gLy8KLS8vLy8vLy8vLy8vLy8vLwotCiAvLyBvdmVybG9hZHMgZm9yIGJhc2ljX2pzb24gdGVtcGxhdGUgcGFyYW1ldGVycwogdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQXJpdGhtZXRpY1R5cGUsCiAgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2FyaXRobWV0aWM8QXJpdGhtZXRpY1R5cGU+Ojp2YWx1ZSBhbmQKQEAgLTEzMTAsMzkgKzExNzcsNiBAQAogICAgIGZyb21fanNvbl90dXBsZV9pbXBsKGosIHQsIGluZGV4X3NlcXVlbmNlX2ZvcjxBcmdzLi4uPiB7fSk7CiB9CiAKLXN0cnVjdCB0b19qc29uX2ZuCi17Ci0gIHByaXZhdGU6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KLSAgICBhdXRvIGNhbGwoQmFzaWNKc29uVHlwZSYgaiwgVCYmIHZhbCwgcHJpb3JpdHlfdGFnPDE+IC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0KG5vZXhjZXB0KHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpKSkKLSAgICAtPiBkZWNsdHlwZSh0b19qc29uKGosIHN0ZDo6Zm9yd2FyZDxUPih2YWwpKSwgdm9pZCgpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCBjYWxsKEJhc2ljSnNvblR5cGUmIC8qdW51c2VkKi8sIFQmJiAvKnVudXNlZCovLCBwcmlvcml0eV90YWc8MD4gLyp1bnVzZWQqLykgY29uc3Qgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEJhc2ljSnNvblR5cGUpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIHRvX2pzb24oKSBtZXRob2QgaW4gVCdzIG5hbWVzcGFjZSIpOwotCi0jaWZkZWYgX01TQ19WRVIKLSAgICAgICAgLy8gTVNWQyBkb2VzIG5vdCBzaG93IGEgc3RhY2t0cmFjZSBmb3IgdGhlIGFib3ZlIGFzc2VydAotICAgICAgICB1c2luZyBkZWNheWVkID0gdW5jdnJlZl90PFQ+OwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih0eXBlbmFtZSBkZWNheWVkOjpmb3JjZV9tc3ZjX3N0YWNrdHJhY2UpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgImZvcmNpbmcgTVNWQyBzdGFja3RyYWNlIHRvIHNob3cgd2hpY2ggVCB3ZSdyZSB0YWxraW5nIGFib3V0LiIpOwotI2VuZGlmCi0gICAgfQotCi0gIHB1YmxpYzoKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgotICAgIHZvaWQgb3BlcmF0b3IoKShCYXNpY0pzb25UeXBlJiBqLCBUJiYgdmFsKSBjb25zdAotICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDx0b19qc29uX2ZuPigpLmNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSk7Ci0gICAgfQotfTsKLQogc3RydWN0IGZyb21fanNvbl9mbgogewogICBwcml2YXRlOgpAQCAtMTM3NSwxNyArMTIwOSwzODMgQEAKICAgICAgICAgcmV0dXJuIGNhbGwoaiwgdmFsLCBwcmlvcml0eV90YWc8MT4ge30pOwogICAgIH0KIH07Cit9CiAKLS8vIHRha2VuIGZyb20gcmFuZ2VzLXYzCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IHN0YXRpY19jb25zdAorLy8vIG5hbWVzcGFjZSB0byBob2xkIGRlZmF1bHQgYGZyb21fanNvbmAgZnVuY3Rpb24KKy8vLyB0byBzZWUgd2h5IHRoaXMgaXMgcmVxdWlyZWQ6CisvLy8gaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxNS9uNDM4MS5odG1sCituYW1lc3BhY2UKIHsKLSAgICBzdGF0aWMgY29uc3RleHByIFQgdmFsdWV7fTsKK2NvbnN0ZXhwciBjb25zdCBhdXRvJiBmcm9tX2pzb24gPSBkZXRhaWw6OnN0YXRpY19jb25zdDxkZXRhaWw6OmZyb21fanNvbl9mbj46OnZhbHVlOworfQorfQorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2NvbnZlcnNpb25zL3RvX2pzb24uaHBwPgorCisKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBvciwgYW5kLCBub3QKKyNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gYmVnaW4sIGVuZAorI2luY2x1ZGUgPHR1cGxlPiAvLyB0dXBsZSwgZ2V0CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGlzX3NhbWUsIGlzX2NvbnN0cnVjdGlibGUsIGlzX2Zsb2F0aW5nX3BvaW50LCBpc19lbnVtLCB1bmRlcmx5aW5nX3R5cGUKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBtb3ZlLCBmb3J3YXJkLCBkZWNsdmFsLCBwYWlyCisjaW5jbHVkZSA8dmFsYXJyYXk+IC8vIHZhbGFycmF5CisjaW5jbHVkZSA8dmVjdG9yPiAvLyB2ZWN0b3IKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY29uc3RydWN0b3JzIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8dmFsdWVfdD4gc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yOworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6Ym9vbGVhbj4KK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpib29sZWFuX3QgYikgbm9leGNlcHQKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6Ym9vbGVhbjsKKyAgICAgICAgai5tX3ZhbHVlID0gYjsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBUIHN0YXRpY19jb25zdDxUPjo6dmFsdWU7Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6c3RyaW5nPgoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190JiBzKQorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpzdHJpbmc7CisgICAgICAgIGoubV92YWx1ZSA9IHM7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190JiYgcykKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6c3RyaW5nOworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUocyk7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfZmxvYXQ+Cit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2Zsb2F0X3QgdmFsKSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjpudW1iZXJfZmxvYXQ7CisgICAgICAgIGoubV92YWx1ZSA9IHZhbDsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZD4KK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdCB2YWwpIG5vZXhjZXB0CisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDsKKyAgICAgICAgai5tX3ZhbHVlID0gdmFsOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI+Cit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX2ludGVnZXJfdCB2YWwpIG5vZXhjZXB0CisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om51bWJlcl9pbnRlZ2VyOworICAgICAgICBqLm1fdmFsdWUgPSB2YWw7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjphcnJheT4KK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjphcnJheV90JiBhcnIpCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUgPSBhcnI7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmJiBhcnIpCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUoYXJyKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZUFycmF5VHlwZSwKKyAgICAgICAgICAgICBlbmFibGVfaWZfdDxub3Qgc3RkOjppc19zYW1lPENvbXBhdGlibGVBcnJheVR5cGUsIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+ID0gMD4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyKQorICAgIHsKKyAgICAgICAgdXNpbmcgc3RkOjpiZWdpbjsKKyAgICAgICAgdXNpbmcgc3RkOjplbmQ7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZS5hcnJheSA9IGoudGVtcGxhdGUgY3JlYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3Q+KGJlZ2luKGFyciksIGVuZChhcnIpKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGFycikKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZSA9IHZhbHVlX3Q6OmFycmF5OworICAgICAgICBqLm1fdmFsdWUuYXJyYXktPnJlc2VydmUoYXJyLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYm9vbCB4IDogYXJyKQorICAgICAgICB7CisgICAgICAgICAgICBqLm1fdmFsdWUuYXJyYXktPnB1c2hfYmFjayh4KTsKKyAgICAgICAgfQorICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBULAorICAgICAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfY29udmVydGlibGU8VCwgQmFzaWNKc29uVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KKyAgICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3QoQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2YWxhcnJheTxUPiYgYXJyKQorICAgIHsKKyAgICAgICAgai5tX3R5cGUgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgai5tX3ZhbHVlID0gdmFsdWVfdDo6YXJyYXk7CisgICAgICAgIGoubV92YWx1ZS5hcnJheS0+cmVzaXplKGFyci5zaXplKCkpOworICAgICAgICBzdGQ6OmNvcHkoc3RkOjpiZWdpbihhcnIpLCBzdGQ6OmVuZChhcnIpLCBqLm1fdmFsdWUuYXJyYXktPmJlZ2luKCkpOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6b2JqZWN0PgoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90JiBvYmopCisgICAgeworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgai5tX3ZhbHVlID0gb2JqOworICAgICAgICBqLmFzc2VydF9pbnZhcmlhbnQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgorICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdChCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCYmIG9iaikKKyAgICB7CisgICAgICAgIGoubV90eXBlID0gdmFsdWVfdDo6b2JqZWN0OworICAgICAgICBqLm1fdmFsdWUgPSBzdGQ6Om1vdmUob2JqKTsKKyAgICAgICAgai5hc3NlcnRfaW52YXJpYW50KCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgQ29tcGF0aWJsZU9iamVjdFR5cGUsCisgICAgICAgICAgICAgZW5hYmxlX2lmX3Q8bm90IHN0ZDo6aXNfc2FtZTxDb21wYXRpYmxlT2JqZWN0VHlwZSwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6b2JqZWN0X3Q+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgc3RhdGljIHZvaWQgY29uc3RydWN0KEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IENvbXBhdGlibGVPYmplY3RUeXBlJiBvYmopCisgICAgeworICAgICAgICB1c2luZyBzdGQ6OmJlZ2luOworICAgICAgICB1c2luZyBzdGQ6OmVuZDsKKworICAgICAgICBqLm1fdHlwZSA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgai5tX3ZhbHVlLm9iamVjdCA9IGoudGVtcGxhdGUgY3JlYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om9iamVjdF90PihiZWdpbihvYmopLCBlbmQob2JqKSk7CisgICAgICAgIGouYXNzZXJ0X2ludmFyaWFudCgpOworICAgIH0KK307CisKKy8vLy8vLy8vLy8vLy8KKy8vIHRvX2pzb24gLy8KKy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVCwKKyAgICAgICAgIGVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpib29sZWFuX3Q+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVCBiKSBub2V4Y2VwdAoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmJvb2xlYW4+Ojpjb25zdHJ1Y3QoaiwgYik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVTdHJpbmcsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QsIENvbXBhdGlibGVTdHJpbmc+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZVN0cmluZyYgcykKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpzdHJpbmc+Ojpjb25zdHJ1Y3Qoaiwgcyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6c3RyaW5nX3QmJiBzKQoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OnN0cmluZz46OmNvbnN0cnVjdChqLCBzdGQ6Om1vdmUocykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBGbG9hdFR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PEZsb2F0VHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBGbG9hdFR5cGUgdmFsKSBub2V4Y2VwdAoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6Om51bWJlcl9mbG9hdD46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfZmxvYXRfdD4odmFsKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVOdW1iZXJVbnNpZ25lZFR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdCwgQ29tcGF0aWJsZU51bWJlclVuc2lnbmVkVHlwZT46OnZhbHVlLCBpbnQ+ID0gMD4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBDb21wYXRpYmxlTnVtYmVyVW5zaWduZWRUeXBlIHZhbCkgbm9leGNlcHQKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3Q+KHZhbCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2ludGVnZXJfdHlwZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90LCBDb21wYXRpYmxlTnVtYmVySW50ZWdlclR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgQ29tcGF0aWJsZU51bWJlckludGVnZXJUeXBlIHZhbCkgbm9leGNlcHQKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpudW1iZXJfaW50ZWdlcj46OmNvbnN0cnVjdChqLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90Pih2YWwpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgRW51bVR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2VudW08RW51bVR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgRW51bVR5cGUgZSkgbm9leGNlcHQKK3sKKyAgICB1c2luZyB1bmRlcmx5aW5nX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtVHlwZT46OnR5cGU7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6bnVtYmVyX2ludGVnZXI+Ojpjb25zdHJ1Y3Qoaiwgc3RhdGljX2Nhc3Q8dW5kZXJseWluZ190eXBlPihlKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGU+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4mIGUpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIENvbXBhdGlibGVBcnJheVR5cGUsCisgICAgICAgICBlbmFibGVfaWZfdDxpc19jb21wYXRpYmxlX2FycmF5X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlIG9yCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6YXJyYXlfdCwgQ29tcGF0aWJsZUFycmF5VHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZUFycmF5VHlwZSYgYXJyKQoreworICAgIGV4dGVybmFsX2NvbnN0cnVjdG9yPHZhbHVlX3Q6OmFycmF5Pjo6Y29uc3RydWN0KGosIGFycik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQsCisgICAgICAgICBlbmFibGVfaWZfdDxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIEJhc2ljSnNvblR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgc3RkOjp2YWxhcnJheTxUPiBhcnIpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKGFycikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgordm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OmFycmF5X3QmJiBhcnIpCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKGFycikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBDb21wYXRpYmxlT2JqZWN0VHlwZSwKKyAgICAgICAgIGVuYWJsZV9pZl90PGlzX2NvbXBhdGlibGVfb2JqZWN0X3R5cGU8QmFzaWNKc29uVHlwZSwgQ29tcGF0aWJsZU9iamVjdFR5cGU+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgY29uc3QgQ29tcGF0aWJsZU9iamVjdFR5cGUmIG9iaikKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ojpjb25zdHJ1Y3Qoaiwgb2JqKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpvYmplY3RfdCYmIG9iaikKK3sKKyAgICBleHRlcm5hbF9jb25zdHJ1Y3Rvcjx2YWx1ZV90OjpvYmplY3Q+Ojpjb25zdHJ1Y3Qoaiwgc3RkOjptb3ZlKG9iaikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLAorICAgICAgICAgZW5hYmxlX2lmX3Q8bm90IHN0ZDo6aXNfY29uc3RydWN0aWJsZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzdHJpbmdfdCwgVCAoJilbTl0+Ojp2YWx1ZSwgaW50PiA9IDA+Cit2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVCAoJmFycilbTl0pCit7CisgICAgZXh0ZXJuYWxfY29uc3RydWN0b3I8dmFsdWVfdDo6YXJyYXk+Ojpjb25zdHJ1Y3QoaiwgYXJyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUuLi4gQXJncz4KK3ZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBzdGQ6OnBhaXI8QXJncy4uLj4mIHApCit7CisgICAgaiA9IHtwLmZpcnN0LCBwLnNlY29uZH07Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFR1cGxlLCBzdGQ6OnNpemVfdC4uLiBJZHg+Cit2b2lkIHRvX2pzb25fdHVwbGVfaW1wbChCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBUdXBsZSYgdCwgaW5kZXhfc2VxdWVuY2U8SWR4Li4uPikKK3sKKyAgICBqID0ge3N0ZDo6Z2V0PElkeD4odCkuLi59OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZS4uLiBBcmdzPgordm9pZCB0b19qc29uKEJhc2ljSnNvblR5cGUmIGosIGNvbnN0IHN0ZDo6dHVwbGU8QXJncy4uLj4mIHQpCit7CisgICAgdG9fanNvbl90dXBsZV9pbXBsKGosIHQsIGluZGV4X3NlcXVlbmNlX2ZvcjxBcmdzLi4uPiB7fSk7Cit9CisKK3N0cnVjdCB0b19qc29uX2ZuCit7CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVD4KKyAgICBhdXRvIGNhbGwoQmFzaWNKc29uVHlwZSYgaiwgVCYmIHZhbCwgcHJpb3JpdHlfdGFnPDE+IC8qdW51c2VkKi8pIGNvbnN0IG5vZXhjZXB0KG5vZXhjZXB0KHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpKSkKKyAgICAtPiBkZWNsdHlwZSh0b19qc29uKGosIHN0ZDo6Zm9yd2FyZDxUPih2YWwpKSwgdm9pZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjYWxsKEJhc2ljSnNvblR5cGUmIC8qdW51c2VkKi8sIFQmJiAvKnVudXNlZCovLCBwcmlvcml0eV90YWc8MD4gLyp1bnVzZWQqLykgY29uc3Qgbm9leGNlcHQKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEJhc2ljSnNvblR5cGUpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIHRvX2pzb24oKSBtZXRob2QgaW4gVCdzIG5hbWVzcGFjZSIpOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgLy8gTVNWQyBkb2VzIG5vdCBzaG93IGEgc3RhY2t0cmFjZSBmb3IgdGhlIGFib3ZlIGFzc2VydAorICAgICAgICB1c2luZyBkZWNheWVkID0gdW5jdnJlZl90PFQ+OworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih0eXBlbmFtZSBkZWNheWVkOjpmb3JjZV9tc3ZjX3N0YWNrdHJhY2UpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgImZvcmNpbmcgTVNWQyBzdGFja3RyYWNlIHRvIHNob3cgd2hpY2ggVCB3ZSdyZSB0YWxraW5nIGFib3V0LiIpOworI2VuZGlmCisgICAgfQorCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBUPgorICAgIHZvaWQgb3BlcmF0b3IoKShCYXNpY0pzb25UeXBlJiBqLCBUJiYgdmFsKSBjb25zdAorICAgIG5vZXhjZXB0KG5vZXhjZXB0KHN0ZDo6ZGVjbHZhbDx0b19qc29uX2ZuPigpLmNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhbGwoaiwgc3RkOjpmb3J3YXJkPFQ+KHZhbCksIHByaW9yaXR5X3RhZzwxPiB7fSk7CisgICAgfQorfTsKK30KKworLy8vIG5hbWVzcGFjZSB0byBob2xkIGRlZmF1bHQgYHRvX2pzb25gIGZ1bmN0aW9uCituYW1lc3BhY2UKK3sKK2NvbnN0ZXhwciBjb25zdCBhdXRvJiB0b19qc29uID0gZGV0YWlsOjpzdGF0aWNfY29uc3Q8ZGV0YWlsOjp0b19qc29uX2ZuPjo6dmFsdWU7Cit9Cit9CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvaW5wdXRfYWRhcHRlcnMuaHBwPgorCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIG1pbgorI2luY2x1ZGUgPGFycmF5PiAvLyBhcnJheQorI2luY2x1ZGUgPGNhc3NlcnQ+IC8vIGFzc2VydAorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGNzdHJpbmc+IC8vIHN0cmxlbgorI2luY2x1ZGUgPGlvcz4gLy8gc3RyZWFtc2l6ZSwgc3RyZWFtb2ZmLCBzdHJlYW1wb3MKKyNpbmNsdWRlIDxpc3RyZWFtPiAvLyBpc3RyZWFtCisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGJlZ2luLCBlbmQsIGl0ZXJhdG9yX3RyYWl0cywgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIGRpc3RhbmNlLCBuZXh0CisjaW5jbHVkZSA8bWVtb3J5PiAvLyBzaGFyZWRfcHRyLCBtYWtlX3NoYXJlZCwgYWRkcmVzc29mCisjaW5jbHVkZSA8bnVtZXJpYz4gLy8gYWNjdW11bGF0ZQorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nLCBjaGFyX3RyYWl0cworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBlbmFibGVfaWYsIGlzX2Jhc2Vfb2YsIGlzX3BvaW50ZXIsIGlzX2ludGVncmFsLCByZW1vdmVfcG9pbnRlcgorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIHBhaXIsIGRlY2x2YWwKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CiAvLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gaW5wdXQgYWRhcHRlcnMgLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjI0LDEwICsxODI0LDM0IEBACiAgICAgLy8vIHRoZSBhY3R1YWwgYWRhcHRlcgogICAgIGlucHV0X2FkYXB0ZXJfdCBpYSA9IG51bGxwdHI7CiB9OworfQorfQogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBsZXhlciBhbmQgcGFyc2VyIC8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2xleGVyLmhwcD4KKworCisjaW5jbHVkZSA8Y2xvY2FsZT4gLy8gbG9jYWxlY29udgorI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPGNzdGRsaWI+IC8vIHN0cnRvZiwgc3RydG9kLCBzdHJ0b2xkLCBzdHJ0b2xsLCBzdHJ0b3VsbAorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+IC8vIGluaXRpYWxpemVyX2xpc3QKKyNpbmNsdWRlIDxpb3M+IC8vIGhleCwgdXBwZXJjYXNlCisjaW5jbHVkZSA8aW9tYW5pcD4gLy8gc2V0dywgc2V0ZmlsbAorI2luY2x1ZGUgPHNzdHJlYW0+IC8vIHN0cmluZ3N0cmVhbQorI2luY2x1ZGUgPHN0cmluZz4gLy8gY2hhcl90cmFpdHMsIHN0cmluZworI2luY2x1ZGUgPHZlY3Rvcj4gLy8gdmVjdG9yCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2lucHV0X2FkYXB0ZXJzLmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vCisvLyBsZXhlciAvLworLy8vLy8vLy8vLy8KIAogLyohCiBAYnJpZWYgbGV4aWNhbCBhbmFseXNpcwpAQCAtMTgxOSw5ICsyMDQzLDEwIEBACiAgICAgQGJyaWVmIHNjYW4gYSBzdHJpbmcgbGl0ZXJhbAogCiAgICAgVGhpcyBmdW5jdGlvbiBzY2FucyBhIHN0cmluZyBhY2NvcmRpbmcgdG8gU2VjdC4gNyBvZiBSRkMgNzE1OS4gV2hpbGUKLSAgICBzY2FubmluZywgYnl0ZXMgYXJlIGVzY2FwZWQgYW5kIGNvcGllZCBpbnRvIGJ1ZmZlciB5eXRleHQuIFRoZW4gdGhlIGZ1bmN0aW9uCi0gICAgcmV0dXJucyBzdWNjZXNzZnVsbHksIHl5dGV4dCBpcyAqbm90KiBudWxsLXRlcm1pbmF0ZWQgKGFzIGl0IG1heSBjb250YWluIFwwCi0gICAgYnl0ZXMpLCBhbmQgeXl0ZXh0LnNpemUoKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcuCisgICAgc2Nhbm5pbmcsIGJ5dGVzIGFyZSBlc2NhcGVkIGFuZCBjb3BpZWQgaW50byBidWZmZXIgdG9rZW5fYnVmZmVyLiBUaGVuIHRoZQorICAgIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCB0b2tlbl9idWZmZXIgaXMgKm5vdCogbnVsbC10ZXJtaW5hdGVkIChhcyBpdAorICAgIG1heSBjb250YWluIFwwIGJ5dGVzKSwgYW5kIHRva2VuX2J1ZmZlci5zaXplKCkgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgICBzdHJpbmcuCiAKICAgICBAcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX3N0cmluZyBpZiBzdHJpbmcgY291bGQgYmUgc3VjY2Vzc2Z1bGx5IHNjYW5uZWQsCiAgICAgICAgICAgICB0b2tlbl90eXBlOjpwYXJzZV9lcnJvciBvdGhlcndpc2UKQEAgLTE4MzEsNyArMjA1Niw3IEBACiAgICAgKi8KICAgICB0b2tlbl90eXBlIHNjYW5fc3RyaW5nKCkKICAgICB7Ci0gICAgICAgIC8vIHJlc2V0IHl5dGV4dCAoaWdub3JlIG9wZW5pbmcgcXVvdGUpCisgICAgICAgIC8vIHJlc2V0IHRva2VuX2J1ZmZlciAoaWdub3JlIG9wZW5pbmcgcXVvdGUpCiAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgLy8gd2UgZW50ZXJlZCB0aGUgZnVuY3Rpb24gYnkgcmVhZGluZyBhbiBvcGVuIHF1b3RlCkBAIC0yMzAzLDcgKzI1MjgsNyBAQAogICAgIGNvbnRhaW5zIGN5Y2xlcywgYnV0IGFueSBjeWNsZSBjYW4gYmUgbGVmdCB3aGVuIEVPRiBpcyByZWFkLiBUaGVyZWZvcmUsCiAgICAgdGhlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gdGVybWluYXRlLgogCi0gICAgRHVyaW5nIHNjYW5uaW5nLCB0aGUgcmVhZCBieXRlcyBhcmUgc3RvcmVkIGluIHl5dGV4dC4gVGhpcyBzdHJpbmcgaXMKKyAgICBEdXJpbmcgc2Nhbm5pbmcsIHRoZSByZWFkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gdG9rZW5fYnVmZmVyLiBUaGlzIHN0cmluZyBpcwogICAgIHRoZW4gY29udmVydGVkIHRvIGEgc2lnbmVkIGludGVnZXIsIGFuIHVuc2lnbmVkIGludGVnZXIsIG9yIGEKICAgICBmbG9hdGluZy1wb2ludCBudW1iZXIuCiAKQEAgLTIzMTcsNyArMjU0Miw3IEBACiAgICAgKi8KICAgICB0b2tlbl90eXBlIHNjYW5fbnVtYmVyKCkKICAgICB7Ci0gICAgICAgIC8vIHJlc2V0IHl5dGV4dCB0byBzdG9yZSB0aGUgbnVtYmVyJ3MgYnl0ZXMKKyAgICAgICAgLy8gcmVzZXQgdG9rZW5fYnVmZmVyIHRvIHN0b3JlIHRoZSBudW1iZXIncyBieXRlcwogICAgICAgICByZXNldCgpOwogCiAgICAgICAgIC8vIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgbnVtYmVyOyBpbml0aWFsbHkgc2V0IHRvIHVuc2lnbmVkOyB3aWxsIGJlCkBAIC0yNjAxLDEwICsyODI2LDEwIEBACiAgICAgICAgIC8vIHRyeSB0byBwYXJzZSBpbnRlZ2VycyBmaXJzdCBhbmQgZmFsbCBiYWNrIHRvIGZsb2F0cwogICAgICAgICBpZiAobnVtYmVyX3R5cGUgPT0gdG9rZW5fdHlwZTo6dmFsdWVfdW5zaWduZWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8geCA9IHN0ZDo6c3RydG91bGwoeXl0ZXh0LmRhdGEoKSwgJmVuZHB0ciwgMTApOworICAgICAgICAgICAgY29uc3QgYXV0byB4ID0gc3RkOjpzdHJ0b3VsbCh0b2tlbl9idWZmZXIuZGF0YSgpLCAmZW5kcHRyLCAxMCk7CiAKICAgICAgICAgICAgIC8vIHdlIGNoZWNrZWQgdGhlIG51bWJlciBmb3JtYXQgYmVmb3JlCi0gICAgICAgICAgICBhc3NlcnQoZW5kcHRyID09IHl5dGV4dC5kYXRhKCkgKyB5eXRleHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydChlbmRwdHIgPT0gdG9rZW5fYnVmZmVyLmRhdGEoKSArIHRva2VuX2J1ZmZlci5zaXplKCkpOwogCiAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkKICAgICAgICAgICAgIHsKQEAgLTI2MTcsMTAgKzI4NDIsMTAgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChudW1iZXJfdHlwZSA9PSB0b2tlbl90eXBlOjp2YWx1ZV9pbnRlZ2VyKQogICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIHggPSBzdGQ6OnN0cnRvbGwoeXl0ZXh0LmRhdGEoKSwgJmVuZHB0ciwgMTApOworICAgICAgICAgICAgY29uc3QgYXV0byB4ID0gc3RkOjpzdHJ0b2xsKHRva2VuX2J1ZmZlci5kYXRhKCksICZlbmRwdHIsIDEwKTsKIAogICAgICAgICAgICAgLy8gd2UgY2hlY2tlZCB0aGUgbnVtYmVyIGZvcm1hdCBiZWZvcmUKLSAgICAgICAgICAgIGFzc2VydChlbmRwdHIgPT0geXl0ZXh0LmRhdGEoKSArIHl5dGV4dC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0KGVuZHB0ciA9PSB0b2tlbl9idWZmZXIuZGF0YSgpICsgdG9rZW5fYnVmZmVyLnNpemUoKSk7CiAKICAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKQogICAgICAgICAgICAgewpAQCAtMjYzNCwxMCArMjg1OSwxMCBAQAogCiAgICAgICAgIC8vIHRoaXMgY29kZSBpcyByZWFjaGVkIGlmIHdlIHBhcnNlIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9yIGlmIGFuCiAgICAgICAgIC8vIGludGVnZXIgY29udmVyc2lvbiBhYm92ZSBmYWlsZWQKLSAgICAgICAgc3RydG9mKHZhbHVlX2Zsb2F0LCB5eXRleHQuZGF0YSgpLCAmZW5kcHRyKTsKKyAgICAgICAgc3RydG9mKHZhbHVlX2Zsb2F0LCB0b2tlbl9idWZmZXIuZGF0YSgpLCAmZW5kcHRyKTsKIAogICAgICAgICAvLyB3ZSBjaGVja2VkIHRoZSBudW1iZXIgZm9ybWF0IGJlZm9yZQotICAgICAgICBhc3NlcnQoZW5kcHRyID09IHl5dGV4dC5kYXRhKCkgKyB5eXRleHQuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0KGVuZHB0ciA9PSB0b2tlbl9idWZmZXIuZGF0YSgpICsgdG9rZW5fYnVmZmVyLnNpemUoKSk7CiAKICAgICAgICAgcmV0dXJuIHRva2VuX3R5cGU6OnZhbHVlX2Zsb2F0OwogICAgIH0KQEAgLTI2NjYsMTAgKzI4OTEsMTAgQEAKICAgICAvLyBpbnB1dCBtYW5hZ2VtZW50CiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICAvLy8gcmVzZXQgeXl0ZXh0OyBjdXJyZW50IGNoYXJhY3RlciBpcyBiZWdpbm5pbmcgb2YgdG9rZW4KKyAgICAvLy8gcmVzZXQgdG9rZW5fYnVmZmVyOyBjdXJyZW50IGNoYXJhY3RlciBpcyBiZWdpbm5pbmcgb2YgdG9rZW4KICAgICB2b2lkIHJlc2V0KCkgbm9leGNlcHQKICAgICB7Ci0gICAgICAgIHl5dGV4dC5jbGVhcigpOworICAgICAgICB0b2tlbl9idWZmZXIuY2xlYXIoKTsKICAgICAgICAgdG9rZW5fc3RyaW5nLmNsZWFyKCk7CiAgICAgICAgIHRva2VuX3N0cmluZy5wdXNoX2JhY2soc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6dG9fY2hhcl90eXBlKGN1cnJlbnQpKTsKICAgICB9CkBAIC0yNzA3LDEwICsyOTMyLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLy8gYWRkIGEgY2hhcmFjdGVyIHRvIHl5dGV4dAorICAgIC8vLyBhZGQgYSBjaGFyYWN0ZXIgdG8gdG9rZW5fYnVmZmVyCiAgICAgdm9pZCBhZGQoaW50IGMpCiAgICAgewotICAgICAgICB5eXRleHQucHVzaF9iYWNrKHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OnRvX2NoYXJfdHlwZShjKSk7CisgICAgICAgIHRva2VuX2J1ZmZlci5wdXNoX2JhY2soc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6dG9fY2hhcl90eXBlKGMpKTsKICAgICB9CiAKICAgcHVibGljOgpAQCAtMjczOSw3ICsyOTY0LDcgQEAKICAgICAvLy8gcmV0dXJuIGN1cnJlbnQgc3RyaW5nIHZhbHVlIChpbXBsaWNpdGx5IHJlc2V0cyB0aGUgdG9rZW47IHVzZWZ1bCBvbmx5IG9uY2UpCiAgICAgc3RkOjpzdHJpbmcgbW92ZV9zdHJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZSh5eXRleHQpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKHRva2VuX2J1ZmZlcik7CiAgICAgfQogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yODY3LDcgKzMwOTIsNyBAQAogICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHRva2VuX3N0cmluZyB7fTsKIAogICAgIC8vLyBidWZmZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCB0b2tlbnMgKG51bWJlcnMsIHN0cmluZ3MpCi0gICAgc3RkOjpzdHJpbmcgeXl0ZXh0IHt9OworICAgIHN0ZDo6c3RyaW5nIHRva2VuX2J1ZmZlciB7fTsKIAogICAgIC8vLyBhIGRlc2NyaXB0aW9uIG9mIG9jY3VycmVkIGxleGVyIGVycm9ycwogICAgIGNvbnN0IGNoYXIqIGVycm9yX21lc3NhZ2UgPSAiIjsKQEAgLTI4ODAsNiArMzEwNSwzNyBAQAogICAgIC8vLyB0aGUgZGVjaW1hbCBwb2ludAogICAgIGNvbnN0IGNoYXIgZGVjaW1hbF9wb2ludF9jaGFyID0gJy4nOwogfTsKK30KK30KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pbnB1dC9wYXJzZXIuaHBwPgorCisKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxjbWF0aD4gLy8gaXNmaW5pdGUKKyNpbmNsdWRlIDxjc3RkaW50PiAvLyB1aW50OF90CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gZnVuY3Rpb24KKyNpbmNsdWRlIDxzdHJpbmc+IC8vIHN0cmluZworI2luY2x1ZGUgPHV0aWxpdHk+IC8vIG1vdmUKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvaW5wdXRfYWRhcHRlcnMuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2xleGVyLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLy8vLy8vLy8vLworLy8gcGFyc2VyIC8vCisvLy8vLy8vLy8vLy8KIAogLyohCiBAYnJpZWYgc3ludGF4IGFuYWx5c2lzCkBAIC0zNDQ1LDEyICszNzAxLDIwIEBACiAgICAgLy8vIHdoZXRoZXIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbiBjYXNlIG9mIGVycm9ycwogICAgIGNvbnN0IGJvb2wgYWxsb3dfZXhjZXB0aW9ucyA9IHRydWU7CiB9OworfQorfQogCi0vLy8vLy8vLy8vLy8vLy8KLS8vIGl0ZXJhdG9ycyAvLwotLy8vLy8vLy8vLy8vLy8vCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9wcmltaXRpdmVfaXRlcmF0b3IuaHBwPgogCi0vKiEKKworI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHB0cmRpZmZfdAorI2luY2x1ZGUgPGxpbWl0cz4gIC8vIG51bWVyaWNfbGltaXRzCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLyoKIEBicmllZiBhbiBpdGVyYXRvciBmb3IgcHJpbWl0aXZlIEpTT04gdHlwZXMKIAogVGhpcyBjbGFzcyBtb2RlbHMgYW4gaXRlcmF0b3IgZm9yIHByaW1pdGl2ZSBKU09OIHR5cGVzIChib29sZWFuLCBudW1iZXIsCkBAIC0zNDYxLDkgKzM3MjUsMTUgQEAKICovCiBjbGFzcyBwcmltaXRpdmVfaXRlcmF0b3JfdAogewotICBwdWJsaWM6CisgIHByaXZhdGU6CiAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gc3RkOjpwdHJkaWZmX3Q7CisgICAgc3RhdGljIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgYmVnaW5fdmFsdWUgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgZGlmZmVyZW5jZV90eXBlIGVuZF92YWx1ZSA9IGJlZ2luX3ZhbHVlICsgMTsKIAorICAgIC8vLyBpdGVyYXRvciBhcyBzaWduZWQgaW50ZWdlciB0eXBlCisgICAgZGlmZmVyZW5jZV90eXBlIG1faXQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnB0cmRpZmZfdD46Om1pbikoKTsKKworICBwdWJsaWM6CiAgICAgY29uc3RleHByIGRpZmZlcmVuY2VfdHlwZSBnZXRfdmFsdWUoKSBjb25zdCBub2V4Y2VwdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1faXQ7CkBAIC0zNTAzLDEwICszNzczLDEwIEBACiAgICAgICAgIHJldHVybiBsaHMubV9pdCA8IHJocy5tX2l0OwogICAgIH0KIAotICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgaSkKKyAgICBwcmltaXRpdmVfaXRlcmF0b3JfdCBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIG4pIG5vZXhjZXB0CiAgICAgewogICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOwotICAgICAgICByZXN1bHQgKz0gaTsKKyAgICAgICAgcmVzdWx0ICs9IG47CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0zNTE1LDU3ICszNzg1LDU3IEBACiAgICAgICAgIHJldHVybiBsaHMubV9pdCAtIHJocy5tX2l0OwogICAgIH0KIAotICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgaXQpCi0gICAgewotICAgICAgICByZXR1cm4gb3MgPDwgaXQubV9pdDsKLSAgICB9Ci0KLSAgICBwcmltaXRpdmVfaXRlcmF0b3JfdCYgb3BlcmF0b3IrKygpCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yKysoKSBub2V4Y2VwdAogICAgIHsKICAgICAgICAgKyttX2l0OwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQogCi0gICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgY29uc3Qgb3BlcmF0b3IrKyhpbnQpCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgY29uc3Qgb3BlcmF0b3IrKyhpbnQpIG5vZXhjZXB0CiAgICAgewogICAgICAgICBhdXRvIHJlc3VsdCA9ICp0aGlzOwogICAgICAgICBtX2l0Kys7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yLS0oKQorICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90JiBvcGVyYXRvci0tKCkgbm9leGNlcHQKICAgICB7CiAgICAgICAgIC0tbV9pdDsKICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgIH0KIAotICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IGNvbnN0IG9wZXJhdG9yLS0oaW50KQorICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90IGNvbnN0IG9wZXJhdG9yLS0oaW50KSBub2V4Y2VwdAogICAgIHsKICAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKICAgICAgICAgbV9pdC0tOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90JiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBuKQorICAgIHByaW1pdGl2ZV9pdGVyYXRvcl90JiBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBuKSBub2V4Y2VwdAogICAgIHsKICAgICAgICAgbV9pdCArPSBuOwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQogCi0gICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIG4pCisgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIG4pIG5vZXhjZXB0CiAgICAgewogICAgICAgICBtX2l0IC09IG47CiAgICAgICAgIHJldHVybiAqdGhpczsKICAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3RleHByIGRpZmZlcmVuY2VfdHlwZSBiZWdpbl92YWx1ZSA9IDA7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBkaWZmZXJlbmNlX3R5cGUgZW5kX3ZhbHVlID0gYmVnaW5fdmFsdWUgKyAxOwotCi0gICAgLy8vIGl0ZXJhdG9yIGFzIHNpZ25lZCBpbnRlZ2VyIHR5cGUKLSAgICBkaWZmZXJlbmNlX3R5cGUgbV9pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6cHRyZGlmZl90Pjo6bWluKSgpOwogfTsKK30KK30KIAorLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaW50ZXJuYWxfaXRlcmF0b3IuaHBwPgorCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL3ByaW1pdGl2ZV9pdGVyYXRvci5ocHA+CisKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CiAvKiEKIEBicmllZiBhbiBpdGVyYXRvciB2YWx1ZQogCkBAIC0zNTgxLDcgKzM4NTEsMzQgQEAKICAgICAvLy8gZ2VuZXJpYyBpdGVyYXRvciBmb3IgYWxsIG90aGVyIHR5cGVzCiAgICAgcHJpbWl0aXZlX2l0ZXJhdG9yX3QgcHJpbWl0aXZlX2l0ZXJhdG9yIHt9OwogfTsKK30KK30KIAorLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaXRlcl9pbXBsLmhwcD4KKworCisjaW5jbHVkZSA8Y2lzbzY0Nj4gLy8gbm90CisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGl0ZXJhdG9yLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIGFkdmFuY2UsIG5leHQKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4gLy8gY29uZGl0aW9uYWwsIGlzX2NvbnN0LCByZW1vdmVfY29uc3QKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvaW50ZXJuYWxfaXRlcmF0b3IuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2l0ZXJhdG9ycy9wcmltaXRpdmVfaXRlcmF0b3IuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21hY3JvX3Njb3BlLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tZXRhLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vIGZvcndhcmQgZGVjbGFyZSwgdG8gYmUgYWJsZSB0byBmcmllbmQgaXQgbGF0ZXIgb24KIHRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yVHlwZT4gY2xhc3MgaXRlcmF0aW9uX3Byb3h5OwogCiAvKiEKQEAgLTQxNzQsMTAgKzQ0NzEsMjUgQEAKICAgICAvLy8gYXNzb2NpYXRlZCBKU09OIGluc3RhbmNlCiAgICAgcG9pbnRlciBtX29iamVjdCA9IG51bGxwdHI7CiAgICAgLy8vIHRoZSBhY3R1YWwgaXRlcmF0b3Igb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UKLSAgICBpbnRlcm5hbF9pdGVyYXRvcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxCYXNpY0pzb25UeXBlPjo6dHlwZT4gbV9pdCA9IHt9OworICAgIGludGVybmFsX2l0ZXJhdG9yPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PEJhc2ljSnNvblR5cGU+Ojp0eXBlPiBtX2l0OwogfTsKK30KK30KIAotLy8vIHByb3h5IGNsYXNzIGZvciB0aGUgaXRlcmF0b3Jfd3JhcHBlciBmdW5jdGlvbnMKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaXRlcmF0b3JzL2l0ZXJhdGlvbl9wcm94eS5ocHA+CisKKworI2luY2x1ZGUgPGNzdGRkZWY+IC8vIHNpemVfdAorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nLCB0b19zdHJpbmcKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC92YWx1ZV90LmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKy8vLyBwcm94eSBjbGFzcyBmb3IgdGhlIGl0ZW1zKCkgZnVuY3Rpb24KIHRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yVHlwZT4gY2xhc3MgaXRlcmF0aW9uX3Byb3h5CiB7CiAgIHByaXZhdGU6CkBAIC00MjQ3LDcgKzQ1NTksNyBAQAogCiAgIHB1YmxpYzoKICAgICAvLy8gY29uc3RydWN0IGl0ZXJhdGlvbiBwcm94eSBmcm9tIGEgY29udGFpbmVyCi0gICAgZXhwbGljaXQgaXRlcmF0aW9uX3Byb3h5KHR5cGVuYW1lIEl0ZXJhdG9yVHlwZTo6cmVmZXJlbmNlIGNvbnQpCisgICAgZXhwbGljaXQgaXRlcmF0aW9uX3Byb3h5KHR5cGVuYW1lIEl0ZXJhdG9yVHlwZTo6cmVmZXJlbmNlIGNvbnQpIG5vZXhjZXB0CiAgICAgICAgIDogY29udGFpbmVyKGNvbnQpIHt9CiAKICAgICAvLy8gcmV0dXJuIGl0ZXJhdG9yIGJlZ2luIChuZWVkZWQgZm9yIHJhbmdlLWJhc2VkIGZvcikKQEAgLTQyNjIsNiArNDU3NCwyMyBAQAogICAgICAgICByZXR1cm4gaXRlcmF0aW9uX3Byb3h5X2ludGVybmFsKGNvbnRhaW5lci5lbmQoKSk7CiAgICAgfQogfTsKK30KK30KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pdGVyYXRvcnMvanNvbl9yZXZlcnNlX2l0ZXJhdG9yLmhwcD4KKworCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gcHRyZGlmZl90CisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIHJldmVyc2VfaXRlcmF0b3IKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBkZWNsdmFsCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAoreworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gcmV2ZXJzZV9pdGVyYXRvciAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvKiEKIEBicmllZiBhIHRlbXBsYXRlIGZvciBhIHJldmVyc2UgaXRlcmF0b3IgY2xhc3MKQEAgLTQzNjYsMTEgKzQ2OTUsMjUgQEAKICAgICAgICAgcmV0dXJuIGl0Lm9wZXJhdG9yICogKCk7CiAgICAgfQogfTsKK30KK30KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBvdXRwdXQgYWRhcHRlcnMgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9vdXRwdXQvb3V0cHV0X2FkYXB0ZXJzLmhwcD4KIAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBjb3B5CisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gc2l6ZV90CisjaW5jbHVkZSA8aW9zPiAvLyBzdHJlYW1zaXplCisjaW5jbHVkZSA8aXRlcmF0b3I+IC8vIGJhY2tfaW5zZXJ0ZXIKKyNpbmNsdWRlIDxtZW1vcnk+IC8vIHNoYXJlZF9wdHIsIG1ha2Vfc2hhcmVkCisjaW5jbHVkZSA8b3N0cmVhbT4gLy8gYmFzaWNfb3N0cmVhbQorI2luY2x1ZGUgPHN0cmluZz4gLy8gYmFzaWNfc3RyaW5nCisjaW5jbHVkZSA8dmVjdG9yPiAvLyB2ZWN0b3IKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CiAvLy8gYWJzdHJhY3Qgb3V0cHV0IGFkYXB0ZXIgaW50ZXJmYWNlCiB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4gc3RydWN0IG91dHB1dF9hZGFwdGVyX3Byb3RvY29sCiB7CkBAIC00NDY3LDEwICs0ODEwLDQzIEBACiAgIHByaXZhdGU6CiAgICAgb3V0cHV0X2FkYXB0ZXJfdDxDaGFyVHlwZT4gb2EgPSBudWxscHRyOwogfTsKK30KK30KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBiaW5hcnkgcmVhZGVyIGFuZCB3cml0ZXIgLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9pbnB1dC9iaW5hcnlfcmVhZGVyLmhwcD4KKworCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBnZW5lcmF0ZV9uCisjaW5jbHVkZSA8YXJyYXk+IC8vIGFycmF5CisjaW5jbHVkZSA8Y2Fzc2VydD4gLy8gYXNzZXJ0CisjaW5jbHVkZSA8Y21hdGg+IC8vIGxkZXhwCisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gc2l6ZV90CisjaW5jbHVkZSA8Y3N0ZGludD4gLy8gdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCB1aW50NjRfdAorI2luY2x1ZGUgPGNzdHJpbmc+IC8vIG1lbWNweQorI2luY2x1ZGUgPGlvbWFuaXA+IC8vIHNldHcsIHNldGZpbGwKKyNpbmNsdWRlIDxpb3M+IC8vIGhleAorI2luY2x1ZGUgPGl0ZXJhdG9yPiAvLyBiYWNrX2luc2VydGVyCisjaW5jbHVkZSA8bGltaXRzPiAvLyBudW1lcmljX2xpbWl0cworI2luY2x1ZGUgPHNzdHJlYW0+IC8vIHN0cmluZ3N0cmVhbQorI2luY2x1ZGUgPHN0cmluZz4gLy8gY2hhcl90cmFpdHMsIHN0cmluZworI2luY2x1ZGUgPHV0aWxpdHk+IC8vIG1ha2VfcGFpciwgbW92ZQorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL2lucHV0L2lucHV0X2FkYXB0ZXJzLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9leGNlcHRpb25zLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBiaW5hcnkgcmVhZGVyIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCiAKIC8qIQogQGJyaWVmIGRlc2VyaWFsaXphdGlvbiBvZiBDQk9SIGFuZCBNZXNzYWdlUGFjayB2YWx1ZXMKQEAgLTQ0ODAsNiArNDg1Niw3IEBACiB7CiAgICAgdXNpbmcgbnVtYmVyX2ludGVnZXJfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9pbnRlZ2VyX3Q7CiAgICAgdXNpbmcgbnVtYmVyX3Vuc2lnbmVkX3QgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfdW5zaWduZWRfdDsKKyAgICB1c2luZyBzdHJpbmdfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnN0cmluZ190OwogCiAgIHB1YmxpYzoKICAgICAvKiEKQEAgLTQ1MDgsNyArNDg4NSw3IEBACiAgICAgICAgIGlmIChzdHJpY3QpCiAgICAgICAgIHsKICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgY2hlY2tfZW9mKHRydWUpOworICAgICAgICAgICAgZXhwZWN0X2VvZigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNDUyOSw3ICs0OTA2LDI4IEBACiAgICAgICAgIGlmIChzdHJpY3QpCiAgICAgICAgIHsKICAgICAgICAgICAgIGdldCgpOwotICAgICAgICAgICAgY2hlY2tfZW9mKHRydWUpOworICAgICAgICAgICAgZXhwZWN0X2VvZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGNyZWF0ZSBhIEpTT04gdmFsdWUgZnJvbSBVQkpTT04gaW5wdXQKKworICAgIEBwYXJhbVtpbl0gc3RyaWN0ICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgaW5wdXQgdG8gYmUgY29uc3VtZWQgY29tcGxldGVkCisgICAgQHJldHVybiBKU09OIHZhbHVlIGNyZWF0ZWQgZnJvbSBVQkpTT04gaW5wdXQKKworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTAgaWYgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5IG9yIHRoZSBlbmQgb2YgZmlsZSB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWFjaGVkIHdoZW4gQGEgc3RyaWN0IHdhcyBzZXQgdG8gdHJ1ZQorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTIgaWYgdW5zdXBwb3J0ZWQgYnl0ZSB3YXMgcmVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV91Ympzb24oY29uc3QgYm9vbCBzdHJpY3QpCisgICAgeworICAgICAgICBjb25zdCBhdXRvIHJlcyA9IHBhcnNlX3VianNvbl9pbnRlcm5hbCgpOworICAgICAgICBpZiAoc3RyaWN0KQorICAgICAgICB7CisgICAgICAgICAgICBnZXRfaWdub3JlX25vb3AoKTsKKyAgICAgICAgICAgIGV4cGVjdF9lb2YoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTQ2MjgsNyArNTAyNiw2IEBACiAKICAgICAgICAgICAgIGNhc2UgMHgzODogLy8gTmVnYXRpdmUgaW50ZWdlciAob25lLWJ5dGUgdWludDhfdCBmb2xsb3dzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgdWludDhfdCAhCiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PG51bWJlcl9pbnRlZ2VyX3Q+KC0xKSAtIGdldF9udW1iZXI8dWludDhfdD4oKTsKICAgICAgICAgICAgIH0KIApAQCAtNDgxOSw5ICs1MjE2LDkgQEAKICAgICAgICAgICAgIGNhc2UgMHhGOTogLy8gSGFsZi1QcmVjaXNpb24gRmxvYXQgKHR3by1ieXRlIElFRUUgNzU0KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBieXRlMSA9IGdldCgpOwotICAgICAgICAgICAgICAgIGNoZWNrX2VvZigpOworICAgICAgICAgICAgICAgIHVuZXhwZWN0X2VvZigpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludCBieXRlMiA9IGdldCgpOwotICAgICAgICAgICAgICAgIGNoZWNrX2VvZigpOworICAgICAgICAgICAgICAgIHVuZXhwZWN0X2VvZigpOwogCiAgICAgICAgICAgICAgICAgLy8gY29kZSBmcm9tIFJGQyA3MDQ5LCBBcHBlbmRpeCBELCBGaWd1cmUgMzoKICAgICAgICAgICAgICAgICAvLyBBcyBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHdlcmUgb25seSBhZGRlZApAQCAtNTE5Niw2ICs1NTkzLDE2IEBACiAgICAgfQogCiAgICAgLyohCisgICAgQHBhcmFtW2luXSBnZXRfY2hhciAgd2hldGhlciBhIG5ldyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICh0cnVlLCBkZWZhdWx0KSBvciB3aGV0aGVyIHRoZSBsYXN0IHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW5zdGVhZAorICAgICovCisgICAgQmFzaWNKc29uVHlwZSBwYXJzZV91Ympzb25faW50ZXJuYWwoY29uc3QgYm9vbCBnZXRfY2hhciA9IHRydWUpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0X3VianNvbl92YWx1ZShnZXRfY2hhciA/IGdldF9pZ25vcmVfbm9vcCgpIDogY3VycmVudCk7CisgICAgfQorCisgICAgLyohCiAgICAgQGJyaWVmIGdldCBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dAogCiAgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSB1c2VkIGlucHV0IGFkYXB0ZXIuIEl0IGRvZXMKQEAgLTUyMTAsNiArNTYxNywyMCBAQAogICAgICAgICByZXR1cm4gKGN1cnJlbnQgPSBpYS0+Z2V0X2NoYXJhY3RlcigpKTsKICAgICB9CiAKKyAgICAvKiEKKyAgICBAcmV0dXJuIGNoYXJhY3RlciByZWFkIGZyb20gdGhlIGlucHV0IGFmdGVyIGlnbm9yaW5nIGFsbCAnTicgZW50cmllcworICAgICovCisgICAgaW50IGdldF9pZ25vcmVfbm9vcCgpCisgICAgeworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY3VycmVudCA9PSAnTicpOworCisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKwogICAgIC8qCiAgICAgQGJyaWVmIHJlYWQgYSBudW1iZXIgZnJvbSB0aGUgaW5wdXQKIApAQCAtNTIzMCw3ICs1NjUxLDcgQEAKICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihOdW1iZXJUeXBlKTsgKytpKQogICAgICAgICB7CiAgICAgICAgICAgICBnZXQoKTsKLSAgICAgICAgICAgIGNoZWNrX2VvZigpOworICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CiAKICAgICAgICAgICAgIC8vIHJldmVyc2UgYnl0ZSBvcmRlciBwcmlvciB0byBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgaWYgKGlzX2xpdHRsZV9lbmRpYW4pCkBAIC01MjU1LDcgKzU2NzYsNyBAQAogICAgIEBwYXJhbVtpbl0gbGVuIG51bWJlciBvZiBieXRlcyB0byByZWFkCiAKICAgICBAbm90ZSBXZSBjYW4gbm90IHJlc2VydmUgQGEgbGVuIGJ5dGVzIGZvciB0aGUgcmVzdWx0LCBiZWNhdXNlIEBhIGxlbgotICAgICAgICAgIG1heSBiZSB0b28gbGFyZ2UuIFVzdWFsbHksIEByZWYgY2hlY2tfZW9mKCkgZGV0ZWN0cyB0aGUgZW5kIG9mCisgICAgICAgICAgbWF5IGJlIHRvbyBsYXJnZS4gVXN1YWxseSwgQHJlZiB1bmV4cGVjdF9lb2YoKSBkZXRlY3RzIHRoZSBlbmQgb2YKICAgICAgICAgICB0aGUgaW5wdXQgYmVmb3JlIHdlIHJ1biBvdXQgb2Ygc3RyaW5nIG1lbW9yeS4KIAogICAgIEByZXR1cm4gc3RyaW5nIGNyZWF0ZWQgYnkgcmVhZGluZyBAYSBsZW4gYnl0ZXMKQEAgLTUyNjMsMTMgKzU2ODQsMTMgQEAKICAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGhhcyBsZXNzIHRoYW4gQGEgbGVuIGJ5dGVzCiAgICAgKi8KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOdW1iZXJUeXBlPgotICAgIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoY29uc3QgTnVtYmVyVHlwZSBsZW4pCisgICAgc3RyaW5nX3QgZ2V0X3N0cmluZyhjb25zdCBOdW1iZXJUeXBlIGxlbikKICAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgICAgc3RyaW5nX3QgcmVzdWx0OwogICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHJlc3VsdCksIGxlbiwgW3RoaXNdKCkKICAgICAgICAgewogICAgICAgICAgICAgZ2V0KCk7Ci0gICAgICAgICAgICBjaGVja19lb2YoKTsKKyAgICAgICAgICAgIHVuZXhwZWN0X2VvZigpOwogICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KGN1cnJlbnQpOwogICAgICAgICB9KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTUyODcsOSArNTcwOCw5IEBACiAgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBlbmRlZAogICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTMgaWYgYW4gdW5leHBlY3RlZCBieXRlIGlzIHJlYWQKICAgICAqLwotICAgIHN0ZDo6c3RyaW5nIGdldF9jYm9yX3N0cmluZygpCisgICAgc3RyaW5nX3QgZ2V0X2Nib3Jfc3RyaW5nKCkKICAgICB7Ci0gICAgICAgIGNoZWNrX2VvZigpOworICAgICAgICB1bmV4cGVjdF9lb2YoKTsKIAogICAgICAgICBzd2l0Y2ggKGN1cnJlbnQpCiAgICAgICAgIHsKQEAgLTUzNDQsMTAgKzU3NjUsMTAgQEAKIAogICAgICAgICAgICAgY2FzZSAweDdGOiAvLyBVVEYtOCBzdHJpbmcgKGluZGVmaW5pdGUgbGVuZ3RoKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdCByZXN1bHQ7CiAgICAgICAgICAgICAgICAgd2hpbGUgKGdldCgpICE9IDB4RkYpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGVja19lb2YoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oY3VycmVudCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNTQwMCw5ICs1ODIxLDkgQEAKICAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIGlucHV0IGVuZGVkCiAgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMyBpZiBhbiB1bmV4cGVjdGVkIGJ5dGUgaXMgcmVhZAogICAgICovCi0gICAgc3RkOjpzdHJpbmcgZ2V0X21zZ3BhY2tfc3RyaW5nKCkKKyAgICBzdHJpbmdfdCBnZXRfbXNncGFja19zdHJpbmcoKQogICAgIHsKLSAgICAgICAgY2hlY2tfZW9mKCk7CisgICAgICAgIHVuZXhwZWN0X2VvZigpOwogCiAgICAgICAgIHN3aXRjaCAoY3VycmVudCkKICAgICAgICAgewpAQCAtNTQ5NiwyNSArNTkxNywyNTEgQEAKICAgICB9CiAKICAgICAvKiEKLSAgICBAYnJpZWYgY2hlY2sgaWYgaW5wdXQgZW5kZWQKKyAgICBAYnJpZWYgcmVhZHMgYSBVQkpTT04gc3RyaW5nCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGVpdGhlciBjYWxsZWQgYWZ0ZXIgcmVhZGluZyB0aGUgJ1MnIGJ5dGUgZXhwbGljaXRseQorICAgIGluZGljYXRpbmcgYSBzdHJpbmcsIG9yIGluIGNhc2Ugb2YgYW4gb2JqZWN0IGtleSB3aGVyZSB0aGUgJ1MnIGJ5dGUgY2FuIGJlCisgICAgbGVmdCBvdXQuCisKKyAgICBAcGFyYW1baW5dIGdldF9jaGFyICB3aGV0aGVyIGEgbmV3IGNoYXJhY3RlciBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKHRydWUsIGRlZmF1bHQpIG9yIHdoZXRoZXIgdGhlIGxhc3QgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzaG91bGQgYmUgY29uc2lkZXJlZCBpbnN0ZWFkCisKKyAgICBAcmV0dXJuIHN0cmluZworCiAgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBlbmRlZAorICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMTMgaWYgYW4gdW5leHBlY3RlZCBieXRlIGlzIHJlYWQKICAgICAqLwotICAgIHZvaWQgY2hlY2tfZW9mKGNvbnN0IGJvb2wgZXhwZWN0X2VvZiA9IGZhbHNlKSBjb25zdAorICAgIHN0cmluZ190IGdldF91Ympzb25fc3RyaW5nKGNvbnN0IGJvb2wgZ2V0X2NoYXIgPSB0cnVlKQogICAgIHsKLSAgICAgICAgaWYgKGV4cGVjdF9lb2YpCisgICAgICAgIGlmIChnZXRfY2hhcikKICAgICAgICAgewotICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY3VycmVudCAhPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkpCisgICAgICAgICAgICBnZXQoKTsgIC8vIFRPRE86IG1heSB3ZSBpZ25vcmUgTiBoZXJlPworICAgICAgICB9CisKKyAgICAgICAgdW5leHBlY3RfZW9mKCk7CisKKyAgICAgICAgc3dpdGNoIChjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9zdHJpbmcoZ2V0X251bWJlcjxpbnQ4X3Q+KCkpOworICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9zdHJpbmcoZ2V0X251bWJlcjxpbnQxNl90PigpKTsKKyAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfc3RyaW5nKGdldF9udW1iZXI8aW50MzJfdD4oKSk7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0cmluZyhnZXRfbnVtYmVyPGludDY0X3Q+KCkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICBzcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXggPDwgY3VycmVudDsKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTEzLCBjaGFyc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBVQkpTT04gc3RyaW5nOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgZGV0ZXJtaW5lIHRoZSB0eXBlIGFuZCBzaXplIGZvciBhIGNvbnRhaW5lcgorCisgICAgSW4gdGhlIG9wdGltaXplZCBVQkpTT04gZm9ybWF0LCBhIHR5cGUgYW5kIGEgc2l6ZSBjYW4gYmUgcHJvdmlkZWQgdG8gYWxsb3cKKyAgICBmb3IgYSBtb3JlIGNvbXBhY3QgcmVwcmVzZW50YXRpb24uCisKKyAgICBAcmV0dXJuIHBhaXIgb2YgdGhlIHNpemUgYW5kIHRoZSB0eXBlCisgICAgKi8KKyAgICBzdGQ6OnBhaXI8c3RkOjpzaXplX3QsIGludD4gZ2V0X3VianNvbl9zaXplX3R5cGUoKQorICAgIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgc3ogPSBzdHJpbmdfdDo6bnBvczsKKyAgICAgICAgaW50IHRjID0gMDsKKworICAgICAgICBnZXRfaWdub3JlX25vb3AoKTsKKworICAgICAgICBpZiAoY3VycmVudCA9PSAnJCcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRjID0gZ2V0KCk7ICAvLyBtdXN0IG5vdCBpZ25vcmUgJ04nLCBiZWNhdXNlICdOJyBtYXliZSB0aGUgdHlwZQorICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CisKKyAgICAgICAgICAgIGdldF9pZ25vcmVfbm9vcCgpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gJyMnKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTAsIGNoYXJzX3JlYWQsICJleHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMiwgY2hhcnNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICcjJyBhZnRlciBVQkpTT04gdHlwZSBpbmZvcm1hdGlvbjsgbGFzdCBieXRlOiAweCIgKyBzcy5zdHIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ogPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09ICcjJykKKyAgICAgICAgeworICAgICAgICAgICAgc3ogPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzeiwgdGMpOworICAgIH0KKworICAgIEJhc2ljSnNvblR5cGUgZ2V0X3VianNvbl92YWx1ZShjb25zdCBpbnQgcHJlZml4KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwcmVmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2Ugc3RkOjpjaGFyX3RyYWl0czxjaGFyPjo6ZW9mKCk6ICAvLyBFT0YKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTEwLCBjaGFyc19yZWFkLCAidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7CisKKyAgICAgICAgICAgIGNhc2UgJ1QnOiAgLy8gdHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnRic6ICAvLyBmYWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgY2FzZSAnWic6ICAvLyBudWxsCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPHVpbnQ4X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQ4X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxpbnQxNl90PigpOworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF9udW1iZXI8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGludDY0X3Q+KCk7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X251bWJlcjxmbG9hdD4oKTsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfbnVtYmVyPGRvdWJsZT4oKTsKKworICAgICAgICAgICAgY2FzZSAnQyc6ICAvLyBjaGFyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgdW5leHBlY3RfZW9mKCk7CisgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY3VycmVudCA+IDEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTMsIGNoYXJzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSBhZnRlciAnQycgbXVzdCBiZSBpbiByYW5nZSAweDAwLi4weDdGOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdfdCgxLCBzdGF0aWNfY2FzdDxjaGFyPihjdXJyZW50KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ1MnOiAgLy8gc3RyaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldF91Ympzb25fc3RyaW5nKCk7CisKKyAgICAgICAgICAgIGNhc2UgJ1snOiAgLy8gYXJyYXkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3VianNvbl9hcnJheSgpOworCisgICAgICAgICAgICBjYXNlICd7JzogIC8vIG9iamVjdAorICAgICAgICAgICAgICAgIHJldHVybiBnZXRfdWJqc29uX29iamVjdCgpOworCisgICAgICAgICAgICBkZWZhdWx0OiAvLyBhbnl0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMiwgY2hhcnNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHJlYWRpbmcgVUJKU09OOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCYXNpY0pzb25UeXBlIGdldF91Ympzb25fYXJyYXkoKQorICAgIHsKKyAgICAgICAgQmFzaWNKc29uVHlwZSByZXN1bHQgPSB2YWx1ZV90OjphcnJheTsKKyAgICAgICAgY29uc3QgYXV0byBzaXplX2FuZF90eXBlID0gZ2V0X3VianNvbl9zaXplX3R5cGUoKTsKKworICAgICAgICBpZiAoc2l6ZV9hbmRfdHlwZS5maXJzdCAhPSBzdHJpbmdfdDo6bnBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9ICdOJykKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6YmFja19pbnNlcnRlcigqcmVzdWx0Lm1fdmFsdWUuYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXMsIHNpemVfYW5kX3R5cGVdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRfdWJqc29uX3ZhbHVlKHNpemVfYW5kX3R5cGUuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKCpyZXN1bHQubV92YWx1ZS5hcnJheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfYW5kX3R5cGUuZmlyc3QsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VfdWJqc29uX2ludGVybmFsKCk7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjdXJyZW50ID09IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpKSkKKyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9ICddJykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHBhcnNlX2Vycm9yOjpjcmVhdGUoMTEwLCBjaGFyc19yZWFkLCAidW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhwYXJzZV91Ympzb25faW50ZXJuYWwoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBnZXRfaWdub3JlX25vb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQmFzaWNKc29uVHlwZSBnZXRfdWJqc29uX29iamVjdCgpCisgICAgeworICAgICAgICBCYXNpY0pzb25UeXBlIHJlc3VsdCA9IHZhbHVlX3Q6Om9iamVjdDsKKyAgICAgICAgY29uc3QgYXV0byBzaXplX2FuZF90eXBlID0gZ2V0X3VianNvbl9zaXplX3R5cGUoKTsKKworICAgICAgICBpZiAoc2l6ZV9hbmRfdHlwZS5maXJzdCAhPSBzdHJpbmdfdDo6bnBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVfYW5kX3R5cGUuc2Vjb25kICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6aW5zZXJ0ZXIoKnJlc3VsdC5tX3ZhbHVlLm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5vYmplY3QtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXMsIHNpemVfYW5kX3R5cGVdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X3VianNvbl9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWwgPSBnZXRfdWJqc29uX3ZhbHVlKHNpemVfYW5kX3R5cGUuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6aW5zZXJ0ZXIoKnJlc3VsdC5tX3ZhbHVlLm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubV92YWx1ZS5vYmplY3QtPmVuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9hbmRfdHlwZS5maXJzdCwgW3RoaXNdKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8ga2V5ID0gZ2V0X3VianNvbl9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWwgPSBwYXJzZV91Ympzb25faW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAnfScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXV0byBrZXkgPSBnZXRfdWJqc29uX3N0cmluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0W3N0ZDo6bW92ZShrZXkpXSA9IHBhcnNlX3VianNvbl9pbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIGdldF9pZ25vcmVfbm9vcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgdGhyb3cgaWYgZW5kIG9mIGlucHV0IGlzIG5vdCByZWFjaGVkCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBub3QgZW5kZWQKKyAgICAqLworICAgIHZvaWQgZXhwZWN0X2VvZigpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShjdXJyZW50ICE9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj46OmVvZigpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhwYXJzZV9lcnJvcjo6Y3JlYXRlKDExMCwgY2hhcnNfcmVhZCwgImV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZnRocm93IGlmIGVuZCBvZiBpbnB1dCBpcyByZWFjaGVkCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMCBpZiBpbnB1dCBlbmRlZAorICAgICovCisgICAgdm9pZCB1bmV4cGVjdF9lb2YoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkoY3VycmVudCA9PSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpTT05fVEhST1cocGFyc2VfZXJyb3I6OmNyZWF0ZSgxMTAsIGNoYXJzX3JlYWQsICJ1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpKTsKKyAgICAgICAgfQogICAgIH0KIAogICBwcml2YXRlOgpAQCAtNTUzMCw2ICs2MTc3LDMwIEBACiAgICAgLy8vIHdoZXRoZXIgd2UgY2FuIGFzc3VtZSBsaXR0bGUgZW5kaWFuZXNzCiAgICAgY29uc3QgYm9vbCBpc19saXR0bGVfZW5kaWFuID0gbGl0dGxlX2VuZGlhbmVzcygpOwogfTsKK30KK30KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9vdXRwdXQvYmluYXJ5X3dyaXRlci5ocHA+CisKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gcmV2ZXJzZQorI2luY2x1ZGUgPGFycmF5PiAvLyBhcnJheQorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50MzJfdCwgdWludDY0X3QKKyNpbmNsdWRlIDxjc3RyaW5nPiAvLyBtZW1jcHkKKyNpbmNsdWRlIDxsaW1pdHM+IC8vIG51bWVyaWNfbGltaXRzCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvaW5wdXQvYmluYXJ5X3JlYWRlci5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvb3V0cHV0L291dHB1dF9hZGFwdGVycy5ocHA+CisKKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBiaW5hcnkgd3JpdGVyIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCiAKIC8qIQogQGJyaWVmIHNlcmlhbGl6YXRpb24gdG8gQ0JPUiBhbmQgTWVzc2FnZVBhY2sgdmFsdWVzCkBAIC01Njc4LDIzICs2MzQ5LDIzIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg2MCArIE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4NzgpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4NzkpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHg3QSkpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUQVJUCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkZGRkZGRkZGRkZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4N0IpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihOKSk7CkBAIC01NzE2LDIzICs2Mzg3LDIzIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg4MCArIE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4OTgpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4OTkpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHg5QSkpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUQVJUCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkZGRkZGRkZGRkZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4OUIpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihOKSk7CkBAIC01NzU1LDIzICs2NDI2LDIzIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHhBMCArIE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QjgpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QjkpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhCQSkpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUQVJUCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkZGRkZGRkZGRkZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4QkIpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihOKSk7CkBAIC01OTM5LDE5ICs2NjEwLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGZpeHN0cgogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHhBMCB8IE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAyNTUpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc3RyIDgKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhEOSkpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oTikpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IDY1NTM1KQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgpKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBzdHIgMTYKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhEQSkpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSA0Mjk0OTY3Mjk1KQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBzdHIgMzIKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhEQikpOwpAQCAtNTk3NCwxMyArNjY0NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBmaXhhcnJheQogICAgICAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4oMHg5MCB8IE4pKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAweEZGRkYpCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IDE2CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REMpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgMzIKICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oMHhERCkpOwpAQCAtNjAwNCwxMyArNjY3NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBmaXhtYXAKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KDB4ODAgfCAoTiAmIDB4RikpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTiA8PSA2NTUzNSkKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIDE2CiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REUpKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQxNl90PihOKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE4gPD0gNDI5NDk2NzI5NSkKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIDMyCiAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KDB4REYpKTsKQEAgLTYwMzEsNiArNjcwMiwxNjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIQorICAgIEBwYXJhbVtpbl0gaiAgSlNPTiB2YWx1ZSB0byBzZXJpYWxpemUKKyAgICBAcGFyYW1baW5dIHVzZV9jb3VudCAgIHdoZXRoZXIgdG8gdXNlICcjJyBwcmVmaXhlcyAob3B0aW1pemVkIGZvcm1hdCkKKyAgICBAcGFyYW1baW5dIHVzZV90eXBlICAgIHdoZXRoZXIgdG8gdXNlICckJyBwcmVmaXhlcyAob3B0aW1pemVkIGZvcm1hdCkKKyAgICBAcGFyYW1baW5dIGFkZF9wcmVmaXggIHdoZXRoZXIgcHJlZml4ZXMgbmVlZCB0byBiZSB1c2VkIGZvciB0aGlzIHZhbHVlCisgICAgKi8KKyAgICB2b2lkIHdyaXRlX3VianNvbihjb25zdCBCYXNpY0pzb25UeXBlJiBqLCBjb25zdCBib29sIHVzZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZV90eXBlLCBjb25zdCBib29sIGFkZF9wcmVmaXggPSB0cnVlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChqLnR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudWxsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ1onKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmJvb2xlYW46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoai5tX3ZhbHVlLmJvb2xlYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PENoYXJUeXBlPignVCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0YnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6bnVtYmVyX2ludGVnZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIsIGFkZF9wcmVmaXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl91bnNpZ25lZDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXJfd2l0aF91Ympzb25fcHJlZml4KGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQsIGFkZF9wcmVmaXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXJfd2l0aF91Ympzb25fcHJlZml4KGoubV92YWx1ZS5udW1iZXJfZmxvYXQsIGFkZF9wcmVmaXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdTJykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXJfd2l0aF91Ympzb25fcHJlZml4KGoubV92YWx1ZS5zdHJpbmctPnNpemUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcnMoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihqLm1fdmFsdWUuc3RyaW5nLT5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgai5tX3ZhbHVlLnN0cmluZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdbJykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgcHJlZml4X3JlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAodXNlX3R5cGUgYW5kIG5vdCBqLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodXNlX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmaXJzdF9wcmVmaXggPSB1Ympzb25fcHJlZml4KGouZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2FtZV9wcmVmaXggPSBzdGQ6OmFsbF9vZihqLmJlZ2luKCkgKyAxLCBqLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIGZpcnN0X3ByZWZpeF0oY29uc3QgQmFzaWNKc29uVHlwZSAmIHYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1Ympzb25fcHJlZml4KHYpID09IGZpcnN0X3ByZWZpeDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhbWVfcHJlZml4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfcmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCckJykpOworICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oZmlyc3RfcHJlZml4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodXNlX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJyMnKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcl93aXRoX3VianNvbl9wcmVmaXgoai5tX3ZhbHVlLmFycmF5LT5zaXplKCksIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiAqai5tX3ZhbHVlLmFycmF5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfdWJqc29uKGVsLCB1c2VfY291bnQsIHVzZV90eXBlLCBwcmVmaXhfcmVxdWlyZWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChub3QgdXNlX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ10nKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ3snKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbCBwcmVmaXhfcmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICh1c2VfdHlwZSBhbmQgbm90IGoubV92YWx1ZS5vYmplY3QtPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodXNlX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmaXJzdF9wcmVmaXggPSB1Ympzb25fcHJlZml4KGouZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2FtZV9wcmVmaXggPSBzdGQ6OmFsbF9vZihqLmJlZ2luKCksIGouZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcywgZmlyc3RfcHJlZml4XShjb25zdCBCYXNpY0pzb25UeXBlICYgdikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVianNvbl9wcmVmaXgodikgPT0gZmlyc3RfcHJlZml4OworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtZV9wcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9yZXF1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJyQnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPihmaXJzdF9wcmVmaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1c2VfY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignIycpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChqLm1fdmFsdWUub2JqZWN0LT5zaXplKCksIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiAqai5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcl93aXRoX3VianNvbl9wcmVmaXgoZWwuZmlyc3Quc2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4oZWwuZmlyc3QuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBlbC5maXJzdC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZV91Ympzb24oZWwuc2Vjb25kLCB1c2VfY291bnQsIHVzZV90eXBlLCBwcmVmaXhfcmVxdWlyZWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChub3QgdXNlX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ30nKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgcHJpdmF0ZToKICAgICAvKgogICAgIEBicmllZiB3cml0ZSBhIG51bWJlciB0byBvdXRwdXQgaW5wdXQKQEAgLTYwMzksMTAgKzY4NjksMTEgQEAKICAgICBAdHBhcmFtIE51bWJlclR5cGUgdGhlIHR5cGUgb2YgdGhlIG51bWJlcgogCiAgICAgQG5vdGUgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byByZXNwZWN0IHRoZSBzeXN0ZW0ncyBlbmRpYW5lc3MsIGJlY2F1c2UgYnl0ZXMKLSAgICAgICAgICBpbiBDQk9SIGFuZCBNZXNzYWdlUGFjayBhcmUgc3RvcmVkIGluIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIGFuZAotICAgICAgICAgIHRoZXJlZm9yZSBuZWVkIHJlb3JkZXJpbmcgb24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLgorICAgICAgICAgIGluIENCT1IsIE1lc3NhZ2VQYWNrLCBhbmQgVUJKU09OIGFyZSBzdG9yZWQgaW4gbmV0d29yayBvcmRlciAoYmlnCisgICAgICAgICAgZW5kaWFuKSBhbmQgdGhlcmVmb3JlIG5lZWQgcmVvcmRlcmluZyBvbiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMuCiAgICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOdW1iZXJUeXBlPiB2b2lkIHdyaXRlX251bWJlcihOdW1iZXJUeXBlIG4pCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgICB2b2lkIHdyaXRlX251bWJlcihjb25zdCBOdW1iZXJUeXBlIG4pCiAgICAgewogICAgICAgICAvLyBzdGVwIDE6IHdyaXRlIG51bWJlciB0byBhcnJheSBvZiBsZW5ndGggTnVtYmVyVHlwZQogICAgICAgICBzdGQ6OmFycmF5PENoYXJUeXBlLCBzaXplb2YoTnVtYmVyVHlwZSk+IHZlYzsKQEAgLTYwNTgsNiArNjg4OSwyMDAgQEAKICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcnModmVjLmRhdGEoKSwgc2l6ZW9mKE51bWJlclR5cGUpKTsKICAgICB9CiAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOdW1iZXJUeXBlPgorICAgIHZvaWQgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeChjb25zdCBOdW1iZXJUeXBlIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYWRkX3ByZWZpeCkKKyAgICB7CisgICAgICAgIGlmIChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PE51bWJlclR5cGU+Ojp2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0QnKSk7ICAvLyBmbG9hdDY0CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZV9udW1iZXIobik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc191bnNpZ25lZDxOdW1iZXJUeXBlPjo6dmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdpJykpOyAgLy8gaW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ1UnKSk7ICAvLyB1aW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8dWludDhfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0knKSk7ICAvLyBpbnQxNgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MTZfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ2wnKSk7ICAvLyBpbnQzMgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0wnKSk7ICAvLyBpbnQ2NAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50NjRfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA3LCAibnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICIgKyBzdGQ6OnRvX3N0cmluZyhuKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1pbikoKSA8PSBuIGFuZCBuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdpJykpOyAgLy8gaW50OAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50OF90PihuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWluKSgpIDw9IG4gYW5kIG4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdVJykpOyAgLy8gdWludDgKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkgPD0gbiBhbmQgbiA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRfcHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2EtPndyaXRlX2NoYXJhY3RlcihzdGF0aWNfY2FzdDxDaGFyVHlwZT4oJ0knKSk7ICAvLyBpbnQxNgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9udW1iZXIoc3RhdGljX2Nhc3Q8aW50MTZfdD4obikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSA8PSBuIGFuZCBuIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZF9wcmVmaXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYS0+d3JpdGVfY2hhcmFjdGVyKHN0YXRpY19jYXN0PENoYXJUeXBlPignbCcpKTsgIC8vIGludDMyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlX251bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpIDw9IG4gYW5kIG4gPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkX3ByZWZpeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9hLT53cml0ZV9jaGFyYWN0ZXIoc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KCdMJykpOyAgLy8gaW50NjQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVfbnVtYmVyKHN0YXRpY19jYXN0PGludDY0X3Q+KG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIExDT1ZfRVhDTF9TVEFSVAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEpTT05fVEhST1cob3V0X29mX3JhbmdlOjpjcmVhdGUoNDA3LCAibnVtYmVyIG92ZXJmbG93IHNlcmlhbGl6aW5nICIgKyBzdGQ6OnRvX3N0cmluZyhuKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTENPVl9FWENMX1NUT1AKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBkZXRlcm1pbmUgdGhlIHR5cGUgcHJlZml4IG9mIGNvbnRhaW5lciB2YWx1ZXMKKworICAgIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbmVlZCB0byBiZSAxMDAlIGFjY3VyYXRlIHdoZW4gaXQgY29tZXMgdG8KKyAgICAgICAgICBpbnRlZ2VyIGxpbWl0cy4gSW4gY2FzZSBhIG51bWJlciBleGNlZWRzIHRoZSBsaW1pdHMgb2YgaW50NjRfdCwKKyAgICAgICAgICB0aGlzIHdpbGwgYmUgZGV0ZWN0ZWQgYnkgYSBsYXRlciBjYWxsIHRvIGZ1bmN0aW9uCisgICAgICAgICAgd3JpdGVfbnVtYmVyX3dpdGhfdWJqc29uX3ByZWZpeC4gVGhlcmVmb3JlLCB3ZSByZXR1cm4gJ0wnIGZvciBhbnkKKyAgICAgICAgICB2YWx1ZSB0aGF0IGRvZXMgbm90IGZpdCB0aGUgcHJldmlvdXMgbGltaXRzLgorICAgICovCisgICAgY2hhciB1Ympzb25fcHJlZml4KGNvbnN0IEJhc2ljSnNvblR5cGUmIGopIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICBzd2l0Y2ggKGoudHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bGw6CisgICAgICAgICAgICAgICAgcmV0dXJuICdaJzsKKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90Ojpib29sZWFuOgorICAgICAgICAgICAgICAgIHJldHVybiBqLm1fdmFsdWUuYm9vbGVhbiA/ICdUJyA6ICdGJzsKKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfaW50ZWdlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpIDw9IGoubV92YWx1ZS5udW1iZXJfaW50ZWdlciBhbmQgai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnVSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSSc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4pKCkgPD0gai5tX3ZhbHVlLm51bWJlcl9pbnRlZ2VyIGFuZCBqLm1fdmFsdWUubnVtYmVyX2ludGVnZXIgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgIC8vIG5vIGNoZWNrIGFuZCBhc3N1bWUgaW50NjRfdCAoc2VlIG5vdGUgYWJvdmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0wnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSB2YWx1ZV90OjpudW1iZXJfdW5zaWduZWQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGoubV92YWx1ZS5udW1iZXJfdW5zaWduZWQgPD0gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdpJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoai5tX3ZhbHVlLm51bWJlcl91bnNpZ25lZCA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgLy8gbm8gY2hlY2sgYW5kIGFzc3VtZSBpbnQ2NF90IChzZWUgbm90ZSBhYm92ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6Om51bWJlcl9mbG9hdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0QnOworCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OnN0cmluZzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1MnOworCisgICAgICAgICAgICBjYXNlIHZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgICAgIHJldHVybiAnWyc7CisKKyAgICAgICAgICAgIGNhc2UgdmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAneyc7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBkaXNjYXJkZWQgdmFsdWVzCisgICAgICAgICAgICAgICAgcmV0dXJuICdOJzsKKyAgICAgICAgfQorICAgIH0KKwogICBwcml2YXRlOgogICAgIC8vLyB3aGV0aGVyIHdlIGNhbiBhc3N1bWUgbGl0dGxlIGVuZGlhbmVzcwogICAgIGNvbnN0IGJvb2wgaXNfbGl0dGxlX2VuZGlhbiA9IGJpbmFyeV9yZWFkZXI8QmFzaWNKc29uVHlwZT46OmxpdHRsZV9lbmRpYW5lc3MoKTsKQEAgLTYwNjUsNyArNzA5MCwxMTQwIEBACiAgICAgLy8vIHRoZSBvdXRwdXQKICAgICBvdXRwdXRfYWRhcHRlcl90PENoYXJUeXBlPiBvYSA9IG51bGxwdHI7CiB9OworfQorfQogCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL291dHB1dC9zZXJpYWxpemVyLmhwcD4KKworCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyByZXZlcnNlLCByZW1vdmUsIGZpbGwsIGZpbmQsIG5vbmVfb2YKKyNpbmNsdWRlIDxhcnJheT4gLy8gYXJyYXkKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBhbmQsIG9yCisjaW5jbHVkZSA8Y2xvY2FsZT4gLy8gbG9jYWxlY29udiwgbGNvbnYKKyNpbmNsdWRlIDxjbWF0aD4gLy8gbGFicywgaXNmaW5pdGUsIGlzbmFuLCBzaWduYml0CisjaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gc2l6ZV90LCBwdHJkaWZmX3QKKyNpbmNsdWRlIDxjc3RkaW50PiAvLyB1aW50OF90CisjaW5jbHVkZSA8Y3N0ZGlvPiAvLyBzbnByaW50ZgorI2luY2x1ZGUgPGlvbWFuaXA+IC8vIHNldGZpbGwKKyNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gbmV4dAorI2luY2x1ZGUgPGxpbWl0cz4gLy8gbnVtZXJpY19saW1pdHMKKyNpbmNsdWRlIDxzdHJpbmc+IC8vIHN0cmluZworI2luY2x1ZGUgPHNzdHJlYW0+IC8vIHN0cmluZ3N0cmVhbQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBpc19zYW1lCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvdG9fY2hhcnMuaHBwPgorCisKKyNpbmNsdWRlIDxjYXNzZXJ0PiAvLyBhc3NlcnQKKyNpbmNsdWRlIDxjaXNvNjQ2PiAvLyBvciwgYW5kLCBub3QKKyNpbmNsdWRlIDxjbWF0aD4gICAvLyBzaWduYml0LCBpc2Zpbml0ZQorI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIGludE5fdCwgdWludE5fdAorI2luY2x1ZGUgPGNzdHJpbmc+IC8vIG1lbWNweSwgbWVtbW92ZQorCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKworLyohCitAYnJpZWYgaW1wbGVtZW50cyB0aGUgR3Jpc3UyIGFsZ29yaXRobSBmb3IgYmluYXJ5IHRvIGRlY2ltYWwgZmxvYXRpbmctcG9pbnQKK2NvbnZlcnNpb24uCisKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSByZWZlcmVuY2UKK2ltcGxlbWVudGF0aW9uIHdoaWNoIG1heSBiZSBvYnRhaW5lZCBmcm9tCitodHRwOi8vZmxvcmlhbi5sb2l0c2NoLmNvbS9wdWJsaWNhdGlvbnMgKGJlbmNoLnRhci5neikuCisKK1RoZSBjb2RlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgQ29weXJpZ2h0IChjKSAyMDA5IEZsb3JpYW4gTG9pdHNjaC4KKworRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBzZWU6CisKK1sxXSBMb2l0c2NoLCAiUHJpbnRpbmcgRmxvYXRpbmctUG9pbnQgTnVtYmVycyBRdWlja2x5IGFuZCBBY2N1cmF0ZWx5IHdpdGgKKyAgICBJbnRlZ2VycyIsIFByb2NlZWRpbmdzIG9mIHRoZSBBQ00gU0lHUExBTiAyMDEwIENvbmZlcmVuY2Ugb24gUHJvZ3JhbW1pbmcKKyAgICBMYW5ndWFnZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uLCBQTERJIDIwMTAKK1syXSBCdXJnZXIsIER5YnZpZywgIlByaW50aW5nIEZsb2F0aW5nLVBvaW50IE51bWJlcnMgUXVpY2tseSBhbmQgQWNjdXJhdGVseSIsCisgICAgUHJvY2VlZGluZ3Mgb2YgdGhlIEFDTSBTSUdQTEFOIDE5OTYgQ29uZmVyZW5jZSBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZQorICAgIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24sIFBMREkgMTk5NgorKi8KK25hbWVzcGFjZSBkdG9hX2ltcGwKK3sKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRhcmdldCwgdHlwZW5hbWUgU291cmNlPgorVGFyZ2V0IHJlaW50ZXJwcmV0X2JpdHMoY29uc3QgU291cmNlIHNvdXJjZSkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUYXJnZXQpID09IHNpemVvZihTb3VyY2UpLCAic2l6ZSBtaXNtYXRjaCIpOworCisgICAgVGFyZ2V0IHRhcmdldDsKKyAgICBzdGQ6Om1lbWNweSgmdGFyZ2V0LCAmc291cmNlLCBzaXplb2YoU291cmNlKSk7CisgICAgcmV0dXJuIHRhcmdldDsKK30KKworc3RydWN0IGRpeWZwIC8vIGYgKiAyXmUKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrUHJlY2lzaW9uID0gNjQ7IC8vID0gcQorCisgICAgdWludDY0X3QgZjsKKyAgICBpbnQgZTsKKworICAgIGNvbnN0ZXhwciBkaXlmcCgpIG5vZXhjZXB0IDogZigwKSwgZSgwKSB7fQorICAgIGNvbnN0ZXhwciBkaXlmcCh1aW50NjRfdCBmXywgaW50IGVfKSBub2V4Y2VwdCA6IGYoZl8pLCBlKGVfKSB7fQorCisgICAgLyohCisgICAgQGJyaWVmIHJldHVybnMgeCAtIHkKKyAgICBAcHJlIHguZSA9PSB5LmUgYW5kIHguZiA+PSB5LmYKKyAgICAqLworICAgIHN0YXRpYyBkaXlmcCBzdWIoY29uc3QgZGl5ZnAmIHgsIGNvbnN0IGRpeWZwJiB5KSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgYXNzZXJ0KHguZSA9PSB5LmUpOworICAgICAgICBhc3NlcnQoeC5mID49IHkuZik7CisKKyAgICAgICAgcmV0dXJuIGRpeWZwKHguZiAtIHkuZiwgeC5lKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgcmV0dXJucyB4ICogeQorICAgIEBub3RlIFRoZSByZXN1bHQgaXMgcm91bmRlZC4gKE9ubHkgdGhlIHVwcGVyIHEgYml0cyBhcmUgcmV0dXJuZWQuKQorICAgICovCisgICAgc3RhdGljIGRpeWZwIG11bChjb25zdCBkaXlmcCYgeCwgY29uc3QgZGl5ZnAmIHkpIG5vZXhjZXB0CisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGtQcmVjaXNpb24gPT0gNjQsICJpbnRlcm5hbCBlcnJvciIpOworCisgICAgICAgIC8vIENvbXB1dGVzOgorICAgICAgICAvLyAgZiA9IHJvdW5kKCh4LmYgKiB5LmYpIC8gMl5xKQorICAgICAgICAvLyAgZSA9IHguZSArIHkuZSArIHEKKworICAgICAgICAvLyBFbXVsYXRlIHRoZSA2NC1iaXQgKiA2NC1iaXQgbXVsdGlwbGljYXRpb246CisgICAgICAgIC8vCisgICAgICAgIC8vIHAgPSB1ICogdgorICAgICAgICAvLyAgID0gKHVfbG8gKyAyXjMyIHVfaGkpICh2X2xvICsgMl4zMiB2X2hpKQorICAgICAgICAvLyAgID0gKHVfbG8gdl9sbyAgICAgICAgICkgKyAyXjMyICgodV9sbyB2X2hpICAgICAgICAgKSArICh1X2hpIHZfbG8gICAgICAgICApKSArIDJeNjQgKHVfaGkgdl9oaSAgICAgICAgICkKKyAgICAgICAgLy8gICA9IChwMCAgICAgICAgICAgICAgICApICsgMl4zMiAoKHAxICAgICAgICAgICAgICAgICkgKyAocDIgICAgICAgICAgICAgICAgKSkgKyAyXjY0IChwMyAgICAgICAgICAgICAgICApCisgICAgICAgIC8vICAgPSAocDBfbG8gKyAyXjMyIHAwX2hpKSArIDJeMzIgKChwMV9sbyArIDJeMzIgcDFfaGkpICsgKHAyX2xvICsgMl4zMiBwMl9oaSkpICsgMl42NCAocDMgICAgICAgICAgICAgICAgKQorICAgICAgICAvLyAgID0gKHAwX2xvICAgICAgICAgICAgICkgKyAyXjMyIChwMF9oaSArIHAxX2xvICsgcDJfbG8gICAgICAgICAgICAgICAgICAgICAgKSArIDJeNjQgKHAxX2hpICsgcDJfaGkgKyBwMykKKyAgICAgICAgLy8gICA9IChwMF9sbyAgICAgICAgICAgICApICsgMl4zMiAoUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAyXjY0IChIICAgICAgICAgICAgICAgICApCisgICAgICAgIC8vICAgPSAocDBfbG8gICAgICAgICAgICAgKSArIDJeMzIgKFFfbG8gKyAyXjMyIFFfaGkgICAgICAgICAgICAgICAgICAgICAgICAgICApICsgMl42NCAoSCAgICAgICAgICAgICAgICAgKQorICAgICAgICAvLworICAgICAgICAvLyAoU2luY2UgUSBtaWdodCBiZSBsYXJnZXIgdGhhbiAyXjMyIC0gMSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICA9IChwMF9sbyArIDJeMzIgUV9sbykgKyAyXjY0IChRX2hpICsgSCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKFFfaGkgKyBIIGRvZXMgbm90IG92ZXJmbG93IGEgNjQtYml0IGludCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICA9IHBfbG8gKyAyXjY0IHBfaGkKKworICAgICAgICBjb25zdCB1aW50NjRfdCB1X2xvID0geC5mICYgMHhGRkZGRkZGRjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgdV9oaSA9IHguZiA+PiAzMjsKKyAgICAgICAgY29uc3QgdWludDY0X3Qgdl9sbyA9IHkuZiAmIDB4RkZGRkZGRkY7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHZfaGkgPSB5LmYgPj4gMzI7CisKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDAgPSB1X2xvICogdl9sbzsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDEgPSB1X2xvICogdl9oaTsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDIgPSB1X2hpICogdl9sbzsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDMgPSB1X2hpICogdl9oaTsKKworICAgICAgICBjb25zdCB1aW50NjRfdCBwMF9oaSA9IHAwID4+IDMyOworICAgICAgICBjb25zdCB1aW50NjRfdCBwMV9sbyA9IHAxICYgMHhGRkZGRkZGRjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDFfaGkgPSBwMSA+PiAzMjsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcDJfbG8gPSBwMiAmIDB4RkZGRkZGRkY7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHAyX2hpID0gcDIgPj4gMzI7CisKKyAgICAgICAgdWludDY0X3QgUSA9IHAwX2hpICsgcDFfbG8gKyBwMl9sbzsKKworICAgICAgICAvLyBUaGUgZnVsbCBwcm9kdWN0IG1pZ2h0IG5vdyBiZSBjb21wdXRlZCBhcworICAgICAgICAvLworICAgICAgICAvLyBwX2hpID0gcDMgKyBwMl9oaSArIHAxX2hpICsgKFEgPj4gMzIpCisgICAgICAgIC8vIHBfbG8gPSBwMF9sbyArIChRIDw8IDMyKQorICAgICAgICAvLworICAgICAgICAvLyBCdXQgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgaGVyZSwgdGhlIGZ1bGwgcF9sbyBpcyBub3QgcmVxdWlyZWQuCisgICAgICAgIC8vIEVmZmVjdGl2ZWx5IHdlIG9ubHkgbmVlZCB0byBhZGQgdGhlIGhpZ2hlc3QgYml0IGluIHBfbG8gdG8gcF9oaSAoYW5kCisgICAgICAgIC8vIFFfaGkgKyAxIGRvZXMgbm90IG92ZXJmbG93KS4KKworICAgICAgICBRICs9IHVpbnQ2NF90ezF9IDw8ICg2NCAtIDMyIC0gMSk7IC8vIHJvdW5kLCB0aWVzIHVwCisKKyAgICAgICAgY29uc3QgdWludDY0X3QgaCA9IHAzICsgcDJfaGkgKyBwMV9oaSArIChRID4+IDMyKTsKKworICAgICAgICByZXR1cm4gZGl5ZnAoaCwgeC5lICsgeS5lICsgNjQpOworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBub3JtYWxpemUgeCBzdWNoIHRoYXQgdGhlIHNpZ25pZmljYW5kIGlzID49IDJeKHEtMSkKKyAgICBAcHJlIHguZiAhPSAwCisgICAgKi8KKyAgICBzdGF0aWMgZGl5ZnAgbm9ybWFsaXplKGRpeWZwIHgpIG5vZXhjZXB0CisgICAgeworICAgICAgICBhc3NlcnQoeC5mICE9IDApOworCisgICAgICAgIHdoaWxlICgoeC5mID4+IDYzKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB4LmYgPDw9IDE7CisgICAgICAgICAgICB4LmUtLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIQorICAgIEBicmllZiBub3JtYWxpemUgeCBzdWNoIHRoYXQgdGhlIHJlc3VsdCBoYXMgdGhlIGV4cG9uZW50IEUKKyAgICBAcHJlIGUgPj0geC5lIGFuZCB0aGUgdXBwZXIgZSAtIHguZSBiaXRzIG9mIHguZiBtdXN0IGJlIHplcm8uCisgICAgKi8KKyAgICBzdGF0aWMgZGl5ZnAgbm9ybWFsaXplX3RvKGNvbnN0IGRpeWZwJiB4LCBjb25zdCBpbnQgdGFyZ2V0X2V4cG9uZW50KSBub2V4Y2VwdAorICAgIHsKKyAgICAgICAgY29uc3QgaW50IGRlbHRhID0geC5lIC0gdGFyZ2V0X2V4cG9uZW50OworCisgICAgICAgIGFzc2VydChkZWx0YSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KCgoeC5mIDw8IGRlbHRhKSA+PiBkZWx0YSkgPT0geC5mKTsKKworICAgICAgICByZXR1cm4gZGl5ZnAoeC5mIDw8IGRlbHRhLCB0YXJnZXRfZXhwb25lbnQpOworICAgIH0KK307CisKK3N0cnVjdCBib3VuZGFyaWVzCit7CisgICAgZGl5ZnAgdzsKKyAgICBkaXlmcCBtaW51czsKKyAgICBkaXlmcCBwbHVzOworfTsKKworLyohCitDb21wdXRlIHRoZSAobm9ybWFsaXplZCkgZGl5ZnAgcmVwcmVzZW50aW5nIHRoZSBpbnB1dCBudW1iZXIgJ3ZhbHVlJyBhbmQgaXRzCitib3VuZGFyaWVzLgorCitAcHJlIHZhbHVlIG11c3QgYmUgZmluaXRlIGFuZCBwb3NpdGl2ZQorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGbG9hdFR5cGU+Citib3VuZGFyaWVzIGNvbXB1dGVfYm91bmRhcmllcyhGbG9hdFR5cGUgdmFsdWUpCit7CisgICAgYXNzZXJ0KHN0ZDo6aXNmaW5pdGUodmFsdWUpKTsKKyAgICBhc3NlcnQodmFsdWUgPiAwKTsKKworICAgIC8vIENvbnZlcnQgdGhlIElFRUUgcmVwcmVzZW50YXRpb24gaW50byBhIGRpeWZwLgorICAgIC8vCisgICAgLy8gSWYgdiBpcyBkZW5vcm1hbDoKKyAgICAvLyAgICAgIHZhbHVlID0gMC5GICogMl4oMSAtIGJpYXMpID0gKCAgICAgICAgICBGKSAqIDJeKDEgLSBiaWFzIC0gKHAtMSkpCisgICAgLy8gSWYgdiBpcyBub3JtYWxpemVkOgorICAgIC8vICAgICAgdmFsdWUgPSAxLkYgKiAyXihFIC0gYmlhcykgPSAoMl4ocC0xKSArIEYpICogMl4oRSAtIGJpYXMgLSAocC0xKSkKKworICAgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+Ojppc19pZWM1NTksCisgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGR0b2Ffc2hvcnQgcmVxdWlyZXMgYW4gSUVFRS03NTQgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24iKTsKKworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrUHJlY2lzaW9uID0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHM7IC8vID0gcCAoaW5jbHVkZXMgdGhlIGhpZGRlbiBiaXQpCisgICAgY29uc3RleHByIGludCAgICAgIGtCaWFzICAgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0VHlwZT46Om1heF9leHBvbmVudCAtIDEgKyAoa1ByZWNpc2lvbiAtIDEpOworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrTWluRXhwICAgID0gMSAtIGtCaWFzOworICAgIGNvbnN0ZXhwciB1aW50NjRfdCBrSGlkZGVuQml0ID0gdWludDY0X3R7MX0gPDwgKGtQcmVjaXNpb24gLSAxKTsgLy8gPSAyXihwLTEpCisKKyAgICB1c2luZyBiaXRzX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPCBrUHJlY2lzaW9uID09IDI0LCB1aW50MzJfdCwgdWludDY0X3QgPjo6dHlwZTsKKworICAgIGNvbnN0IHVpbnQ2NF90IGJpdHMgPSByZWludGVycHJldF9iaXRzPGJpdHNfdHlwZT4odmFsdWUpOworICAgIGNvbnN0IHVpbnQ2NF90IEUgPSBiaXRzID4+IChrUHJlY2lzaW9uIC0gMSk7CisgICAgY29uc3QgdWludDY0X3QgRiA9IGJpdHMgJiAoa0hpZGRlbkJpdCAtIDEpOworCisgICAgY29uc3QgYm9vbCBpc19kZW5vcm1hbCA9IChFID09IDApOworICAgIGNvbnN0IGRpeWZwIHYgPSBpc19kZW5vcm1hbAorICAgICAgICAgICAgICAgICAgICA/IGRpeWZwKEYsIGtNaW5FeHApCisgICAgICAgICAgICAgICAgICAgIDogZGl5ZnAoRiArIGtIaWRkZW5CaXQsIHN0YXRpY19jYXN0PGludD4oRSkgLSBrQmlhcyk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBib3VuZGFyaWVzIG0tIGFuZCBtKyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgdmFsdWUKKyAgICAvLyB2ID0gZiAqIDJeZS4KKyAgICAvLworICAgIC8vIERldGVybWluZSB2LSBhbmQgdissIHRoZSBmbG9hdGluZy1wb2ludCBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIGlmIHYsCisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIC8vCisgICAgLy8gICAgICB2LSA9IHYgLSAyXmUgICAgICAgIGlmIGYgIT0gMl4ocC0xKSBvciBlID09IGVfbWluICAgICAgICAgICAgICAgIChBKQorICAgIC8vICAgICAgICAgPSB2IC0gMl4oZS0xKSAgICBpZiBmID09IDJeKHAtMSkgYW5kIGUgPiBlX21pbiAgICAgICAgICAgICAgICAoQikKKyAgICAvLworICAgIC8vICAgICAgdisgPSB2ICsgMl5lCisgICAgLy8KKyAgICAvLyBMZXQgbS0gPSAodi0gKyB2KSAvIDIgYW5kIG0rID0gKHYgKyB2KykgLyAyLiBBbGwgcmVhbCBudW1iZXJzIF9zdHJpY3RseV8KKyAgICAvLyBiZXR3ZWVuIG0tIGFuZCBtKyByb3VuZCB0byB2LCByZWdhcmRsZXNzIG9mIGhvdyB0aGUgaW5wdXQgcm91bmRpbmcKKyAgICAvLyBhbGdvcml0aG0gYnJlYWtzIHRpZXMuCisgICAgLy8KKyAgICAvLyAgICAgIC0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLSAgKEEpCisgICAgLy8gICAgICAgICB2LSAgICAgICAgICAgIG0tICAgICAgICAgICAgdiAgICAgICAgICAgICBtKyAgICAgICAgICAgIHYrCisgICAgLy8KKyAgICAvLyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLSAgKEIpCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIHYtICAgICBtLSAgICAgdiAgICAgICAgICAgICBtKyAgICAgICAgICAgIHYrCisKKyAgICBjb25zdCBib29sIGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlciA9IChGID09IDAgYW5kIEUgPiAxKTsKKyAgICBjb25zdCBkaXlmcCBtX3BsdXMgPSBkaXlmcCgyICogdi5mICsgMSwgdi5lIC0gMSk7CisgICAgY29uc3QgZGl5ZnAgbV9taW51cyA9IGxvd2VyX2JvdW5kYXJ5X2lzX2Nsb3NlcgorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpeWZwKDQgKiB2LmYgLSAxLCB2LmUgLSAyKSAgLy8gKEIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGl5ZnAoMiAqIHYuZiAtIDEsIHYuZSAtIDEpOyAvLyAoQSkKKworICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsaXplZCB3KyA9IG0rLgorICAgIGNvbnN0IGRpeWZwIHdfcGx1cyA9IGRpeWZwOjpub3JtYWxpemUobV9wbHVzKTsKKworICAgIC8vIERldGVybWluZSB3LSA9IG0tIHN1Y2ggdGhhdCBlXyh3LSkgPSBlXyh3KykuCisgICAgY29uc3QgZGl5ZnAgd19taW51cyA9IGRpeWZwOjpub3JtYWxpemVfdG8obV9taW51cywgd19wbHVzLmUpOworCisgICAgcmV0dXJuIHtkaXlmcDo6bm9ybWFsaXplKHYpLCB3X21pbnVzLCB3X3BsdXN9OworfQorCisvLyBHaXZlbiBub3JtYWxpemVkIGRpeWZwIHcsIEdyaXN1IG5lZWRzIHRvIGZpbmQgYSAobm9ybWFsaXplZCkgY2FjaGVkCisvLyBwb3dlci1vZi10ZW4gYywgc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCBjICogdyA9IGYgKiAyXmUgbGllcworLy8gd2l0aGluIGEgY2VydGFpbiByYW5nZSBbYWxwaGEsIGdhbW1hXSAoRGVmaW5pdGlvbiAzLjIgZnJvbSBbMV0pCisvLworLy8gICAgICBhbHBoYSA8PSBlID0gZV9jICsgZV93ICsgcSA8PSBnYW1tYQorLy8KKy8vIG9yCisvLworLy8gICAgICBmX2MgKiBmX3cgKiAyXmFscGhhIDw9IGZfYyAyXihlX2MpICogZl93IDJeKGVfdykgKiAyXnEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBmX2MgKiBmX3cgKiAyXmdhbW1hCisvLworLy8gU2luY2UgYyBhbmQgdyBhcmUgbm9ybWFsaXplZCwgaS5lLiAyXihxLTEpIDw9IGYgPCAyXnEsIHRoaXMgaW1wbGllcworLy8KKy8vICAgICAgMl4ocS0xKSAqIDJeKHEtMSkgKiAyXmFscGhhIDw9IGMgKiB3ICogMl5xIDwgMl5xICogMl5xICogMl5nYW1tYQorLy8KKy8vIG9yCisvLworLy8gICAgICAyXihxIC0gMiArIGFscGhhKSA8PSBjICogdyA8IDJeKHEgKyBnYW1tYSkKKy8vCisvLyBUaGUgY2hvaWNlIG9mIChhbHBoYSxnYW1tYSkgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgYW5kIHRoZSBmb3JtIG9mCisvLyB0aGUgZGlnaXQgZ2VuZXJhdGlvbiBwcm9jZWR1cmUuIFVzaW5nIChhbHBoYSxnYW1tYSk9KC02MCwtMzIpIHdvcmtzIG91dCB3ZWxsCisvLyBpbiBwcmFjdGljZToKKy8vCisvLyBUaGUgaWRlYSBpcyB0byBjdXQgdGhlIG51bWJlciBjICogdyA9IGYgKiAyXmUgaW50byB0d28gcGFydHMsIHdoaWNoIGNhbiBiZQorLy8gcHJvY2Vzc2VkIGluZGVwZW5kZW50bHk6IEFuIGludGVncmFsIHBhcnQgcDEsIGFuZCBhIGZyYWN0aW9uYWwgcGFydCBwMjoKKy8vCisvLyAgICAgIGYgKiAyXmUgPSAoIChmIGRpdiAyXi1lKSAqIDJeLWUgKyAoZiBtb2QgMl4tZSkgKSAqIDJeZQorLy8gICAgICAgICAgICAgID0gKGYgZGl2IDJeLWUpICsgKGYgbW9kIDJeLWUpICogMl5lCisvLyAgICAgICAgICAgICAgPSBwMSArIHAyICogMl5lCisvLworLy8gVGhlIGNvbnZlcnNpb24gb2YgcDEgaW50byBkZWNpbWFsIGZvcm0gcmVxdWlyZXMgYSBzZXJpZXMgb2YgZGl2aXNpb25zIGFuZAorLy8gbW9kdWxvcyBieSAoYSBwb3dlciBvZikgMTAuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGZhc3RlciBmb3IgMzItYml0IHRoYW4gZm9yCisvLyA2NC1iaXQgaW50ZWdlcnMsIHNvIHAxIHNob3VsZCBpZGVhbGx5IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIuIFRoaXMgY2FuIGJlCisvLyBhY2hpZXZlZCBieSBjaG9vc2luZworLy8KKy8vICAgICAgLWUgPj0gMzIgICBvciAgIGUgPD0gLTMyIDo9IGdhbW1hCisvLworLy8gSW4gb3JkZXIgdG8gY29udmVydCB0aGUgZnJhY3Rpb25hbCBwYXJ0CisvLworLy8gICAgICBwMiAqIDJeZSA9IHAyIC8gMl4tZSA9IGRbLTFdIC8gMTBeMSArIGRbLTJdIC8gMTBeMiArIC4uLgorLy8KKy8vIGludG8gZGVjaW1hbCBmb3JtLCB0aGUgZnJhY3Rpb24gaXMgcmVwZWF0ZWRseSBtdWx0aXBsaWVkIGJ5IDEwIGFuZCB0aGUgZGlnaXRzCisvLyBkWy1pXSBhcmUgZXh0cmFjdGVkIGluIG9yZGVyOgorLy8KKy8vICAgICAgKDEwICogcDIpIGRpdiAyXi1lID0gZFstMV0KKy8vICAgICAgKDEwICogcDIpIG1vZCAyXi1lID0gZFstMl0gLyAxMF4xICsgLi4uCisvLworLy8gVGhlIG11bHRpcGxpY2F0aW9uIGJ5IDEwIG11c3Qgbm90IG92ZXJmbG93LiBJdCBpcyBzdWZmaWNpZW50IHRvIGNob29zZQorLy8KKy8vICAgICAgMTAgKiBwMiA8IDE2ICogcDIgPSAyXjQgKiBwMiA8PSAyXjY0LgorLy8KKy8vIFNpbmNlIHAyID0gZiBtb2QgMl4tZSA8IDJeLWUsCisvLworLy8gICAgICAtZSA8PSA2MCAgIG9yICAgZSA+PSAtNjAgOj0gYWxwaGEKKworY29uc3RleHByIGludCBrQWxwaGEgPSAtNjA7Citjb25zdGV4cHIgaW50IGtHYW1tYSA9IC0zMjsKKworc3RydWN0IGNhY2hlZF9wb3dlciAvLyBjID0gZiAqIDJeZSB+PSAxMF5rCit7CisgICAgdWludDY0X3QgZjsKKyAgICBpbnQgZTsKKyAgICBpbnQgazsKK307CisKKy8qIQorRm9yIGEgbm9ybWFsaXplZCBkaXlmcCB3ID0gZiAqIDJeZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgKG5vcm1hbGl6ZWQpIGNhY2hlZAorcG93ZXItb2YtdGVuIGMgPSBmX2MgKiAyXmVfYywgc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCB3ICogYworc2F0aXNmaWVzIChEZWZpbml0aW9uIDMuMiBmcm9tIFsxXSkKKworICAgICBhbHBoYSA8PSBlX2MgKyBlICsgcSA8PSBnYW1tYS4KKyovCitpbmxpbmUgY2FjaGVkX3Bvd2VyIGdldF9jYWNoZWRfcG93ZXJfZm9yX2JpbmFyeV9leHBvbmVudChpbnQgZSkKK3sKKyAgICAvLyBOb3cKKyAgICAvLworICAgIC8vICAgICAgYWxwaGEgPD0gZV9jICsgZSArIHEgPD0gZ2FtbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyAgICAvLyAgICAgID09PiBmX2MgKiAyXmFscGhhIDw9IGMgKiAyXmUgKiAyXnEKKyAgICAvLworICAgIC8vIGFuZCBzaW5jZSB0aGUgYydzIGFyZSBub3JtYWxpemVkLCAyXihxLTEpIDw9IGZfYywKKyAgICAvLworICAgIC8vICAgICAgPT0+IDJeKHEgLSAxICsgYWxwaGEpIDw9IGMgKiAyXihlICsgcSkKKyAgICAvLyAgICAgID09PiAyXihhbHBoYSAtIGUgLSAxKSA8PSBjCisgICAgLy8KKyAgICAvLyBJZiBjIHdlcmUgYW4gZXhha3QgcG93ZXIgb2YgdGVuLCBpLmUuIGMgPSAxMF5rLCBvbmUgbWF5IGRldGVybWluZSBrIGFzCisgICAgLy8KKyAgICAvLyAgICAgIGsgPSBjZWlsKCBsb2dfMTAoIDJeKGFscGhhIC0gZSAtIDEpICkgKQorICAgIC8vICAgICAgICA9IGNlaWwoIChhbHBoYSAtIGUgLSAxKSAqIGxvZ18xMCgyKSApCisgICAgLy8KKyAgICAvLyBGcm9tIHRoZSBwYXBlcjoKKyAgICAvLyAiSW4gdGhlb3J5IHRoZSByZXN1bHQgb2YgdGhlIHByb2NlZHVyZSBjb3VsZCBiZSB3cm9uZyBzaW5jZSBjIGlzIHJvdW5kZWQsCisgICAgLy8gIGFuZCB0aGUgY29tcHV0YXRpb24gaXRzZWxmIGlzIGFwcHJveGltYXRlZCBbLi4uXS4gSW4gcHJhY3RpY2UsIGhvd2V2ZXIsCisgICAgLy8gIHRoaXMgc2ltcGxlIGZ1bmN0aW9uIGlzIHN1ZmZpY2llbnQuIgorICAgIC8vCisgICAgLy8gRm9yIElFRUUgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIGNvbnZlcnRlZCBpbnRvCisgICAgLy8gbm9ybWFsaXplZCBkaXlmcCdzIHcgPSBmICogMl5lLCB3aXRoIHEgPSA2NCwKKyAgICAvLworICAgIC8vICAgICAgZSA+PSAtMTAyMiAgICAgIChtaW4gSUVFRSBleHBvbmVudCkKKyAgICAvLyAgICAgICAgICAgLTUyICAgICAgICAocCAtIDEpCisgICAgLy8gICAgICAgICAgIC01MiAgICAgICAgKHAgLSAxLCBwb3NzaWJseSBub3JtYWxpemUgZGVub3JtYWwgSUVFRSBudW1iZXJzKQorICAgIC8vICAgICAgICAgICAtMTEgICAgICAgIChub3JtYWxpemUgdGhlIGRpeWZwKQorICAgIC8vICAgICAgICAgPSAtMTEzNworICAgIC8vCisgICAgLy8gYW5kCisgICAgLy8KKyAgICAvLyAgICAgIGUgPD0gKzEwMjMgICAgICAobWF4IElFRUUgZXhwb25lbnQpCisgICAgLy8gICAgICAgICAgIC01MiAgICAgICAgKHAgLSAxKQorICAgIC8vICAgICAgICAgICAtMTEgICAgICAgIChub3JtYWxpemUgdGhlIGRpeWZwKQorICAgIC8vICAgICAgICAgPSA5NjAKKyAgICAvLworICAgIC8vIFRoaXMgYmluYXJ5IGV4cG9uZW50IHJhbmdlIFstMTEzNyw5NjBdIHJlc3VsdHMgaW4gYSBkZWNpbWFsIGV4cG9uZW50CisgICAgLy8gcmFuZ2UgWy0zMDcsMzI0XS4gT25lIGRvZXMgbm90IG5lZWQgdG8gc3RvcmUgYSBjYWNoZWQgcG93ZXIgZm9yIGVhY2gKKyAgICAvLyBrIGluIHRoaXMgcmFuZ2UuIEZvciBlYWNoIHN1Y2ggayBpdCBzdWZmaWNlcyB0byBmaW5kIGEgY2FjaGVkIHBvd2VyCisgICAgLy8gc3VjaCB0aGF0IHRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdCBsaWVzIGluIFthbHBoYSxnYW1tYV0uCisgICAgLy8gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGRlY2ltYWwgZXhwb25lbnRzIG9mIGFkamFjZW50CisgICAgLy8gdGFibGUgZW50cmllcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgIC8vCisgICAgLy8gICAgICBmbG9vciggKGdhbW1hIC0gYWxwaGEpICogbG9nXzEwKDIpICkgPSA4LgorICAgIC8vCisgICAgLy8gKEEgc21hbGxlciBkaXN0YW5jZSBnYW1tYS1hbHBoYSB3b3VsZCByZXF1aXJlIGEgbGFyZ2VyIHRhYmxlLikKKworICAgIC8vIE5COgorICAgIC8vIEFjdHVhbGx5IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjLCBzdWNoIHRoYXQgLTYwIDw9IGVfYyArIGUgKyA2NCA8PSAtMzQuCisKKyAgICBjb25zdGV4cHIgaW50IGtDYWNoZWRQb3dlcnNTaXplID0gNzk7CisgICAgY29uc3RleHByIGludCBrQ2FjaGVkUG93ZXJzTWluRGVjRXhwID0gLTMwMDsKKyAgICBjb25zdGV4cHIgaW50IGtDYWNoZWRQb3dlcnNEZWNTdGVwID0gODsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgY2FjaGVkX3Bvd2VyIGtDYWNoZWRQb3dlcnNbXSA9CisgICAgeworICAgICAgICB7IDB4QUI3MEZFMTdDNzlBQzZDQSwgLTEwNjAsIC0zMDAgfSwKKyAgICAgICAgeyAweEZGNzdCMUZDQkVCQ0RDNEYsIC0xMDM0LCAtMjkyIH0sCisgICAgICAgIHsgMHhCRTU2OTFFRjQxNkJENjBDLCAtMTAwNywgLTI4NCB9LAorICAgICAgICB7IDB4OEREMDFGQUQ5MDdGRkMzQywgIC05ODAsIC0yNzYgfSwKKyAgICAgICAgeyAweEQzNTE1QzI4MzE1NTlBODMsICAtOTU0LCAtMjY4IH0sCisgICAgICAgIHsgMHg5RDcxQUM4RkFEQTZDOUI1LCAgLTkyNywgLTI2MCB9LAorICAgICAgICB7IDB4RUE5QzIyNzcyM0VFOEJDQiwgIC05MDEsIC0yNTIgfSwKKyAgICAgICAgeyAweEFFQ0M0OTkxNDA3ODUzNkQsICAtODc0LCAtMjQ0IH0sCisgICAgICAgIHsgMHg4MjNDMTI3OTVEQjZDRTU3LCAgLTg0NywgLTIzNiB9LAorICAgICAgICB7IDB4QzIxMDk0MzY0REZCNTYzNywgIC04MjEsIC0yMjggfSwKKyAgICAgICAgeyAweDkwOTZFQTZGMzg0ODk4NEYsICAtNzk0LCAtMjIwIH0sCisgICAgICAgIHsgMHhENzc0ODVDQjI1ODIzQUM3LCAgLTc2OCwgLTIxMiB9LAorICAgICAgICB7IDB4QTA4NkNGQ0Q5N0JGOTdGNCwgIC03NDEsIC0yMDQgfSwKKyAgICAgICAgeyAweEVGMzQwQTk4MTcyQUFDRTUsICAtNzE1LCAtMTk2IH0sCisgICAgICAgIHsgMHhCMjM4NjdGQjJBMzVCMjhFLCAgLTY4OCwgLTE4OCB9LAorICAgICAgICB7IDB4ODRDOEQ0REZEMkM2M0YzQiwgIC02NjEsIC0xODAgfSwKKyAgICAgICAgeyAweEM1REQ0NDI3MUFEM0NEQkEsICAtNjM1LCAtMTcyIH0sCisgICAgICAgIHsgMHg5MzZCOUZDRUJCMjVDOTk2LCAgLTYwOCwgLTE2NCB9LAorICAgICAgICB7IDB4REJBQzZDMjQ3RDYyQTU4NCwgIC01ODIsIC0xNTYgfSwKKyAgICAgICAgeyAweEEzQUI2NjU4MEQ1RkRBRjYsICAtNTU1LCAtMTQ4IH0sCisgICAgICAgIHsgMHhGM0UyRjg5M0RFQzNGMTI2LCAgLTUyOSwgLTE0MCB9LAorICAgICAgICB7IDB4QjVCNUFEQThBQUZGODBCOCwgIC01MDIsIC0xMzIgfSwKKyAgICAgICAgeyAweDg3NjI1RjA1NkM3QzRBOEIsICAtNDc1LCAtMTI0IH0sCisgICAgICAgIHsgMHhDOUJDRkY2MDM0QzEzMDUzLCAgLTQ0OSwgLTExNiB9LAorICAgICAgICB7IDB4OTY0RTg1OEM5MUJBMjY1NSwgIC00MjIsIC0xMDggfSwKKyAgICAgICAgeyAweERGRjk3NzI0NzAyOTdFQkQsICAtMzk2LCAtMTAwIH0sCisgICAgICAgIHsgMHhBNkRGQkQ5RkI4RTVCODhGLCAgLTM2OSwgIC05MiB9LAorICAgICAgICB7IDB4RjhBOTVGQ0Y4ODc0N0Q5NCwgIC0zNDMsICAtODQgfSwKKyAgICAgICAgeyAweEI5NDQ3MDkzOEZBODlCQ0YsICAtMzE2LCAgLTc2IH0sCisgICAgICAgIHsgMHg4QTA4RjBGOEJGMEYxNTZCLCAgLTI4OSwgIC02OCB9LAorICAgICAgICB7IDB4Q0RCMDI1NTU2NTMxMzFCNiwgIC0yNjMsICAtNjAgfSwKKyAgICAgICAgeyAweDk5M0ZFMkM2RDA3QjdGQUMsICAtMjM2LCAgLTUyIH0sCisgICAgICAgIHsgMHhFNDVDMTBDNDJBMkIzQjA2LCAgLTIxMCwgIC00NCB9LAorICAgICAgICB7IDB4QUEyNDI0OTk2OTczOTJEMywgIC0xODMsICAtMzYgfSwKKyAgICAgICAgeyAweEZEODdCNUYyODMwMENBMEUsICAtMTU3LCAgLTI4IH0sCisgICAgICAgIHsgMHhCQ0U1MDg2NDkyMTExQUVCLCAgLTEzMCwgIC0yMCB9LAorICAgICAgICB7IDB4OENCQ0NDMDk2RjUwODhDQywgIC0xMDMsICAtMTIgfSwKKyAgICAgICAgeyAweEQxQjcxNzU4RTIxOTY1MkMsICAgLTc3LCAgIC00IH0sCisgICAgICAgIHsgMHg5QzQwMDAwMDAwMDAwMDAwLCAgIC01MCwgICAgNCB9LAorICAgICAgICB7IDB4RThENEE1MTAwMDAwMDAwMCwgICAtMjQsICAgMTIgfSwKKyAgICAgICAgeyAweEFENzhFQkM1QUM2MjAwMDAsICAgICAzLCAgIDIwIH0sCisgICAgICAgIHsgMHg4MTNGMzk3OEY4OTQwOTg0LCAgICAzMCwgICAyOCB9LAorICAgICAgICB7IDB4QzA5N0NFN0JDOTA3MTVCMywgICAgNTYsICAgMzYgfSwKKyAgICAgICAgeyAweDhGN0UzMkNFN0JFQTVDNzAsICAgIDgzLCAgIDQ0IH0sCisgICAgICAgIHsgMHhENUQyMzhBNEFCRTk4MDY4LCAgIDEwOSwgICA1MiB9LAorICAgICAgICB7IDB4OUY0RjI3MjYxNzlBMjI0NSwgICAxMzYsICAgNjAgfSwKKyAgICAgICAgeyAweEVENjNBMjMxRDRDNEZCMjcsICAgMTYyLCAgIDY4IH0sCisgICAgICAgIHsgMHhCMERFNjUzODhDQzhBREE4LCAgIDE4OSwgICA3NiB9LAorICAgICAgICB7IDB4ODNDNzA4OEUxQUFCNjVEQiwgICAyMTYsICAgODQgfSwKKyAgICAgICAgeyAweEM0NUQxREY5NDI3MTFEOUEsICAgMjQyLCAgIDkyIH0sCisgICAgICAgIHsgMHg5MjRENjkyQ0E2MUJFNzU4LCAgIDI2OSwgIDEwMCB9LAorICAgICAgICB7IDB4REEwMUVFNjQxQTcwOERFQSwgICAyOTUsICAxMDggfSwKKyAgICAgICAgeyAweEEyNkRBMzk5OUFFRjc3NEEsICAgMzIyLCAgMTE2IH0sCisgICAgICAgIHsgMHhGMjA5Nzg3QkI0N0Q2Qjg1LCAgIDM0OCwgIDEyNCB9LAorICAgICAgICB7IDB4QjQ1NEU0QTE3OUREMTg3NywgICAzNzUsICAxMzIgfSwKKyAgICAgICAgeyAweDg2NUI4NjkyNUI5QkM1QzIsICAgNDAyLCAgMTQwIH0sCisgICAgICAgIHsgMHhDODM1NTNDNUM4OTY1RDNELCAgIDQyOCwgIDE0OCB9LAorICAgICAgICB7IDB4OTUyQUI0NUNGQTk3QTBCMywgICA0NTUsICAxNTYgfSwKKyAgICAgICAgeyAweERFNDY5RkJEOTlBMDVGRTMsICAgNDgxLCAgMTY0IH0sCisgICAgICAgIHsgMHhBNTlCQzIzNERCMzk4QzI1LCAgIDUwOCwgIDE3MiB9LAorICAgICAgICB7IDB4RjZDNjlBNzJBMzk4OUY1QywgICA1MzQsICAxODAgfSwKKyAgICAgICAgeyAweEI3RENCRjUzNTRFOUJFQ0UsICAgNTYxLCAgMTg4IH0sCisgICAgICAgIHsgMHg4OEZDRjMxN0YyMjI0MUUyLCAgIDU4OCwgIDE5NiB9LAorICAgICAgICB7IDB4Q0MyMENFOUJEMzVDNzhBNSwgICA2MTQsICAyMDQgfSwKKyAgICAgICAgeyAweDk4MTY1QUYzN0IyMTUzREYsICAgNjQxLCAgMjEyIH0sCisgICAgICAgIHsgMHhFMkEwQjVEQzk3MUYzMDNBLCAgIDY2NywgIDIyMCB9LAorICAgICAgICB7IDB4QThEOUQxNTM1Q0UzQjM5NiwgICA2OTQsICAyMjggfSwKKyAgICAgICAgeyAweEZCOUI3Q0Q5QTRBNzQ0M0MsICAgNzIwLCAgMjM2IH0sCisgICAgICAgIHsgMHhCQjc2NEM0Q0E3QTQ0NDEwLCAgIDc0NywgIDI0NCB9LAorICAgICAgICB7IDB4OEJBQjhFRUZCNjQwOUMxQSwgICA3NzQsICAyNTIgfSwKKyAgICAgICAgeyAweEQwMUZFRjEwQTY1Nzg0MkMsICAgODAwLCAgMjYwIH0sCisgICAgICAgIHsgMHg5QjEwQTRFNUU5OTEzMTI5LCAgIDgyNywgIDI2OCB9LAorICAgICAgICB7IDB4RTcxMDlCRkJBMTlDMEM5RCwgICA4NTMsICAyNzYgfSwKKyAgICAgICAgeyAweEFDMjgyMEQ5NjIzQkY0MjksICAgODgwLCAgMjg0IH0sCisgICAgICAgIHsgMHg4MDQ0NEI1RTdBQTdDRjg1LCAgIDkwNywgIDI5MiB9LAorICAgICAgICB7IDB4QkYyMUU0NDAwM0FDREQyRCwgICA5MzMsICAzMDAgfSwKKyAgICAgICAgeyAweDhFNjc5QzJGNUU0NEZGOEYsICAgOTYwLCAgMzA4IH0sCisgICAgICAgIHsgMHhENDMzMTc5RDlDOENCODQxLCAgIDk4NiwgIDMxNiB9LAorICAgICAgICB7IDB4OUUxOURCOTJCNEUzMUJBOSwgIDEwMTMsICAzMjQgfSwKKyAgICB9OworCisgICAgLy8gVGhpcyBjb21wdXRhdGlvbiBnaXZlcyBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdHMgZm9yIGsgYXMKKyAgICAvLyAgICAgIGsgPSBjZWlsKChrQWxwaGEgLSBlIC0gMSkgKiAwLjMwMTAyOTk5NTY2Mzk4MTE0KQorICAgIC8vIGZvciB8ZXwgPD0gMTUwMCwgYnV0IGRvZXNuJ3QgcmVxdWlyZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zLgorICAgIC8vIE5COiBsb2dfMTAoMikgfj0gNzg5MTMgLyAyXjE4CisgICAgYXNzZXJ0KGUgPj0gLTE1MDApOworICAgIGFzc2VydChlIDw9ICAxNTAwKTsKKyAgICBjb25zdCBpbnQgZiA9IGtBbHBoYSAtIGUgLSAxOworICAgIGNvbnN0IGludCBrID0gKGYgKiA3ODkxMykgLyAoMSA8PCAxOCkgKyAoZiA+IDApOworCisgICAgY29uc3QgaW50IGluZGV4ID0gKC1rQ2FjaGVkUG93ZXJzTWluRGVjRXhwICsgayArIChrQ2FjaGVkUG93ZXJzRGVjU3RlcCAtIDEpKSAvIGtDYWNoZWRQb3dlcnNEZWNTdGVwOworICAgIGFzc2VydChpbmRleCA+PSAwKTsKKyAgICBhc3NlcnQoaW5kZXggPCBrQ2FjaGVkUG93ZXJzU2l6ZSk7CisgICAgc3RhdGljX2Nhc3Q8dm9pZD4oa0NhY2hlZFBvd2Vyc1NpemUpOyAvLyBGaXggd2FybmluZy4KKworICAgIGNvbnN0IGNhY2hlZF9wb3dlciBjYWNoZWQgPSBrQ2FjaGVkUG93ZXJzW2luZGV4XTsKKyAgICBhc3NlcnQoa0FscGhhIDw9IGNhY2hlZC5lICsgZSArIDY0KTsKKyAgICBhc3NlcnQoa0dhbW1hID49IGNhY2hlZC5lICsgZSArIDY0KTsKKworICAgIHJldHVybiBjYWNoZWQ7Cit9CisKKy8qIQorRm9yIG4gIT0gMCwgcmV0dXJucyBrLCBzdWNoIHRoYXQgcG93MTAgOj0gMTBeKGstMSkgPD0gbiA8IDEwXmsuCitGb3IgbiA9PSAwLCByZXR1cm5zIDEgYW5kIHNldHMgcG93MTAgOj0gMS4KKyovCitpbmxpbmUgaW50IGZpbmRfbGFyZ2VzdF9wb3cxMChjb25zdCB1aW50MzJfdCBuLCB1aW50MzJfdCYgcG93MTApCit7CisgICAgLy8gTENPVl9FWENMX1NUQVJUCisgICAgaWYgKG4gPj0gMTAwMDAwMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDAwMDAwMDsKKyAgICAgICAgcmV0dXJuIDEwOworICAgIH0KKyAgICAvLyBMQ09WX0VYQ0xfU1RPUAorICAgIGVsc2UgaWYgKG4gPj0gMTAwMDAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDAwMDA7CisgICAgICAgIHJldHVybiAgOTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDAwMDA7CisgICAgICAgIHJldHVybiAgODsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDAwOworICAgICAgICByZXR1cm4gIDc7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPj0gMTAwMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwMDA7CisgICAgICAgIHJldHVybiAgNjsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTAwMDA7CisgICAgICAgIHJldHVybiAgNTsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMDAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDAwOworICAgICAgICByZXR1cm4gIDQ7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPj0gMTAwKQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxMDA7CisgICAgICAgIHJldHVybiAgMzsKKyAgICB9CisgICAgZWxzZSBpZiAobiA+PSAxMCkKKyAgICB7CisgICAgICAgIHBvdzEwID0gMTA7CisgICAgICAgIHJldHVybiAgMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG93MTAgPSAxOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIGdyaXN1Ml9yb3VuZChjaGFyKiBidWYsIGludCBsZW4sIHVpbnQ2NF90IGRpc3QsIHVpbnQ2NF90IGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHJlc3QsIHVpbnQ2NF90IHRlbl9rKQoreworICAgIGFzc2VydChsZW4gPj0gMSk7CisgICAgYXNzZXJ0KGRpc3QgPD0gZGVsdGEpOworICAgIGFzc2VydChyZXN0IDw9IGRlbHRhKTsKKyAgICBhc3NlcnQodGVuX2sgPiAwKTsKKworICAgIC8vICAgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWx0YSAtLS0tPgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIGRpc3QgLS0tLS0tLS0tPgorICAgIC8vIC0tLS0tLS0tLS0tLS0tWy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tXS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgICBNLSAgICAgICAgICAgICAgICAgdyAgICAgICAgICAgICAgICAgICBNKworICAgIC8vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuX2sKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLT4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIHJlc3QgLS0tLT4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLVstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLV0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgICAgVgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBidWYgKiAxMF5rCisgICAgLy8KKyAgICAvLyB0ZW5fayByZXByZXNlbnRzIGEgdW5pdC1pbi10aGUtbGFzdC1wbGFjZSBpbiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbgorICAgIC8vIHN0b3JlZCBpbiBidWYuCisgICAgLy8gRGVjcmVtZW50IGJ1ZiBieSB0ZW5fayB3aGlsZSB0aGlzIHRha2VzIGJ1ZiBjbG9zZXIgdG8gdy4KKworICAgIC8vIFRoZSB0ZXN0cyBhcmUgd3JpdHRlbiBpbiB0aGlzIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93IGluIHVuc2lnbmVkCisgICAgLy8gaW50ZWdlciBhcml0aG1ldGljLgorCisgICAgd2hpbGUgKHJlc3QgPCBkaXN0CisgICAgICAgICAgICBhbmQgZGVsdGEgLSByZXN0ID49IHRlbl9rCisgICAgICAgICAgICBhbmQgKHJlc3QgKyB0ZW5fayA8IGRpc3Qgb3IgZGlzdCAtIHJlc3QgPiByZXN0ICsgdGVuX2sgLSBkaXN0KSkKKyAgICB7CisgICAgICAgIGFzc2VydChidWZbbGVuIC0gMV0gIT0gJzAnKTsKKyAgICAgICAgYnVmW2xlbiAtIDFdLS07CisgICAgICAgIHJlc3QgKz0gdGVuX2s7CisgICAgfQorfQorCisvKiEKK0dlbmVyYXRlcyBWID0gYnVmZmVyICogMTBeZGVjaW1hbF9leHBvbmVudCwgc3VjaCB0aGF0IE0tIDw9IFYgPD0gTSsuCitNLSBhbmQgTSsgbXVzdCBiZSBub3JtYWxpemVkIGFuZCBzaGFyZSB0aGUgc2FtZSBleHBvbmVudCAtNjAgPD0gZSA8PSAtMzIuCisqLworaW5saW5lIHZvaWQgZ3Jpc3UyX2RpZ2l0X2dlbihjaGFyKiBidWZmZXIsIGludCYgbGVuZ3RoLCBpbnQmIGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpeWZwIE1fbWludXMsIGRpeWZwIHcsIGRpeWZwIE1fcGx1cykKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KGtBbHBoYSA+PSAtNjAsICJpbnRlcm5hbCBlcnJvciIpOworICAgIHN0YXRpY19hc3NlcnQoa0dhbW1hIDw9IC0zMiwgImludGVybmFsIGVycm9yIik7CisKKyAgICAvLyBHZW5lcmF0ZXMgdGhlIGRpZ2l0cyAoYW5kIHRoZSBleHBvbmVudCkgb2YgYSBkZWNpbWFsIGZsb2F0aW5nLXBvaW50CisgICAgLy8gbnVtYmVyIFYgPSBidWZmZXIgKiAxMF5kZWNpbWFsX2V4cG9uZW50IGluIHRoZSByYW5nZSBbTS0sIE0rXS4gVGhlIGRpeWZwJ3MKKyAgICAvLyB3LCBNLSBhbmQgTSsgc2hhcmUgdGhlIHNhbWUgZXhwb25lbnQgZSwgd2hpY2ggc2F0aXNmaWVzIGFscGhhIDw9IGUgPD0gZ2FtbWEuCisgICAgLy8KKyAgICAvLyAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVsdGEgLS0tLT4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSBkaXN0IC0tLS0tLS0tLT4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLVstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLV0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgTS0gICAgICAgICAgICAgICAgIHcgICAgICAgICAgICAgICAgICAgTSsKKyAgICAvLworICAgIC8vIEdyaXN1MiBnZW5lcmF0ZXMgdGhlIGRpZ2l0cyBvZiBNKyBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHN0b3BzIGFzIHNvb24gYXMKKyAgICAvLyBWIGlzIGluIFtNLSxNK10uCisKKyAgICBhc3NlcnQoTV9wbHVzLmUgPj0ga0FscGhhKTsKKyAgICBhc3NlcnQoTV9wbHVzLmUgPD0ga0dhbW1hKTsKKworICAgIHVpbnQ2NF90IGRlbHRhID0gZGl5ZnA6OnN1YihNX3BsdXMsIE1fbWludXMpLmY7IC8vIChzaWduaWZpY2FuZCBvZiAoTSsgLSBNLSksIGltcGxpY2l0IGV4cG9uZW50IGlzIGUpCisgICAgdWludDY0X3QgZGlzdCAgPSBkaXlmcDo6c3ViKE1fcGx1cywgdyAgICAgICkuZjsgLy8gKHNpZ25pZmljYW5kIG9mIChNKyAtIHcgKSwgaW1wbGljaXQgZXhwb25lbnQgaXMgZSkKKworICAgIC8vIFNwbGl0IE0rID0gZiAqIDJeZSBpbnRvIHR3byBwYXJ0cyBwMSBhbmQgcDIgKG5vdGU6IGUgPCAwKToKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBmICogMl5lCisgICAgLy8gICAgICAgICA9ICgoZiBkaXYgMl4tZSkgKiAyXi1lICsgKGYgbW9kIDJeLWUpKSAqIDJeZQorICAgIC8vICAgICAgICAgPSAoKHAxICAgICAgICApICogMl4tZSArIChwMiAgICAgICAgKSkgKiAyXmUKKyAgICAvLyAgICAgICAgID0gcDEgKyBwMiAqIDJeZQorCisgICAgY29uc3QgZGl5ZnAgb25lKHVpbnQ2NF90ezF9IDw8IC1NX3BsdXMuZSwgTV9wbHVzLmUpOworCisgICAgdWludDMyX3QgcDEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTV9wbHVzLmYgPj4gLW9uZS5lKTsgLy8gcDEgPSBmIGRpdiAyXi1lIChTaW5jZSAtZSA+PSAzMiwgcDEgZml0cyBpbnRvIGEgMzItYml0IGludC4pCisgICAgdWludDY0X3QgcDIgPSBNX3BsdXMuZiAmIChvbmUuZiAtIDEpOyAgICAgICAgICAgICAgICAgICAgLy8gcDIgPSBmIG1vZCAyXi1lCisKKyAgICAvLyAxKQorICAgIC8vCisgICAgLy8gR2VuZXJhdGUgdGhlIGRpZ2l0cyBvZiB0aGUgaW50ZWdyYWwgcGFydCBwMSA9IGRbbi0xXS4uLmRbMV1kWzBdCisKKyAgICBhc3NlcnQocDEgPiAwKTsKKworICAgIHVpbnQzMl90IHBvdzEwOworICAgIGNvbnN0IGludCBrID0gZmluZF9sYXJnZXN0X3BvdzEwKHAxLCBwb3cxMCk7CisKKyAgICAvLyAgICAgIDEwXihrLTEpIDw9IHAxIDwgMTBeaywgcG93MTAgPSAxMF4oay0xKQorICAgIC8vCisgICAgLy8gICAgICBwMSA9IChwMSBkaXYgMTBeKGstMSkpICogMTBeKGstMSkgKyAocDEgbW9kIDEwXihrLTEpKQorICAgIC8vICAgICAgICAgPSAoZFtrLTFdICAgICAgICAgKSAqIDEwXihrLTEpICsgKHAxIG1vZCAxMF4oay0xKSkKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcDIgKiAyXmUKKyAgICAvLyAgICAgICAgID0gZFtrLTFdICogMTBeKGstMSkgKyAocDEgbW9kIDEwXihrLTEpKSAgICAgICAgICArIHAyICogMl5lCisgICAgLy8gICAgICAgICA9IGRbay0xXSAqIDEwXihrLTEpICsgKChwMSBtb2QgMTBeKGstMSkpICogMl4tZSArIHAyKSAqIDJeZQorICAgIC8vICAgICAgICAgPSBkW2stMV0gKiAxMF4oay0xKSArICggICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCkgKiAyXmUKKyAgICAvLworICAgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgZGlnaXRzIGRbbl0gb2YgcDEgZnJvbSBsZWZ0IHRvIHJpZ2h0IChuID0gay0xLC4uLiwwKQorICAgIC8vCisgICAgLy8gICAgICBwMSA9IGRbay0xXS4uLmRbbl0gKiAxMF5uICsgZFtuLTFdLi4uZFswXQorICAgIC8vCisgICAgLy8gYnV0IHN0b3AgYXMgc29vbiBhcworICAgIC8vCisgICAgLy8gICAgICByZXN0ICogMl5lID0gKGRbbi0xXS4uLmRbMF0gKiAyXi1lICsgcDIpICogMl5lIDw9IGRlbHRhICogMl5lCisKKyAgICBpbnQgbiA9IGs7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgLy8gSW52YXJpYW50czoKKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXm4gKyAocDEgKyBwMiAqIDJeZSkgICAgKGJ1ZmZlciA9IDAgZm9yIG4gPSBrKQorICAgICAgICAvLyAgICAgIHBvdzEwID0gMTBeKG4tMSkgPD0gcDEgPCAxMF5uCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGQgPSBwMSAvIHBvdzEwOyAgLy8gZCA9IHAxIGRpdiAxMF4obi0xKQorICAgICAgICBjb25zdCB1aW50MzJfdCByID0gcDEgJSBwb3cxMDsgIC8vIHIgPSBwMSBtb2QgMTBeKG4tMSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXm4gKyAoZCAqIDEwXihuLTEpICsgcikgKyBwMiAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gKGJ1ZmZlciAqIDEwICsgZCkgKiAxMF4obi0xKSArIChyICsgcDIgKiAyXmUpCisgICAgICAgIC8vCisgICAgICAgIGFzc2VydChkIDw9IDkpOworICAgICAgICBidWZmZXJbbGVuZ3RoKytdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgZCk7IC8vIGJ1ZmZlciA6PSBidWZmZXIgKiAxMCArIGQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICBNKyA9IGJ1ZmZlciAqIDEwXihuLTEpICsgKHIgKyBwMiAqIDJeZSkKKyAgICAgICAgLy8KKyAgICAgICAgcDEgPSByOworICAgICAgICBuLS07CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF5uICsgKHAxICsgcDIgKiAyXmUpCisgICAgICAgIC8vICAgICAgcG93MTAgPSAxMF5uCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gTm93IGNoZWNrIGlmIGVub3VnaCBkaWdpdHMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KKyAgICAgICAgLy8gQ29tcHV0ZQorICAgICAgICAvLworICAgICAgICAvLyAgICAgIHAxICsgcDIgKiAyXmUgPSAocDEgKiAyXi1lICsgcDIpICogMl5lID0gcmVzdCAqIDJeZQorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOgorICAgICAgICAvLyBTaW5jZSByZXN0IGFuZCBkZWx0YSBzaGFyZSB0aGUgc2FtZSBleHBvbmVudCBlLCBpdCBzdWZmaWNlcyB0bworICAgICAgICAvLyBjb21wYXJlIHRoZSBzaWduaWZpY2FuZHMuCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHJlc3QgPSAodWludDY0X3R7cDF9IDw8IC1vbmUuZSkgKyBwMjsKKyAgICAgICAgaWYgKHJlc3QgPD0gZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFYgPSBidWZmZXIgKiAxMF5uLCB3aXRoIE0tIDw9IFYgPD0gTSsuCisKKyAgICAgICAgICAgIGRlY2ltYWxfZXhwb25lbnQgKz0gbjsKKworICAgICAgICAgICAgLy8gV2UgbWF5IG5vdyBqdXN0IHN0b3AuIEJ1dCBpbnN0ZWFkIGxvb2sgaWYgdGhlIGJ1ZmZlciBjb3VsZCBiZQorICAgICAgICAgICAgLy8gZGVjcmVtZW50ZWQgdG8gYnJpbmcgViBjbG9zZXIgdG8gdy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBwb3cxMCA9IDEwXm4gaXMgbm93IDEgdWxwIGluIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIFYuCisgICAgICAgICAgICAvLyBUaGUgcm91bmRpbmcgcHJvY2VkdXJlIHdvcmtzIHdpdGggZGl5ZnAncyB3aXRoIGFuIGltcGxpY2l0CisgICAgICAgICAgICAvLyBleHBvbmVudCBvZiBlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgMTBebiA9ICgxMF5uICogMl4tZSkgKiAyXmUgPSB1bHAgKiAyXmUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCB0ZW5fbiA9IHVpbnQ2NF90e3BvdzEwfSA8PCAtb25lLmU7CisgICAgICAgICAgICBncmlzdTJfcm91bmQoYnVmZmVyLCBsZW5ndGgsIGRpc3QsIGRlbHRhLCByZXN0LCB0ZW5fbik7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBvdzEwIC89IDEwOworICAgICAgICAvLworICAgICAgICAvLyAgICAgIHBvdzEwID0gMTBeKG4tMSkgPD0gcDEgPCAxMF5uCisgICAgICAgIC8vIEludmFyaWFudHMgcmVzdG9yZWQuCisgICAgfQorCisgICAgLy8gMikKKyAgICAvLworICAgIC8vIFRoZSBkaWdpdHMgb2YgdGhlIGludGVncmFsIHBhcnQgaGF2ZSBiZWVuIGdlbmVyYXRlZDoKKyAgICAvLworICAgIC8vICAgICAgTSsgPSBkW2stMV0uLi5kWzFdZFswXSArIHAyICogMl5lCisgICAgLy8gICAgICAgICA9IGJ1ZmZlciAgICAgICAgICAgICsgcDIgKiAyXmUKKyAgICAvLworICAgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgZGlnaXRzIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnQgcDIgKiAyXmUuCisgICAgLy8KKyAgICAvLyBOb3RlOgorICAgIC8vIE5vIGRlY2ltYWwgcG9pbnQgaXMgZ2VuZXJhdGVkOiB0aGUgZXhwb25lbnQgaXMgYWRqdXN0ZWQgaW5zdGVhZC4KKyAgICAvLworICAgIC8vIHAyIGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIGZyYWN0aW9uCisgICAgLy8KKyAgICAvLyAgICAgIHAyICogMl5lCisgICAgLy8gICAgICAgICAgPSBwMiAvIDJeLWUKKyAgICAvLyAgICAgICAgICA9IGRbLTFdIC8gMTBeMSArIGRbLTJdIC8gMTBeMiArIC4uLgorICAgIC8vCisgICAgLy8gTm93IGdlbmVyYXRlIHRoZSBkaWdpdHMgZFstbV0gb2YgcDEgZnJvbSBsZWZ0IHRvIHJpZ2h0IChtID0gMSwyLC4uLikKKyAgICAvLworICAgIC8vICAgICAgcDIgKiAyXmUgPSBkWy0xXWRbLTJdLi4uZFstbV0gKiAxMF4tbQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICsgMTBeLW0gKiAoZFstbS0xXSAvIDEwXjEgKyBkWy1tLTJdIC8gMTBeMiArIC4uLikKKyAgICAvLworICAgIC8vIHVzaW5nCisgICAgLy8KKyAgICAvLyAgICAgIDEwXm0gKiBwMiA9ICgoMTBebSAqIHAyKSBkaXYgMl4tZSkgKiAyXi1lICsgKCgxMF5tICogcDIpIG1vZCAyXi1lKQorICAgIC8vICAgICAgICAgICAgICAgID0gKCAgICAgICAgICAgICAgICAgICBkKSAqIDJeLWUgKyAoICAgICAgICAgICAgICAgICAgIHIpCisgICAgLy8KKyAgICAvLyBvcgorICAgIC8vICAgICAgMTBebSAqIHAyICogMl5lID0gZCArIHIgKiAyXmUKKyAgICAvLworICAgIC8vIGkuZS4KKyAgICAvLworICAgIC8vICAgICAgTSsgPSBidWZmZXIgKyBwMiAqIDJeZQorICAgIC8vICAgICAgICAgPSBidWZmZXIgKyAxMF4tbSAqIChkICsgciAqIDJeZSkKKyAgICAvLyAgICAgICAgID0gKGJ1ZmZlciAqIDEwXm0gKyBkKSAqIDEwXi1tICsgMTBeLW0gKiByICogMl5lCisgICAgLy8KKyAgICAvLyBhbmQgc3RvcCBhcyBzb29uIGFzIDEwXi1tICogciAqIDJeZSA8PSBkZWx0YSAqIDJeZQorCisgICAgYXNzZXJ0KHAyID4gZGVsdGEpOworCisgICAgaW50IG0gPSAwOworICAgIGZvciAoOzspCisgICAgeworICAgICAgICAvLyBJbnZhcmlhbnQ6CisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKGRbLW0tMV0gLyAxMCArIGRbLW0tMl0gLyAxMF4yICsgLi4uKSAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqIChwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKiAyXmUKKyAgICAgICAgLy8gICAgICAgICA9IGJ1ZmZlciAqIDEwXi1tICsgMTBeLW0gKiAoMS8xMCAqICgxMCAqIHAyKSAgICAgICAgICAgICAgICAgICApICogMl5lCisgICAgICAgIC8vICAgICAgICAgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKDEvMTAgKiAoKDEwKnAyIGRpdiAyXi1lKSAqIDJeLWUgKyAoMTAqcDIgbW9kIDJeLWUpKSAqIDJeZQorICAgICAgICAvLworICAgICAgICBhc3NlcnQocDIgPD0gVUlOVDY0X01BWCAvIDEwKTsKKyAgICAgICAgcDIgKj0gMTA7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGQgPSBwMiA+PiAtb25lLmU7ICAgICAvLyBkID0gKDEwICogcDIpIGRpdiAyXi1lCisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHIgPSBwMiAmIChvbmUuZiAtIDEpOyAvLyByID0gKDEwICogcDIpIG1vZCAyXi1lCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4tbSArIDEwXi1tICogKDEvMTAgKiAoZCAqIDJeLWUgKyByKSAqIDJeZQorICAgICAgICAvLyAgICAgICAgID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqICgxLzEwICogKGQgKyByICogMl5lKSkKKyAgICAgICAgLy8gICAgICAgICA9IChidWZmZXIgKiAxMCArIGQpICogMTBeKC1tLTEpICsgMTBeKC1tLTEpICogciAqIDJeZQorICAgICAgICAvLworICAgICAgICBhc3NlcnQoZCA8PSA5KTsKKyAgICAgICAgYnVmZmVyW2xlbmd0aCsrXSA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIGQpOyAvLyBidWZmZXIgOj0gYnVmZmVyICogMTAgKyBkCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgTSsgPSBidWZmZXIgKiAxMF4oLW0tMSkgKyAxMF4oLW0tMSkgKiByICogMl5lCisgICAgICAgIC8vCisgICAgICAgIHAyID0gcjsKKyAgICAgICAgbSsrOworICAgICAgICAvLworICAgICAgICAvLyAgICAgIE0rID0gYnVmZmVyICogMTBeLW0gKyAxMF4tbSAqIHAyICogMl5lCisgICAgICAgIC8vIEludmFyaWFudCByZXN0b3JlZC4KKworICAgICAgICAvLyBDaGVjayBpZiBlbm91Z2ggZGlnaXRzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgMTBeLW0gKiBwMiAqIDJeZSA8PSBkZWx0YSAqIDJeZQorICAgICAgICAvLyAgICAgICAgICAgICAgcDIgKiAyXmUgPD0gMTBebSAqIGRlbHRhICogMl5lCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBwMiA8PSAxMF5tICogZGVsdGEKKyAgICAgICAgZGVsdGEgKj0gMTA7CisgICAgICAgIGRpc3QgICo9IDEwOworICAgICAgICBpZiAocDIgPD0gZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gViA9IGJ1ZmZlciAqIDEwXi1tLCB3aXRoIE0tIDw9IFYgPD0gTSsuCisKKyAgICBkZWNpbWFsX2V4cG9uZW50IC09IG07CisKKyAgICAvLyAxIHVscCBpbiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBpcyBub3cgMTBeLW0uCisgICAgLy8gU2luY2UgZGVsdGEgYW5kIGRpc3QgYXJlIG5vdyBzY2FsZWQgYnkgMTBebSwgd2UgbmVlZCB0byBkbyB0aGUKKyAgICAvLyBzYW1lIHdpdGggdWxwIGluIG9yZGVyIHRvIGtlZXAgdGhlIHVuaXRzIGluIHN5bmMuCisgICAgLy8KKyAgICAvLyAgICAgIDEwXm0gKiAxMF4tbSA9IDEgPSAyXi1lICogMl5lID0gdGVuX20gKiAyXmUKKyAgICAvLworICAgIGNvbnN0IHVpbnQ2NF90IHRlbl9tID0gb25lLmY7CisgICAgZ3Jpc3UyX3JvdW5kKGJ1ZmZlciwgbGVuZ3RoLCBkaXN0LCBkZWx0YSwgcDIsIHRlbl9tKTsKKworICAgIC8vIEJ5IGNvbnN0cnVjdGlvbiB0aGlzIGFsZ29yaXRobSBnZW5lcmF0ZXMgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIGRlY2ltYWwKKyAgICAvLyBudW1iZXIgKExvaXRzY2gsIFRoZW9yZW0gNi4yKSB3aGljaCByb3VuZHMgYmFjayB0byB3LgorICAgIC8vIEZvciBhbiBpbnB1dCBudW1iZXIgb2YgcHJlY2lzaW9uIHAsIGF0IGxlYXN0CisgICAgLy8KKyAgICAvLyAgICAgIE4gPSAxICsgY2VpbChwICogbG9nXzEwKDIpKQorICAgIC8vCisgICAgLy8gZGVjaW1hbCBkaWdpdHMgYXJlIHN1ZmZpY2llbnQgdG8gaWRlbnRpZnkgYWxsIGJpbmFyeSBmbG9hdGluZy1wb2ludAorICAgIC8vIG51bWJlcnMgKE1hdHVsYSwgIkluLWFuZC1PdXQgY29udmVyc2lvbnMiKS4KKyAgICAvLyBUaGlzIGltcGxpZXMgdGhhdCB0aGUgYWxnb3JpdGhtIGRvZXMgbm90IHByb2R1Y2UgbW9yZSB0aGFuIE4gZGVjaW1hbAorICAgIC8vIGRpZ2l0cy4KKyAgICAvLworICAgIC8vICAgICAgTiA9IDE3IGZvciBwID0gNTMgKElFRUUgZG91YmxlIHByZWNpc2lvbikKKyAgICAvLyAgICAgIE4gPSA5ICBmb3IgcCA9IDI0IChJRUVFIHNpbmdsZSBwcmVjaXNpb24pCit9CisKKy8qIQordiA9IGJ1ZiAqIDEwXmRlY2ltYWxfZXhwb25lbnQKK2xlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cykKK1RoZSBidWZmZXIgbXVzdCBiZSBsYXJnZSBlbm91Z2gsIGkuZS4gPj0gbWF4X2RpZ2l0czEwLgorKi8KK2lubGluZSB2b2lkIGdyaXN1MihjaGFyKiBidWYsIGludCYgbGVuLCBpbnQmIGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgZGl5ZnAgbV9taW51cywgZGl5ZnAgdiwgZGl5ZnAgbV9wbHVzKQoreworICAgIGFzc2VydChtX3BsdXMuZSA9PSBtX21pbnVzLmUpOworICAgIGFzc2VydChtX3BsdXMuZSA9PSB2LmUpOworCisgICAgLy8gIC0tLS0tLS0tKC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKS0tLS0tLS0tICAgIChBKQorICAgIC8vICAgICAgICAgIG0tICAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgIG0rCisgICAgLy8KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0oLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pLS0tLS0tLS0gICAgKEIpCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgbS0gICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgbSsKKyAgICAvLworICAgIC8vIEZpcnN0IHNjYWxlIHYgKGFuZCBtLSBhbmQgbSspIHN1Y2ggdGhhdCB0aGUgZXhwb25lbnQgaXMgaW4gdGhlIHJhbmdlCisgICAgLy8gW2FscGhhLCBnYW1tYV0uCisKKyAgICBjb25zdCBjYWNoZWRfcG93ZXIgY2FjaGVkID0gZ2V0X2NhY2hlZF9wb3dlcl9mb3JfYmluYXJ5X2V4cG9uZW50KG1fcGx1cy5lKTsKKworICAgIGNvbnN0IGRpeWZwIGNfbWludXNfayhjYWNoZWQuZiwgY2FjaGVkLmUpOyAvLyA9IGMgfj0gMTBeLWsKKworICAgIC8vIFRoZSBleHBvbmVudCBvZiB0aGUgcHJvZHVjdHMgaXMgPSB2LmUgKyBjX21pbnVzX2suZSArIHEgYW5kIGlzIGluIHRoZSByYW5nZSBbYWxwaGEsZ2FtbWFdCisgICAgY29uc3QgZGl5ZnAgdyAgICAgICA9IGRpeWZwOjptdWwodiwgICAgICAgY19taW51c19rKTsKKyAgICBjb25zdCBkaXlmcCB3X21pbnVzID0gZGl5ZnA6Om11bChtX21pbnVzLCBjX21pbnVzX2spOworICAgIGNvbnN0IGRpeWZwIHdfcGx1cyAgPSBkaXlmcDo6bXVsKG1fcGx1cywgIGNfbWludXNfayk7CisKKyAgICAvLyAgLS0tLSgtLS0rLS0tKS0tLS0tLS0tLS0tLS0tLSgtLS0rLS0tKS0tLS0tLS0tLS0tLS0tLSgtLS0rLS0tKS0tLS0KKyAgICAvLyAgICAgICAgICB3LSAgICAgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgICAgICB3KworICAgIC8vICAgICAgICAgID0gYyptLSAgICAgICAgICAgICAgICAgID0gYyp2ICAgICAgICAgICAgICAgICAgID0gYyptKworICAgIC8vCisgICAgLy8gZGl5ZnA6Om11bCByb3VuZHMgaXRzIHJlc3VsdCBhbmQgY19taW51c19rIGlzIGFwcHJveGltYXRlZCB0b28uIHcsIHctIGFuZAorICAgIC8vIHcrIGFyZSBub3cgb2ZmIGJ5IGEgc21hbGwgYW1vdW50LgorICAgIC8vIEluIGZhY3Q6CisgICAgLy8KKyAgICAvLyAgICAgIHcgLSB2ICogMTBeayA8IDEgdWxwCisgICAgLy8KKyAgICAvLyBUbyBhY2NvdW50IGZvciB0aGlzIGluYWNjdXJhY3ksIGFkZCByZXNwLiBzdWJ0cmFjdCAxIHVscC4KKyAgICAvLworICAgIC8vICAtLS0tLS0tLSstLS1bLS0tLS0tLS0tLS0tLS0tKC0tLSstLS0pLS0tLS0tLS0tLS0tLS0tXS0tLSstLS0tLS0tLQorICAgIC8vICAgICAgICAgIHctICBNLSAgICAgICAgICAgICAgICAgIHcgICAgICAgICAgICAgICAgICAgTSsgIHcrCisgICAgLy8KKyAgICAvLyBOb3cgYW55IG51bWJlciBpbiBbTS0sIE0rXSAoYm91bmRzIGluY2x1ZGVkKSB3aWxsIHJvdW5kIHRvIHcgd2hlbiBpbnB1dCwKKyAgICAvLyByZWdhcmRsZXNzIG9mIGhvdyB0aGUgaW5wdXQgcm91bmRpbmcgYWxnb3JpdGhtIGJyZWFrcyB0aWVzLgorICAgIC8vCisgICAgLy8gQW5kIGRpZ2l0X2dlbiBnZW5lcmF0ZXMgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIHN1Y2ggbnVtYmVyIGluIFtNLSwgTStdLgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCBHcmlzdTIgYWx3YXlzIGdlbmVyYXRlcyB0aGUgc2hvcnRlc3QKKyAgICAvLyBwb3NzaWJsZSBudW1iZXIgaW4gdGhlIGludGVydmFsIChtLSwgbSspLgorICAgIGNvbnN0IGRpeWZwIE1fbWludXMod19taW51cy5mICsgMSwgd19taW51cy5lKTsKKyAgICBjb25zdCBkaXlmcCBNX3BsdXMgKHdfcGx1cy5mICAtIDEsIHdfcGx1cy5lICk7CisKKyAgICBkZWNpbWFsX2V4cG9uZW50ID0gLWNhY2hlZC5rOyAvLyA9IC0oLWspID0gaworCisgICAgZ3Jpc3UyX2RpZ2l0X2dlbihidWYsIGxlbiwgZGVjaW1hbF9leHBvbmVudCwgTV9taW51cywgdywgTV9wbHVzKTsKK30KKworLyohCit2ID0gYnVmICogMTBeZGVjaW1hbF9leHBvbmVudAorbGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciAobnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzKQorVGhlIGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCwgaS5lLiA+PSBtYXhfZGlnaXRzMTAuCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIEZsb2F0VHlwZT4KK3ZvaWQgZ3Jpc3UyKGNoYXIqIGJ1ZiwgaW50JiBsZW4sIGludCYgZGVjaW1hbF9leHBvbmVudCwgRmxvYXRUeXBlIHZhbHVlKQoreworICAgIHN0YXRpY19hc3NlcnQoZGl5ZnA6OmtQcmVjaXNpb24gPj0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjpkaWdpdHMgKyAzLAorICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yOiBub3QgZW5vdWdoIHByZWNpc2lvbiIpOworCisgICAgYXNzZXJ0KHN0ZDo6aXNmaW5pdGUodmFsdWUpKTsKKyAgICBhc3NlcnQodmFsdWUgPiAwKTsKKworICAgIC8vIElmIHRoZSBuZWlnaGJvcnMgKGFuZCBib3VuZGFyaWVzKSBvZiAndmFsdWUnIGFyZSBhbHdheXMgY29tcHV0ZWQgZm9yIGRvdWJsZS1wcmVjaXNpb24KKyAgICAvLyBudW1iZXJzLCBhbGwgZmxvYXQncyBjYW4gYmUgcmVjb3ZlcmVkIHVzaW5nIHN0cnRvZCAoYW5kIHN0cnRvZikuIEhvd2V2ZXIsIHRoZSByZXN1bHRpbmcKKyAgICAvLyBkZWNpbWFsIHJlcHJlc2VudGF0aW9ucyBhcmUgbm90IGV4YWN0bHkgInNob3J0Ii4KKyAgICAvLworICAgIC8vIFRoZSBkb2N1bWVudGF0aW9uIGZvciAnc3RkOjp0b19jaGFycycgKGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxpdHkvdG9fY2hhcnMpCisgICAgLy8gc2F5cyAidmFsdWUgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIGFzIGlmIGJ5IHN0ZDo6c3ByaW50ZiBpbiB0aGUgZGVmYXVsdCAoIkMiKSBsb2NhbGUiCisgICAgLy8gYW5kIHNpbmNlIHNwcmludGYgcHJvbW90ZXMgZmxvYXQncyB0byBkb3VibGUncywgSSB0aGluayB0aGlzIGlzIGV4YWN0bHkgd2hhdCAnc3RkOjp0b19jaGFycycKKyAgICAvLyBkb2VzLgorICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgJ3N0ZDo6dG9fY2hhcnMnIHJlcXVpcmVzIHRoYXQgInBhcnNpbmcgdGhlCisgICAgLy8gcmVwcmVzZW50YXRpb24gdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgc3RkOjpmcm9tX2NoYXJzIGZ1bmN0aW9uIHJlY292ZXJzIHZhbHVlIGV4YWN0bHkiLiBUaGF0CisgICAgLy8gaW5kaWNhdGVzIHRoYXQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHNob3VsZCBiZSByZWNvdmVyZWQgdXNpbmcKKyAgICAvLyAnc3RkOjpzdHJ0b2YnLgorICAgIC8vCisgICAgLy8gTkI6IElmIHRoZSBuZWlnaGJvcnMgYXJlIGNvbXB1dGVkIGZvciBzaW5nbGUtcHJlY2lzaW9uIG51bWJlcnMsIHRoZXJlIGlzIGEgc2luZ2xlIGZsb2F0CisgICAgLy8gICAgICg3LjAzODUzMDdlLTI2Zikgd2hpY2ggY2FuJ3QgYmUgcmVjb3ZlcmVkIHVzaW5nIHN0cnRvZC4gVGhlIHJlc3VsdGluZyBkb3VibGUgcHJlY2lzaW9uCisgICAgLy8gICAgIHZhbHVlIGlzIG9mZiBieSAxIHVscC4KKyNpZiAwCisgICAgY29uc3QgYm91bmRhcmllcyB3ID0gY29tcHV0ZV9ib3VuZGFyaWVzKHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKTsKKyNlbHNlCisgICAgY29uc3QgYm91bmRhcmllcyB3ID0gY29tcHV0ZV9ib3VuZGFyaWVzKHZhbHVlKTsKKyNlbmRpZgorCisgICAgZ3Jpc3UyKGJ1ZiwgbGVuLCBkZWNpbWFsX2V4cG9uZW50LCB3Lm1pbnVzLCB3LncsIHcucGx1cyk7Cit9CisKKy8qIQorQGJyaWVmIGFwcGVuZHMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGUgdG8gYnVmCitAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIGV4cG9uZW50LgorQHByZSAtMTAwMCA8IGUgPCAxMDAwCisqLworaW5saW5lIGNoYXIqIGFwcGVuZF9leHBvbmVudChjaGFyKiBidWYsIGludCBlKQoreworICAgIGFzc2VydChlID4gLTEwMDApOworICAgIGFzc2VydChlIDwgIDEwMDApOworCisgICAgaWYgKGUgPCAwKQorICAgIHsKKyAgICAgICAgZSA9IC1lOworICAgICAgICAqYnVmKysgPSAnLSc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpidWYrKyA9ICcrJzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBrID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGUpOworICAgIGlmIChrIDwgMTApCisgICAgeworICAgICAgICAvLyBBbHdheXMgcHJpbnQgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUgZXhwb25lbnQuCisgICAgICAgIC8vIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmludGYoIiVnIikuCisgICAgICAgICpidWYrKyA9ICcwJzsKKyAgICAgICAgKmJ1ZisrID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgayk7CisgICAgfQorICAgIGVsc2UgaWYgKGsgPCAxMDApCisgICAgeworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrIC8gMTApOworICAgICAgICBrICU9IDEwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmJ1ZisrID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgayAvIDEwMCk7CisgICAgICAgIGsgJT0gMTAwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrIC8gMTApOworICAgICAgICBrICU9IDEwOworICAgICAgICAqYnVmKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBrKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCisvKiEKK0BicmllZiBwcmV0dGlmeSB2ID0gYnVmICogMTBeZGVjaW1hbF9leHBvbmVudAorCitJZiB2IGlzIGluIHRoZSByYW5nZSBbMTBebWluX2V4cCwgMTBebWF4X2V4cCkgaXQgd2lsbCBiZSBwcmludGVkIGluIGZpeGVkLXBvaW50Citub3RhdGlvbi4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgcHJpbnRlZCBpbiBleHBvbmVudGlhbCBub3RhdGlvbi4KKworQHByZSBtaW5fZXhwIDwgMAorQHByZSBtYXhfZXhwID4gMAorKi8KK2lubGluZSBjaGFyKiBmb3JtYXRfYnVmZmVyKGNoYXIqIGJ1ZiwgaW50IGxlbiwgaW50IGRlY2ltYWxfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX2V4cCwgaW50IG1heF9leHApCit7CisgICAgYXNzZXJ0KG1pbl9leHAgPCAwKTsKKyAgICBhc3NlcnQobWF4X2V4cCA+IDApOworCisgICAgY29uc3QgaW50IGsgPSBsZW47CisgICAgY29uc3QgaW50IG4gPSBsZW4gKyBkZWNpbWFsX2V4cG9uZW50OworCisgICAgLy8gdiA9IGJ1ZiAqIDEwXihuLWspCisgICAgLy8gayBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cykKKyAgICAvLyBuIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVjaW1hbCBwb2ludCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKworICAgIGlmIChrIDw9IG4gYW5kIG4gPD0gbWF4X2V4cCkKKyAgICB7CisgICAgICAgIC8vIGRpZ2l0c1swMDBdCisgICAgICAgIC8vIGxlbiA8PSBtYXhfZXhwICsgMgorCisgICAgICAgIHN0ZDo6bWVtc2V0KGJ1ZiArIGssICcwJywgc3RhdGljX2Nhc3Q8c2l6ZV90PihuIC0gaykpOworICAgICAgICAvLyBNYWtlIGl0IGxvb2sgbGlrZSBhIGZsb2F0aW5nLXBvaW50IG51bWJlciAoIzM2MiwgIzM3OCkKKyAgICAgICAgYnVmW24gKyAwXSA9ICcuJzsKKyAgICAgICAgYnVmW24gKyAxXSA9ICcwJzsKKyAgICAgICAgcmV0dXJuIGJ1ZiArIChuICsgMik7CisgICAgfQorCisgICAgaWYgKDAgPCBuIGFuZCBuIDw9IG1heF9leHApCisgICAgeworICAgICAgICAvLyBkaWcuaXRzCisgICAgICAgIC8vIGxlbiA8PSBtYXhfZGlnaXRzMTAgKyAxCisKKyAgICAgICAgYXNzZXJ0KGsgPiBuKTsKKworICAgICAgICBzdGQ6Om1lbW1vdmUoYnVmICsgKG4gKyAxKSwgYnVmICsgbiwgc3RhdGljX2Nhc3Q8c2l6ZV90PihrIC0gbikpOworICAgICAgICBidWZbbl0gPSAnLic7CisgICAgICAgIHJldHVybiBidWYgKyAoayArIDEpOworICAgIH0KKworICAgIGlmIChtaW5fZXhwIDwgbiBhbmQgbiA8PSAwKQorICAgIHsKKyAgICAgICAgLy8gMC5bMDAwXWRpZ2l0cworICAgICAgICAvLyBsZW4gPD0gMiArICgtbWluX2V4cCAtIDEpICsgbWF4X2RpZ2l0czEwCisKKyAgICAgICAgc3RkOjptZW1tb3ZlKGJ1ZiArICgyICsgLW4pLCBidWYsIHN0YXRpY19jYXN0PHNpemVfdD4oaykpOworICAgICAgICBidWZbMF0gPSAnMCc7CisgICAgICAgIGJ1ZlsxXSA9ICcuJzsKKyAgICAgICAgc3RkOjptZW1zZXQoYnVmICsgMiwgJzAnLCBzdGF0aWNfY2FzdDxzaXplX3Q+KC1uKSk7CisgICAgICAgIHJldHVybiBidWYgKyAoMiArICgtbikgKyBrKTsKKyAgICB9CisKKyAgICBpZiAoayA9PSAxKQorICAgIHsKKyAgICAgICAgLy8gZEUrMTIzCisgICAgICAgIC8vIGxlbiA8PSAxICsgNQorCisgICAgICAgIGJ1ZiArPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBkLmlnaXRzRSsxMjMKKyAgICAgICAgLy8gbGVuIDw9IG1heF9kaWdpdHMxMCArIDEgKyA1CisKKyAgICAgICAgc3RkOjptZW1tb3ZlKGJ1ZiArIDIsIGJ1ZiArIDEsIHN0YXRpY19jYXN0PHNpemVfdD4oayAtIDEpKTsKKyAgICAgICAgYnVmWzFdID0gJy4nOworICAgICAgICBidWYgKz0gMSArIGs7CisgICAgfQorCisgICAgKmJ1ZisrID0gJ2UnOworICAgIHJldHVybiBhcHBlbmRfZXhwb25lbnQoYnVmLCBuIC0gMSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGR0b2FfaW1wbAorCisvKiEKK0BicmllZiBnZW5lcmF0ZXMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbG9hdGluZy1wb2ludCBudW1iZXIgdmFsdWUgaW4gW2ZpcnN0LCBsYXN0KS4KKworVGhlIGZvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gaXMgc2ltaWxhciB0byBwcmludGYncyAlZworZm9ybWF0LiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHBhc3QtdGhlLWVuZCBvZiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KKworQG5vdGUgVGhlIGlucHV0IG51bWJlciBtdXN0IGJlIGZpbml0ZSwgaS5lLiBOYU4ncyBhbmQgSW5mJ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCitAbm90ZSBUaGUgYnVmZmVyIG11c3QgYmUgbGFyZ2UgZW5vdWdoLgorQG5vdGUgVGhlIHJlc3VsdCBpcyBOT1QgbnVsbC10ZXJtaW5hdGVkLgorKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBGbG9hdFR5cGU+CitjaGFyKiB0b19jaGFycyhjaGFyKiBmaXJzdCwgY2hhciogbGFzdCwgRmxvYXRUeXBlIHZhbHVlKQoreworICAgIHN0YXRpY19jYXN0PHZvaWQ+KGxhc3QpOyAvLyBtYXliZSB1bnVzZWQgLSBmaXggd2FybmluZworICAgIGFzc2VydChzdGQ6OmlzZmluaXRlKHZhbHVlKSk7CisKKyAgICAvLyBVc2Ugc2lnbmJpdCh2YWx1ZSkgaW5zdGVhZCBvZiAodmFsdWUgPCAwKSBzaW5jZSBzaWduYml0IHdvcmtzIGZvciAtMC4KKyAgICBpZiAoc3RkOjpzaWduYml0KHZhbHVlKSkKKyAgICB7CisgICAgICAgIHZhbHVlID0gLXZhbHVlOworICAgICAgICAqZmlyc3QrKyA9ICctJzsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gMCkgLy8gKy0wCisgICAgeworICAgICAgICAqZmlyc3QrKyA9ICcwJzsKKyAgICAgICAgLy8gTWFrZSBpdCBsb29rIGxpa2UgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgKCMzNjIsICMzNzgpCisgICAgICAgICpmaXJzdCsrID0gJy4nOworICAgICAgICAqZmlyc3QrKyA9ICcwJzsKKyAgICAgICAgcmV0dXJuIGZpcnN0OworICAgIH0KKworICAgIGFzc2VydChsYXN0IC0gZmlyc3QgPj0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgLy8gQ29tcHV0ZSB2ID0gYnVmZmVyICogMTBeZGVjaW1hbF9leHBvbmVudC4KKyAgICAvLyBUaGUgZGVjaW1hbCBkaWdpdHMgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyLCB3aGljaCBuZWVkcyB0byBiZSBpbnRlcnByZXRlZAorICAgIC8vIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAvLyBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpLmUuIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMuCisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IGRlY2ltYWxfZXhwb25lbnQgPSAwOworICAgIGR0b2FfaW1wbDo6Z3Jpc3UyKGZpcnN0LCBsZW4sIGRlY2ltYWxfZXhwb25lbnQsIHZhbHVlKTsKKworICAgIGFzc2VydChsZW4gPD0gc3RkOjpudW1lcmljX2xpbWl0czxGbG9hdFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgLy8gRm9ybWF0IHRoZSBidWZmZXIgbGlrZSBwcmludGYoIiUuKmciLCBwcmVjLCB2YWx1ZSkKKyAgICBjb25zdGV4cHIgaW50IGtNaW5FeHAgPSAtNDsKKyAgICAvLyBVc2UgZGlnaXRzMTAgaGVyZSB0byBpbmNyZWFzZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAyLgorICAgIGNvbnN0ZXhwciBpbnQga01heEV4cCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6ZGlnaXRzMTA7CisKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IGtNYXhFeHAgKyAyKTsKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IDIgKyAoLWtNaW5FeHAgLSAxKSArIHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID49IHN0ZDo6bnVtZXJpY19saW1pdHM8RmxvYXRUeXBlPjo6bWF4X2RpZ2l0czEwICsgNik7CisKKyAgICByZXR1cm4gZHRvYV9pbXBsOjpmb3JtYXRfYnVmZmVyKGZpcnN0LCBsZW4sIGRlY2ltYWxfZXhwb25lbnQsIGtNaW5FeHAsIGtNYXhFeHApOworfQorCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIG5sb2htYW5uCisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fc2NvcGUuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL21ldGEuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL291dHB1dC9vdXRwdXRfYWRhcHRlcnMuaHBwPgorCisvLyAjaW5jbHVkZSA8bmxvaG1hbm4vZGV0YWlsL3ZhbHVlX3QuaHBwPgorCisKK25hbWVzcGFjZSBubG9obWFubgoreworbmFtZXNwYWNlIGRldGFpbAorewogLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gc2VyaWFsaXphdGlvbiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNjA3Nyw2ICs4MjM1LDkgQEAKICAgICB1c2luZyBudW1iZXJfZmxvYXRfdCA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6Om51bWJlcl9mbG9hdF90OwogICAgIHVzaW5nIG51bWJlcl9pbnRlZ2VyX3QgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpudW1iZXJfaW50ZWdlcl90OwogICAgIHVzaW5nIG51bWJlcl91bnNpZ25lZF90ID0gdHlwZW5hbWUgQmFzaWNKc29uVHlwZTo6bnVtYmVyX3Vuc2lnbmVkX3Q7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IFVURjhfQUNDRVBUID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3QgVVRGOF9SRUpFQ1QgPSAxOworCiAgIHB1YmxpYzoKICAgICAvKiEKICAgICBAcGFyYW1baW5dIHMgIG91dHB1dCBzdHJlYW0gdG8gc2VyaWFsaXplIHRvCkBAIC02MDg2LDcgKzgyNDcsOCBAQAogICAgICAgICA6IG8oc3RkOjptb3ZlKHMpKSwgbG9jKHN0ZDo6bG9jYWxlY29udigpKSwKICAgICAgICAgICB0aG91c2FuZHNfc2VwKGxvYy0+dGhvdXNhbmRzX3NlcCA9PSBudWxscHRyID8gJ1wwJyA6ICogKGxvYy0+dGhvdXNhbmRzX3NlcCkpLAogICAgICAgICAgIGRlY2ltYWxfcG9pbnQobG9jLT5kZWNpbWFsX3BvaW50ID09IG51bGxwdHIgPyAnXDAnIDogKiAobG9jLT5kZWNpbWFsX3BvaW50KSksCi0gICAgICAgICAgaW5kZW50X2NoYXIoaWNoYXIpLCBpbmRlbnRfc3RyaW5nKDUxMiwgaW5kZW50X2NoYXIpIHt9CisgICAgICAgICAgaW5kZW50X2NoYXIoaWNoYXIpLCBpbmRlbnRfc3RyaW5nKDUxMiwgaW5kZW50X2NoYXIpCisgICAge30KIAogICAgIC8vIGRlbGV0ZSBiZWNhdXNlIG9mIHBvaW50ZXIgbWVtYmVycwogICAgIHNlcmlhbGl6ZXIoY29uc3Qgc2VyaWFsaXplciYpID0gZGVsZXRlOwpAQCAtNjMwMywxNzEgKzg0NjUsNiBAQAogCiAgIHByaXZhdGU6CiAgICAgLyohCi0gICAgQGJyaWVmIHJldHVybnMgdGhlIG51bWJlciBvZiBleHBlY3RlZCBieXRlcyBmb2xsb3dpbmcgaW4gVVRGLTggc3RyaW5nCi0KLSAgICBAcGFyYW1baW5dICB1ICB0aGUgZmlyc3QgYnl0ZSBvZiBhIFVURi04IHN0cmluZwotICAgIEByZXR1cm4gIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgYnl0ZXMgZm9sbG93aW5nCi0gICAgKi8KLSAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c2l6ZV90IGJ5dGVzX2ZvbGxvd2luZyhjb25zdCB1aW50OF90IHUpCi0gICAgewotICAgICAgICByZXR1cm4gKCh1IDw9IDEyNykgPyAwCi0gICAgICAgICAgICAgICAgOiAoKDE5MiA8PSB1IGFuZCB1IDw9IDIyMykgPyAxCi0gICAgICAgICAgICAgICAgICAgOiAoKDIyNCA8PSB1IGFuZCB1IDw9IDIzOSkgPyAyCi0gICAgICAgICAgICAgICAgICAgICAgOiAoKDI0MCA8PSB1IGFuZCB1IDw9IDI0NykgPyAzIDogc3RkOjpzdHJpbmc6Om5wb3MpKSkpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjYWxjdWxhdGVzIHRoZSBleHRyYSBzcGFjZSB0byBlc2NhcGUgYSBKU09OIHN0cmluZwotCi0gICAgQHBhcmFtW2luXSBzICB0aGUgc3RyaW5nIHRvIGVzY2FwZQotICAgIEBwYXJhbVtpbl0gZW5zdXJlX2FzY2lpICB3aGV0aGVyIHRvIGVzY2FwZSBub24tQVNDSUkgY2hhcmFjdGVycyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1WFhYWCBzZXF1ZW5jZXMKLSAgICBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBlc2NhcGUgc3RyaW5nIEBhIHMKLQotICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIHN0cmluZyBAYSBzLgotICAgICovCi0gICAgc3RhdGljIHN0ZDo6c2l6ZV90IGV4dHJhX3NwYWNlKGNvbnN0IHN0cmluZ190JiBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGVuc3VyZV9hc2NpaSkgbm9leGNlcHQKLSAgICB7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IHJlcyA9IDA7Ci0KLSAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc1tpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjb250cm9sIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoCi0gICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGMgKDEgYnl0ZSkgdG8gXHggKDIgYnl0ZXMpCi0gICAgICAgICAgICAgICAgICAgIHJlcyArPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb250cm9sIGNoYXJhY3RlcnMgdGhhdCBuZWVkIFx1eHh4eCBlc2NhcGluZwotICAgICAgICAgICAgICAgIGNhc2UgMHgwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgICAgIGNhc2UgMHgwMzoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDQ6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDA1OgotICAgICAgICAgICAgICAgIGNhc2UgMHgwNjoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDc6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDBCOgotICAgICAgICAgICAgICAgIGNhc2UgMHgwRToKLSAgICAgICAgICAgICAgICBjYXNlIDB4MEY6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDEwOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxMToKLSAgICAgICAgICAgICAgICBjYXNlIDB4MTI6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDEzOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxNDoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MTU6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDE2OgotICAgICAgICAgICAgICAgIGNhc2UgMHgxNzoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MTg6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDE5OgotICAgICAgICAgICAgICAgIGNhc2UgMHgxQToKLSAgICAgICAgICAgICAgICBjYXNlIDB4MUI6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDFDOgotICAgICAgICAgICAgICAgIGNhc2UgMHgxRDoKLSAgICAgICAgICAgICAgICBjYXNlIDB4MUU6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDFGOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBjICgxIGJ5dGUpIHRvIFx1eHh4eCAoNiBieXRlcykKLSAgICAgICAgICAgICAgICAgICAgcmVzICs9IDU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlX2FzY2lpIGFuZCAoc1tpXSAmIDB4ODAgb3Igc1tpXSA9PSAweDdGKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBieXRlcyA9IGJ5dGVzX2ZvbGxvd2luZyhzdGF0aWNfY2FzdDx1aW50OF90PihzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbCBiZSBkZXRlY3RlZCBieSB0aHJvd19pZl9pbnZhbGlkX3V0ZjgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoYnl0ZXMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlcG9pbnRzIHRoYXQgbmVlZCA0IGJ5dGVzIChpLmUuLCAzIGFkZGl0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlcykgaW4gVVRGLTggbmVlZCBhIHN1cnJvZ2F0ZSBwYWlyIHdoZW4gXHUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGluZyBpcyB1c2VkOiBmcm9tIDQgYnl0ZXMgdG8gXHV4eHh4XHV4eHh4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDEyIGJ5dGVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSAoMTIgLSBieXRlcyAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20geCBieXRlcyB0byBcdXh4eHggKDYgYnl0ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9ICg2IC0gYnl0ZXMgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgYWRkaXRpb25hbCBieXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBieXRlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGVzY2FwZV9jb2RlcG9pbnQoaW50IGNvZGVwb2ludCwgc3RyaW5nX3QmIHJlc3VsdCwgc3RkOjpzaXplX3QmIHBvcykKLSAgICB7Ci0gICAgICAgIC8vIGV4cGVjdGluZyBhIHByb3BlciBjb2RlcG9pbnQKLSAgICAgICAgYXNzZXJ0KDB4MDAgPD0gY29kZXBvaW50IGFuZCBjb2RlcG9pbnQgPD0gMHgxMEZGRkYpOwotCi0gICAgICAgIC8vIHRoZSBsYXN0IHdyaXR0ZW4gY2hhcmFjdGVyIHdhcyB0aGUgYmFja3NsYXNoIGJlZm9yZSB0aGUgJ3UnCi0gICAgICAgIGFzc2VydChyZXN1bHRbcG9zXSA9PSAnXFwnKTsKLQotICAgICAgICAvLyB3cml0ZSB0aGUgJ3UnCi0gICAgICAgIHJlc3VsdFsrK3Bvc10gPSAndSc7Ci0KLSAgICAgICAgLy8gY29udmVydCBhIG51bWJlciAwLi4xNSB0byBpdHMgaGV4IHJlcHJlc2VudGF0aW9uICgwLi5mKQotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjphcnJheTxjaGFyLCAxNj4gaGV4aWZ5ID0KLSAgICAgICAgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAotICAgICAgICAgICAgICAgICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MTAwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNvZGVwb2ludHMgVSswMDAwLi5VK0ZGRkYgY2FuIGJlIHJlcHJlc2VudGVkIGFzIFx1eHh4eC4KLSAgICAgICAgICAgIHJlc3VsdFsrK3Bvc10gPSBoZXhpZnlbKGNvZGVwb2ludCA+PiAxMikgJiAweDBGXTsKLSAgICAgICAgICAgIHJlc3VsdFsrK3Bvc10gPSBoZXhpZnlbKGNvZGVwb2ludCA+PiA4KSAmIDB4MEZdOwotICAgICAgICAgICAgcmVzdWx0WysrcG9zXSA9IGhleGlmeVsoY29kZXBvaW50ID4+IDQpICYgMHgwRl07Ci0gICAgICAgICAgICByZXN1bHRbKytwb3NdID0gaGV4aWZ5W2NvZGVwb2ludCAmIDB4MEZdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY29kZXBvaW50cyBVKzEwMDAwLi5VKzEwRkZGRiBuZWVkIGEgc3Vycm9nYXRlIHBhaXIgdG8gYmUKLSAgICAgICAgICAgIC8vIHJlcHJlc2VudGVkIGFzIFx1eHh4eFx1eHh4eC4KLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvZmFxL3V0Zl9ib20uaHRtbCN1dGYxNi00Ci0gICAgICAgICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDsKLSAgICAgICAgICAgIGNvbnN0IGludCBoaWdoX3N1cnJvZ2F0ZSA9IDB4RDgwMCB8ICgoY29kZXBvaW50ID4+IDEwKSAmIDB4M0ZGKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBsb3dfc3Vycm9nYXRlID0gMHhEQzAwIHwgKGNvZGVwb2ludCAmIDB4M0ZGKTsKLSAgICAgICAgICAgIHJlc3VsdFsrK3Bvc10gPSBoZXhpZnlbKGhpZ2hfc3Vycm9nYXRlID4+IDEyKSAmIDB4MEZdOwotICAgICAgICAgICAgcmVzdWx0WysrcG9zXSA9IGhleGlmeVsoaGlnaF9zdXJyb2dhdGUgPj4gOCkgJiAweDBGXTsKLSAgICAgICAgICAgIHJlc3VsdFsrK3Bvc10gPSBoZXhpZnlbKGhpZ2hfc3Vycm9nYXRlID4+IDQpICYgMHgwRl07Ci0gICAgICAgICAgICByZXN1bHRbKytwb3NdID0gaGV4aWZ5W2hpZ2hfc3Vycm9nYXRlICYgMHgwRl07Ci0gICAgICAgICAgICArK3BvczsgIC8vIGJhY2tzbGFzaCBpcyBhbHJlYWR5IGluIG91dHB1dAotICAgICAgICAgICAgcmVzdWx0WysrcG9zXSA9ICd1JzsKLSAgICAgICAgICAgIHJlc3VsdFsrK3Bvc10gPSBoZXhpZnlbKGxvd19zdXJyb2dhdGUgPj4gMTIpICYgMHgwRl07Ci0gICAgICAgICAgICByZXN1bHRbKytwb3NdID0gaGV4aWZ5Wyhsb3dfc3Vycm9nYXRlID4+IDgpICYgMHgwRl07Ci0gICAgICAgICAgICByZXN1bHRbKytwb3NdID0gaGV4aWZ5Wyhsb3dfc3Vycm9nYXRlID4+IDQpICYgMHgwRl07Ci0gICAgICAgICAgICByZXN1bHRbKytwb3NdID0gaGV4aWZ5W2xvd19zdXJyb2dhdGUgJiAweDBGXTsKLSAgICAgICAgfQotCi0gICAgICAgICsrcG9zOwotICAgIH0KLQotICAgIC8qIQogICAgIEBicmllZiBkdW1wIGVzY2FwZWQgc3RyaW5nCiAKICAgICBFc2NhcGUgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGNlcnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGJ5IGEgc2VxdWVuY2Ugb2YgYW4KQEAgLTY0ODEsMTQ1ICs4NDc4LDE0NiBAQAogCiAgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBsZW5ndGggb2Ygc3RyaW5nIEBhIHMuCiAgICAgKi8KLSAgICB2b2lkIGR1bXBfZXNjYXBlZChjb25zdCBzdHJpbmdfdCYgcywgY29uc3QgYm9vbCBlbnN1cmVfYXNjaWkpIGNvbnN0CisgICAgdm9pZCBkdW1wX2VzY2FwZWQoY29uc3Qgc3RyaW5nX3QmIHMsIGNvbnN0IGJvb2wgZW5zdXJlX2FzY2lpKQogICAgIHsKLSAgICAgICAgdGhyb3dfaWZfaW52YWxpZF91dGY4KHMpOwotCi0gICAgICAgIGNvbnN0IGF1dG8gc3BhY2UgPSBleHRyYV9zcGFjZShzLCBlbnN1cmVfYXNjaWkpOwotICAgICAgICBpZiAoc3BhY2UgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhzLmNfc3RyKCksIHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJpbmcgb2YgbmVjZXNzYXJ5IHNpemUKLSAgICAgICAgc3RyaW5nX3QgcmVzdWx0KHMuc2l6ZSgpICsgc3BhY2UsICdcXCcpOwotICAgICAgICBzdGQ6OnNpemVfdCBwb3MgPSAwOworICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQ7CisgICAgICAgIHVpbnQ4X3Qgc3RhdGUgPSBVVEY4X0FDQ0VQVDsKKyAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXMgPSAwOyAgLy8gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gc3RyaW5nX2J1ZmZlcgogCiAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpKQogICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNbaV0pCisgICAgICAgICAgICBjb25zdCBhdXRvIGJ5dGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzW2ldKTsKKworICAgICAgICAgICAgc3dpdGNoIChkZWNvZGUoc3RhdGUsIGNvZGVwb2ludCwgYnl0ZSkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnIic6IC8vIHF1b3RhdGlvbiBtYXJrICgweDIyKQorICAgICAgICAgICAgICAgIGNhc2UgVVRGOF9BQ0NFUFQ6ICAvLyBkZWNvZGUgZm91bmQgYSBuZXcgY29kZSBwb2ludAogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcyArIDFdID0gJyInOwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOiAvLyByZXZlcnNlIHNvbGlkdXMgKDB4NUMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAnXGInOiAvLyBiYWNrc3BhY2UgKDB4MDgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zICsgMV0gPSAnYic7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdcZic6IC8vIGZvcm1mZWVkICgweDBDKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcyArIDFdID0gJ2YnOwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOiAvLyBuZXdsaW5lICgweDBBKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcyArIDFdID0gJ24nOwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAnXHInOiAvLyBjYXJyaWFnZSByZXR1cm4gKDB4MEQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zICsgMV0gPSAncic7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6IC8vIGhvcml6b250YWwgdGFiICgweDA5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3BvcyArIDFdID0gJ3QnOwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSBjb250cm9sIGNoYXJhY3RlcnMgKDB4MDAuLjB4MUYpIG9yLCBpZgotICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmVfYXNjaWkgcGFyYW1ldGVyIGlzIHVzZWQsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgICAgIGlmICgoMHgwMCA8PSBzW2ldIGFuZCBzW2ldIDw9IDB4MUYpIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuc3VyZV9hc2NpaSBhbmQgKHNbaV0gJiAweDgwIG9yIHNbaV0gPT0gMHg3RikpKQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGVwb2ludCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBieXRlcyA9IGJ5dGVzX2ZvbGxvd2luZyhzdGF0aWNfY2FzdDx1aW50OF90PihzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbCBiZSBkZXRlY3RlZCBieSB0aHJvd19pZl9pbnZhbGlkX3V0ZjgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoYnl0ZXMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBhZGRpdGlvbmFsIGJ5dGVzIGFyZSBwcmVzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoaSArIGJ5dGVzIDwgcy5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB1c2UgXHV4eHh4IGVzY2FwaW5nLCB3ZSBmaXJzdCBuZWVkIHRvIGNhbGN1bGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvZGVwb2ludCBmcm9tIHRoZSBVVEYtOCBieXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIGlzIHVuc2lnbmVkIHR5cGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYnl0ZXMgPD0gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA4OiAvLyBiYWNrc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcG9pbnQgPSBzW2ldICYgMHhGRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50ID0gKChzW2ldICYgMHgzRikgPDwgNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc1tpICsgMV0gJiAweDdGKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50ID0gKChzW2ldICYgMHgxRikgPDwgMTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChzW2kgKyAxXSAmIDB4N0YpIDw8IDYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNbaSArIDJdICYgMHg3Rik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9ICgoc1tpXSAmIDB4RikgPDwgMTgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChzW2kgKyAxXSAmIDB4N0YpIDw8IDEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoc1tpICsgMl0gJiAweDdGKSA8PCA2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzW2kgKyAzXSAmIDB4N0YpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIExDT1ZfRVhDTF9MSU5FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdiJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2NvZGVwb2ludChjb2RlcG9pbnQsIHJlc3VsdCwgcG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDk6IC8vIGhvcml6b250YWwgdGFiCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICd0JzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBBOiAvLyBuZXdsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICduJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBDOiAvLyBmb3JtZmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnZic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwRDogLy8gY2FycmlhZ2UgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdcXCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2J1ZmZlcltieXRlcysrXSA9ICdyJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIyOiAvLyBxdW90YXRpb24gbWFyaworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXCInOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NUM6IC8vIHJldmVyc2Ugc29saWR1cworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSBjb250cm9sIGNoYXJhY3RlcnMgKDB4MDAuLjB4MUYpIG9yLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZV9hc2NpaSBwYXJhbWV0ZXIgaXMgdXNlZCwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGVwb2ludCA8PSAweDFGKSBvciAoZW5zdXJlX2FzY2lpIGFuZCAoY29kZXBvaW50ID49IDB4N0YpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcG9pbnQgPD0gMHhGRkZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNucHJpbnRmKHN0cmluZ19idWZmZXIuZGF0YSgpICsgYnl0ZXMsIDcsICJcXHUlMDR4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNvZGVwb2ludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c25wcmludGYoc3RyaW5nX2J1ZmZlci5kYXRhKCkgKyBieXRlcywgMTMsICJcXHUlMDR4XFx1JTA0eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigweEQ3QzAgKyAoY29kZXBvaW50ID4+IDEwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigweERDMDAgKyAoY29kZXBvaW50ICYgMHgzRkYpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGJ5dGUgdG8gYnVmZmVyIChhbGwgcHJldmlvdXMgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb3BpZWQgaGF2ZSBpbiBkZWZhdWx0IGNhc2UgYWJvdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSBzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYnVmZmVyIGFuZCByZXNldCBpbmRleDsgdGhlcmUgbXVzdCBiZSAxMyBieXRlcworICAgICAgICAgICAgICAgICAgICAvLyBsZWZ0LCBhcyB0aGlzIGlzIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAvLyB3cml0dGVuICgiXHV4eHh4XHV4eHh4XDAiKSBmb3Igb25lIGNvZGUgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZ19idWZmZXIuc2l6ZSgpIC0gYnl0ZXMgPCAxMykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGNoYXJhY3RlcnMgYXJlIGFkZGVkIGFzLWlzCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMoc3RyaW5nX2J1ZmZlci5kYXRhKCksIGJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIFVURjhfUkVKRUNUOiAgLy8gZGVjb2RlIGZvdW5kIGludmFsaWQgVVRGLTggYnl0ZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleCA8PCBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGUpOworICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTYsICJpbnZhbGlkIFVURi04IGJ5dGUgYXQgaW5kZXggIiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIjogMHgiICsgc3Muc3RyKCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gZGVjb2RlIGZvdW5kIHlldCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY29kZSBwb2ludAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBlbnN1cmVfYXNjaWkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgcG9pbnQgd2lsbCBub3QgYmUgZXNjYXBlZCAtIGNvcHkgYnl0ZSB0byBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19idWZmZXJbYnl0ZXMrK10gPSBzW2ldOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydChwb3MgPT0gcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIG8tPndyaXRlX2NoYXJhY3RlcnMocmVzdWx0LmNfc3RyKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBpZiAoSlNPTl9MSUtFTFkoc3RhdGUgPT0gVVRGOF9BQ0NFUFQpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIKKyAgICAgICAgICAgIGlmIChieXRlcyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhzdHJpbmdfYnVmZmVyLmRhdGEoKSwgYnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgZmluaXNoIHJlYWRpbmcsIGJ1dCBkbyBub3QgYWNjZXB0OiBzdHJpbmcgd2FzIGluY29tcGxldGUKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4IDw8IHN0YXRpY19jYXN0PGludD4oc3RhdGljX2Nhc3Q8dWludDhfdD4ocy5iYWNrKCkpKTsKKyAgICAgICAgICAgIEpTT05fVEhST1codHlwZV9lcnJvcjo6Y3JlYXRlKDMxNiwgImluY29tcGxldGUgVVRGLTggc3RyaW5nOyBsYXN0IGJ5dGU6IDB4IiArIHNzLnN0cigpKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiEKQEAgLTY2NzksMTQgKzg2NzcsMzYgQEAKICAgICB2b2lkIGR1bXBfZmxvYXQobnVtYmVyX2Zsb2F0X3QgeCkKICAgICB7CiAgICAgICAgIC8vIE5hTiAvIGluZgotICAgICAgICBpZiAobm90IHN0ZDo6aXNmaW5pdGUoeCkgb3Igc3RkOjppc25hbih4KSkKKyAgICAgICAgaWYgKG5vdCBzdGQ6OmlzZmluaXRlKHgpKQogICAgICAgICB7CiAgICAgICAgICAgICBvLT53cml0ZV9jaGFyYWN0ZXJzKCJudWxsIiwgNCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBnZXQgbnVtYmVyIG9mIGRpZ2l0cyBmb3IgYSB0ZXh0IC0+IGZsb2F0IC0+IHRleHQgcm91bmQtdHJpcAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8bnVtYmVyX2Zsb2F0X3Q+OjpkaWdpdHMxMDsKKyAgICAgICAgLy8gSWYgbnVtYmVyX2Zsb2F0X3QgaXMgYW4gSUVFRS03NTQgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyLAorICAgICAgICAvLyB1c2UgdGhlIEdyaXN1MiBhbGdvcml0aG0gdG8gcHJvZHVjZSBzaG9ydCBudW1iZXJzIHdoaWNoIGFyZQorICAgICAgICAvLyBndWFyYW50ZWVkIHRvIHJvdW5kLXRyaXAsIHVzaW5nIHN0cnRvZiBhbmQgc3RydG9kLCByZXNwLgorICAgICAgICAvLworICAgICAgICAvLyBOQjogVGhlIHRlc3QgYmVsb3cgd29ya3MgaWYgPGxvbmcgZG91YmxlPiA9PSA8ZG91YmxlPi4KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2llZWVfc2luZ2xlX29yX2RvdWJsZQorICAgICAgICAgICAgPSAoc3RkOjpudW1lcmljX2xpbWl0czxudW1iZXJfZmxvYXRfdD46OmlzX2llYzU1OSBhbmQgc3RkOjpudW1lcmljX2xpbWl0czxudW1iZXJfZmxvYXRfdD46OmRpZ2l0cyA9PSAyNCBhbmQgc3RkOjpudW1lcmljX2xpbWl0czxudW1iZXJfZmxvYXRfdD46Om1heF9leHBvbmVudCA9PSAxMjgpIG9yCisgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6aXNfaWVjNTU5IGFuZCBzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6ZGlnaXRzID09IDUzIGFuZCBzdGQ6Om51bWVyaWNfbGltaXRzPG51bWJlcl9mbG9hdF90Pjo6bWF4X2V4cG9uZW50ID09IDEwMjQpOworCisgICAgICAgIGR1bXBfZmxvYXQoeCwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19pZWVlX3NpbmdsZV9vcl9kb3VibGU+KCkpOworICAgIH0KKworICAgIHZvaWQgZHVtcF9mbG9hdChudW1iZXJfZmxvYXRfdCB4LCBzdGQ6OnRydWVfdHlwZSAvKmlzX2llZWVfc2luZ2xlX29yX2RvdWJsZSovKQorICAgIHsKKyAgICAgICAgY2hhciogYmVnaW4gPSBudW1iZXJfYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgY2hhciogZW5kID0gOjpubG9obWFubjo6ZGV0YWlsOjp0b19jaGFycyhiZWdpbiwgYmVnaW4gKyBudW1iZXJfYnVmZmVyLnNpemUoKSwgeCk7CisKKyAgICAgICAgby0+d3JpdGVfY2hhcmFjdGVycyhiZWdpbiwgc3RhdGljX2Nhc3Q8c2l6ZV90PihlbmQgLSBiZWdpbikpOworICAgIH0KKworICAgIHZvaWQgZHVtcF9mbG9hdChudW1iZXJfZmxvYXRfdCB4LCBzdGQ6OmZhbHNlX3R5cGUgLyppc19pZWVlX3NpbmdsZV9vcl9kb3VibGUqLykKKyAgICB7CisgICAgICAgIC8vIGdldCBudW1iZXIgb2YgZGlnaXRzIGZvciBhIGZsb2F0IC0+IHRleHQgLT4gZmxvYXQgcm91bmQtdHJpcAorICAgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8bnVtYmVyX2Zsb2F0X3Q+OjptYXhfZGlnaXRzMTA7CiAKICAgICAgICAgLy8gdGhlIGFjdHVhbCBjb252ZXJzaW9uCiAgICAgICAgIHN0ZDo6cHRyZGlmZl90IGxlbiA9IHNucHJpbnRmKG51bWJlcl9idWZmZXIuZGF0YSgpLCBudW1iZXJfYnVmZmVyLnNpemUoKSwgIiUuKmciLCBkLCB4KTsKQEAgLTY3NDQsMTUgKzg3NjQsMTYgQEAKICAgICBmb2xsb3dlZC4KIAogICAgIEBwYXJhbVtpbixvdXRdIHN0YXRlICB0aGUgc3RhdGUgb2YgdGhlIGRlY29kaW5nCisgICAgQHBhcmFtW2luLG91dF0gY29kZXAgIGNvZGVwb2ludCAodmFsaWQgb25seSBpZiByZXN1bHRpbmcgc3RhdGUgaXMgVVRGOF9BQ0NFUFQpCiAgICAgQHBhcmFtW2luXSBieXRlICAgICAgIG5leHQgYnl0ZSB0byBkZWNvZGUKKyAgICBAcmV0dXJuICAgICAgICAgICAgICAgbmV3IHN0YXRlCiAKLSAgICBAbm90ZSBUaGUgZnVuY3Rpb24gaGFzIGJlZW4gZWRpdGVkOiBhIHN0ZDo6YXJyYXkgaXMgdXNlZCBhbmQgdGhlIGNvZGUKLSAgICAgICAgICBwb2ludCBpcyBub3QgY2FsY3VsYXRlZC4KKyAgICBAbm90ZSBUaGUgZnVuY3Rpb24gaGFzIGJlZW4gZWRpdGVkOiBhIHN0ZDo6YXJyYXkgaXMgdXNlZC4KIAogICAgIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgQmpvZXJuIEhvZWhybWFubiA8YmpvZXJuQGhvZWhybWFubi5kZT4KICAgICBAc2EgaHR0cDovL2Jqb2Vybi5ob2Vocm1hbm4uZGUvdXRmLTgvZGVjb2Rlci9kZmEvCiAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBkZWNvZGUodWludDhfdCYgc3RhdGUsIGNvbnN0IHVpbnQ4X3QgYnl0ZSkKKyAgICBzdGF0aWMgdWludDhfdCBkZWNvZGUodWludDhfdCYgc3RhdGUsIHVpbnQzMl90JiBjb2RlcCwgY29uc3QgdWludDhfdCBieXRlKSBub2V4Y2VwdAogICAgIHsKICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDhfdCwgNDAwPiB1dGY4ZCA9CiAgICAgICAgIHsKQEAgLTY3NzUsNDIgKzg3OTYsMTMgQEAKICAgICAgICAgfTsKIAogICAgICAgICBjb25zdCB1aW50OF90IHR5cGUgPSB1dGY4ZFtieXRlXTsKKworICAgICAgICBjb2RlcCA9IChzdGF0ZSAhPSBVVEY4X0FDQ0VQVCkKKyAgICAgICAgICAgICAgICA/IChieXRlICYgMHgzZnUpIHwgKGNvZGVwIDw8IDYpCisgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oMHhmZiA+PiB0eXBlKSAmIChieXRlKTsKKwogICAgICAgICBzdGF0ZSA9IHV0ZjhkWzI1NnUgKyBzdGF0ZSAqIDE2dSArIHR5cGVdOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiB0aHJvdyBhbiBleGNlcHRpb24gaWYgYSBzdHJpbmcgaXMgbm90IFVURi04IGVuY29kZWQKLQotICAgIEBwYXJhbVtpbl0gc3RyICBVVEYtOCBzdHJpbmcgdG8gY2hlY2sKLSAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTYgaWYgcGFzc2VkIHN0cmluZyBpcyBub3QgVVRGLTggZW5jb2RlZAotCi0gICAgQHNpbmNlIHZlcnNpb24gMy4wLjAKLSAgICAqLwotICAgIHN0YXRpYyB2b2lkIHRocm93X2lmX2ludmFsaWRfdXRmOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQotICAgIHsKLSAgICAgICAgLy8gc3RhcnQgd2l0aCBzdGF0ZSAwICg9IGFjY2VwdCkKLSAgICAgICAgdWludDhfdCBzdGF0ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYnl0ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0cltpXSk7Ci0gICAgICAgICAgICBkZWNvZGUoc3RhdGUsIGJ5dGUpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gc3RhdGUgMSBtZWFucyByZWplY3QKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgICAgICAgICBzcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXggPDwgc3RhdGljX2Nhc3Q8aW50PihieXRlKTsKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTYsICJpbnZhbGlkIFVURi04IGJ5dGUgYXQgaW5kZXggIiArIHN0ZDo6dG9fc3RyaW5nKGkpICsgIjogMHgiICsgc3Muc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0ZSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB3ZSBmaW5pc2ggcmVhZGluZywgYnV0IGRvIG5vdCBhY2NlcHQ6IHN0cmluZyB3YXMgaW5jb21wbGV0ZQotICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgICAgICBzcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpoZXggPDwgc3RhdGljX2Nhc3Q8aW50PihzdGF0aWNfY2FzdDx1aW50OF90PihzdHIuYmFjaygpKSk7Ci0gICAgICAgICAgICBKU09OX1RIUk9XKHR5cGVfZXJyb3I6OmNyZWF0ZSgzMTYsICJpbmNvbXBsZXRlIFVURi04IHN0cmluZzsgbGFzdCBieXRlOiAweCIgKyBzcy5zdHIoKSkpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICB9CiAKICAgcHJpdmF0ZToKQEAgLTY4MjcsMTMgKzg4MTksMjcgQEAKICAgICAvLy8gdGhlIGxvY2FsZSdzIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyCiAgICAgY29uc3QgY2hhciBkZWNpbWFsX3BvaW50ID0gJ1wwJzsKIAorICAgIC8vLyBzdHJpbmcgYnVmZmVyCisgICAgc3RkOjphcnJheTxjaGFyLCA1MTI+IHN0cmluZ19idWZmZXJ7e319OworCiAgICAgLy8vIHRoZSBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIKICAgICBjb25zdCBjaGFyIGluZGVudF9jaGFyOwotCiAgICAgLy8vIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcKICAgICBzdHJpbmdfdCBpbmRlbnRfc3RyaW5nOwogfTsKK30KK30KIAorLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9qc29uX3JlZi5ocHA+CisKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIG5sb2htYW5uCit7CituYW1lc3BhY2UgZGV0YWlsCit7CiB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlPgogY2xhc3MganNvbl9yZWYKIHsKQEAgLTY4ODYsNzQgKzg4OTIsMzAgQEAKICAgICB2YWx1ZV90eXBlKiB2YWx1ZV9yZWYgPSBudWxscHRyOwogICAgIGNvbnN0IGJvb2wgaXNfcnZhbHVlOwogfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vLyBuYW1lc3BhY2UgdG8gaG9sZCBkZWZhdWx0IGB0b19qc29uYCAvIGBmcm9tX2pzb25gIGZ1bmN0aW9ucwotbmFtZXNwYWNlCi17Ci1jb25zdGV4cHIgY29uc3QgYXV0byYgdG9fanNvbiA9IGRldGFpbDo6c3RhdGljX2NvbnN0PGRldGFpbDo6dG9fanNvbl9mbj46OnZhbHVlOwotY29uc3RleHByIGNvbnN0IGF1dG8mIGZyb21fanNvbiA9IGRldGFpbDo6c3RhdGljX2NvbnN0PGRldGFpbDo6ZnJvbV9qc29uX2ZuPjo6dmFsdWU7Cit9CiB9CiAKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvanNvbl9wb2ludGVyLmhwcD4KIAotLyohCi1AYnJpZWYgZGVmYXVsdCBKU09OU2VyaWFsaXplciB0ZW1wbGF0ZSBhcmd1bWVudAogCi1UaGlzIHNlcmlhbGl6ZXIgaWdub3JlcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB1c2VzIEFETAotKFthcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwXShodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9hZGwpKQotZm9yIHNlcmlhbGl6YXRpb24uCi0qLwotdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgotc3RydWN0IGFkbF9zZXJpYWxpemVyCisjaW5jbHVkZSA8Y2Fzc2VydD4gLy8gYXNzZXJ0CisjaW5jbHVkZSA8bnVtZXJpYz4gLy8gYWNjdW11bGF0ZQorI2luY2x1ZGUgPHN0cmluZz4gLy8gc3RyaW5nCisjaW5jbHVkZSA8dmVjdG9yPiAvLyB2ZWN0b3IKKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9tYWNyb19zY29wZS5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvZXhjZXB0aW9ucy5ocHA+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvdmFsdWVfdC5ocHA+CisKKworbmFtZXNwYWNlIG5sb2htYW5uCiB7Ci0gICAgLyohCi0gICAgQGJyaWVmIGNvbnZlcnQgYSBKU09OIHZhbHVlIHRvIGFueSB2YWx1ZSB0eXBlCi0KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGJ5IHRoZSBgZ2V0KClgIGZ1bmN0aW9uIG9mIHRoZQotICAgIEByZWYgYmFzaWNfanNvbiBjbGFzcyAoZWl0aGVyIGV4cGxpY2l0IG9yIHZpYSBjb252ZXJzaW9uIG9wZXJhdG9ycykuCi0KLSAgICBAcGFyYW1baW5dIGogICAgICAgICBKU09OIHZhbHVlIHRvIHJlYWQgZnJvbQotICAgIEBwYXJhbVtpbixvdXRdIHZhbCAgdmFsdWUgdG8gd3JpdGUgdG8KLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEJhc2ljSnNvblR5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZT4KLSAgICBzdGF0aWMgdm9pZCBmcm9tX2pzb24oQmFzaWNKc29uVHlwZSYmIGosIFZhbHVlVHlwZSYgdmFsKSBub2V4Y2VwdCgKLSAgICAgICAgbm9leGNlcHQoOjpubG9obWFubjo6ZnJvbV9qc29uKHN0ZDo6Zm9yd2FyZDxCYXNpY0pzb25UeXBlPihqKSwgdmFsKSkpCi0gICAgewotICAgICAgICA6Om5sb2htYW5uOjpmcm9tX2pzb24oc3RkOjpmb3J3YXJkPEJhc2ljSnNvblR5cGU+KGopLCB2YWwpOwotICAgIH0KLQotICAgIC8qIQotICAgIEBicmllZiBjb252ZXJ0IGFueSB2YWx1ZSB0eXBlIHRvIGEgSlNPTiB2YWx1ZQotCi0gICAgVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBAcmVmIGJhc2ljX2pzb24KLSAgICBjbGFzcy4KLQotICAgIEBwYXJhbVtpbixvdXRdIGogIEpTT04gdmFsdWUgdG8gd3JpdGUgdG8KLSAgICBAcGFyYW1baW5dIHZhbCAgICAgdmFsdWUgdG8gcmVhZCBmcm9tCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU+Ci0gICAgc3RhdGljIHZvaWQgdG9fanNvbihCYXNpY0pzb25UeXBlJiBqLCBWYWx1ZVR5cGUmJiB2YWwpIG5vZXhjZXB0KAotICAgICAgICBub2V4Y2VwdCg6Om5sb2htYW5uOjp0b19qc29uKGosIHN0ZDo6Zm9yd2FyZDxWYWx1ZVR5cGU+KHZhbCkpKSkKLSAgICB7Ci0gICAgICAgIDo6bmxvaG1hbm46OnRvX2pzb24oaiwgc3RkOjpmb3J3YXJkPFZhbHVlVHlwZT4odmFsKSk7Ci0gICAgfQotfTsKLQotLyohCi1AYnJpZWYgSlNPTiBQb2ludGVyCi0KLUEgSlNPTiBwb2ludGVyIGRlZmluZXMgYSBzdHJpbmcgc3ludGF4IGZvciBpZGVudGlmeWluZyBhIHNwZWNpZmljIHZhbHVlCi13aXRoaW4gYSBKU09OIGRvY3VtZW50LiBJdCBjYW4gYmUgdXNlZCB3aXRoIGZ1bmN0aW9ucyBgYXRgIGFuZAotYG9wZXJhdG9yW11gLiBGdXJ0aGVybW9yZSwgSlNPTiBwb2ludGVycyBhcmUgdGhlIGJhc2UgZm9yIEpTT04gcGF0Y2hlcy4KLQotQHNhIFtSRkMgNjkwMV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDEpCi0KLUBzaW5jZSB2ZXJzaW9uIDIuMC4wCi0qLwordGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KIGNsYXNzIGpzb25fcG9pbnRlcgogewotICAgIC8vLyBhbGxvdyBiYXNpY19qc29uIHRvIGFjY2VzcyBwcml2YXRlIG1lbWJlcnMKKyAgICAvLyBhbGxvdyBiYXNpY19qc29uIHRvIGFjY2VzcyBwcml2YXRlIG1lbWJlcnMKICAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgogICAgIGZyaWVuZCBjbGFzcyBiYXNpY19qc29uOwogCkBAIC02OTY3LDE5ICs4OTI5LDIxIEBACiAgICAgQHBhcmFtW2luXSBzICBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBKU09OIHBvaW50ZXI7IGlmIG9taXR0ZWQsIHRoZSBlbXB0eQogICAgICAgICAgICAgICAgICAgc3RyaW5nIGlzIGFzc3VtZWQgd2hpY2ggcmVmZXJlbmNlcyB0aGUgd2hvbGUgSlNPTiB2YWx1ZQogCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwNyBpZiB0aGUgZ2l2ZW4gSlNPTiBwb2ludGVyIEBhIHMgaXMgbm9uZW1wdHkgYW5kCi0gICAgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoIChgL2ApOyBzZWUgZXhhbXBsZSBiZWxvdworICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDcgaWYgdGhlIGdpdmVuIEpTT04gcG9pbnRlciBAYSBzIGlzIG5vbmVtcHR5IGFuZCBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmVnaW4gd2l0aCBhIHNsYXNoIChgL2ApOyBzZWUgZXhhbXBsZSBiZWxvdwogCi0gICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOCBpZiBhIHRpbGRlIChgfmApIGluIHRoZSBnaXZlbiBKU09OIHBvaW50ZXIgQGEgcwotICAgIGlzIG5vdCBmb2xsb3dlZCBieSBgMGAgKHJlcHJlc2VudGluZyBgfmApIG9yIGAxYCAocmVwcmVzZW50aW5nIGAvYCk7Ci0gICAgc2VlIGV4YW1wbGUgYmVsb3cKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA4IGlmIGEgdGlsZGUgKGB+YCkgaW4gdGhlIGdpdmVuIEpTT04gcG9pbnRlciBAYSBzIGlzCisgICAgbm90IGZvbGxvd2VkIGJ5IGAwYCAocmVwcmVzZW50aW5nIGB+YCkgb3IgYDFgIChyZXByZXNlbnRpbmcgYC9gKTsgc2VlCisgICAgZXhhbXBsZSBiZWxvdwogCi0gICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBjb25zdHJ1Y3Rpb24gc2V2ZXJhbCB2YWxpZCBKU09OCi0gICAgcG9pbnRlcnMgYXMgd2VsbCBhcyB0aGUgZXhjZXB0aW9uYWwgYmVoYXZpb3IuLGpzb25fcG9pbnRlcn0KKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIGNvbnN0cnVjdGlvbiBzZXZlcmFsIHZhbGlkIEpTT04gcG9pbnRlcnMKKyAgICBhcyB3ZWxsIGFzIHRoZSBleGNlcHRpb25hbCBiZWhhdmlvci4sanNvbl9wb2ludGVyfQogCiAgICAgQHNpbmNlIHZlcnNpb24gMi4wLjAKICAgICAqLwotICAgIGV4cGxpY2l0IGpzb25fcG9pbnRlcihjb25zdCBzdGQ6OnN0cmluZyYgcyA9ICIiKSA6IHJlZmVyZW5jZV90b2tlbnMoc3BsaXQocykpIHt9CisgICAgZXhwbGljaXQganNvbl9wb2ludGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzID0gIiIpCisgICAgICAgIDogcmVmZXJlbmNlX3Rva2VucyhzcGxpdChzKSkKKyAgICB7fQogCiAgICAgLyohCiAgICAgQGJyaWVmIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlNPTiBwb2ludGVyCkBAIC03MDIxLDcgKzg5ODUsNyBAQAogICAgICovCiAgICAgc3RhdGljIGludCBhcnJheV9pbmRleChjb25zdCBzdGQ6OnN0cmluZyYgcykKICAgICB7Ci0gICAgICAgIHNpemVfdCBwcm9jZXNzZWRfY2hhcnMgPSAwOworICAgICAgICBzdGQ6OnNpemVfdCBwcm9jZXNzZWRfY2hhcnMgPSAwOwogICAgICAgICBjb25zdCBpbnQgcmVzID0gc3RkOjpzdG9pKHMsICZwcm9jZXNzZWRfY2hhcnMpOwogCiAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHJpbmcgd2FzIGNvbXBsZXRlbHkgcmVhZApAQCAtNzA3Niw4ICs5MDQwLDY2IEBACiAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwOSBpZiBhcnJheSBpbmRleCBpcyBub3QgYSBudW1iZXIKICAgICBAdGhyb3cgdHlwZV9lcnJvci4zMTMgaWYgdmFsdWUgY2Fubm90IGJlIHVuZmxhdHRlbmVkCiAgICAgKi8KLSAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotICAgIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMJiBnZXRfYW5kX2NyZWF0ZShOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYgaikgY29uc3Q7CisgICAgQmFzaWNKc29uVHlwZSYgZ2V0X2FuZF9jcmVhdGUoQmFzaWNKc29uVHlwZSYgaikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgYXV0byByZXN1bHQgPSAmajsKKworICAgICAgICAvLyBpbiBjYXNlIG5vIHJlZmVyZW5jZSB0b2tlbnMgZXhpc3QsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgSlNPTiB2YWx1ZQorICAgICAgICAvLyBqIHdoaWNoIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYSBwcmltaXRpdmUgdmFsdWUKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpudWxsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZV90b2tlbiA9PSAiMCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IGFycmF5IGlmIHJlZmVyZW5jZSB0b2tlbiBpcyAwCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgYSBuZXcgb2JqZWN0IG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAmcmVzdWx0LT5vcGVyYXRvcltdKHJlZmVyZW5jZV90b2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIG9ubHkgcmVhY2hlZCBpZiB0aGVyZSBleGlzdHMgYSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICB0b2tlbiBfYW5kXyB0aGUgY3VycmVudCB2YWx1ZSBpcyBwcmltaXRpdmUuIEluIHRoaXMgY2FzZSwgd2UgaGF2ZQorICAgICAgICAgICAgICAgIGFuIGVycm9yIHNpdHVhdGlvbiwgYmVjYXVzZSBwcmltaXRpdmUgdmFsdWVzIG1heSBvbmx5IG9jY3VyIGFzCisgICAgICAgICAgICAgICAgc2luZ2xlIHZhbHVlOyB0aGF0IGlzLCB3aXRoIGFuIGVtcHR5IGxpc3Qgb2YgcmVmZXJlbmNlIHRva2Vucy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjp0eXBlX2Vycm9yOjpjcmVhdGUoMzEzLCAiaW52YWxpZCB2YWx1ZSB0byB1bmZsYXR0ZW4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnJlc3VsdDsKKyAgICB9CiAKICAgICAvKiEKICAgICBAYnJpZWYgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBwb2ludGVkIHRvIHZhbHVlCkBAIC03MDk4LDggKzkxMjAsNzUgQEAKICAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTA5ICAgaWYgYW4gYXJyYXkgaW5kZXggd2FzIG5vdCBhIG51bWJlcgogICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0ICBpZiB0aGUgSlNPTiBwb2ludGVyIGNhbiBub3QgYmUgcmVzb2x2ZWQKICAgICAqLwotICAgIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCi0gICAgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIGdldF91bmNoZWNrZWQoTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwqIHB0cikgY29uc3Q7CisgICAgQmFzaWNKc29uVHlwZSYgZ2V0X3VuY2hlY2tlZChCYXNpY0pzb25UeXBlKiBwdHIpIGNvbnN0CisgICAgeworICAgICAgICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzaXplX3R5cGU7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVmZXJlbmNlX3Rva2VuIDogcmVmZXJlbmNlX3Rva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29udmVydCBudWxsIHZhbHVlcyB0byBhcnJheXMgb3Igb2JqZWN0cyBiZWZvcmUgY29udGludWluZworICAgICAgICAgICAgaWYgKHB0ci0+bV90eXBlID09IGRldGFpbDo6dmFsdWVfdDo6bnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiByZWZlcmVuY2UgdG9rZW4gaXMgYSBudW1iZXIKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIG51bXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbF9vZihyZWZlcmVuY2VfdG9rZW4uYmVnaW4oKSwgcmVmZXJlbmNlX3Rva2VuLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBjaGFyIHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHggPj0gJzAnIGFuZCB4IDw9ICc5Jyk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdmFsdWUgdG8gYXJyYXkgZm9yIG51bWJlcnMgb3IgIi0iIG9yIHRvIG9iamVjdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAqcHRyID0gKG51bXMgb3IgcmVmZXJlbmNlX3Rva2VuID09ICItIikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5CisgICAgICAgICAgICAgICAgICAgICAgIDogZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAocHRyLT5tX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB1bmNoZWNrZWQgb2JqZWN0IGFjY2VzcworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5vcGVyYXRvcltdKHJlZmVyZW5jZV90b2tlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjphcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQorICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4uc2l6ZSgpID4gMSBhbmQgcmVmZXJlbmNlX3Rva2VuWzBdID09ICcwJykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtdXN0IG5vdCBiZWdpbiB3aXRoICcwJyIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHRyZWF0ICItIiBhcyBpbmRleCBiZXlvbmQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGFycmF5IGluZGV4IHRvIG51bWJlcjsgdW5jaGVja2VkIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5vcGVyYXRvcltdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0goc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDksIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIGlzIG5vdCBhIG51bWJlciIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAqcHRyOworICAgIH0KIAogICAgIC8qIQogICAgIEB0aHJvdyBwYXJzZV9lcnJvci4xMDYgICBpZiBhbiBhcnJheSBpbmRleCBiZWdpbnMgd2l0aCAnMCcKQEAgLTcxMDcsOCArOTE5Niw1NyBAQAogICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDAyICBpZiB0aGUgYXJyYXkgaW5kZXggJy0nIGlzIHVzZWQKICAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwNCAgaWYgdGhlIEpTT04gcG9pbnRlciBjYW4gbm90IGJlIHJlc29sdmVkCiAgICAgKi8KLSAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotICAgIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMJiBnZXRfY2hlY2tlZChOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCogcHRyKSBjb25zdDsKKyAgICBCYXNpY0pzb25UeXBlJiBnZXRfY2hlY2tlZChCYXNpY0pzb25UeXBlKiBwdHIpIGNvbnN0CisgICAgeworICAgICAgICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSBCYXNpY0pzb25UeXBlOjpzaXplX3R5cGU7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcmVmZXJlbmNlX3Rva2VuIDogcmVmZXJlbmNlX3Rva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChwdHItPm1fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6b2JqZWN0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQocmVmZXJlbmNlX3Rva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocmVmZXJlbmNlX3Rva2VuID09ICItIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICItIiBhbHdheXMgZmFpbHMgdGhlIHJhbmdlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnLScgKCIgKyBzdGQ6OnRvX3N0cmluZyhwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGlzIG91dCBvZiByYW5nZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQorICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4uc2l6ZSgpID4gMSBhbmQgcmVmZXJlbmNlX3Rva2VuWzBdID09ICcwJykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtdXN0IG5vdCBiZWdpbiB3aXRoICcwJyIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IGF0IHBlcmZvcm1zIHJhbmdlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIEpTT05fVFJZCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPmF0KHN0YXRpY19jYXN0PHNpemVfdHlwZT4oYXJyYXlfaW5kZXgocmVmZXJlbmNlX3Rva2VuKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0goc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA5LCAwLCAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyBpcyBub3QgYSBudW1iZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwNCwgInVucmVzb2x2ZWQgcmVmZXJlbmNlIHRva2VuICciICsgcmVmZXJlbmNlX3Rva2VuICsgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKnB0cjsKKyAgICB9CiAKICAgICAvKiEKICAgICBAYnJpZWYgcmV0dXJuIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBwb2ludGVkIHRvIHZhbHVlCkBAIC03MTIzLDggKzkyNjEsNTggQEAKICAgICBAdGhyb3cgb3V0X29mX3JhbmdlLjQwMiAgaWYgdGhlIGFycmF5IGluZGV4ICctJyBpcyB1c2VkCiAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDQgIGlmIHRoZSBKU09OIHBvaW50ZXIgY2FuIG5vdCBiZSByZXNvbHZlZAogICAgICovCi0gICAgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUExfREVDTEFSQVRJT04KLSAgICBjb25zdCBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYgZ2V0X3VuY2hlY2tlZChjb25zdCBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCogcHRyKSBjb25zdDsKKyAgICBjb25zdCBCYXNpY0pzb25UeXBlJiBnZXRfdW5jaGVja2VkKGNvbnN0IEJhc2ljSnNvblR5cGUqIHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdW5jaGVja2VkIG9iamVjdCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGNhbm5vdCBiZSB1c2VkIGZvciBjb25zdCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICctJyAoIiArIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHVuY2hlY2tlZCBhcnJheSBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBKU09OX0NBVENIKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDQsICJ1bnJlc29sdmVkIHJlZmVyZW5jZSB0b2tlbiAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICpwdHI7CisgICAgfQogCiAgICAgLyohCiAgICAgQHRocm93IHBhcnNlX2Vycm9yLjEwNiAgIGlmIGFuIGFycmF5IGluZGV4IGJlZ2lucyB3aXRoICcwJwpAQCAtNzEzMiw4ICs5MzIwLDU3IEBACiAgICAgQHRocm93IG91dF9vZl9yYW5nZS40MDIgIGlmIHRoZSBhcnJheSBpbmRleCAnLScgaXMgdXNlZAogICAgIEB0aHJvdyBvdXRfb2ZfcmFuZ2UuNDA0ICBpZiB0aGUgSlNPTiBwb2ludGVyIGNhbiBub3QgYmUgcmVzb2x2ZWQKICAgICAqLwotICAgIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCi0gICAgY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIGdldF9jaGVja2VkKGNvbnN0IE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMKiBwdHIpIGNvbnN0OworICAgIGNvbnN0IEJhc2ljSnNvblR5cGUmIGdldF9jaGVja2VkKGNvbnN0IEJhc2ljSnNvblR5cGUqIHB0cikgY29uc3QKKyAgICB7CisgICAgICAgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIEJhc2ljSnNvblR5cGU6OnNpemVfdHlwZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWZlcmVuY2VfdG9rZW4gOiByZWZlcmVuY2VfdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiBhdCBwZXJmb3JtcyByYW5nZSBjaGVjaworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5hdChyZWZlcmVuY2VfdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGFsd2F5cyBmYWlscyB0aGUgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpvdXRfb2ZfcmFuZ2U6OmNyZWF0ZSg0MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICctJyAoIiArIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCisgICAgICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9UUlkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVRDSChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDksIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIGlzIG5vdCBhIG51bWJlciIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAqcHRyOworICAgIH0KIAogICAgIC8qIQogICAgIEBicmllZiBzcGxpdCB0aGUgc3RyaW5nIGlucHV0IHRvIHJlZmVyZW5jZSB0b2tlbnMKQEAgLTcyNTIsMTAgKzk0ODksNTcgQEAKIAogICAgIEBub3RlIEVtcHR5IG9iamVjdHMgb3IgYXJyYXlzIGFyZSBmbGF0dGVuZWQgdG8gYG51bGxgLgogICAgICovCi0gICAgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUExfREVDTEFSQVRJT04KICAgICBzdGF0aWMgdm9pZCBmbGF0dGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWZlcmVuY2Vfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0pzb25UeXBlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljSnNvblR5cGUmIHJlc3VsdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodmFsdWUubV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLm1fdmFsdWUuYXJyYXktPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IGFycmF5IGFzIG51bGwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3JlZmVyZW5jZV9zdHJpbmddID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBhcnJheSBhbmQgdXNlIGluZGV4IGFzIHJlZmVyZW5jZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHZhbHVlLm1fdmFsdWUuYXJyYXktPnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKHJlZmVyZW5jZV9zdHJpbmcgKyAiLyIgKyBzdGQ6OnRvX3N0cmluZyhpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpKSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubV92YWx1ZS5vYmplY3QtPmVtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IG9iamVjdCBhcyBudWxsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZWZlcmVuY2Vfc3RyaW5nXSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgb2JqZWN0IGFuZCB1c2Uga2V5cyBhcyByZWZlcmVuY2Ugc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6ICp2YWx1ZS5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihyZWZlcmVuY2Vfc3RyaW5nICsgIi8iICsgZXNjYXBlKGVsZW1lbnQuZmlyc3QpLCBlbGVtZW50LnNlY29uZCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgcHJpbWl0aXZlIHZhbHVlIHdpdGggaXRzIHJlZmVyZW5jZSBzdHJpbmcKKyAgICAgICAgICAgICAgICByZXN1bHRbcmVmZXJlbmNlX3N0cmluZ10gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qIQogICAgIEBwYXJhbVtpbl0gdmFsdWUgIGZsYXR0ZW5lZCBKU09OCkBAIC03MjY3LDE5ICs5NTUxLDEwOCBAQAogICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxNSAgaWYgb2JqZWN0IHZhbHVlcyBhcmUgbm90IHByaW1pdGl2ZQogICAgIEB0aHJvdyB0eXBlX2Vycm9yLjMxMyAgaWYgdmFsdWUgY2Fubm90IGJlIHVuZmxhdHRlbmVkCiAgICAgKi8KLSAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotICAgIHN0YXRpYyBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTAotICAgIHVuZmxhdHRlbihjb25zdCBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYgdmFsdWUpOworICAgIHN0YXRpYyBCYXNpY0pzb25UeXBlCisgICAgdW5mbGF0dGVuKGNvbnN0IEJhc2ljSnNvblR5cGUmIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IHZhbHVlLmlzX29iamVjdCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnR5cGVfZXJyb3I6OmNyZWF0ZSgzMTQsICJvbmx5IG9iamVjdHMgY2FuIGJlIHVuZmxhdHRlbmVkIikpOworICAgICAgICB9CisKKyAgICAgICAgQmFzaWNKc29uVHlwZSByZXN1bHQ7CisKKyAgICAgICAgLy8gaXRlcmF0ZSB0aGUgSlNPTiBvYmplY3QgdmFsdWVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6ICp2YWx1ZS5tX3ZhbHVlLm9iamVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGVsZW1lbnQuc2Vjb25kLmlzX3ByaW1pdGl2ZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6dHlwZV9lcnJvcjo6Y3JlYXRlKDMxNSwgInZhbHVlcyBpbiBvYmplY3QgbXVzdCBiZSBwcmltaXRpdmUiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFzc2lnbiB2YWx1ZSB0byByZWZlcmVuY2UgcG9pbnRlZCB0byBieSBKU09OIHBvaW50ZXI7IE5vdGUgdGhhdCBpZgorICAgICAgICAgICAgLy8gdGhlIEpTT04gcG9pbnRlciBpcyAiIiAoaS5lLiwgcG9pbnRzIHRvIHRoZSB3aG9sZSB2YWx1ZSksIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBnZXRfYW5kX2NyZWF0ZSByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHJlc3VsdCBpdHNlbGYuIEFuIGFzc2lnbm1lbnQKKyAgICAgICAgICAgIC8vIHdpbGwgdGhlbiBjcmVhdGUgYSBwcmltaXRpdmUgdmFsdWUuCisgICAgICAgICAgICBqc29uX3BvaW50ZXIoZWxlbWVudC5maXJzdCkuZ2V0X2FuZF9jcmVhdGUocmVzdWx0KSA9IGVsZW1lbnQuc2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGpzb25fcG9pbnRlciBjb25zdCYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gKGxocy5yZWZlcmVuY2VfdG9rZW5zID09IHJocy5yZWZlcmVuY2VfdG9rZW5zKTsKKyAgICB9CiAKICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGpzb25fcG9pbnRlciBjb25zdCYgbGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gbm90IChsaHMgPT0gcmhzKTsKKyAgICB9CiAKICAgICAvLy8gdGhlIHJlZmVyZW5jZSB0b2tlbnMKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVmZXJlbmNlX3Rva2VuczsKIH07Cit9CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9hZGxfc2VyaWFsaXplci5ocHA+CisKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvY29udmVyc2lvbnMvZnJvbV9qc29uLmhwcD4KKworLy8gI2luY2x1ZGUgPG5sb2htYW5uL2RldGFpbC9jb252ZXJzaW9ucy90b19qc29uLmhwcD4KKworCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKK3RlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KK3N0cnVjdCBhZGxfc2VyaWFsaXplcgoreworICAgIC8qIQorICAgIEBicmllZiBjb252ZXJ0IGEgSlNPTiB2YWx1ZSB0byBhbnkgdmFsdWUgdHlwZQorCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBieSB0aGUgYGdldCgpYCBmdW5jdGlvbiBvZiB0aGUKKyAgICBAcmVmIGJhc2ljX2pzb24gY2xhc3MgKGVpdGhlciBleHBsaWNpdCBvciB2aWEgY29udmVyc2lvbiBvcGVyYXRvcnMpLgorCisgICAgQHBhcmFtW2luXSBqICAgICAgICAgSlNPTiB2YWx1ZSB0byByZWFkIGZyb20KKyAgICBAcGFyYW1baW4sb3V0XSB2YWwgIHZhbHVlIHRvIHdyaXRlIHRvCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNpY0pzb25UeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU+CisgICAgc3RhdGljIHZvaWQgZnJvbV9qc29uKEJhc2ljSnNvblR5cGUmJiBqLCBWYWx1ZVR5cGUmIHZhbCkgbm9leGNlcHQoCisgICAgICAgIG5vZXhjZXB0KDo6bmxvaG1hbm46OmZyb21fanNvbihzdGQ6OmZvcndhcmQ8QmFzaWNKc29uVHlwZT4oaiksIHZhbCkpKQorICAgIHsKKyAgICAgICAgOjpubG9obWFubjo6ZnJvbV9qc29uKHN0ZDo6Zm9yd2FyZDxCYXNpY0pzb25UeXBlPihqKSwgdmFsKTsKKyAgICB9CisKKyAgICAvKiEKKyAgICBAYnJpZWYgY29udmVydCBhbnkgdmFsdWUgdHlwZSB0byBhIEpTT04gdmFsdWUKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgQHJlZiBiYXNpY19qc29uCisgICAgY2xhc3MuCisKKyAgICBAcGFyYW1baW4sb3V0XSBqICBKU09OIHZhbHVlIHRvIHdyaXRlIHRvCisgICAgQHBhcmFtW2luXSB2YWwgICAgIHZhbHVlIHRvIHJlYWQgZnJvbQorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlPgorICAgIHN0YXRpYyB2b2lkIHRvX2pzb24oQmFzaWNKc29uVHlwZSYgaiwgVmFsdWVUeXBlJiYgdmFsKSBub2V4Y2VwdCgKKyAgICAgICAgbm9leGNlcHQoOjpubG9obWFubjo6dG9fanNvbihqLCBzdGQ6OmZvcndhcmQ8VmFsdWVUeXBlPih2YWwpKSkpCisgICAgeworICAgICAgICA6Om5sb2htYW5uOjp0b19qc29uKGosIHN0ZDo6Zm9yd2FyZDxWYWx1ZVR5cGU+KHZhbCkpOworICAgIH0KK307Cit9CisKKworLyohCitAYnJpZWYgbmFtZXNwYWNlIGZvciBOaWVscyBMb2htYW5uCitAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubgorQHNpbmNlIHZlcnNpb24gMS4wLjAKKyovCituYW1lc3BhY2UgbmxvaG1hbm4KK3sKIAogLyohCiBAYnJpZWYgYSBjbGFzcyB0byBzdG9yZSBKU09OIHZhbHVlcwpAQCAtNzM2Nyw3ICs5NzQwLDcgQEAKIHsKICAgcHJpdmF0ZToKICAgICB0ZW1wbGF0ZTxkZXRhaWw6OnZhbHVlX3Q+IGZyaWVuZCBzdHJ1Y3QgZGV0YWlsOjpleHRlcm5hbF9jb25zdHJ1Y3RvcjsKLSAgICBmcmllbmQgOjpubG9obWFubjo6anNvbl9wb2ludGVyOworICAgIGZyaWVuZCA6Om5sb2htYW5uOjpqc29uX3BvaW50ZXI8YmFzaWNfanNvbj47CiAgICAgZnJpZW5kIDo6bmxvaG1hbm46OmRldGFpbDo6cGFyc2VyPGJhc2ljX2pzb24+OwogICAgIGZyaWVuZCA6Om5sb2htYW5uOjpkZXRhaWw6OnNlcmlhbGl6ZXI8YmFzaWNfanNvbj47CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQmFzaWNKc29uVHlwZT4KQEAgLTc0MDQsNyArOTc3Nyw3IEBACiAgIHB1YmxpYzoKICAgICB1c2luZyB2YWx1ZV90ID0gZGV0YWlsOjp2YWx1ZV90OwogICAgIC8vLyBAY29weWRvYyBubG9obWFubjo6anNvbl9wb2ludGVyCi0gICAgdXNpbmcganNvbl9wb2ludGVyID0gOjpubG9obWFubjo6anNvbl9wb2ludGVyOworICAgIHVzaW5nIGpzb25fcG9pbnRlciA9IDo6bmxvaG1hbm46Ompzb25fcG9pbnRlcjxiYXNpY19qc29uPjsKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTRklOQUU+CiAgICAgdXNpbmcganNvbl9zZXJpYWxpemVyID0gSlNPTlNlcmlhbGl6ZXI8VCwgU0ZJTkFFPjsKICAgICAvLy8gaGVscGVyIHR5cGUgZm9yIGluaXRpYWxpemVyIGxpc3RzIG9mIGJhc2ljX2pzb24gdmFsdWVzCkBAIC03NTE3LDEwICs5ODkwLDEzIEBACiAgICAgICAgIHJlc3VsdFsiY29weXJpZ2h0Il0gPSAiKEMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIjsKICAgICAgICAgcmVzdWx0WyJuYW1lIl0gPSAiSlNPTiBmb3IgTW9kZXJuIEMrKyI7CiAgICAgICAgIHJlc3VsdFsidXJsIl0gPSAiaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24iOwotICAgICAgICByZXN1bHRbInZlcnNpb24iXSA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHsic3RyaW5nIiwgIjMuMC4xIn0sIHsibWFqb3IiLCAzfSwgeyJtaW5vciIsIDB9LCB7InBhdGNoIiwgMX0KLSAgICAgICAgfTsKKyAgICAgICAgcmVzdWx0WyJ2ZXJzaW9uIl1bInN0cmluZyJdID0KKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKE5MT0hNQU5OX0pTT05fVkVSU0lPTl9NQUpPUikgKyAiLiIgKworICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoTkxPSE1BTk5fSlNPTl9WRVJTSU9OX01JTk9SKSArICIuIiArCisgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhOTE9ITUFOTl9KU09OX1ZFUlNJT05fUEFUQ0gpOworICAgICAgICByZXN1bHRbInZlcnNpb24iXVsibWFqb3IiXSA9IE5MT0hNQU5OX0pTT05fVkVSU0lPTl9NQUpPUjsKKyAgICAgICAgcmVzdWx0WyJ2ZXJzaW9uIl1bIm1pbm9yIl0gPSBOTE9ITUFOTl9KU09OX1ZFUlNJT05fTUlOT1I7CisgICAgICAgIHJlc3VsdFsidmVyc2lvbiJdWyJwYXRjaCJdID0gTkxPSE1BTk5fSlNPTl9WRVJTSU9OX1BBVENIOwogCiAjaWZkZWYgX1dJTjMyCiAgICAgICAgIHJlc3VsdFsicGxhdGZvcm0iXSA9ICJ3aW4zMiI7CkBAIC04MTM5LDcgKzEwNTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gbnVsbHB0cjsgIC8vIHNpbGVuY2Ugd2FybmluZywgc2VlICM4MjEKICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkodCA9PSB2YWx1ZV90OjpudWxsKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhvdGhlcl9lcnJvcjo6Y3JlYXRlKDUwMCwgIjk2MWMxNTFkMmU4N2YyNjg2YTk1NWE5YmUyNGQzMTZmMTM2MmJmMjEgMy4wLjEiKSk7IC8vIExDT1ZfRVhDTF9MSU5FCisgICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKG90aGVyX2Vycm9yOjpjcmVhdGUoNTAwLCAiOTYxYzE1MWQyZTg3ZjI2ODZhOTU1YTliZTI0ZDMxNmYxMzYyYmYyMSAzLjEuMCIpKTsgLy8gTENPVl9FWENMX0xJTkUKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC04MTgyLDcgKzEwNTU4LDcgQEAKICAgICAgICAgICAgIGFycmF5ID0gY3JlYXRlPGFycmF5X3Q+KHN0ZDo6bW92ZSh2YWx1ZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBkZXN0cm95KHZhbHVlX3QgdCkKKyAgICAgICAgdm9pZCBkZXN0cm95KHZhbHVlX3QgdCkgbm9leGNlcHQKICAgICAgICAgewogICAgICAgICAgICAgc3dpdGNoICh0KQogICAgICAgICAgICAgewpAQCAtODIyNyw3ICsxMDYwMyw3IEBACiAgICAgdmFsdWUgaXMgY2hhbmdlZCwgYmVjYXVzZSB0aGUgaW52YXJpYW50IGV4cHJlc3NlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCiAgICAgQGEgbV90eXBlIGFuZCBAYSBtX3ZhbHVlLgogICAgICovCi0gICAgdm9pZCBhc3NlcnRfaW52YXJpYW50KCkgY29uc3QKKyAgICB2b2lkIGFzc2VydF9pbnZhcmlhbnQoKSBjb25zdCBub2V4Y2VwdAogICAgIHsKICAgICAgICAgYXNzZXJ0KG1fdHlwZSAhPSB2YWx1ZV90OjpvYmplY3Qgb3IgbV92YWx1ZS5vYmplY3QgIT0gbnVsbHB0cik7CiAgICAgICAgIGFzc2VydChtX3R5cGUgIT0gdmFsdWVfdDo6YXJyYXkgb3IgbV92YWx1ZS5hcnJheSAhPSBudWxscHRyKTsKQEAgLTg0MzIsMTUgKzEwODA4LDEzIEBACiAKICAgICBAc2luY2UgdmVyc2lvbiAyLjEuMAogICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29tcGF0aWJsZVR5cGUsIHR5cGVuYW1lIFUgPSBkZXRhaWw6OnVuY3ZyZWZfdDxDb21wYXRpYmxlVHlwZT4sCi0gICAgICAgICAgICAgZGV0YWlsOjplbmFibGVfaWZfdDxub3Qgc3RkOjppc19iYXNlX29mPHN0ZDo6aXN0cmVhbSwgVT46OnZhbHVlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN0ZDo6aXNfc2FtZTxVLCBiYXNpY19qc29uX3Q+Ojp2YWx1ZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZXRhaWw6OmlzX2Jhc2ljX2pzb25fbmVzdGVkX3R5cGU8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfanNvbl90LCBVPjo6dmFsdWUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6Omhhc190b19qc29uPGJhc2ljX2pzb24sIFU+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD4gPSAwPgotICAgIGJhc2ljX2pzb24oQ29tcGF0aWJsZVR5cGUgJiYgdmFsKSBub2V4Y2VwdChub2V4Y2VwdChKU09OU2VyaWFsaXplcjxVPjo6dG9fanNvbigKLSAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8YmFzaWNfanNvbl90Jj4oKSwgc3RkOjpmb3J3YXJkPENvbXBhdGlibGVUeXBlPih2YWwpKSkpCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBhdGlibGVUeXBlLAorICAgICAgICAgICAgICB0eXBlbmFtZSBVID0gZGV0YWlsOjp1bmN2cmVmX3Q8Q29tcGF0aWJsZVR5cGU+LAorICAgICAgICAgICAgICBkZXRhaWw6OmVuYWJsZV9pZl90PAorICAgICAgICAgICAgICAgICAgZGV0YWlsOjppc19jb21wYXRpYmxlX3R5cGU8YmFzaWNfanNvbl90LCBVPjo6dmFsdWUsIGludD4gPSAwPgorICAgIGJhc2ljX2pzb24oQ29tcGF0aWJsZVR5cGUgJiYgdmFsKSBub2V4Y2VwdChub2V4Y2VwdCgKKyAgICAgICAgICAgICAgICBKU09OU2VyaWFsaXplcjxVPjo6dG9fanNvbihzdGQ6OmRlY2x2YWw8YmFzaWNfanNvbl90Jj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8Q29tcGF0aWJsZVR5cGU+KHZhbCkpKSkKICAgICB7CiAgICAgICAgIEpTT05TZXJpYWxpemVyPFU+Ojp0b19qc29uKCp0aGlzLCBzdGQ6OmZvcndhcmQ8Q29tcGF0aWJsZVR5cGU+KHZhbCkpOwogICAgICAgICBhc3NlcnRfaW52YXJpYW50KCk7CkBAIC05MDIxLDcgKzExMzk1LDcgQEAKIAogICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wCiAgICAgKi8KLSAgICB+YmFzaWNfanNvbigpCisgICAgfmJhc2ljX2pzb24oKSBub2V4Y2VwdAogICAgIHsKICAgICAgICAgYXNzZXJ0X2ludmFyaWFudCgpOwogICAgICAgICBtX3ZhbHVlLmRlc3Ryb3kobV90eXBlKTsKQEAgLTExMzYxLDE4ICsxMzczNSw4OSBAQAogCiAgICAgQG5vdGUgVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGZpbmFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZQogICAgIGZ1dHVyZS4KKworICAgIEBkZXByZWNhdGVkIFRoaXMgc3RyZWFtIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgorICAgICAgICAgICAgICAgIGZ1dHVyZSA0LjAuMCBvZiB0aGUgbGlicmFyeS4gUGxlYXNlIHVzZSBAcmVmIGl0ZW1zKCkgaW5zdGVhZDsKKyAgICAgICAgICAgICAgICB0aGF0IGlzLCByZXBsYWNlIGBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopYCB3aXRoIGBqLml0ZW1zKClgLgogICAgICovCi0gICAgc3RhdGljIGl0ZXJhdGlvbl9wcm94eTxpdGVyYXRvcj4gaXRlcmF0b3Jfd3JhcHBlcihyZWZlcmVuY2UgcmVmKQorICAgIEpTT05fREVQUkVDQVRFRAorICAgIHN0YXRpYyBpdGVyYXRpb25fcHJveHk8aXRlcmF0b3I+IGl0ZXJhdG9yX3dyYXBwZXIocmVmZXJlbmNlIHJlZikgbm9leGNlcHQKICAgICB7Ci0gICAgICAgIHJldHVybiBpdGVyYXRpb25fcHJveHk8aXRlcmF0b3I+KHJlZik7CisgICAgICAgIHJldHVybiByZWYuaXRlbXMoKTsKICAgICB9CiAKICAgICAvKiEKICAgICBAY29weWRvYyBpdGVyYXRvcl93cmFwcGVyKHJlZmVyZW5jZSkKICAgICAqLwotICAgIHN0YXRpYyBpdGVyYXRpb25fcHJveHk8Y29uc3RfaXRlcmF0b3I+IGl0ZXJhdG9yX3dyYXBwZXIoY29uc3RfcmVmZXJlbmNlIHJlZikKKyAgICBKU09OX0RFUFJFQ0FURUQKKyAgICBzdGF0aWMgaXRlcmF0aW9uX3Byb3h5PGNvbnN0X2l0ZXJhdG9yPiBpdGVyYXRvcl93cmFwcGVyKGNvbnN0X3JlZmVyZW5jZSByZWYpIG5vZXhjZXB0CiAgICAgewotICAgICAgICByZXR1cm4gaXRlcmF0aW9uX3Byb3h5PGNvbnN0X2l0ZXJhdG9yPihyZWYpOworICAgICAgICByZXR1cm4gcmVmLml0ZW1zKCk7CisgICAgfQorCisgICAgLyohCisgICAgQGJyaWVmIGhlbHBlciB0byBhY2Nlc3MgaXRlcmF0b3IgbWVtYmVyIGZ1bmN0aW9ucyBpbiByYW5nZS1iYXNlZCBmb3IKKworICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIGFjY2VzcyBAcmVmIGl0ZXJhdG9yOjprZXkoKSBhbmQgQHJlZgorICAgIGl0ZXJhdG9yOjp2YWx1ZSgpIGR1cmluZyByYW5nZS1iYXNlZCBmb3IgbG9vcHMuIEluIHRoZXNlIGxvb3BzLCBhCisgICAgcmVmZXJlbmNlIHRvIHRoZSBKU09OIHZhbHVlcyBpcyByZXR1cm5lZCwgc28gdGhlcmUgaXMgbm8gYWNjZXNzIHRvIHRoZQorICAgIHVuZGVybHlpbmcgaXRlcmF0b3IuCisKKyAgICBGb3IgbG9vcCB3aXRob3V0IGBpdGVtcygpYCBmdW5jdGlvbjoKKworICAgIEBjb2Rle2NwcH0KKyAgICBmb3IgKGF1dG8gaXQgPSBqX29iamVjdC5iZWdpbigpOyBpdCAhPSBqX29iamVjdC5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAia2V5OiAiIDw8IGl0LmtleSgpIDw8ICIsIHZhbHVlOiIgPDwgaXQudmFsdWUoKSA8PCAnXG4nOworICAgIH0KKyAgICBAZW5kY29kZQorCisgICAgUmFuZ2UtYmFzZWQgZm9yIGxvb3Agd2l0aG91dCBgaXRlbXMoKWAgZnVuY3Rpb246CisKKyAgICBAY29kZXtjcHB9CisgICAgZm9yIChhdXRvIGl0IDogal9vYmplY3QpCisgICAgeworICAgICAgICAvLyAiaXQiIGlzIG9mIHR5cGUganNvbjo6cmVmZXJlbmNlIGFuZCBoYXMgbm8ga2V5KCkgbWVtYmVyCisgICAgICAgIHN0ZDo6Y291dCA8PCAidmFsdWU6ICIgPDwgaXQgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIFJhbmdlLWJhc2VkIGZvciBsb29wIHdpdGggYGl0ZW1zKClgIGZ1bmN0aW9uOgorCisgICAgQGNvZGV7Y3BwfQorICAgIGZvciAoYXV0byBpdCA6IGpfb2JqZWN0Lml0ZW1zKCkpCisgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImtleTogIiA8PCBpdC5rZXkoKSA8PCAiLCB2YWx1ZToiIDw8IGl0LnZhbHVlKCkgPDwgJ1xuJzsKKyAgICB9CisgICAgQGVuZGNvZGUKKworICAgIEBub3RlIFdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXksIGBrZXkoKWAgd2lsbCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQorICAgICAgICAgIGVsZW1lbnQgYXMgc3RyaW5nIChzZWUgZXhhbXBsZSkuIEZvciBwcmltaXRpdmUgdHlwZXMgKGUuZy4sIG51bWJlcnMpLAorICAgICAgICAgIGBrZXkoKWAgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICBAcmV0dXJuIGl0ZXJhdGlvbiBwcm94eSBvYmplY3Qgd3JhcHBpbmcgQGEgcmVmIHdpdGggYW4gaW50ZXJmYWNlIHRvIHVzZSBpbgorICAgICAgICAgICAgcmFuZ2UtYmFzZWQgZm9yIGxvb3BzCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgZnVuY3Rpb24gaXMgdXNlZC4saXRlbXN9CisKKyAgICBAZXhjZXB0aW9uc2FmZXR5IFN0cm9uZyBndWFyYW50ZWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZXJlIGFyZSBubworICAgIGNoYW5nZXMgaW4gdGhlIEpTT04gdmFsdWUuCisKKyAgICBAY29tcGxleGl0eSBDb25zdGFudC4KKworICAgIEBzaW5jZSB2ZXJzaW9uIDMueC54LgorICAgICovCisgICAgaXRlcmF0aW9uX3Byb3h5PGl0ZXJhdG9yPiBpdGVtcygpIG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXRlcmF0aW9uX3Byb3h5PGl0ZXJhdG9yPigqdGhpcyk7CisgICAgfQorCisgICAgLyohCisgICAgQGNvcHlkb2MgaXRlbXMoKQorICAgICovCisgICAgaXRlcmF0aW9uX3Byb3h5PGNvbnN0X2l0ZXJhdG9yPiBpdGVtcygpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgICByZXR1cm4gaXRlcmF0aW9uX3Byb3h5PGNvbnN0X2l0ZXJhdG9yPigqdGhpcyk7CiAgICAgfQogCiAgICAgLy8vIEB9CkBAIC0xMjk0Myw4ICsxNTM4OCw4IEBACiAKICAgICAvKiEKICAgICBAYnJpZWYgc2VyaWFsaXplIHRvIHN0cmVhbQotICAgIEBkZXByZWNhdGVkIFRoaXMgc3RyZWFtIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhCi0gICAgICAgICAgICAgICAgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFBsZWFzZSB1c2UKKyAgICBAZGVwcmVjYXRlZCBUaGlzIHN0cmVhbSBvcGVyYXRvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4KKyAgICAgICAgICAgICAgICBmdXR1cmUgNC4wLjAgb2YgdGhlIGxpYnJhcnkuIFBsZWFzZSB1c2UKICAgICAgICAgICAgICAgICBAcmVmIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgYmFzaWNfanNvbiYpCiAgICAgICAgICAgICAgICAgaW5zdGVhZDsgdGhhdCBpcywgcmVwbGFjZSBjYWxscyBsaWtlIGBqID4+IG87YCB3aXRoIGBvIDw8IGo7YC4KICAgICBAc2luY2UgdmVyc2lvbiAxLjAuMDsgZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMC4wCkBAIC0xMzEyOSw4ICsxNTU3NCw4IEBACiAKICAgICAvKiEKICAgICBAYnJpZWYgZGVzZXJpYWxpemUgZnJvbSBzdHJlYW0KLSAgICBAZGVwcmVjYXRlZCBUaGlzIHN0cmVhbSBvcGVyYXRvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYQotICAgICAgICAgICAgICAgIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBQbGVhc2UgdXNlCisgICAgQGRlcHJlY2F0ZWQgVGhpcyBzdHJlYW0gb3BlcmF0b3IgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluCisgICAgICAgICAgICAgICAgdmVyc2lvbiA0LjAuMCBvZiB0aGUgbGlicmFyeS4gUGxlYXNlIHVzZQogICAgICAgICAgICAgICAgIEByZWYgb3BlcmF0b3I+PihzdGQ6OmlzdHJlYW0mLCBiYXNpY19qc29uJikKICAgICAgICAgICAgICAgICBpbnN0ZWFkOyB0aGF0IGlzLCByZXBsYWNlIGNhbGxzIGxpa2UgYGogPDwgaTtgIHdpdGggYGkgPj4gajtgLgogICAgIEBzaW5jZSB2ZXJzaW9uIDEuMC4wOyBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMy4wLjAKQEAgLTEzMzMxLDkgKzE1Nzc2LDExIEBACiAgICAgdmVjdG9yIGluIENCT1IgZm9ybWF0Lix0b19jYm9yfQogCiAgICAgQHNhIGh0dHA6Ly9jYm9yLmlvCi0gICAgQHNhIEByZWYgZnJvbV9jYm9yKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiwgY29uc3Qgc2l6ZV90KSBmb3IgdGhlCisgICAgQHNhIEByZWYgZnJvbV9jYm9yKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCBzdHJpY3QpIGZvciB0aGUKICAgICAgICAgYW5hbG9nb3VzIGRlc2VyaWFsaXphdGlvbgogICAgIEBzYSBAcmVmIHRvX21zZ3BhY2soY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgcmVsYXRlZCBNZXNzYWdlUGFjayBmb3JtYXQKKyAgICBAc2EgQHJlZiB0b191Ympzb24oY29uc3QgYmFzaWNfanNvbiYsIGNvbnN0IGJvb2wsIGNvbnN0IGJvb2wpIGZvciB0aGUKKyAgICAgICAgICAgICByZWxhdGVkIFVCSlNPTiBmb3JtYXQKIAogICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45CiAgICAgKi8KQEAgLTEzNDI5LDYgKzE1ODc2LDggQEAKICAgICBAc2EgQHJlZiBmcm9tX21zZ3BhY2soY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mLCBjb25zdCBzaXplX3QpIGZvciB0aGUKICAgICAgICAgYW5hbG9nb3VzIGRlc2VyaWFsaXphdGlvbgogICAgIEBzYSBAcmVmIHRvX2Nib3IoY29uc3QgYmFzaWNfanNvbiYgZm9yIHRoZSByZWxhdGVkIENCT1IgZm9ybWF0CisgICAgQHNhIEByZWYgdG9fdWJqc29uKGNvbnN0IGJhc2ljX2pzb24mLCBjb25zdCBib29sLCBjb25zdCBib29sKSBmb3IgdGhlCisgICAgICAgICAgICAgcmVsYXRlZCBVQkpTT04gZm9ybWF0CiAKICAgICBAc2luY2UgdmVyc2lvbiAyLjAuOQogICAgICovCkBAIC0xMzQ1MCw2ICsxNTg5OSwxMDcgQEAKICAgICB9CiAKICAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgVUJKU09OIHNlcmlhbGl6YXRpb24gb2YgYSBnaXZlbiBKU09OIHZhbHVlCisKKyAgICBTZXJpYWxpemVzIGEgZ2l2ZW4gSlNPTiB2YWx1ZSBAYSBqIHRvIGEgYnl0ZSB2ZWN0b3IgdXNpbmcgdGhlIFVCSlNPTgorICAgIChVbml2ZXJzYWwgQmluYXJ5IEpTT04pIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBVQkpTT04gYWltcyB0byBiZSBtb3JlIGNvbXBhY3QKKyAgICB0aGFuIEpTT04gaXRzZWxmLCB5ZXQgbW9yZSBlZmZpY2llbnQgdG8gcGFyc2UuCisKKyAgICBUaGUgbGlicmFyeSB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwcGluZyBmcm9tIEpTT04gdmFsdWVzIHR5cGVzIHRvCisgICAgVUJKU09OIHR5cGVzIGFjY29yZGluZyB0byB0aGUgVUJKU09OIHNwZWNpZmljYXRpb246CisKKyAgICBKU09OIHZhbHVlIHR5cGUgfCB2YWx1ZS9yYW5nZSAgICAgICAgICAgICAgICAgICAgICAgfCBVQkpTT04gdHlwZSB8IG1hcmtlcgorICAgIC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tCisgICAgbnVsbCAgICAgICAgICAgIHwgYG51bGxgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbnVsbCAgICAgICAgfCBgWmAKKyAgICBib29sZWFuICAgICAgICAgfCBgdHJ1ZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cnVlICAgICAgICB8IGBUYAorICAgIGJvb2xlYW4gICAgICAgICB8IGBmYWxzZWAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgIHwgYEZgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTkyMjMzNzIwMzY4NTQ3NzU4MDguLi0yMTQ3NDgzNjQ5IHwgaW50NjQgICAgICAgfCBgTGAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAtMjE0NzQ4MzY0OC4uLTMyNzY5ICAgICAgICAgICAgICAgfCBpbnQzMiAgICAgICB8IGBsYAorICAgIG51bWJlcl9pbnRlZ2VyICB8IC0zMjc2OC4uLTEyOSAgICAgICAgICAgICAgICAgICAgICB8IGludDE2ICAgICAgIHwgYElgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgLTEyOC4uMTI3ICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50OCAgICAgICAgfCBgaWAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAxMjguLjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1aW50OCAgICAgICB8IGBVYAorICAgIG51bWJlcl9pbnRlZ2VyICB8IDI1Ni4uMzI3NjcgICAgICAgICAgICAgICAgICAgICAgICB8IGludDE2ICAgICAgIHwgYElgCisgICAgbnVtYmVyX2ludGVnZXIgIHwgMzI3NjguLjIxNDc0ODM2NDcgICAgICAgICAgICAgICAgIHwgaW50MzIgICAgICAgfCBgbGAKKyAgICBudW1iZXJfaW50ZWdlciAgfCAyMTQ3NDgzNjQ4Li45MjIzMzcyMDM2ODU0Nzc1ODA3ICAgfCBpbnQ2NCAgICAgICB8IGBMYAorICAgIG51bWJlcl91bnNpZ25lZCB8IDAuLjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludDggICAgICAgIHwgYGlgCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMTI4Li4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdWludDggICAgICAgfCBgVWAKKyAgICBudW1iZXJfdW5zaWduZWQgfCAyNTYuLjMyNzY3ICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnQxNiAgICAgICB8IGBJYAorICAgIG51bWJlcl91bnNpZ25lZCB8IDMyNzY4Li4yMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICB8IGludDMyICAgICAgIHwgYGxgCisgICAgbnVtYmVyX3Vuc2lnbmVkIHwgMjE0NzQ4MzY0OC4uOTIyMzM3MjAzNjg1NDc3NTgwNyAgIHwgaW50NjQgICAgICAgfCBgTGAKKyAgICBudW1iZXJfZmxvYXQgICAgfCAqYW55IHZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgfCBmbG9hdDY0ICAgICB8IGBEYAorICAgIHN0cmluZyAgICAgICAgICB8ICp3aXRoIHNob3J0ZXN0IGxlbmd0aCBpbmRpY2F0b3IqICB8IHN0cmluZyAgICAgIHwgYFNgCisgICAgYXJyYXkgICAgICAgICAgIHwgKnNlZSBub3RlcyBvbiBvcHRpbWl6ZWQgZm9ybWF0KiAgIHwgYXJyYXkgICAgICAgfCBgW2AKKyAgICBvYmplY3QgICAgICAgICAgfCAqc2VlIG5vdGVzIG9uIG9wdGltaXplZCBmb3JtYXQqICAgfCBtYXAgICAgICAgICB8IGB7YAorCisgICAgQG5vdGUgVGhlIG1hcHBpbmcgaXMgKipjb21wbGV0ZSoqIGluIHRoZSBzZW5zZSB0aGF0IGFueSBKU09OIHZhbHVlIHR5cGUKKyAgICAgICAgICBjYW4gYmUgY29udmVydGVkIHRvIGEgVUJKU09OIHZhbHVlLgorCisgICAgQG5vdGUgVGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuICoqbm90KiogYmUgY29udmVydGVkIHRvIGEgVUJKU09OIHZhbHVlOgorICAgICAgICAgIC0gc3RyaW5ncyB3aXRoIG1vcmUgdGhhbiA5MjIzMzcyMDM2ODU0Nzc1ODA3IGJ5dGVzICh0aGVvcmV0aWNhbCkKKyAgICAgICAgICAtIHVuc2lnbmVkIGludGVnZXIgbnVtYmVycyBhYm92ZSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisKKyAgICBAbm90ZSBUaGUgZm9sbG93aW5nIG1hcmtlcnMgYXJlIG5vdCB1c2VkIGluIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgIC0gYFpgOiBuby1vcCB2YWx1ZXMgYXJlIG5vdCBjcmVhdGVkLgorICAgICAgICAgIC0gYENgOiBzaW5nbGUtYnl0ZSBzdHJpbmdzIGFyZSBzZXJpYWxpemVkIHdpdGggYFNgIG1hcmtlcnMuCisKKyAgICBAbm90ZSBBbnkgVUJKU09OIG91dHB1dCBjcmVhdGVkIEByZWYgdG9fdWJqc29uIGNhbiBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkCisgICAgICAgICAgYnkgQHJlZiBmcm9tX3VianNvbi4KKworICAgIEBub3RlIElmIE5hTiBvciBJbmZpbml0eSBhcmUgc3RvcmVkIGluc2lkZSBhIEpTT04gbnVtYmVyLCB0aGV5IGFyZQorICAgICAgICAgIHNlcmlhbGl6ZWQgcHJvcGVybHkuIFRoaXMgYmVoYXZpb3IgZGlmZmVycyBmcm9tIHRoZSBAcmVmIGR1bXAoKQorICAgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHNlcmlhbGl6ZXMgTmFOIG9yIEluZmluaXR5IHRvIGBudWxsYC4KKworICAgIEBub3RlIFRoZSBvcHRpbWl6ZWQgZm9ybWF0cyBmb3IgY29udGFpbmVycyBhcmUgc3VwcG9ydGVkOiBQYXJhbWV0ZXIKKyAgICAgICAgICBAYSB1c2Vfc2l6ZSBhZGRzIHNpemUgaW5mb3JtYXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhIGNvbnRhaW5lciBhbmQKKyAgICAgICAgICByZW1vdmVzIHRoZSBjbG9zaW5nIG1hcmtlci4gUGFyYW1ldGVyIEBhIHVzZV90eXBlIGZ1cnRoZXIgY2hlY2tzCisgICAgICAgICAgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBjb250YWluZXIgaGF2ZSB0aGUgc2FtZSB0eXBlIGFuZCBhZGRzIHRoZQorICAgICAgICAgIHR5cGUgbWFya2VyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRhaW5lci4gVGhlIEBhIHVzZV90eXBlCisgICAgICAgICAgcGFyYW1ldGVyIG11c3Qgb25seSBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggQGEgdXNlX3NpemUgPSB0cnVlLiBOb3RlCisgICAgICAgICAgdGhhdCBAYSB1c2Vfc2l6ZSA9IHRydWUgYWxvbmUgbWF5IHJlc3VsdCBpbiBsYXJnZXIgcmVwcmVzZW50YXRpb25zIC0KKyAgICAgICAgICB0aGUgYmVuZWZpdCBvZiB0aGlzIHBhcmFtZXRlciBpcyB0aGF0IHRoZSByZWNlaXZpbmcgc2lkZSBpcworICAgICAgICAgIGltbWVkaWF0ZWx5IGluZm9ybWVkIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGNvbnRhaW5lci4KKworICAgIEBwYXJhbVtpbl0gaiAgSlNPTiB2YWx1ZSB0byBzZXJpYWxpemUKKyAgICBAcGFyYW1baW5dIHVzZV9zaXplICB3aGV0aGVyIHRvIGFkZCBzaXplIGFubm90YXRpb25zIHRvIGNvbnRhaW5lciB0eXBlcworICAgIEBwYXJhbVtpbl0gdXNlX3R5cGUgIHdoZXRoZXIgdG8gYWRkIHR5cGUgYW5ub3RhdGlvbnMgdG8gY29udGFpbmVyIHR5cGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgKG11c3QgYmUgY29tYmluZWQgd2l0aCBAYSB1c2Vfc2l6ZSA9IHRydWUpCisgICAgQHJldHVybiBVQkpTT04gc2VyaWFsaXphdGlvbiBhcyBieXRlIHZlY3RvcgorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBKU09OIHZhbHVlIEBhIGouCisKKyAgICBAbGl2ZWV4YW1wbGV7VGhlIGV4YW1wbGUgc2hvd3MgdGhlIHNlcmlhbGl6YXRpb24gb2YgYSBKU09OIHZhbHVlIHRvIGEgYnl0ZQorICAgIHZlY3RvciBpbiBVQkpTT04gZm9ybWF0Lix0b191Ympzb259CisKKyAgICBAc2EgaHR0cDovL3VianNvbi5vcmcKKyAgICBAc2EgQHJlZiBmcm9tX3VianNvbihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wgc3RyaWN0KSBmb3IgdGhlCisgICAgICAgIGFuYWxvZ291cyBkZXNlcmlhbGl6YXRpb24KKyAgICBAc2EgQHJlZiB0b19jYm9yKGNvbnN0IGJhc2ljX2pzb24mIGZvciB0aGUgcmVsYXRlZCBDQk9SIGZvcm1hdAorICAgIEBzYSBAcmVmIHRvX21zZ3BhY2soY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgcmVsYXRlZCBNZXNzYWdlUGFjayBmb3JtYXQKKworICAgIEBzaW5jZSB2ZXJzaW9uIDMuMS4wCisgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8dWludDhfdD4gdG9fdWJqc29uKGNvbnN0IGJhc2ljX2pzb24mIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZV9zaXplID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZV90eXBlID0gZmFsc2UpCisgICAgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXN1bHQ7CisgICAgICAgIHRvX3VianNvbihqLCByZXN1bHQsIHVzZV9zaXplLCB1c2VfdHlwZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgdG9fdWJqc29uKGNvbnN0IGJhc2ljX2pzb24mIGosIGRldGFpbDo6b3V0cHV0X2FkYXB0ZXI8dWludDhfdD4gbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2Vfc2l6ZSA9IGZhbHNlLCBjb25zdCBib29sIHVzZV90eXBlID0gZmFsc2UpCisgICAgeworICAgICAgICBiaW5hcnlfd3JpdGVyPHVpbnQ4X3Q+KG8pLndyaXRlX3VianNvbihqLCB1c2Vfc2l6ZSwgdXNlX3R5cGUpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRvX3VianNvbihjb25zdCBiYXNpY19qc29uJiBqLCBkZXRhaWw6Om91dHB1dF9hZGFwdGVyPGNoYXI+IG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlX3NpemUgPSBmYWxzZSwgY29uc3QgYm9vbCB1c2VfdHlwZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgYmluYXJ5X3dyaXRlcjxjaGFyPihvKS53cml0ZV91Ympzb24oaiwgdXNlX3NpemUsIHVzZV90eXBlKTsKKyAgICB9CisKKyAgICAvKiEKICAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGlucHV0IGluIENCT1IgZm9ybWF0CiAKICAgICBEZXNlcmlhbGl6ZXMgYSBnaXZlbiBpbnB1dCBAYSBpIHRvIGEgSlNPTiB2YWx1ZSB1c2luZyB0aGUgQ0JPUiAoQ29uY2lzZQpAQCAtMTM1MzUsNiArMTYwODUsOCBAQAogICAgIEBzYSBAcmVmIHRvX2Nib3IoY29uc3QgYmFzaWNfanNvbiYpIGZvciB0aGUgYW5hbG9nb3VzIHNlcmlhbGl6YXRpb24KICAgICBAc2EgQHJlZiBmcm9tX21zZ3BhY2soZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBib29sKSBmb3IgdGhlCiAgICAgICAgIHJlbGF0ZWQgTWVzc2FnZVBhY2sgZm9ybWF0CisgICAgQHNhIEByZWYgZnJvbV91Ympzb24oZGV0YWlsOjppbnB1dF9hZGFwdGVyLCBjb25zdCBib29sKSBmb3IgdGhlIHJlbGF0ZWQKKyAgICAgICAgVUJKU09OIGZvcm1hdAogCiAgICAgQHNpbmNlIHZlcnNpb24gMi4wLjk7IHBhcmFtZXRlciBAYSBzdGFydF9pbmRleCBzaW5jZSAyLjEuMTsgY2hhbmdlZCB0bwogICAgICAgICAgICBjb25zdW1lIGlucHV0IGFkYXB0ZXJzLCByZW1vdmVkIHN0YXJ0X2luZGV4IHBhcmFtZXRlciwgYW5kIGFkZGVkCkBAIC0xMzYyMiw2ICsxNjE3NCw4IEBACiAgICAgQHNhIEByZWYgdG9fbXNncGFjayhjb25zdCBiYXNpY19qc29uJikgZm9yIHRoZSBhbmFsb2dvdXMgc2VyaWFsaXphdGlvbgogICAgIEBzYSBAcmVmIGZyb21fY2JvcihkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIGNvbnN0IGJvb2wpIGZvciB0aGUgcmVsYXRlZCBDQk9SCiAgICAgICAgIGZvcm1hdAorICAgIEBzYSBAcmVmIGZyb21fdWJqc29uKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCkgZm9yIHRoZSByZWxhdGVkCisgICAgICAgIFVCSlNPTiBmb3JtYXQKIAogICAgIEBzaW5jZSB2ZXJzaW9uIDIuMC45OyBwYXJhbWV0ZXIgQGEgc3RhcnRfaW5kZXggc2luY2UgMi4xLjE7IGNoYW5nZWQgdG8KICAgICAgICAgICAgY29uc3VtZSBpbnB1dCBhZGFwdGVycywgcmVtb3ZlZCBzdGFydF9pbmRleCBwYXJhbWV0ZXIsIGFuZCBhZGRlZApAQCAtMTM2NDMsNiArMTYxOTcsNzIgQEAKICAgICAgICAgcmV0dXJuIGJpbmFyeV9yZWFkZXIoZGV0YWlsOjppbnB1dF9hZGFwdGVyKHN0ZDo6Zm9yd2FyZDxBMT4oYTEpLCBzdGQ6OmZvcndhcmQ8QTI+KGEyKSkpLnBhcnNlX21zZ3BhY2soc3RyaWN0KTsKICAgICB9CiAKKyAgICAvKiEKKyAgICBAYnJpZWYgY3JlYXRlIGEgSlNPTiB2YWx1ZSBmcm9tIGFuIGlucHV0IGluIFVCSlNPTiBmb3JtYXQKKworICAgIERlc2VyaWFsaXplcyBhIGdpdmVuIGlucHV0IEBhIGkgdG8gYSBKU09OIHZhbHVlIHVzaW5nIHRoZSBVQkpTT04gKFVuaXZlcnNhbAorICAgIEJpbmFyeSBKU09OKSBzZXJpYWxpemF0aW9uIGZvcm1hdC4KKworICAgIFRoZSBsaWJyYXJ5IG1hcHMgVUJKU09OIHR5cGVzIHRvIEpTT04gdmFsdWUgdHlwZXMgYXMgZm9sbG93czoKKworICAgIFVCSlNPTiB0eXBlIHwgSlNPTiB2YWx1ZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWFya2VyCisgICAgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0KKyAgICBuby1vcCAgICAgICB8ICpubyB2YWx1ZSwgbmV4dCB2YWx1ZSBpcyByZWFkKiAgICAgICAgICB8IGBOYAorICAgIG51bGwgICAgICAgIHwgYG51bGxgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYFpgCisgICAgZmFsc2UgICAgICAgfCBgZmFsc2VgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgRmAKKyAgICB0cnVlICAgICAgICB8IGB0cnVlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBUYAorICAgIGZsb2F0MzIgICAgIHwgbnVtYmVyX2Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGRgCisgICAgZmxvYXQ2NCAgICAgfCBudW1iZXJfZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgRGAKKyAgICB1aW50OCAgICAgICB8IG51bWJlcl91bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBVYAorICAgIGludDggICAgICAgIHwgbnVtYmVyX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGlgCisgICAgaW50MTYgICAgICAgfCBudW1iZXJfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgSWAKKyAgICBpbnQzMiAgICAgICB8IG51bWJlcl9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBsYAorICAgIGludDY0ICAgICAgIHwgbnVtYmVyX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYExgCisgICAgc3RyaW5nICAgICAgfCBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgU2AKKyAgICBjaGFyICAgICAgICB8IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBDYAorICAgIGFycmF5ICAgICAgIHwgYXJyYXkgKG9wdGltaXplZCB2YWx1ZXMgYXJlIHN1cHBvcnRlZCkgIHwgYFtgCisgICAgb2JqZWN0ICAgICAgfCBvYmplY3QgKG9wdGltaXplZCB2YWx1ZXMgYXJlIHN1cHBvcnRlZCkgfCBge2AKKworICAgIEBub3RlIFRoZSBtYXBwaW5nIGlzICoqY29tcGxldGUqKiBpbiB0aGUgc2Vuc2UgdGhhdCBhbnkgVUJKU09OIHZhbHVlIGNhbgorICAgICAgICAgIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gdmFsdWUuCisKKyAgICBAcGFyYW1baW5dIGkgIGFuIGlucHV0IGluIFVCSlNPTiBmb3JtYXQgY29udmVydGlibGUgdG8gYW4gaW5wdXQgYWRhcHRlcgorICAgIEBwYXJhbVtpbl0gc3RyaWN0ICB3aGV0aGVyIHRvIGV4cGVjdCB0aGUgaW5wdXQgdG8gYmUgY29uc3VtZWQgdW50aWwgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICh0cnVlIGJ5IGRlZmF1bHQpCisKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEwIGlmIHRoZSBnaXZlbiBpbnB1dCBlbmRzIHByZW1hdHVyZWx5IG9yIHRoZSBlbmQgb2YKKyAgICBmaWxlIHdhcyBub3QgcmVhY2hlZCB3aGVuIEBhIHN0cmljdCB3YXMgc2V0IHRvIHRydWUKKyAgICBAdGhyb3cgcGFyc2VfZXJyb3IuMTEyIGlmIGEgcGFyc2UgZXJyb3Igb2NjdXJzCisgICAgQHRocm93IHBhcnNlX2Vycm9yLjExMyBpZiBhIHN0cmluZyBjb3VsZCBub3QgYmUgcGFyc2VkIHN1Y2Nlc3NmdWxseQorCisgICAgQGNvbXBsZXhpdHkgTGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBAYSBpLgorCisgICAgQGxpdmVleGFtcGxle1RoZSBleGFtcGxlIHNob3dzIHRoZSBkZXNlcmlhbGl6YXRpb24gb2YgYSBieXRlIHZlY3RvciBpbgorICAgIFVCSlNPTiBmb3JtYXQgdG8gYSBKU09OIHZhbHVlLixmcm9tX3VianNvbn0KKworICAgIEBzYSBodHRwOi8vdWJqc29uLm9yZworICAgIEBzYSBAcmVmIHRvX3VianNvbihjb25zdCBiYXNpY19qc29uJiwgY29uc3QgYm9vbCwgY29uc3QgYm9vbCkgZm9yIHRoZQorICAgICAgICAgICAgIGFuYWxvZ291cyBzZXJpYWxpemF0aW9uCisgICAgQHNhIEByZWYgZnJvbV9jYm9yKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCkgZm9yIHRoZSByZWxhdGVkIENCT1IKKyAgICAgICAgZm9ybWF0CisgICAgQHNhIEByZWYgZnJvbV9tc2dwYWNrKGRldGFpbDo6aW5wdXRfYWRhcHRlciwgY29uc3QgYm9vbCkgZm9yIHRoZSByZWxhdGVkCisgICAgICAgIE1lc3NhZ2VQYWNrIGZvcm1hdAorCisgICAgQHNpbmNlIHZlcnNpb24gMy4xLjAKKyAgICAqLworICAgIHN0YXRpYyBiYXNpY19qc29uIGZyb21fdWJqc29uKGRldGFpbDo6aW5wdXRfYWRhcHRlciBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc3RyaWN0ID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBiaW5hcnlfcmVhZGVyKGkpLnBhcnNlX3VianNvbihzdHJpY3QpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwKKyAgICAgICAgICAgICBkZXRhaWw6OmVuYWJsZV9pZl90PHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkZXRhaWw6OmlucHV0X2FkYXB0ZXIsIEExLCBBMj46OnZhbHVlLCBpbnQ+ID0gMD4KKyAgICBzdGF0aWMgYmFzaWNfanNvbiBmcm9tX3VianNvbihBMSAmJiBhMSwgQTIgJiYgYTIsIGNvbnN0IGJvb2wgc3RyaWN0ID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBiaW5hcnlfcmVhZGVyKGRldGFpbDo6aW5wdXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8QTE+KGExKSwgc3RkOjpmb3J3YXJkPEEyPihhMikpKS5wYXJzZV91Ympzb24oc3RyaWN0KTsKKyAgICB9CisKICAgICAvLy8gQH0KIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNDA2Niw3ICsxNjY4Niw3IEBACiAgICAgICAgICAgICAvLyB3cmFwcGVyIHRvIGdldCBhIHZhbHVlIGZvciBhbiBvcGVyYXRpb24KICAgICAgICAgICAgIGNvbnN0IGF1dG8gZ2V0X3ZhbHVlID0gWyZ2YWxdKGNvbnN0IHN0ZDo6c3RyaW5nICYgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG1lbWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaW5nX3R5cGUpIC0+IGJhc2ljX2pzb24mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmluZ190eXBlKSAtPiBiYXNpY19qc29uICYKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBmaW5kIHZhbHVlCiAgICAgICAgICAgICAgICAgYXV0byBpdCA9IHZhbC5tX3ZhbHVlLm9iamVjdC0+ZmluZChtZW1iZXIpOwpAQCAtMTQyMTYsNiArMTY4MzYsNyBAQAogICAgIGRpZmYgZm9yIHR3byBKU09OIHZhbHVlcy4sZGlmZn0KIAogICAgIEBzYSBAcmVmIHBhdGNoIC0tIGFwcGx5IGEgSlNPTiBwYXRjaAorICAgIEBzYSBAcmVmIG1lcmdlX3BhdGNoIC0tIGFwcGx5IGEgSlNPTiBNZXJnZSBQYXRjaAogCiAgICAgQHNhIFtSRkMgNjkwMiAoSlNPTiBQYXRjaCldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAyKQogCkBAIC0xNDM0Nyw0MTggKzE2OTY4LDg2IEBACiAgICAgfQogCiAgICAgLy8vIEB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpTT04gTWVyZ2UgUGF0Y2ggZnVuY3Rpb25zIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vLyBAbmFtZSBKU09OIE1lcmdlIFBhdGNoIGZ1bmN0aW9ucworICAgIC8vLyBAeworCisgICAgLyohCisgICAgQGJyaWVmIGFwcGxpZXMgYSBKU09OIE1lcmdlIFBhdGNoCisKKyAgICBUaGUgbWVyZ2UgcGF0Y2ggZm9ybWF0IGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIEhUVFAgUEFUQ0gKKyAgICBtZXRob2QgYXMgYSBtZWFucyBvZiBkZXNjcmliaW5nIGEgc2V0IG9mIG1vZGlmaWNhdGlvbnMgdG8gYSB0YXJnZXQKKyAgICByZXNvdXJjZSdzIGNvbnRlbnQuIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBhIG1lcmdlIHBhdGNoIHRvIHRoZSBjdXJyZW50CisgICAgSlNPTiB2YWx1ZS4KKworICAgIFRoZSBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGZyb20gU2VjdGlvbiAyIG9mCisgICAgW1JGQyA3Mzk2IChKU09OIE1lcmdlIFBhdGNoKV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzczOTYpOgorCisgICAgYGBgCisgICAgZGVmaW5lIE1lcmdlUGF0Y2goVGFyZ2V0LCBQYXRjaCk6CisgICAgICBpZiBQYXRjaCBpcyBhbiBPYmplY3Q6CisgICAgICAgIGlmIFRhcmdldCBpcyBub3QgYW4gT2JqZWN0OgorICAgICAgICAgIFRhcmdldCA9IHt9IC8vIElnbm9yZSB0aGUgY29udGVudHMgYW5kIHNldCBpdCB0byBhbiBlbXB0eSBPYmplY3QKKyAgICAgICAgZm9yIGVhY2ggTmFtZS9WYWx1ZSBwYWlyIGluIFBhdGNoOgorICAgICAgICAgIGlmIFZhbHVlIGlzIG51bGw6CisgICAgICAgICAgICBpZiBOYW1lIGV4aXN0cyBpbiBUYXJnZXQ6CisgICAgICAgICAgICAgIHJlbW92ZSB0aGUgTmFtZS9WYWx1ZSBwYWlyIGZyb20gVGFyZ2V0CisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRhcmdldFtOYW1lXSA9IE1lcmdlUGF0Y2goVGFyZ2V0W05hbWVdLCBWYWx1ZSkKKyAgICAgICAgcmV0dXJuIFRhcmdldAorICAgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFBhdGNoCisgICAgYGBgCisKKyAgICBUaGVyZWJ5LCBgVGFyZ2V0YCBpcyB0aGUgY3VycmVudCBvYmplY3Q7IHRoYXQgaXMsIHRoZSBwYXRjaCBpcyBhcHBsaWVkIHRvCisgICAgdGhlIGN1cnJlbnQgdmFsdWUuCisKKyAgICBAcGFyYW1baW5dIHBhdGNoICB0aGUgcGF0Y2ggdG8gYXBwbHkKKworICAgIEBjb21wbGV4aXR5IExpbmVhciBpbiB0aGUgbGVuZ3RocyBvZiBAYSBwYXRjaC4KKworICAgIEBsaXZlZXhhbXBsZXtUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IGEgSlNPTiBNZXJnZSBQYXRjaCBpcyBhcHBsaWVkIHRvCisgICAgYSBKU09OIGRvY3VtZW50LixtZXJnZV9wYXRjaH0KKworICAgIEBzYSBAcmVmIHBhdGNoIC0tIGFwcGx5IGEgSlNPTiBwYXRjaAorICAgIEBzYSBbUkZDIDczOTYgKEpTT04gTWVyZ2UgUGF0Y2gpXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzM5NikKKworICAgIEBzaW5jZSB2ZXJzaW9uIDMuMC4wCisgICAgKi8KKyAgICB2b2lkIG1lcmdlX3BhdGNoKGNvbnN0IGJhc2ljX2pzb24mIHBhdGNoKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoLmlzX29iamVjdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm90IGlzX29iamVjdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICp0aGlzID0gb2JqZWN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXRjaC5iZWdpbigpOyBpdCAhPSBwYXRjaC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUoKS5pc19udWxsKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcmFzZShpdC5rZXkoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaXQua2V5KCkpLm1lcmdlX3BhdGNoKGl0LnZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICp0aGlzID0gcGF0Y2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQH0KIH07Ci0KLS8vLy8vLy8vLy8vLy8KLS8vIHByZXNldHMgLy8KLS8vLy8vLy8vLy8vLy8KLQotLyohCi1AYnJpZWYgZGVmYXVsdCBKU09OIGNsYXNzCi0KLVRoaXMgdHlwZSBpcyB0aGUgZGVmYXVsdCBzcGVjaWFsaXphdGlvbiBvZiB0aGUgQHJlZiBiYXNpY19qc29uIGNsYXNzIHdoaWNoCi11c2VzIHRoZSBzdGFuZGFyZCB0ZW1wbGF0ZSB0eXBlcy4KLQotQHNpbmNlIHZlcnNpb24gMS4wLjAKLSovCi11c2luZyBqc29uID0gYmFzaWNfanNvbjw+OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIGpzb25fcG9pbnRlciAvLwotLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYKLWpzb25fcG9pbnRlcjo6Z2V0X2FuZF9jcmVhdGUoTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIGopIGNvbnN0Ci17Ci0gICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEw6OnNpemVfdHlwZTsKLSAgICBhdXRvIHJlc3VsdCA9ICZqOwotCi0gICAgLy8gaW4gY2FzZSBubyByZWZlcmVuY2UgdG9rZW5zIGV4aXN0LCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIEpTT04gdmFsdWUKLSAgICAvLyBqIHdoaWNoIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgYSBwcmltaXRpdmUgdmFsdWUKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHJlc3VsdC0+bV90eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6bnVsbDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlX3Rva2VuID09ICIwIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IGFycmF5IGlmIHJlZmVyZW5jZSB0b2tlbiBpcyAwCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICZyZXN1bHQtPm9wZXJhdG9yW10oMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGEgbmV3IG9iamVjdCBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICZyZXN1bHQtPm9wZXJhdG9yW10ocmVmZXJlbmNlX3Rva2VuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgYXJyYXkKLSAgICAgICAgICAgICAgICBKU09OX1RSWQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJnJlc3VsdC0+b3BlcmF0b3JbXShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGFycmF5X2luZGV4KHJlZmVyZW5jZV90b2tlbikpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSlNPTl9DQVRDSChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA5LCAwLCAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyBpcyBub3QgYSBudW1iZXIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIG9ubHkgcmVhY2hlZCBpZiB0aGVyZSBleGlzdHMgYSByZWZlcmVuY2UKLSAgICAgICAgICAgIHRva2VuIF9hbmRfIHRoZSBjdXJyZW50IHZhbHVlIGlzIHByaW1pdGl2ZS4gSW4gdGhpcyBjYXNlLCB3ZSBoYXZlCi0gICAgICAgICAgICBhbiBlcnJvciBzaXR1YXRpb24sIGJlY2F1c2UgcHJpbWl0aXZlIHZhbHVlcyBtYXkgb25seSBvY2N1ciBhcwotICAgICAgICAgICAgc2luZ2xlIHZhbHVlOyB0aGF0IGlzLCB3aXRoIGFuIGVtcHR5IGxpc3Qgb2YgcmVmZXJlbmNlIHRva2Vucy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjp0eXBlX2Vycm9yOjpjcmVhdGUoMzEzLCAiaW52YWxpZCB2YWx1ZSB0byB1bmZsYXR0ZW4iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKnJlc3VsdDsKLX0KLQotTkxPSE1BTk5fQkFTSUNfSlNPTl9UUExfREVDTEFSQVRJT04KLU5MT0hNQU5OX0JBU0lDX0pTT05fVFBMJgotanNvbl9wb2ludGVyOjpnZXRfdW5jaGVja2VkKE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMKiBwdHIpIGNvbnN0Ci17Ci0gICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEw6OnNpemVfdHlwZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCi0gICAgewotICAgICAgICAvLyBjb252ZXJ0IG51bGwgdmFsdWVzIHRvIGFycmF5cyBvciBvYmplY3RzIGJlZm9yZSBjb250aW51aW5nCi0gICAgICAgIGlmIChwdHItPm1fdHlwZSA9PSBkZXRhaWw6OnZhbHVlX3Q6Om51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHJlZmVyZW5jZSB0b2tlbiBpcyBhIG51bWJlcgotICAgICAgICAgICAgY29uc3QgYm9vbCBudW1zID0KLSAgICAgICAgICAgICAgICBzdGQ6OmFsbF9vZihyZWZlcmVuY2VfdG9rZW4uYmVnaW4oKSwgcmVmZXJlbmNlX3Rva2VuLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGNoYXIgeCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHggPj0gJzAnIGFuZCB4IDw9ICc5Jyk7Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgLy8gY2hhbmdlIHZhbHVlIHRvIGFycmF5IGZvciBudW1iZXJzIG9yICItIiBvciB0byBvYmplY3Qgb3RoZXJ3aXNlCi0gICAgICAgICAgICAqcHRyID0gKG51bXMgb3IgcmVmZXJlbmNlX3Rva2VuID09ICItIikKLSAgICAgICAgICAgICAgICAgICA/IGRldGFpbDo6dmFsdWVfdDo6YXJyYXkKLSAgICAgICAgICAgICAgICAgICA6IGRldGFpbDo6dmFsdWVfdDo6b2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChwdHItPm1fdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6Om9iamVjdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgdW5jaGVja2VkIG9iamVjdCBhY2Nlc3MKLSAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5vcGVyYXRvcltdKHJlZmVyZW5jZV90b2tlbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjphcnJheToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBlcnJvciBjb25kaXRpb24gKGNmLiBSRkMgNjkwMSwgU2VjdC4gNCkKLSAgICAgICAgICAgICAgICBpZiAoSlNPTl9VTkxJS0VMWShyZWZlcmVuY2VfdG9rZW4uc2l6ZSgpID4gMSBhbmQgcmVmZXJlbmNlX3Rva2VuWzBdID09ICcwJykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG11c3Qgbm90IGJlZ2luIHdpdGggJzAnIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VfdG9rZW4gPT0gIi0iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSB0cmVhdCAiLSIgYXMgaW5kZXggYmV5b25kIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgYXJyYXkgaW5kZXggdG8gbnVtYmVyOyB1bmNoZWNrZWQgYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgIEpTT05fVFJZCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwdHItPm9wZXJhdG9yW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVRDSChzdGQ6OmludmFsaWRfYXJndW1lbnQmKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6cGFyc2VfZXJyb3I6OmNyZWF0ZSgxMDksIDAsICJhcnJheSBpbmRleCAnIiArIHJlZmVyZW5jZV90b2tlbiArICInIGlzIG5vdCBhIG51bWJlciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmCi1qc29uX3BvaW50ZXI6OmdldF9jaGVja2VkKE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMKiBwdHIpIGNvbnN0Ci17Ci0gICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEw6OnNpemVfdHlwZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6b2JqZWN0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vdGU6IGF0IHBlcmZvcm1zIHJhbmdlIGNoZWNrCi0gICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQocmVmZXJlbmNlX3Rva2VuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGFsd2F5cyBmYWlscyB0aGUgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnLScgKCIgKyBzdGQ6OnRvX3N0cmluZyhwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQotICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICBKU09OX1RSWQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0goc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmCi1qc29uX3BvaW50ZXI6OmdldF91bmNoZWNrZWQoY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwqIHB0cikgY29uc3QKLXsKLSAgICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTDo6c2l6ZV90eXBlOwotICAgIGZvciAoY29uc3QgYXV0byYgcmVmZXJlbmNlX3Rva2VuIDogcmVmZXJlbmNlX3Rva2VucykKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocHRyLT5tX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHVuY2hlY2tlZCBvYmplY3QgYWNjZXNzCi0gICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+b3BlcmF0b3JbXShyZWZlcmVuY2VfdG9rZW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6YXJyYXk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocmVmZXJlbmNlX3Rva2VuID09ICItIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiLSIgY2Fubm90IGJlIHVzZWQgZm9yIGNvbnN0IGFjY2VzcwotICAgICAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICctJyAoIiArIHN0ZDo6dG9fc3RyaW5nKHB0ci0+bV92YWx1ZS5hcnJheS0+c2l6ZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBpcyBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IgY29uZGl0aW9uIChjZi4gUkZDIDY5MDEsIFNlY3QuIDQpCi0gICAgICAgICAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkocmVmZXJlbmNlX3Rva2VuLnNpemUoKSA+IDEgYW5kIHJlZmVyZW5jZV90b2tlblswXSA9PSAnMCcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnBhcnNlX2Vycm9yOjpjcmVhdGUoMTA2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kZXggJyIgKyByZWZlcmVuY2VfdG9rZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtdXN0IG5vdCBiZWdpbiB3aXRoICcwJyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB1c2UgdW5jaGVja2VkIGFycmF5IGFjY2VzcwotICAgICAgICAgICAgICAgIEpTT05fVFJZCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcHRyLT5vcGVyYXRvcltdKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0goc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmCi1qc29uX3BvaW50ZXI6OmdldF9jaGVja2VkKGNvbnN0IE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMKiBwdHIpIGNvbnN0Ci17Ci0gICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEw6OnNpemVfdHlwZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJlZmVyZW5jZV90b2tlbiA6IHJlZmVyZW5jZV90b2tlbnMpCi0gICAgewotICAgICAgICBzd2l0Y2ggKHB0ci0+bV90eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIGRldGFpbDo6dmFsdWVfdDo6b2JqZWN0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vdGU6IGF0IHBlcmZvcm1zIHJhbmdlIGNoZWNrCi0gICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQocmVmZXJlbmNlX3Rva2VuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbiA9PSAiLSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gIi0iIGFsd2F5cyBmYWlscyB0aGUgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6Om91dF9vZl9yYW5nZTo6Y3JlYXRlKDQwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSBpbmRleCAnLScgKCIgKyBzdGQ6OnRvX3N0cmluZyhwdHItPm1fdmFsdWUuYXJyYXktPnNpemUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGVycm9yIGNvbmRpdGlvbiAoY2YuIFJGQyA2OTAxLCBTZWN0LiA0KQotICAgICAgICAgICAgICAgIGlmIChKU09OX1VOTElLRUxZKHJlZmVyZW5jZV90b2tlbi5zaXplKCkgPiAxIGFuZCByZWZlcmVuY2VfdG9rZW5bMF0gPT0gJzAnKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbXVzdCBub3QgYmVnaW4gd2l0aCAnMCciKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm90ZTogYXQgcGVyZm9ybXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgICAgICAgICBKU09OX1RSWQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnB0ci0+YXQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihhcnJheV9pbmRleChyZWZlcmVuY2VfdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEpTT05fQ0FUQ0goc3RkOjppbnZhbGlkX2FyZ3VtZW50JikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05fVEhST1coZGV0YWlsOjpwYXJzZV9lcnJvcjo6Y3JlYXRlKDEwOSwgMCwgImFycmF5IGluZGV4ICciICsgcmVmZXJlbmNlX3Rva2VuICsgIicgaXMgbm90IGEgbnVtYmVyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6b3V0X29mX3JhbmdlOjpjcmVhdGUoNDA0LCAidW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJyIgKyByZWZlcmVuY2VfdG9rZW4gKyAiJyIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqcHRyOwotfQotCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTF9ERUNMQVJBVElPTgotdm9pZCBqc29uX3BvaW50ZXI6OmZsYXR0ZW4oY29uc3Qgc3RkOjpzdHJpbmcmIHJlZmVyZW5jZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOTE9ITUFOTl9CQVNJQ19KU09OX1RQTCYgcmVzdWx0KQotewotICAgIHN3aXRjaCAodmFsdWUubV90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBkZXRhaWw6OnZhbHVlX3Q6OmFycmF5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUubV92YWx1ZS5hcnJheS0+ZW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IGFycmF5IGFzIG51bGwKLSAgICAgICAgICAgICAgICByZXN1bHRbcmVmZXJlbmNlX3N0cmluZ10gPSBudWxscHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgYXJyYXkgYW5kIHVzZSBpbmRleCBhcyByZWZlcmVuY2Ugc3RyaW5nCi0gICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHZhbHVlLm1fdmFsdWUuYXJyYXktPnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhdHRlbihyZWZlcmVuY2Vfc3RyaW5nICsgIi8iICsgc3RkOjp0b19zdHJpbmcoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubV92YWx1ZS5hcnJheS0+b3BlcmF0b3JbXShpKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgZGV0YWlsOjp2YWx1ZV90OjpvYmplY3Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5tX3ZhbHVlLm9iamVjdC0+ZW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBmbGF0dGVuIGVtcHR5IG9iamVjdCBhcyBudWxsCi0gICAgICAgICAgICAgICAgcmVzdWx0W3JlZmVyZW5jZV9zdHJpbmddID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIG9iamVjdCBhbmQgdXNlIGtleXMgYXMgcmVmZXJlbmNlIHN0cmluZwotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6ICp2YWx1ZS5tX3ZhbHVlLm9iamVjdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4ocmVmZXJlbmNlX3N0cmluZyArICIvIiArIGVzY2FwZShlbGVtZW50LmZpcnN0KSwgZWxlbWVudC5zZWNvbmQsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBhZGQgcHJpbWl0aXZlIHZhbHVlIHdpdGggaXRzIHJlZmVyZW5jZSBzdHJpbmcKLSAgICAgICAgICAgIHJlc3VsdFtyZWZlcmVuY2Vfc3RyaW5nXSA9IHZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCi1OTE9ITUFOTl9CQVNJQ19KU09OX1RQTAotanNvbl9wb2ludGVyOjp1bmZsYXR0ZW4oY29uc3QgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwmIHZhbHVlKQotewotICAgIGlmIChKU09OX1VOTElLRUxZKG5vdCB2YWx1ZS5pc19vYmplY3QoKSkpCi0gICAgewotICAgICAgICBKU09OX1RIUk9XKGRldGFpbDo6dHlwZV9lcnJvcjo6Y3JlYXRlKDMxNCwgIm9ubHkgb2JqZWN0cyBjYW4gYmUgdW5mbGF0dGVuZWQiKSk7Ci0gICAgfQotCi0gICAgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwgcmVzdWx0OwotCi0gICAgLy8gaXRlcmF0ZSB0aGUgSlNPTiBvYmplY3QgdmFsdWVzCi0gICAgZm9yIChjb25zdCBhdXRvJiBlbGVtZW50IDogKnZhbHVlLm1fdmFsdWUub2JqZWN0KQotICAgIHsKLSAgICAgICAgaWYgKEpTT05fVU5MSUtFTFkobm90IGVsZW1lbnQuc2Vjb25kLmlzX3ByaW1pdGl2ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgSlNPTl9USFJPVyhkZXRhaWw6OnR5cGVfZXJyb3I6OmNyZWF0ZSgzMTUsICJ2YWx1ZXMgaW4gb2JqZWN0IG11c3QgYmUgcHJpbWl0aXZlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXNzaWduIHZhbHVlIHRvIHJlZmVyZW5jZSBwb2ludGVkIHRvIGJ5IEpTT04gcG9pbnRlcjsgTm90ZSB0aGF0IGlmCi0gICAgICAgIC8vIHRoZSBKU09OIHBvaW50ZXIgaXMgIiIgKGkuZS4sIHBvaW50cyB0byB0aGUgd2hvbGUgdmFsdWUpLCBmdW5jdGlvbgotICAgICAgICAvLyBnZXRfYW5kX2NyZWF0ZSByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHJlc3VsdCBpdHNlbGYuIEFuIGFzc2lnbm1lbnQKLSAgICAgICAgLy8gd2lsbCB0aGVuIGNyZWF0ZSBhIHByaW1pdGl2ZSB2YWx1ZS4KLSAgICAgICAganNvbl9wb2ludGVyKGVsZW1lbnQuZmlyc3QpLmdldF9hbmRfY3JlYXRlKHJlc3VsdCkgPSBlbGVtZW50LnNlY29uZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGpzb25fcG9pbnRlciBjb25zdCYgbGhzLCBqc29uX3BvaW50ZXIgY29uc3QmIHJocykgbm9leGNlcHQKLXsKLSAgICByZXR1cm4gKGxocy5yZWZlcmVuY2VfdG9rZW5zID09IHJocy5yZWZlcmVuY2VfdG9rZW5zKTsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShqc29uX3BvaW50ZXIgY29uc3QmIGxocywganNvbl9wb2ludGVyIGNvbnN0JiByaHMpIG5vZXhjZXB0Ci17Ci0gICAgcmV0dXJuIG5vdCAobGhzID09IHJocyk7Ci19CiB9IC8vIG5hbWVzcGFjZSBubG9obWFubgogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBub25tZW1iZXIgc3VwcG9ydCAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE0ODUzLDYgKzE3MTQyLDkgQEAKICAgICByZXR1cm4gbmxvaG1hbm46Ompzb246Ompzb25fcG9pbnRlcihzdGQ6OnN0cmluZyhzLCBuKSk7CiB9CiAKKy8vICNpbmNsdWRlIDxubG9obWFubi9kZXRhaWwvbWFjcm9fdW5zY29wZS5ocHA+CisKKwogLy8gcmVzdG9yZSBHQ0MvY2xhbmcgZGlhZ25vc3RpYyBzZXR0aW5ncwogI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fR05VR19fKQogICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCkBAIC0xNDg2OCw3ICsxNzE2MCwxMSBAQAogI3VuZGVmIEpTT05fTElLRUxZCiAjdW5kZWYgSlNPTl9VTkxJS0VMWQogI3VuZGVmIEpTT05fREVQUkVDQVRFRAorI3VuZGVmIEpTT05fSEFTX0NQUF8xNAorI3VuZGVmIEpTT05fSEFTX0NQUF8xNwogI3VuZGVmIE5MT0hNQU5OX0JBU0lDX0pTT05fVFBMX0RFQ0xBUkFUSU9OCiAjdW5kZWYgTkxPSE1BTk5fQkFTSUNfSlNPTl9UUEwKKyN1bmRlZiBOTE9ITUFOTl9KU09OX0hBU19IRUxQRVIKKwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi90ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IDg5ZjVjMjIuLmRkY2U3ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ01ha2VMaXN0cy50eHQKKysrIGIvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMTAxLDYgKzEwMSw3IEBACiAKICAgICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucygke3Rlc3RjYXNlfSBQUklWQVRFIENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCiAgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoJHt0ZXN0Y2FzZX0gUFJJVkFURSAidGhpcmRwYXJ0eS9jYXRjaCIpCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoJHt0ZXN0Y2FzZX0gUFJJVkFURSAke05MT0hNQU5OX0pTT05fSU5DTFVERV9CVUlMRF9ESVJ9KQogICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3Rlc3RjYXNlfSAke05MT0hNQU5OX0pTT05fVEFSR0VUX05BTUV9KQogCiAgICAgaWYoTk9UIE1TVkMpCmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlIGIvdGVzdC9NYWtlZmlsZQppbmRleCBhMTcwYWNiLi40ZGMzOTkxIDEwMDY0NAotLS0gYS90ZXN0L01ha2VmaWxlCisrKyBiL3Rlc3QvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKICMgYWRkaXRpb25hbCBmbGFncwogQ1hYRkxBR1MgKz0gLXN0ZD1jKysxMSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtV2Nhc3QtYWxpZ24gLVdjYXN0LXF1YWwgLVduby1jdG9yLWR0b3ItcHJpdmFjeSAtV2Rpc2FibGVkLW9wdGltaXphdGlvbiAtV2Zvcm1hdD0yIC1XaW5pdC1zZWxmIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLWluY2x1ZGUtZGlycyAtV29sZC1zdHlsZS1jYXN0IC1Xb3ZlcmxvYWRlZC12aXJ0dWFsIC1XcmVkdW5kYW50LWRlY2xzIC1Xc2hhZG93IC1Xc2lnbi1jb252ZXJzaW9uIC1Xc2lnbi1wcm9tbyAtV3N0cmljdC1vdmVyZmxvdz01IC1Xc3dpdGNoIC1XdW5kZWYgLVduby11bnVzZWQgLVdub24tdmlydHVhbC1kdG9yIC1XcmVvcmRlciAtV2RlcHJlY2F0ZWQgLVduby1mbG9hdC1lcXVhbAotQ1BQRkxBR1MgKz0gLUkgLi4vc3JjIC1JIC4gLUkgdGhpcmRwYXJ0eS9jYXRjaCAtRENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUKK0NQUEZMQUdTICs9IC1JIC4uL3NpbmdsZV9pbmNsdWRlIC1JIC4gLUkgdGhpcmRwYXJ0eS9jYXRjaCAtRENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUKIAogU09VUkNFUyA9IHNyYy91bml0LmNwcCBcCiAgICAgICAgICAgc3JjL3VuaXQtYWxnb3JpdGhtcy5jcHAgXApAQCAtMjUsOSArMjUsMTAgQEAKICAgICAgICAgICBzcmMvdW5pdC1lbGVtZW50X2FjY2VzczEuY3BwIFwKICAgICAgICAgICBzcmMvdW5pdC1lbGVtZW50X2FjY2VzczIuY3BwIFwKICAgICAgICAgICBzcmMvdW5pdC1pbnNwZWN0aW9uLmNwcCBcCi0gICAgICAgICAgc3JjL3VuaXQtaXRlcmF0b3Jfd3JhcHBlci5jcHAgXAorICAgICAgICAgIHNyYy91bml0LWl0ZW1zLmNwcCBcCiAgICAgICAgICAgc3JjL3VuaXQtaXRlcmF0b3JzMS5jcHAgXAogICAgICAgICAgIHNyYy91bml0LWl0ZXJhdG9yczIuY3BwIFwKKyAgICAgICAgICBzcmMvdW5pdC1tZXJnZV9wYXRjaC5jcHAgXAogICAgICAgICAgIHNyYy91bml0LWpzb25fcGF0Y2guY3BwIFwKICAgICAgICAgICBzcmMvdW5pdC1qc29uX3BvaW50ZXIuY3BwIFwKICAgICAgICAgICBzcmMvdW5pdC1tZXRhLmNwcCBcCkBAIC0zOSw2ICs0MCw3IEBACiAgICAgICAgICAgc3JjL3VuaXQtcmVncmVzc2lvbi5jcHAgXAogICAgICAgICAgIHNyYy91bml0LXNlcmlhbGl6YXRpb24uY3BwIFwKICAgICAgICAgICBzcmMvdW5pdC10ZXN0c3VpdGVzLmNwcCBcCisgICAgICAgICAgc3JjL3VuaXQtdWJqc29uLmNwcCBcCiAgICAgICAgICAgc3JjL3VuaXQtdW5pY29kZS5jcHAKIAogT0JKRUNUUyA9ICQoU09VUkNFUzouY3BwPS5vKQpAQCAtNTIsMTcgKzU0LDE3IEBACiBhbGw6ICQoVEVTVENBU0VTKQogCiBjbGVhbjoKLQlybSAtZnIganNvbl91bml0ICQoT0JKRUNUUykgJChTT1VSQ0VTOi5jcHA9Lmdjbm8pICQoU09VUkNFUzouY3BwPS5nY2RhKSAkKFRFU1RDQVNFUykgcGFyc2VfYWZsX2Z1enplciBwYXJzZV9jYm9yX2Z1enplciBwYXJzZV9tc2dwYWNrX2Z1enplcgorCXJtIC1mciBqc29uX3VuaXQgJChPQkpFQ1RTKSAkKFNPVVJDRVM6LmNwcD0uZ2NubykgJChTT1VSQ0VTOi5jcHA9LmdjZGEpICQoVEVTVENBU0VTKSAkKEZVWlpFUlMpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBzaW5nbGUgdGVzdCBmaWxlCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotanNvbl91bml0OiAkKE9CSkVDVFMpIC4uL3NyYy9qc29uLmhwcCB0aGlyZHBhcnR5L2NhdGNoL2NhdGNoLmhwcAoranNvbl91bml0OiAkKE9CSkVDVFMpIC4uL3NpbmdsZV9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwIHRoaXJkcGFydHkvY2F0Y2gvY2F0Y2guaHBwCiAJQGVjaG8gIltDWFhMRF0gJEAiCiAJQCQoQ1hYKSAkKENYWEZMQUdTKSAkKExERkxBR1MpICQoT0JKRUNUUykgLW8gJEAKIAotJS5vOiAlLmNwcCAuLi9zcmMvanNvbi5ocHAgdGhpcmRwYXJ0eS9jYXRjaC9jYXRjaC5ocHAKKyUubzogJS5jcHAgLi4vc2luZ2xlX2luY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHAgdGhpcmRwYXJ0eS9jYXRjaC9jYXRjaC5ocHAKIAlAZWNobyAiW0NYWF0gICAkQCIKIAlAJChDWFgpICQoQ1hYRkxBR1MpICQoQ1BQRkxBR1MpIC1jICQ8IC1vICRACiAKQEAgLTcxLDEzICs3MywxMyBAQAogIyBpbmRpdmlkdWFsIHRlc3QgY2FzZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi10ZXN0LSU6IHNyYy91bml0LSUubyBzcmMvdW5pdC5vIC4uL3NyYy9qc29uLmhwcCB0aGlyZHBhcnR5L2NhdGNoL2NhdGNoLmhwcAordGVzdC0lOiBzcmMvdW5pdC0lLm8gc3JjL3VuaXQubyAuLi9zaW5nbGVfaW5jbHVkZS9ubG9obWFubi9qc29uLmhwcCB0aGlyZHBhcnR5L2NhdGNoL2NhdGNoLmhwcAogCUBlY2hvICJbQ1hYTERdICRAIgogCUAkKENYWCkgJChDWFhGTEFHUykgJChDUFBGTEFHUykgJChMREZMQUdTKSAkPCBzcmMvdW5pdC5vIC1vICRACiAKIFRFU1RfUEFUVEVSTiA/PSAiKiIKIFRFU1RfUFJFRklYID0gIiIKLWNoZWNrOiAkKFRFU1RDQVNFUykKK2NoZWNrOiAkKE9CSkVDVFMpICQoVEVTVENBU0VTKQogCUBjZCAuLiA7IGZvciB0ZXN0Y2FzZSBpbiAkKFRFU1RDQVNFUyk7IGRvIGVjaG8gIkV4ZWN1dGluZyAkJHRlc3RjYXNlLi4uIjsgJChURVNUX1BSRUZJWCl0ZXN0LyQkdGVzdGNhc2UgJChURVNUX1BBVFRFUk4pIHx8IGV4aXQgMTsgZG9uZQogCiAKQEAgLTg2LDcgKzg4LDggQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBGVVpaRVJfRU5HSU5FID0gc3JjL2Z1enplci1kcml2ZXJfYWZsLmNwcAotZnV6emVyczogcGFyc2VfYWZsX2Z1enplciBwYXJzZV9jYm9yX2Z1enplciBwYXJzZV9tc2dwYWNrX2Z1enplcgorRlVaWkVSUyA9IHBhcnNlX2FmbF9mdXp6ZXIgcGFyc2VfY2Jvcl9mdXp6ZXIgcGFyc2VfbXNncGFja19mdXp6ZXIgcGFyc2VfdWJqc29uX2Z1enplcgorZnV6emVyczogJChGVVpaRVJTKQogCiBwYXJzZV9hZmxfZnV6emVyOgogCSQoQ1hYKSAkKENYWEZMQUdTKSAkKENQUEZMQUdTKSAkKEZVWlpFUl9FTkdJTkUpIHNyYy9mdXp6ZXItcGFyc2VfanNvbi5jcHAgLW8gJEAKQEAgLTk2LDMgKzk5LDYgQEAKIAogcGFyc2VfbXNncGFja19mdXp6ZXI6CiAJJChDWFgpICQoQ1hYRkxBR1MpICQoQ1BQRkxBR1MpICQoRlVaWkVSX0VOR0lORSkgc3JjL2Z1enplci1wYXJzZV9tc2dwYWNrLmNwcCAtbyAkQAorCitwYXJzZV91Ympzb25fZnV6emVyOgorCSQoQ1hYKSAkKENYWEZMQUdTKSAkKENQUEZMQUdTKSAkKEZVWlpFUl9FTkdJTkUpIHNyYy9mdXp6ZXItcGFyc2VfdWJqc29uLmNwcCAtbyAkQApkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb24ub3JnLzEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbi5vcmcvMS5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjAyOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb24ub3JnLzEuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb24ub3JnLzIuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbi5vcmcvMi5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhmZDRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb24ub3JnLzIuanNvbi51Ympzb24KQEAgLTAsMCArMSwyIEBACit7aQRtZW51e2kCaWRTaQRmaWxlaQVwb3B1cHtpCG1lbnVpdGVtW3tpB29uY2xpY2tTaQ5DcmVhdGVOZXdEb2MoKWkFdmFsdWVTaQNOZXd9e2kHb25jbGlja1NpCU9wZW5Eb2MoKWkFdmFsdWVTaQRPcGVufXtpB29uY2xpY2tTaQorQ2xvc2VEb2MoKWkFdmFsdWVTaQVDbG9zZX1dfWkFdmFsdWVTaQRGaWxlfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbi5vcmcvMy5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uLm9yZy8zLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjZiYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbi5vcmcvMy5qc29uLnVianNvbgpAQCAtMCwwICsxLDIgQEAKK3tpBndpZGdldHtpBWRlYnVnU2kCb25pBWltYWdle2kJYWxpZ25tZW50U2kGY2VudGVyaQdoT2Zmc2V0VfppBG5hbWVTaQRzdW4xaQNzcmNTaQ5JbWFnZXMvU3VuLnBuZ2kHdk9mZnNldFX6fWkEdGV4dHtpCWFsaWdubWVudFNpBmNlbnRlcmkEZGF0YVNpCitDbGljayBIZXJlaQdoT2Zmc2V0VfppBG5hbWVTaQV0ZXh0MWkJb25Nb3VzZVVwU2kpc3VuMS5vcGFjaXR5ID0gKHN1bjEub3BhY2l0eSAvIDEwMCkgKiA5MDtpBHNpemVpJGkFc3R5bGVTaQRib2xkaQd2T2Zmc2V0aWR9aQZ3aW5kb3d7aQZoZWlnaHRJAfRpBG5hbWVTaQttYWluX3dpbmRvd2kFdGl0bGVTaRpTYW1wbGUgS29uZmFidWxhdG9yIFdpZGdldGkFd2lkdGhJAfR9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbi5vcmcvNC5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uLm9yZy80Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbi5vcmcvNC5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbi5vcmcvNS5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uLm9yZy81Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjg4OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbi5vcmcvNS5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9ubG9obWFubl90ZXN0cy9hbGxfdW5pY29kZS5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX25sb2htYW5uX3Rlc3RzL2FsbF91bmljb2RlLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmY5OGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9ubG9obWFubl90ZXN0cy9hbGxfdW5pY29kZS5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDEuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNjg1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwMS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbWl0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDIuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDIuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwMi5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbVF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDMuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDMuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1NGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwMy5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbRl0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDQuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDQuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwYWQwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNC5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDUuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDUuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNjU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbU2kDZm9vXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNi5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwNi5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM3YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA2Lmpzb24udWJqc29uCkBAIC0wLDAgKzEgQEAKK1tdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA3Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA3Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjZkZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDcuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAore30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDguanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDguanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NGYwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwOC5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDkuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMDkuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZDU5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAwOS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACit7aQNmb29TaQNiYXJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEwLmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEwLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmY3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTAuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAore2kBYVppA2Zvb1NpA2Jhcn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTEuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNzc1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxMS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbaf9dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEyLmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEyLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzlkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTIuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEzLmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEzLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjQzNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTMuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAorW0zu3e8LghZ+610KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTQuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTQuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhNDE1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNC5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTUuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTUuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1NzkwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbaQFdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE2Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE2Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDk0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTYuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAorW2x/////XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNy5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxNy5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMxYjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE3Lmpzb24udWJqc29uCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxOC5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAxOC5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjE3NzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE4Lmpzb24udWJqc29uCkBAIC0wLDAgKzEgQEAKK1tMESIQ9H3pgRVdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE5Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE5Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNjJiMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMTkuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAorW0x//////////10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjAuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjAuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhYWI1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMC5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjEuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5ZWVmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMS5qc29uLnVianNvbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjIuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjIuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzMTM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMi5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbRD/zwIMSbpeNXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMy5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyMy5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVlN2YyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIzLmpzb24udWJqc29uCkBAIC0wLDAgKzEgQEAKK1tEv/PAgxJul41dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjQuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjFjZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjUuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI2Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI2Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDc2OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjYuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjcuanNvbgppbmRleCAxN2NlNTIxLi42NzI0MzhjIDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjcuanNvbgorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjcuanNvbgpAQCAtMSArMSBAQAotWzEuNzk3NjkzMTM0ODYyMzE1N2UzMDhdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorWzEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyNy5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAyNy5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjVkZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24udWJqc29uCkBAIC0wLDAgKzEgQEAKK1tEf+////////9dClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI4Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI4Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjguanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI5Lmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI5Lmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWI4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjkuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzAuanNvbgppbmRleCBmZDM1NzY1Li5lOWEyNjY0IDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzAuanNvbgorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzAuanNvbgpAQCAtMSArMSBAQAotWzEuMjM0NUUtMzBdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorWzEuMjM0NWUtMzBdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24udWJqc29uIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjM5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzAuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAorW0Q5uQnj9fbCDl0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzEuanNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uCmluZGV4IDE0MjhkMTQuLmQ2ZjM0MDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uCkBAIC0xICsxIEBACi1bMS4yMzQ1RSszMF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitbMS4yMzQ1ZSszMF0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzEuanNvbi51Ympzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3MTRkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACitbREYvKcTusVXlXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMi5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMi5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzcxNGRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMyLmpzb24udWJqc29uCkBAIC0wLDAgKzEgQEAKK1tERi8pxO6xVeVdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczEuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMS5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDlmMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczEuanNvbi51Ympzb24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczIuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMi5qc29uLnVianNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJmNGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczIuanNvbi51Ympzb24KQEAgLTAsMCArMSBAQAorW1tbW1tbW1tbW1tbW1tbW1tbW1NpDE5vdCB0b28gZGVlcF1dXV1dXV1dXV1dXV1dXV1dXV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMy5qc29uLnVianNvbiBiL3Rlc3QvZGF0YS9qc29uX3Rlc3RzL3Bhc3MzLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOWExOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMy5qc29uLnVianNvbgpAQCAtMCwwICsxIEBACit7aRdKU09OIFRlc3QgUGF0dGVybiBwYXNzM3tpDEluIHRoaXMgdGVzdFNpEEl0IGlzIGFuIG9iamVjdC5pE1RoZSBvdXRlcm1vc3QgdmFsdWVTaRttdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS59fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9qc29uX3Rlc3RzdWl0ZS9zYW1wbGUuanNvbi51Ympzb24gYi90ZXN0L2RhdGEvanNvbl90ZXN0c3VpdGUvc2FtcGxlLmpzb24udWJqc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZGYxMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvanNvbl90ZXN0c3VpdGUvc2FtcGxlLmpzb24udWJqc29uCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9tYXJrdXNfa3Vobi9VVEYtOC10ZXN0LnR4dCBiL3Rlc3QvZGF0YS9tYXJrdXNfa3Vobi9VVEYtOC10ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWI1ZDUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL21hcmt1c19rdWhuL1VURi04LXRlc3QudHh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL2Z1enplci1kcml2ZXJfYWZsLmNwcCBiL3Rlc3Qvc3JjL2Z1enplci1kcml2ZXJfYWZsLmNwcAppbmRleCA2OWZjZWM3Li42YTljMjg4IDEwMDY0NAotLS0gYS90ZXN0L3NyYy9mdXp6ZXItZHJpdmVyX2FmbC5jcHAKKysrIGIvdGVzdC9zcmMvZnV6emVyLWRyaXZlcl9hZmwuY3BwCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAoZnV6eiB0ZXN0IHN1cHBvcnQpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGRyaXZlciBmb3IgQW1lcmljYW4gRnV6enkgTG9wIChhZmwtZnV6eikuIEl0IHJlbGllcyBvbgpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvZnV6emVyLXBhcnNlX2Nib3IuY3BwIGIvdGVzdC9zcmMvZnV6emVyLXBhcnNlX2Nib3IuY3BwCmluZGV4IDU3NjQwN2IuLjJiMDBlZGYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL2Z1enplci1wYXJzZV9jYm9yLmNwcAorKysgYi90ZXN0L3NyYy9mdXp6ZXItcGFyc2VfY2Jvci5jcHAKQEAgLTEsNyArMSw3IEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrIChmdXp6IHRlc3Qgc3VwcG9ydCkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgcGFyc2VyIHRlc3Qgc3VpdGFibGUgZm9yIGZ1enogdGVzdGluZy4gR2l2ZW4gYSBieXRlCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGpzb24uaHBwPgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogCiB1c2luZyBqc29uID0gbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL2Z1enplci1wYXJzZV9qc29uLmNwcCBiL3Rlc3Qvc3JjL2Z1enplci1wYXJzZV9qc29uLmNwcAppbmRleCA2YjJiMTE1Li41YjRlMGIwIDEwMDY0NAotLS0gYS90ZXN0L3NyYy9mdXp6ZXItcGFyc2VfanNvbi5jcHAKKysrIGIvdGVzdC9zcmMvZnV6emVyLXBhcnNlX2pzb24uY3BwCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAoZnV6eiB0ZXN0IHN1cHBvcnQpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHBhcnNlciB0ZXN0IHN1aXRhYmxlIGZvciBmdXp6IHRlc3RpbmcuIEdpdmVuIGEgYnl0ZQpAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxqc29uLmhwcD4KKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcganNvbiA9IG5sb2htYW5uOjpqc29uOwogCmRpZmYgLS1naXQgYS90ZXN0L3NyYy9mdXp6ZXItcGFyc2VfbXNncGFjay5jcHAgYi90ZXN0L3NyYy9mdXp6ZXItcGFyc2VfbXNncGFjay5jcHAKaW5kZXggYzNmOWViNS4uMDIxOTQ1YyAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvZnV6emVyLXBhcnNlX21zZ3BhY2suY3BwCisrKyBiL3Rlc3Qvc3JjL2Z1enplci1wYXJzZV9tc2dwYWNrLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKGZ1enogdGVzdCBzdXBwb3J0KQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBwYXJzZXIgdGVzdCBzdWl0YWJsZSBmb3IgZnV6eiB0ZXN0aW5nLiBHaXZlbiBhIGJ5dGUKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8anNvbi5ocHA+CisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKIApkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvZnV6emVyLXBhcnNlX3VianNvbi5jcHAgYi90ZXN0L3NyYy9mdXp6ZXItcGFyc2VfdWJqc29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQwNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcmMvZnV6emVyLXBhcnNlX3VianNvbi5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAgICBfXyBfX19fXyBfX19fXyBfX19fXworIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAoZnV6eiB0ZXN0IHN1cHBvcnQpCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCit8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgorCitUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHBhcnNlciB0ZXN0IHN1aXRhYmxlIGZvciBmdXp6IHRlc3RpbmcuIEdpdmVuIGEgYnl0ZQorYXJyYXkgZGF0YSwgaXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKworLSBqMSA9IGZyb21fdWJqc29uKGRhdGEpCistIHZlYyA9IHRvX3VianNvbihqMSkKKy0gajIgPSBmcm9tX3VianNvbih2ZWMpCistIGFzc2VydChqMSA9PSBqMikKKworVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGBMTFZNRnV6emVyVGVzdE9uZUlucHV0YCBjYW4gYmUgdXNlZCBpbiBkaWZmZXJlbnQgZnV6emVyCitkcml2ZXJzLgorCitMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgorKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CisKK3VzaW5nIGpzb24gPSBubG9obWFubjo6anNvbjsKKworLy8gc2VlIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgLy8gc3RlcCAxOiBwYXJzZSBpbnB1dAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMxKGRhdGEsIGRhdGEgKyBzaXplKTsKKyAgICAgICAganNvbiBqMSA9IGpzb246OmZyb21fdWJqc29uKHZlYzEpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzdGVwIDI6IHJvdW5kIHRyaXAKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYzIgPSBqc29uOjp0b191Ympzb24oajEpOworCisgICAgICAgICAgICAvLyBwYXJzZSBzZXJpYWxpemF0aW9uCisgICAgICAgICAgICBqc29uIGoyID0ganNvbjo6ZnJvbV91Ympzb24odmVjMik7CisKKyAgICAgICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG11c3QgbWF0Y2gKKyAgICAgICAgICAgIGFzc2VydChqc29uOjp0b191Ympzb24oajIpID09IHZlYzIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChjb25zdCBqc29uOjpwYXJzZV9lcnJvciYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHBhcnNpbmcgYSBVQkpTT04gc2VyaWFsaXphdGlvbiBtdXN0IG5vdCBmYWlsCisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChjb25zdCBqc29uOjpwYXJzZV9lcnJvciYpCisgICAgeworICAgICAgICAvLyBwYXJzZSBlcnJvcnMgYXJlIG9rLCBiZWNhdXNlIGlucHV0IG1heSBiZSByYW5kb20gYnl0ZXMKKyAgICB9CisgICAgY2F0Y2ggKGNvbnN0IGpzb246OnR5cGVfZXJyb3ImKQorICAgIHsKKyAgICAgICAgLy8gdHlwZSBlcnJvcnMgY2FuIG9jY3VyIGR1cmluZyBwYXJzaW5nLCB0b28KKyAgICB9CisKKyAgICAvLyByZXR1cm4gMCAtIG5vbi16ZXJvIHJldHVybiB2YWx1ZXMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LWFsZ29yaXRobXMuY3BwIGIvdGVzdC9zcmMvdW5pdC1hbGdvcml0aG1zLmNwcAppbmRleCBmNzRjYTcyLi5hMDVlYjk1IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWFsZ29yaXRobXMuY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtYWxnb3JpdGhtcy5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoImFsZ29yaXRobXMiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1hbGxvY2F0b3IuY3BwIGIvdGVzdC9zcmMvdW5pdC1hbGxvY2F0b3IuY3BwCmluZGV4IGExODJkOTguLjc1ZWZhYWQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtYWxsb2NhdG9yLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWFsbG9jYXRvci5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCiAjZGVmaW5lIHByaXZhdGUgcHVibGljCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogLy8gc3BlY2lhbCB0ZXN0IGNhc2UgdG8gY2hlY2sgaWYgbWVtb3J5IGlzIGxlYWtlZCBpZiBjb25zdHJ1Y3RvciB0aHJvd3MKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY2FwYWNpdHkuY3BwIGIvdGVzdC9zcmMvdW5pdC1jYXBhY2l0eS5jcHAKaW5kZXggNGRmNTEyYS4uZTFhYmU3MCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1jYXBhY2l0eS5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jYXBhY2l0eS5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoImNhcGFjaXR5IikKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY2Jvci5jcHAgYi90ZXN0L3NyYy91bml0LWNib3IuY3BwCmluZGV4IDFlMzdhOTguLjYyYWNjZmMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtY2Jvci5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jYm9yLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKICNpbmNsdWRlIDxmc3RyZWFtPgpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKICAgICB9CiB9CiAKLVRFU1RfQ0FTRSgiYWxsIGZpcnN0IGJ5dGVzIiwgIlshdGhyb3dzXSIpCitURVNUX0NBU0UoImFsbCBDQk9SIGZpcnN0IGJ5dGVzIiwgIlshdGhyb3dzXSIpCiB7CiAgICAgLy8gdGhlc2UgYnl0ZXMgd2lsbCBmYWlsIGltbWVkaWF0ZWx5IHdpdGggZXhjZXB0aW9uIHBhcnNlX2Vycm9yLjExMgogICAgIHN0ZDo6c2V0PHVpbnQ4X3Q+IHVuc3VwcG9ydGVkID0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfY29uc3RfaXRlcmF0b3IuY3BwIGIvdGVzdC9zcmMvdW5pdC1jbGFzc19jb25zdF9pdGVyYXRvci5jcHAKaW5kZXggNWVjYzlkNi4uZTVjMjM5MCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1jbGFzc19jb25zdF9pdGVyYXRvci5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jbGFzc19jb25zdF9pdGVyYXRvci5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCiAjZGVmaW5lIHByaXZhdGUgcHVibGljCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJjb25zdF9pdGVyYXRvciBjbGFzcyIpCmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LWNsYXNzX2l0ZXJhdG9yLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfaXRlcmF0b3IuY3BwCmluZGV4IDQ1ZjI4ZWYuLjI2MDQ3MjkgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfaXRlcmF0b3IuY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfaXRlcmF0b3IuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKIFRFU1RfQ0FTRSgiaXRlcmF0b3IgY2xhc3MiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1jbGFzc19sZXhlci5jcHAgYi90ZXN0L3NyYy91bml0LWNsYXNzX2xleGVyLmNwcAppbmRleCA0NTM1NWNkLi43ODUwZmUwIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWNsYXNzX2xleGVyLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWNsYXNzX2xleGVyLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKICNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiAvLyBzaG9ydGN1dCB0byBzY2FuIGEgc3RyaW5nIGxpdGVyYWwKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfcGFyc2VyLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtY2xhc3NfcGFyc2VyLmNwcAppbmRleCA5MWZkMTgxLi4wYmUwNDViIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWNsYXNzX3BhcnNlci5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jbGFzc19wYXJzZXIuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKICNpbmNsdWRlIDx2YWxhcnJheT4KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY29tcGFyaXNvbi5jcHAgYi90ZXN0L3NyYy91bml0LWNvbXBhcmlzb24uY3BwCmluZGV4IGRiZDc3ODguLmU1OTFiMGIgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtY29tcGFyaXNvbi5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jb21wYXJpc29uLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKIC8vIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBzdGQ6Omxlc3M8anNvbjo6dmFsdWVfdD4KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY29uY2VwdHMuY3BwIGIvdGVzdC9zcmMvdW5pdC1jb25jZXB0cy5jcHAKaW5kZXggZGVhMTIzOC4uMDA3OWQ3OCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1jb25jZXB0cy5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jb25jZXB0cy5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoImNvbmNlcHRzIikKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY29uc3RydWN0b3IxLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtY29uc3RydWN0b3IxLmNwcAppbmRleCA5ZDkzZjZmLi5iNGY0ZTgzIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWNvbnN0cnVjdG9yMS5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jb25zdHJ1Y3RvcjEuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKICNpbmNsdWRlIDxkZXF1ZT4KQEAgLTI5NSwxMSArMjk1LDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGpzb24gansxfTsKIAotICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKChqLmdldDxzdGQ6OnBhaXI8aW50LCBpbnQ+PigpKSwganNvbjo6b3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUygoai5nZXQ8c3RkOjpwYWlyPGludCwgaW50Pj4oKSksIGpzb246Om91dF9vZl9yYW5nZSYpOwogICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX1dJVEgoKGouZ2V0PHN0ZDo6cGFpcjxpbnQsIGludD4+KCkpLCAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDFdIGFycmF5IGluZGV4IDEgaXMgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICBDSEVDS19USFJPV1NfQVMoKGouZ2V0PHN0ZDo6dHVwbGU8aW50LCBpbnQ+PigpKSwganNvbjo6b3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUygoai5nZXQ8c3RkOjp0dXBsZTxpbnQsIGludD4+KCkpLCBqc29uOjpvdXRfb2ZfcmFuZ2UmKTsKICAgICAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKChqLmdldDxzdGQ6OnR1cGxlPGludCwgaW50Pj4oKSksICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwMV0gYXJyYXkgaW5kZXggMSBpcyBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUygoai5nZXQ8c3RkOjphcnJheTxpbnQsIDM+PigpKSwganNvbjo6b3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUygoai5nZXQ8c3RkOjphcnJheTxpbnQsIDM+PigpKSwganNvbjo6b3V0X29mX3JhbmdlJik7CiAgICAgICAgICAgICBDSEVDS19USFJPV1NfV0lUSCgoai5nZXQ8c3RkOjphcnJheTxpbnQsIDM+PigpKSwgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDAxXSBhcnJheSBpbmRleCAxIGlzIG91dCBvZiByYW5nZSIpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtY29uc3RydWN0b3IyLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtY29uc3RydWN0b3IyLmNwcAppbmRleCA1ODU0NWFkLi45ZDM0ZjU2IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWNvbnN0cnVjdG9yMi5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1jb25zdHJ1Y3RvcjIuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJvdGhlciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3IiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1jb252ZW5pZW5jZS5jcHAgYi90ZXN0L3NyYy91bml0LWNvbnZlbmllbmNlLmNwcAppbmRleCAyYmZlZjBmLi5mOWU5OTI4IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWNvbnZlbmllbmNlLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWNvbnZlbmllbmNlLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKICNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiB2b2lkIGNoZWNrX2VzY2FwZWQoY29uc3QgY2hhciogb3JpZ2luYWwsIGNvbnN0IGNoYXIqIGVzY2FwZWQgPSAiIiwgY29uc3QgYm9vbCBlbnN1cmVfYXNjaWkgPSBmYWxzZSk7CkBAIC05OSwxMSArOTksMTEgQEAKICAgICAgICAgY2hlY2tfZXNjYXBlZCgiXHgxZiIsICJcXHUwMDFmIik7CiAKICAgICAgICAgLy8gaW52YWxpZCBVVEYtOCBjaGFyYWN0ZXJzCi0gICAgICAgIENIRUNLX1RIUk9XU19BUyhjaGVja19lc2NhcGVkKCLDpFx4QTnDvCIpLCBqc29uOjp0eXBlX2Vycm9yKTsKKyAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGNoZWNrX2VzY2FwZWQoIsOkXHhBOcO8IiksIGpzb246OnR5cGVfZXJyb3ImKTsKICAgICAgICAgQ0hFQ0tfVEhST1dTX1dJVEgoY2hlY2tfZXNjYXBlZCgiw6RceEE5w7wiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi50eXBlX2Vycm9yLjMxNl0gaW52YWxpZCBVVEYtOCBieXRlIGF0IGluZGV4IDI6IDB4QTkiKTsKIAotICAgICAgICBDSEVDS19USFJPV1NfQVMoY2hlY2tfZXNjYXBlZCgiXHhDMiIpLCBqc29uOjp0eXBlX2Vycm9yKTsKKyAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGNoZWNrX2VzY2FwZWQoIlx4QzIiKSwganNvbjo6dHlwZV9lcnJvciYpOwogICAgICAgICBDSEVDS19USFJPV1NfV0lUSChjaGVja19lc2NhcGVkKCJceEMyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24udHlwZV9lcnJvci4zMTZdIGluY29tcGxldGUgVVRGLTggc3RyaW5nOyBsYXN0IGJ5dGU6IDB4QzIiKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LWNvbnZlcnNpb25zLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtY29udmVyc2lvbnMuY3BwCmluZGV4IGZiMGFiNGUuLjk5NDQ5NzggMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtY29udmVyc2lvbnMuY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtY29udmVyc2lvbnMuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKICNpbmNsdWRlIDxkZXF1ZT4KQEAgLTEwMjAsNyArMTAyMCw3IEBACiAgICAgICAgICAgICAgICAgU0VDVElPTigic3RkOjphcnJheSBpcyBsYXJnZXIgdGhhbiBKU09OIikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8aW50LCA2PiBhcnI2ID0ge3sxLCAyLCAzLCA0LCA1LCA2fX07Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhhcnI2ID0gajEsIGpzb246Om91dF9vZl9yYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhhcnI2ID0gajEsIGpzb246Om91dF9vZl9yYW5nZSYpOwogICAgICAgICAgICAgICAgICAgICBDSEVDS19USFJPV1NfV0lUSChhcnI2ID0gajEsICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwMV0gYXJyYXkgaW5kZXggNCBpcyBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtZGVzZXJpYWxpemF0aW9uLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtZGVzZXJpYWxpemF0aW9uLmNwcAppbmRleCAxZGE3OTFhLi5mNWE2MWNlIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWRlc2VyaWFsaXphdGlvbi5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1kZXNlcmlhbGl6YXRpb24uY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1lbGVtZW50X2FjY2VzczEuY3BwIGIvdGVzdC9zcmMvdW5pdC1lbGVtZW50X2FjY2VzczEuY3BwCmluZGV4IGUyODhjYjUuLmY3ZmQzZTggMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtZWxlbWVudF9hY2Nlc3MxLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWVsZW1lbnRfYWNjZXNzMS5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoImVsZW1lbnQgYWNjZXNzIDEiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1lbGVtZW50X2FjY2VzczIuY3BwIGIvdGVzdC9zcmMvdW5pdC1lbGVtZW50X2FjY2VzczIuY3BwCmluZGV4IDhmNjI4ZjYuLjg1MmE5M2MgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtZWxlbWVudF9hY2Nlc3MyLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWVsZW1lbnRfYWNjZXNzMi5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoImVsZW1lbnQgYWNjZXNzIDIiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1pbnNwZWN0aW9uLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtaW5zcGVjdGlvbi5jcHAKaW5kZXggMDA0M2E5ZS4uNWZhY2IxMSAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1pbnNwZWN0aW9uLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWluc3BlY3Rpb24uY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJvYmplY3QgaW5zcGVjdGlvbiIpCkBAIC0zMTYsOCArMzE2LDggQEAKICAgICBTRUNUSU9OKCJyb3VuZCB0cmlwcyIpCiAgICAgewogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOgotICAgIHsiMy4xNDE1OTI2NTM1ODk3OTMiLCAiMTAwMDAwMDAwMDAwMDAwMDAxMEU1IgotICAgIH0pCisgICAgICAgICAgICAgICAgeyIzLjE0MTU5MjY1MzU4OTc5MyIsICIxMDAwMDAwMDAwMDAwMDAwMDEwRTUiCisgICAgICAgICAgICAgICAgfSkKICAgICAgICAgewogICAgICAgICAgICAganNvbiBqMSA9IGpzb246OnBhcnNlKHMpOwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgczEgPSBqMS5kdW1wKCk7CmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LWl0ZW1zLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtaXRlbXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjYzMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NyYy91bml0LWl0ZW1zLmNwcApAQCAtMCwwICsxLDE0MjYgQEAKKy8qCisgICAgX18gX19fX18gX19fX18gX19fX18KKyBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCit8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgorCitMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCitjb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCitJTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQorQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorU09GVFdBUkUuCisqLworCisjaW5jbHVkZSAiY2F0Y2guaHBwIgorCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+Cit1c2luZyBubG9obWFubjo6anNvbjsKKworVEVTVF9DQVNFKCJpdGVyYXRvcl93cmFwcGVyIikKK3sKKyAgICBTRUNUSU9OKCJvYmplY3QiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oInJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGkudmFsdWUoKSA9IGpzb24oMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGkudmFsdWUoKSA9IGpzb24oMjIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMjIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbHVlcyB3aGVyZSBjaGFuZ2VkCisgICAgICAgICAgICBDSEVDSyhqID09IGpzb24oe3siQSIsIDExfSwgeyJCIiwgMjJ9fSkpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oImNvbnN0IG9iamVjdCIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oImFycmF5IikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oInZhbHVlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0geyJBIiwgIkIifTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJyZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgaS52YWx1ZSgpID0gIkFBIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQUEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgaS52YWx1ZSgpID0gIkJCIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbHVlcyB3aGVyZSBjaGFuZ2VkCisgICAgICAgICAgICBDSEVDSyhqID09IGpzb24oeyJBQSIsICJCQiJ9KSk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHsiQSIsICJCIn07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0geyJBIiwgIkIifTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiY29uc3QgYXJyYXkiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oInJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHsiQSIsICJCIn07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHZhbHVlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0geyJBIiwgIkIifTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCByZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNUSU9OKCJwcmltaXRpdmUiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oInJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB2YWx1ZQorICAgICAgICAgICAgICAgIGkudmFsdWUoKSA9IGpzb24oMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbHVlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICBDSEVDSyhqID09IGpzb24oMikpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oImNvbnN0IHByaW1pdGl2ZSIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2NvdW50ZXI7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0gMTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2NvdW50ZXI7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9DQVNFKCJpdGVtcygpIikKK3sKKyAgICBTRUNUSU9OKCJvYmplY3QiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSBqc29uKDExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDExKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSBqc29uKDIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDIyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiB2YWx1ZXMgd2hlcmUgY2hhbmdlZAorICAgICAgICAgICAgQ0hFQ0soaiA9PSBqc29uKHt7IkEiLCAxMX0sIHsiQiIsIDIyfX0pKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHZhbHVlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiY29uc3Qgb2JqZWN0IikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oInZhbHVlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oInJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNUSU9OKCJhcnJheSIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHsiQSIsICJCIn07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJyZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSAiQUEiOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSAiQkIiOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgdmFsdWVzIHdoZXJlIGNoYW5nZWQKKyAgICAgICAgICAgIENIRUNLKGogPT0ganNvbih7IkFBIiwgIkJCIn0pKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHZhbHVlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0geyJBIiwgIkIifTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHsiQSIsICJCIn07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiY29uc3QgYXJyYXkiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0geyJBIiwgIkIifTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHsiQSIsICJCIn07CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCByZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oInByaW1pdGl2ZSIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJyZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB2YWx1ZQorICAgICAgICAgICAgICAgIGkudmFsdWUoKSA9IGpzb24oMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbHVlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICBDSEVDSyhqID09IGpzb24oMikpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2NvdW50ZXI7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0gMTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNUSU9OKCJjb25zdCBwcmltaXRpdmUiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigidmFsdWUiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGouaXRlbXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK2NvdW50ZXI7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7CisgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QganNvbiBqID0gMTsKKyAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IDE7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDogai5pdGVtcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJjb25zdCByZWZlcmVuY2UiKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBqc29uIGogPSAxOworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqLml0ZW1zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytjb3VudGVyOworICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIiIpOworICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtaXRlcmF0b3Jfd3JhcHBlci5jcHAgYi90ZXN0L3NyYy91bml0LWl0ZXJhdG9yX3dyYXBwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZjZTE2Li4wMDAwMDAwCi0tLSBhL3Rlc3Qvc3JjL3VuaXQtaXRlcmF0b3Jfd3JhcHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLyoKLSAgICBfXyBfX19fXyBfX19fXyBfX19fXwotIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKLXxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAotaW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi10byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKLWNvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi1jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKLUlNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCi1BVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCi1TT0ZUV0FSRS4KLSovCi0KLSNpbmNsdWRlICJjYXRjaC5ocHAiCi0KLSNpbmNsdWRlICJqc29uLmhwcCIKLXVzaW5nIG5sb2htYW5uOjpqc29uOwotCi1URVNUX0NBU0UoIml0ZXJhdG9yX3dyYXBwZXIiKQotewotICAgIFNFQ1RJT04oIm9iamVjdCIpCi0gICAgewotICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgaS52YWx1ZSgpID0ganNvbigxMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgaS52YWx1ZSgpID0ganNvbigyMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdmFsdWVzIHdoZXJlIGNoYW5nZWQKLSAgICAgICAgICAgIENIRUNLKGogPT0ganNvbih7eyJBIiwgMTF9LCB7IkIiLCAyMn19KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU0VDVElPTigiY29uc3Qgb2JqZWN0IikKLSAgICB7Ci0gICAgICAgIFNFQ1RJT04oInZhbHVlIikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJyZWZlcmVuY2UiKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBqc29uIGogPSB7eyJBIiwgMX0sIHsiQiIsIDJ9fTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHt7IkEiLCAxfSwgeyJCIiwgMn19OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QganNvbiBqID0ge3siQSIsIDF9LCB7IkIiLCAyfX07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSBqc29uKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU0VDVElPTigiYXJyYXkiKQotICAgIHsKLSAgICAgICAgU0VDVElPTigidmFsdWUiKQotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIGogPSB7IkEiLCAiQiJ9OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNFQ1RJT04oInJlZmVyZW5jZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gaiA9IHsiQSIsICJCIn07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSAiQUEiOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlKCkgPSAiQkIiOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCQiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdmFsdWVzIHdoZXJlIGNoYW5nZWQKLSAgICAgICAgICAgIENIRUNLKGogPT0ganNvbih7IkFBIiwgIkJCIn0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNFQ1RJT04oImNvbnN0IHZhbHVlIikKLSAgICAgICAgewotICAgICAgICAgICAganNvbiBqID0geyJBIiwgIkIifTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJjb25zdCByZWZlcmVuY2UiKQotICAgICAgICB7Ci0gICAgICAgICAgICBqc29uIGogPSB7IkEiLCAiQiJ9OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY291bnRlcisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIwIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIxIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0gIkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTRUNUSU9OKCJjb25zdCBhcnJheSIpCi0gICAgewotICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHsiQSIsICJCIn07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QganNvbiBqID0geyJBIiwgIkIifTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJBIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiMSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09ICJCIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigiY29uc3QgdmFsdWUiKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBqc29uIGogPSB7IkEiLCAiQiJ9OwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNFQ1RJT04oImNvbnN0IHJlZmVyZW5jZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IHsiQSIsICJCIn07Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGpzb246Oml0ZXJhdG9yX3dyYXBwZXIoaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkua2V5KCkgPT0gIjEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkudmFsdWUoKSA9PSAiQiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNFQ1RJT04oInByaW1pdGl2ZSIpCi0gICAgewotICAgICAgICBTRUNUSU9OKCJ2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gaiA9IDE7Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigicmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAganNvbiBqID0gMTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotCi0gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHZhbHVlCi0gICAgICAgICAgICAgICAgaS52YWx1ZSgpID0ganNvbigyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soY291bnRlciA9PSAyKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdmFsdWUgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgIENIRUNLKGogPT0ganNvbigyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGpzb24gaiA9IDE7Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAganNvbiBqID0gMTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU0VDVElPTigiY29uc3QgcHJpbWl0aXZlIikKLSAgICB7Ci0gICAgICAgIFNFQ1RJT04oInZhbHVlIikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QganNvbiBqID0gMTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICsrY291bnRlcjsKLSAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJyZWZlcmVuY2UiKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBqc29uIGogPSAxOwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAxOwotCi0gICAgICAgICAgICBmb3IgKGF1dG8mIGkgOiBqc29uOjppdGVyYXRvcl93cmFwcGVyKGopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICsrY291bnRlcjsKLSAgICAgICAgICAgICAgICBDSEVDSyhpLmtleSgpID09ICIiKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhpLnZhbHVlKCkgPT0ganNvbigxKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKGNvdW50ZXIgPT0gMik7Ci0gICAgICAgIH0KLQotICAgICAgICBTRUNUSU9OKCJjb25zdCB2YWx1ZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGpzb24gaiA9IDE7Ci0gICAgICAgICAgICBpbnQgY291bnRlciA9IDE7Ci0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0VDVElPTigiY29uc3QgcmVmZXJlbmNlIikKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QganNvbiBqID0gMTsKLSAgICAgICAgICAgIGludCBjb3VudGVyID0gMTsKLQotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpIDoganNvbjo6aXRlcmF0b3Jfd3JhcHBlcihqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICArK2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS5rZXkoKSA9PSAiIik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaS52YWx1ZSgpID09IGpzb24oMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhjb3VudGVyID09IDIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1pdGVyYXRvcnMxLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtaXRlcmF0b3JzMS5jcHAKaW5kZXggOGM1ZWRkYi4uYTYzZGU1ZSAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1pdGVyYXRvcnMxLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWl0ZXJhdG9yczEuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKIFRFU1RfQ0FTRSgiaXRlcmF0b3JzIDEiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1pdGVyYXRvcnMyLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtaXRlcmF0b3JzMi5jcHAKaW5kZXggZDg3Mjg5MC4uMDU1MDljMyAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1pdGVyYXRvcnMyLmNwcAorKysgYi90ZXN0L3NyYy91bml0LWl0ZXJhdG9yczIuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJpdGVyYXRvcnMgMiIpCmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LWpzb25fcGF0Y2guY3BwIGIvdGVzdC9zcmMvdW5pdC1qc29uX3BhdGNoLmNwcAppbmRleCAzNDkwZjcwLi43MWRiYzQ1IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWpzb25fcGF0Y2guY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtanNvbl9wYXRjaC5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtanNvbl9wb2ludGVyLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtanNvbl9wb2ludGVyLmNwcAppbmRleCBiNmI4Mzc2Li5mNTcyZTFjIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LWpzb25fcG9pbnRlci5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1qc29uX3BvaW50ZXIuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImNhdGNoLmhwcCIKIAogI2RlZmluZSBwcml2YXRlIHB1YmxpYwotI2luY2x1ZGUgImpzb24uaHBwIgorI2luY2x1ZGUgPG5sb2htYW5uL2pzb24uaHBwPgogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKIFRFU1RfQ0FTRSgiSlNPTiBwb2ludGVycyIpCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGpzb24gdiA9IHsxLCAyLCAzLCA0fTsKICAgICAgICAgICAgIGpzb246Ompzb25fcG9pbnRlciBwdHIoIi8xMGUiKTsKLSAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyh2W3B0cl0sIGpzb246Om91dF9vZl9yYW5nZSk7CisgICAgICAgICAgICBDSEVDS19USFJPV1NfQVModltwdHJdLCBqc29uOjpvdXRfb2ZfcmFuZ2UmKTsKICAgICAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKHZbcHRyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbanNvbi5leGNlcHRpb24ub3V0X29mX3JhbmdlLjQwNF0gdW5yZXNvbHZlZCByZWZlcmVuY2UgdG9rZW4gJzEwZSciKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1tZXJnZV9wYXRjaC5jcHAgYi90ZXN0L3NyYy91bml0LW1lcmdlX3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ3MTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcmMvdW5pdC1tZXJnZV9wYXRjaC5jcHAKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgICAgX18gX19fX18gX19fX18gX19fX18KKyBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCit8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgorCitMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCitjb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCitJTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQorQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorU09GVFdBUkUuCisqLworCisjaW5jbHVkZSAiY2F0Y2guaHBwIgorCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+Cit1c2luZyBubG9obWFubjo6anNvbjsKKworVEVTVF9DQVNFKCJKU09OIE1lcmdlIFBhdGNoIikKK3sKKyAgICBTRUNUSU9OKCJleGFtcGxlcyBmcm9tIFJGQyA3Mzk2IikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oIlNlY3Rpb24gMSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gZG9jdW1lbnQgPSBSIih7CisgICAgICAgICAgICAgICAgImEiOiAiYiIsCisgICAgICAgICAgICAgICAgImMiOiB7CisgICAgICAgICAgICAgICAgICAgICJkIjogImUiLAorICAgICAgICAgICAgICAgICAgICAiZiI6ICJnIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pIl9qc29uOworCisgICAgICAgICAgICBqc29uIHBhdGNoID0gUiIoeworICAgICAgICAgICAgICAgICJhIjogInoiLAorICAgICAgICAgICAgICAgICJjIjogeworICAgICAgICAgICAgICAgICAgICAiZiI6IG51bGwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSJfanNvbjsKKworICAgICAgICAgICAganNvbiBleHBlY3RlZCA9IFIiKHsKKyAgICAgICAgICAgICAgICAiYSI6ICJ6IiwKKyAgICAgICAgICAgICAgICAiYyI6IHsKKyAgICAgICAgICAgICAgICAgICAgImQiOiAiZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSJfanNvbjsKKworICAgICAgICAgICAgZG9jdW1lbnQubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgQ0hFQ0soZG9jdW1lbnQgPT0gZXhwZWN0ZWQpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiU2VjdGlvbiAzIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBkb2N1bWVudCA9IFIiKHsKKyAgICAgICAgICAgICAgICAidGl0bGUiOiAiR29vZGJ5ZSEiLAorICAgICAgICAgICAgICAgICJhdXRob3IiOiB7CisgICAgICAgICAgICAgICAgICAgICJnaXZlbk5hbWUiOiAiSm9obiIsCisgICAgICAgICAgICAgICAgICAgICJmYW1pbHlOYW1lIjogIkRvZSIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSIsCisgICAgICAgICAgICAgICAgICAgICJzYW1wbGUiCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAiY29udGVudCI6ICJUaGlzIHdpbGwgYmUgdW5jaGFuZ2VkIgorICAgICAgICAgICAgfSkiX2pzb247CisKKyAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIih7CisgICAgICAgICAgICAgICAgInRpdGxlIjogIkhlbGxvISIsCisgICAgICAgICAgICAgICAgInBob25lTnVtYmVyIjogIiswMS0xMjMtNDU2LTc4OTAiLAorICAgICAgICAgICAgICAgICJhdXRob3IiOiB7CisgICAgICAgICAgICAgICAgICAgICJmYW1pbHlOYW1lIjogbnVsbAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgInRhZ3MiOiBbCisgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIgorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0pIl9qc29uOworCisgICAgICAgICAgICBqc29uIGV4cGVjdGVkID0gUiIoeworICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJIZWxsbyEiLAorICAgICAgICAgICAgICAgICJhdXRob3IiOiB7CisgICAgICAgICAgICAgICAgICAgICJnaXZlbk5hbWUiOiAiSm9obiIKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJ0YWdzIjogWworICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSIKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICJjb250ZW50IjogIlRoaXMgd2lsbCBiZSB1bmNoYW5nZWQiLAorICAgICAgICAgICAgICAgICJwaG9uZU51bWJlciI6ICIrMDEtMTIzLTQ1Ni03ODkwIgorICAgICAgICAgICAgfSkiX2pzb247CisKKyAgICAgICAgICAgIGRvY3VtZW50Lm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgIENIRUNLKGRvY3VtZW50ID09IGV4cGVjdGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oIkFwcGVuZGl4IEEiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDEiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOiJiIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIih7ImEiOiJjIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gUiIoeyJhIjoiYyJ9KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOiJiIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIih7ImIiOiJjIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gUiIoeyJhIjoiYiIsICJiIjoiYyJ9KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDMiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOiJiIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIih7ImEiOm51bGx9KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHJlc3VsdCA9IFIiKHt9KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOiJiIiwiYiI6ImMifSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6bnVsbH0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gUiIoeyJiIjoiYyJ9KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOlsiYiJdfSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6ImMifSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIih7ImEiOiJjIn0pIl9qc29uOworCisgICAgICAgICAgICAgICAgb3JpZ2luYWwubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgICAgIENIRUNLKG9yaWdpbmFsID09IHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIkV4YW1wbGUgNiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBvcmlnaW5hbCA9IFIiKHsiYSI6ImMifSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6WyJiIl19KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHJlc3VsdCA9IFIiKHsiYSI6WyJiIl19KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDciKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOnsiYiI6ICJjIn19KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHBhdGNoID0gUiIoeyJhIjp7ImIiOiJkIiwiYyI6bnVsbH19KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHJlc3VsdCA9IFIiKHsiYSI6IHsiYiI6ICJkIn19KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDgiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOlt7ImIiOiJjIn1dfSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6WzFdfSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIih7ImEiOlsxXX0pIl9qc29uOworCisgICAgICAgICAgICAgICAgb3JpZ2luYWwubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgICAgIENIRUNLKG9yaWdpbmFsID09IHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIkV4YW1wbGUgOSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBvcmlnaW5hbCA9IFIiKFsiYSIsImIiXSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKFsiYyIsImQiXSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIihbImMiLCJkIl0pIl9qc29uOworCisgICAgICAgICAgICAgICAgb3JpZ2luYWwubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgICAgIENIRUNLKG9yaWdpbmFsID09IHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIkV4YW1wbGUgMTAiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7ImEiOiJiIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIihbImMiXSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIihbImMiXSkiX2pzb247CisKKyAgICAgICAgICAgICAgICBvcmlnaW5hbC5tZXJnZV9wYXRjaChwYXRjaCk7CisgICAgICAgICAgICAgICAgQ0hFQ0sob3JpZ2luYWwgPT0gcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiRXhhbXBsZSAxMSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBvcmlnaW5hbCA9IFIiKHsiYSI6ImZvbyJ9KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHBhdGNoID0gUiIobnVsbCkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIihudWxsKSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJFeGFtcGxlIDEyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqc29uIG9yaWdpbmFsID0gUiIoeyJhIjoiZm9vIn0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIigiYmFyIikiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIigiYmFyIikiX2pzb247CisKKyAgICAgICAgICAgICAgICBvcmlnaW5hbC5tZXJnZV9wYXRjaChwYXRjaCk7CisgICAgICAgICAgICAgICAgQ0hFQ0sob3JpZ2luYWwgPT0gcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiRXhhbXBsZSAxMyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBvcmlnaW5hbCA9IFIiKHsiZSI6bnVsbH0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcGF0Y2ggPSBSIih7ImEiOjF9KSJfanNvbjsKKyAgICAgICAgICAgICAgICBqc29uIHJlc3VsdCA9IFIiKHsiZSI6bnVsbCwiYSI6MX0pIl9qc29uOworCisgICAgICAgICAgICAgICAgb3JpZ2luYWwubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgICAgIENIRUNLKG9yaWdpbmFsID09IHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIkV4YW1wbGUgMTQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIihbMSwyXSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6ImIiLCJjIjpudWxsfSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiByZXN1bHQgPSBSIih7ImEiOiJiIn0pIl9qc29uOworCisgICAgICAgICAgICAgICAgb3JpZ2luYWwubWVyZ2VfcGF0Y2gocGF0Y2gpOworICAgICAgICAgICAgICAgIENIRUNLKG9yaWdpbmFsID09IHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIkV4YW1wbGUgMTUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gb3JpZ2luYWwgPSBSIih7fSkiX2pzb247CisgICAgICAgICAgICAgICAganNvbiBwYXRjaCA9IFIiKHsiYSI6eyJiYiI6eyJjY2MiOm51bGx9fX0pIl9qc29uOworICAgICAgICAgICAgICAgIGpzb24gcmVzdWx0ID0gUiIoeyJhIjp7ImJiIjp7fX19KSJfanNvbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbmFsLm1lcmdlX3BhdGNoKHBhdGNoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhvcmlnaW5hbCA9PSByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1tZXRhLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtbWV0YS5jcHAKaW5kZXggZjZlOWQ2Zi4uNGFhMzY3MyAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1tZXRhLmNwcAorKysgYi90ZXN0L3NyYy91bml0LW1ldGEuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE2IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJ2ZXJzaW9uIGluZm9ybWF0aW9uIikKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgICAgICBDSEVDSyhqWyJ1cmwiXSA9PSAiaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24iKTsKICAgICAgICAgQ0hFQ0soalsidmVyc2lvbiJdID09IGpzb24oCiAgICAgICAgIHsKLSAgICAgICAgICAgIHsic3RyaW5nIiwgIjMuMC4xIn0sCisgICAgICAgICAgICB7InN0cmluZyIsICIzLjEuMCJ9LAogICAgICAgICAgICAgeyJtYWpvciIsIDN9LAotICAgICAgICAgICAgeyJtaW5vciIsIDB9LAotICAgICAgICAgICAgeyJwYXRjaCIsIDF9CisgICAgICAgICAgICB7Im1pbm9yIiwgMX0sCisgICAgICAgICAgICB7InBhdGNoIiwgMH0KICAgICAgICAgfSkpOwogCiAgICAgICAgIENIRUNLKGouZmluZCgicGxhdGZvcm0iKSAhPSBqLmVuZCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtbW9kaWZpZXJzLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtbW9kaWZpZXJzLmNwcAppbmRleCA0NGI5Y2YyLi42ZDhkM2E4IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LW1vZGlmaWVycy5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1tb2RpZmllcnMuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJtb2RpZmllcnMiKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1tc2dwYWNrLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtbXNncGFjay5jcHAKaW5kZXggNTMxMDEyYi4uZjhkZTEzZCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1tc2dwYWNrLmNwcAorKysgYi90ZXN0L3NyYy91bml0LW1zZ3BhY2suY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogI2luY2x1ZGUgPGZzdHJlYW0+CmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LW5vZXhjZXB0LmNwcCBiL3Rlc3Qvc3JjL3VuaXQtbm9leGNlcHQuY3BwCmluZGV4IDU2Y2E0YTQuLjlhNDJkMGMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtbm9leGNlcHQuY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtbm9leGNlcHQuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjcsNyArMjcsNyBAQAogKi8KIAogI2luY2x1ZGUgImNhdGNoLmhwcCIKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIAogdXNpbmcgbmxvaG1hbm46Ompzb247CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtcG9pbnRlcl9hY2Nlc3MuY3BwIGIvdGVzdC9zcmMvdW5pdC1wb2ludGVyX2FjY2Vzcy5jcHAKaW5kZXggMTkyNTQ5MC4uNjA1MjBiZCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1wb2ludGVyX2FjY2Vzcy5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1wb2ludGVyX2FjY2Vzcy5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoInBvaW50ZXIgYWNjZXNzIikKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtcmVhZG1lLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtcmVhZG1lLmNwcAppbmRleCBlYmYxMDU4Li5kZWM4NzllIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LXJlYWRtZS5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1yZWFkbWUuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogI2luY2x1ZGUgPGRlcXVlPgpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC1yZWZlcmVuY2VfYWNjZXNzLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtcmVmZXJlbmNlX2FjY2Vzcy5jcHAKaW5kZXggZWE4NGM5ZS4uYzlmMjFmOCAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC1yZWZlcmVuY2VfYWNjZXNzLmNwcAorKysgYi90ZXN0L3NyYy91bml0LXJlZmVyZW5jZV9hY2Nlc3MuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogVEVTVF9DQVNFKCJyZWZlcmVuY2UgYWNjZXNzIikKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtcmVncmVzc2lvbi5jcHAgYi90ZXN0L3NyYy91bml0LXJlZ3Jlc3Npb24uY3BwCmluZGV4IGExMTllZDcuLmMzNDI4NTMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtcmVncmVzc2lvbi5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC1yZWdyZXNzaW9uLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKICNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KQEAgLTU5Myw2ICs1OTMsNjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5vdXRfb2ZfcmFuZ2UuNDA2XSBudW1iZXIgb3ZlcmZsb3cgcGFyc2luZyAnMjJlMjIyMiciKTsKICAgICB9CiAKKyAgICBTRUNUSU9OKCJpc3N1ZSAjMzYwIC0gTG9zcyBvZiBwcmVjaXNpb24gd2hlbiBzZXJpYWxpemluZyA8ZG91YmxlPiIpCisgICAgeworICAgICAgICBhdXRvIGNoZWNrX3JvdW5kdHJpcCA9IFtdKGRvdWJsZSBudW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIENBUFRVUkUobnVtYmVyKTsKKworICAgICAgICAgICAganNvbiBqID0gbnVtYmVyOworICAgICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfZmxvYXQoKSk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgajsKKworICAgICAgICAgICAgQ0hFQ0tfTk9USFJPVyhzcyA+PiBqKTsKKyAgICAgICAgICAgIENIRUNLKGouaXNfbnVtYmVyX2Zsb2F0KCkpOworICAgICAgICAgICAgQ0hFQ0soai5nZXQ8anNvbjo6bnVtYmVyX2Zsb2F0X3Q+KCkgPT0gbnVtYmVyKTsKKyAgICAgICAgfTsKKworICAgICAgICBjaGVja19yb3VuZHRyaXAoMTAwMDAwMDAwMDAwLjEyMzYpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoc3RkOjpudW1lcmljX2xpbWl0czxqc29uOjpudW1iZXJfZmxvYXRfdD46Om1heCgpKTsKKworICAgICAgICAvLyBTb21lIG1vcmUgbnVtYmVycyB3aGljaCBmYWlsIHRvIHJvdW5kdHJpcCB3aGVuIHNlcmlhbGl6ZWQgd2l0aCBkaWdpdHMxMCBzaWduaWZpY2FuZCBkaWdpdHMgKGluc3RlYWQgb2YgbWF4X2RpZ2l0czEwKQorICAgICAgICBjaGVja19yb3VuZHRyaXAoMS41NDE4ODg2MTE5NDgwNjRlLTE3KTsKKyAgICAgICAgY2hlY2tfcm91bmR0cmlwKDUuNDE4NzcxMDI4NTkxMDE1ZS0xNik7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCg5LjM5ODY4NTU5MjYwODU5NWUtMTUpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoOC44MjY4NDM5NTI3NjIzNDdlLTE0KTsKKyAgICAgICAgY2hlY2tfcm91bmR0cmlwKDguMTQzMjkxMzEzNDc1MzM1ZS0xMyk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCg0Ljg1MTMyODE3Mjc2MjUwOGUtMTIpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNi42Nzc4NTA5OTgwODQzNThlLTExKTsKKyAgICAgICAgY2hlY2tfcm91bmR0cmlwKDMuOTk1Mzk4NTE4MTc0NTI1ZS0xMCk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgxLjk2MDQ1MjYwNTY0NTEyNGUtOSk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgzLjU1MTgxMjU4NjMwMjg4M2UtOCk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgyLjk0Nzk4ODQxMTY4OTI2MWUtNyk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCg4LjIxMDE2Njc0ODA1NjE5MmUtNik7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCg2LjEwNDg4OTcwNDI2Njc1M2UtNSk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgwLjAwMDg2Mjk5NTQ2MzEzMzA4NzYpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMC4wMDQ5MzY5OTM4ODEwNTE2MTEpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMC4wODMwOTcyNTEwMjYwODA3Myk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgwLjUyMTA0OTQyNjg0OTk3ODMpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNi4zODI5Mjc5MzA5Mzk3NjcpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNTkuOTQ5NDcyNDUzNTg2NzEpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMzYxLjA4Mzg2NTEyNjYxMjIpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNDY3OC4zNTQ1OTYxODE4NzcpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNjE0MTIuMTc2NTg5NTYwNDMpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNzI1Njk2LjA3OTkwNTc3ODIpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMjgxMTczMi41ODMzOTk4MjgpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMzAxNzgzNTEuMDc1MzM2MDUpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNjg5Njg0ODgwLjMyMzU4NDQpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNTcxNDg4NzY3My41NTUxNDcpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoODQ2NTIwMzg4MjEuMTg4MDgpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMTU2NTEwNTgzNDMxLjc3MjEpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNTkzODQ1MDU2OTAyMS43MzIpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoODM2MjMyOTc2NTQ0NjAuMzMpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoNzAxNDY2NTczMjU0NzczLjYpOworICAgICAgICBjaGVja19yb3VuZHRyaXAoMTM2OTAxMzM3MDMwNDUxMyk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCg5Njk2MzY0ODAyMzA5NDcyMCk7CisgICAgICAgIGNoZWNrX3JvdW5kdHJpcCgzLjQ3ODIzNzQwOTI4MDEwOGUrMTcpOworICAgIH0KKwogICAgIFNFQ1RJT04oImlzc3VlICMzNjYgLSBqc29uOjpwYXJzZSBvbiBmYWlsZWQgc3RyZWFtIGdldHMgc3R1Y2siKQogICAgIHsKICAgICAgICAgc3RkOjppZnN0cmVhbSBmKCJmaWxlX25vdF9mb3VuZC5qc29uIik7CkBAIC03ODUsNyArODQzLDcgQEAKICAgICB7CiAgICAgICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCIxNjYwMjA2OTY2NjMzODU5NjQ0OTAiKTsKICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfZmxvYXQoKSk7Ci0gICAgICAgIENIRUNLKGouZHVtcCgpID09ICIxLjY2MDIwNjk2NjYzMzg2ZSsyMCIpOworICAgICAgICBDSEVDSyhqLmdldDxqc29uOjpudW1iZXJfZmxvYXRfdD4oKSA9PSAxNjYwMjA2OTY2NjMzODU5NjQ0OTAuMCk7CiAgICAgfQogCiAgICAgU0VDVElPTigiaXNzdWUgIzQwNSAtIEhlYXAtYnVmZmVyLW92ZXJmbG93IChPU1MtRnV6eiBpc3N1ZSAzNDIpIikKQEAgLTEzMTEsNyArMTM2OSw3IEBACiAgICAgICAgIHVpbnQ4X3Qga2V5MVtdID0geyAxMDMsIDkyLCAxMTcsIDQ4LCA0OCwgNDgsIDU1LCA5MiwgMTE0LCAyMTUsIDEyNiwgMjE0LCA5NSwgOTIsIDM0LCAxNzQsIDQwLCA3MSwgMzgsIDE3NCwgNDAsIDcxLCAzOCwgMjIzLCAxMzQsIDI0NywgMTI3IH07CiAgICAgICAgIHN0ZDo6c3RyaW5nIGtleTFfc3RyKGtleTEsIGtleTEgKyBzaXplb2Yoa2V5MSkgLyBzaXplb2Yoa2V5MVswXSkpOwogICAgICAgICBqc29uIGogPSBrZXkxX3N0cjsKLSAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGouZHVtcCgpLCBqc29uOjp0eXBlX2Vycm9yKTsKKyAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGouZHVtcCgpLCBqc29uOjp0eXBlX2Vycm9yJik7CiAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKGouZHVtcCgpLCAiW2pzb24uZXhjZXB0aW9uLnR5cGVfZXJyb3IuMzE2XSBpbnZhbGlkIFVURi04IGJ5dGUgYXQgaW5kZXggMTA6IDB4N0UiKTsKICAgICB9CiAKQEAgLTEzMzYsNyArMTM5NCw3IEBACiAKICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKG1vZGVsLnBhdGNoKFIiKFt7Im9wIjogIm1vdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIjogIi9vbmUvdHdvL3RocmVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6ICIvYS9iL2MifV0pIl9qc29uKSwganNvbjo6b3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6ICIvYS9iL2MifV0pIl9qc29uKSwganNvbjo6b3V0X29mX3JhbmdlJik7CiAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKG1vZGVsLnBhdGNoKFIiKFt7Im9wIjogIm1vdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIjogIi9vbmUvdHdvL3RocmVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6ICIvYS9iL2MifV0pIl9qc29uKSwKQEAgLTEzNDQsNyArMTQwMiw3IEBACiAKICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKG1vZGVsLnBhdGNoKFIiKFt7Im9wIjogImNvcHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20iOiAiL29uZS90d28vdGhyZWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiAiL2EvYi9jIn1dKSJfanNvbiksIGpzb246Om91dF9vZl9yYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6ICIvYS9iL2MifV0pIl9qc29uKSwganNvbjo6b3V0X29mX3JhbmdlJik7CiAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKG1vZGVsLnBhdGNoKFIiKFt7Im9wIjogImNvcHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20iOiAiL29uZS90d28vdGhyZWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGgiOiAiL2EvYi9jIn1dKSJfanNvbiksCmRpZmYgLS1naXQgYS90ZXN0L3NyYy91bml0LXNlcmlhbGl6YXRpb24uY3BwIGIvdGVzdC9zcmMvdW5pdC1zZXJpYWxpemF0aW9uLmNwcAppbmRleCA1NjY4YjdiLi5mNWFkN2Y3IDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LXNlcmlhbGl6YXRpb24uY3BwCisrKyBiL3Rlc3Qvc3JjL3VuaXQtc2VyaWFsaXphdGlvbi5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgICAgX18gX19fX18gX19fX18gX19fX18KICBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCi18ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMC4xCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCiB8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgogCiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgotQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KK0NvcHlyaWdodCAoYykgMjAxMy0yMDE4IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCiAKIFBlcm1pc3Npb24gaXMgaGVyZWJ5ICBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55ICBwZXJzb24gb2J0YWluaW5nIGEgY29weQogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiBURVNUX0NBU0UoInNlcmlhbGl6YXRpb24iKQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC10ZXN0c3VpdGVzLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtdGVzdHN1aXRlcy5jcHAKaW5kZXggYWFkMmIxZC4uYjJjYmZiYyAxMDA2NDQKLS0tIGEvdGVzdC9zcmMvdW5pdC10ZXN0c3VpdGVzLmNwcAorKysgYi90ZXN0L3NyYy91bml0LXRlc3RzdWl0ZXMuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE3IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiB1c2luZyBubG9obWFubjo6anNvbjsKIAogI2luY2x1ZGUgPGZzdHJlYW0+CkBAIC0zMDcsMTUgKzMwNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIxLmpzb24iLAogICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIyLmpzb24iLAogICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIzLmpzb24iLAotICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjQuanNvbiIsIC8vIHJvdW5kdHJpcCBlcnJvcgotICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjUuanNvbiIsIC8vIHJvdW5kdHJpcCBlcnJvcgotICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjYuanNvbiIsIC8vIHJvdW5kdHJpcCBlcnJvcgotICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjcuanNvbiIsIC8vIHJvdW5kdHJpcCBlcnJvcgotICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjguanNvbiIsIC8vIHJvdW5kdHJpcCBlcnJvcgorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjguanNvbiIsIC8vIGluY29tcGF0aWJsZSB3aXRoIHJvdW5kdHJpcDI0CiAgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMjkuanNvbiIsCi0gICAgICAgICAgICAgICAgICAgIC8vInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMC5qc29uIiwgLy8gcm91bmR0cmlwIGVycm9yCi0gICAgICAgICAgICAgICAgICAgIC8vInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uIiwgLy8gcm91bmR0cmlwIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzIuanNvbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uX3JvdW5kdHJpcC9yb3VuZHRyaXAzMS5qc29uIgorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvanNvbl9yb3VuZHRyaXAvcm91bmR0cmlwMzIuanNvbiIgLy8gc2FtZSBhcyByb3VuZHRyaXAzMQogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgIHsKICAgICAgICAgICAgIENBUFRVUkUoZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC10b19jaGFycy5jcHAgYi90ZXN0L3NyYy91bml0LXRvX2NoYXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2MzMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcmMvdW5pdC10b19jaGFycy5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgICAgX18gX19fX18gX19fX18gX19fX18KKyBfX3wgIHwgICBfX3wgICAgIHwgICB8IHwgIEpTT04gZm9yIE1vZGVybiBDKysgKHRlc3Qgc3VpdGUpCit8ICB8ICB8X18gICB8ICB8ICB8IHwgfCB8ICB2ZXJzaW9uIDMuMS4wCit8X19fX198X19fX198X19fX198X3xfX198ICBodHRwczovL2dpdGh1Yi5jb20vbmxvaG1hbm4vanNvbgorCitMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgPGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgIGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gIHVzZSwgY29weSwgIG1vZGlmeSwgbWVyZ2UsICBwdWJsaXNoLCBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yICBzZWxsCitjb3BpZXMgIG9mICB0aGUgU29mdHdhcmUsICBhbmQgIHRvICBwZXJtaXQgcGVyc29ucyAgdG8gIHdob20gIHRoZSBTb2Z0d2FyZSAgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFICBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSAgT0YgQU5ZIEtJTkQsICBFWFBSRVNTIE9SCitJTVBMSUVELCAgSU5DTFVESU5HIEJVVCAgTk9UICBMSU1JVEVEIFRPICBUSEUgIFdBUlJBTlRJRVMgT0YgIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgIFNIQUxMIFRIRQorQVVUSE9SUyAgT1IgQ09QWVJJR0hUICBIT0xERVJTICBCRSAgTElBQkxFIEZPUiAgQU5ZICBDTEFJTSwgIERBTUFHRVMgT1IgIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFICBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorU09GVFdBUkUuCisqLworCisvLyBYWFg6CisvLyBPbmx5IGNvbXBpbGUgdGhlc2UgdGVzdHMgaWYgJ2Zsb2F0JyBhbmQgJ2RvdWJsZScgYXJlIElFRUUtNzU0IHNpbmdsZS0gYW5kCisvLyBkb3VibGUtcHJlY2lzaW9uIG51bWJlcnMsIHJlc3AuCisKKyNpbmNsdWRlICJjYXRjaC5ocHAiCisKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KK3VzaW5nIG5sb2htYW5uOjpkZXRhaWw6OmR0b2FfaW1wbDo6cmVpbnRlcnByZXRfYml0czsKKworc3RhdGljIGZsb2F0IG1ha2VfZmxvYXQodWludDMyX3Qgc2lnbl9iaXQsIHVpbnQzMl90IGJpYXNlZF9leHBvbmVudCwgdWludDMyX3Qgc2lnbmlmaWNhbmQpCit7CisgICAgYXNzZXJ0KHNpZ25fYml0ID09IDAgfHwgc2lnbl9iaXQgPT0gMSk7CisgICAgYXNzZXJ0KGJpYXNlZF9leHBvbmVudCA8PSAweEZGKTsKKyAgICBhc3NlcnQoc2lnbmlmaWNhbmQgPD0gMHgwMDdGRkZGRik7CisKKyAgICB1aW50MzJfdCBiaXRzID0gMDsKKworICAgIGJpdHMgfD0gc2lnbl9iaXQgPDwgMzE7CisgICAgYml0cyB8PSBiaWFzZWRfZXhwb25lbnQgPDwgMjM7CisgICAgYml0cyB8PSBzaWduaWZpY2FuZDsKKworICAgIHJldHVybiByZWludGVycHJldF9iaXRzPGZsb2F0PihiaXRzKTsKK30KKworLy8gbGRleHAgLS0gY29udmVydCBmICogMl5lIHRvIElFRUUgc2luZ2xlIHByZWNpc2lvbgorc3RhdGljIGZsb2F0IG1ha2VfZmxvYXQodWludDY0X3QgZiwgaW50IGUpCit7CisgICAgY29uc3RleHByIHVpbnQ2NF90IGtIaWRkZW5CaXQgICAgICAgICAgICAgICA9IDB4MDA4MDAwMDA7CisgICAgY29uc3RleHByIHVpbnQ2NF90IGtTaWduaWZpY2FuZE1hc2sgICAgICAgICA9IDB4MDA3RkZGRkY7CisgICAgY29uc3RleHByIGludCAgICAgIGtQaHlzaWNhbFNpZ25pZmljYW5kU2l6ZSA9IDIzOyAgLy8gRXhjbHVkZXMgdGhlIGhpZGRlbiBiaXQuCisgICAgY29uc3RleHByIGludCAgICAgIGtFeHBvbmVudEJpYXMgICAgICAgICAgICA9IDB4N0YgKyBrUGh5c2ljYWxTaWduaWZpY2FuZFNpemU7CisgICAgY29uc3RleHByIGludCAgICAgIGtEZW5vcm1hbEV4cG9uZW50ICAgICAgICA9IDEgLSAgICBrRXhwb25lbnRCaWFzOworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrTWF4RXhwb25lbnQgICAgICAgICAgICAgPSAweEZGIC0ga0V4cG9uZW50QmlhczsKKworICAgIHdoaWxlIChmID4ga0hpZGRlbkJpdCArIGtTaWduaWZpY2FuZE1hc2spCisgICAgeworICAgICAgICBmID4+PSAxOworICAgICAgICBlKys7CisgICAgfQorICAgIGlmIChlID49IGtNYXhFeHBvbmVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICB9CisgICAgaWYgKGUgPCBrRGVub3JtYWxFeHBvbmVudCkKKyAgICB7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQorICAgIHdoaWxlIChlID4ga0Rlbm9ybWFsRXhwb25lbnQgJiYgKGYgJiBrSGlkZGVuQml0KSA9PSAwKQorICAgIHsKKyAgICAgICAgZiA8PD0gMTsKKyAgICAgICAgZS0tOworICAgIH0KKworICAgIHVpbnQ2NF90IGJpYXNlZF9leHBvbmVudCA9IChlID09IGtEZW5vcm1hbEV4cG9uZW50ICYmIChmICYga0hpZGRlbkJpdCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PHVpbnQ2NF90PihlICsga0V4cG9uZW50Qmlhcyk7CisKKyAgICB1aW50NjRfdCBiaXRzID0gKGYgJiBrU2lnbmlmaWNhbmRNYXNrKSB8IChiaWFzZWRfZXhwb25lbnQgPDwga1BoeXNpY2FsU2lnbmlmaWNhbmRTaXplKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfYml0czxmbG9hdD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJpdHMpKTsKK30KKworc3RhdGljIGRvdWJsZSBtYWtlX2RvdWJsZSh1aW50NjRfdCBzaWduX2JpdCwgdWludDY0X3QgYmlhc2VkX2V4cG9uZW50LCB1aW50NjRfdCBzaWduaWZpY2FuZCkKK3sKKyAgICBhc3NlcnQoc2lnbl9iaXQgPT0gMCB8fCBzaWduX2JpdCA9PSAxKTsKKyAgICBhc3NlcnQoYmlhc2VkX2V4cG9uZW50IDw9IDB4N0ZGKTsKKyAgICBhc3NlcnQoc2lnbmlmaWNhbmQgPD0gMHgwMDBGRkZGRkZGRkZGRkZGKTsKKworICAgIHVpbnQ2NF90IGJpdHMgPSAwOworCisgICAgYml0cyB8PSBzaWduX2JpdCA8PCA2MzsKKyAgICBiaXRzIHw9IGJpYXNlZF9leHBvbmVudCA8PCA1MjsKKyAgICBiaXRzIHw9IHNpZ25pZmljYW5kOworCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2JpdHM8ZG91YmxlPihiaXRzKTsKK30KKworLy8gbGRleHAgLS0gY29udmVydCBmICogMl5lIHRvIElFRUUgZG91YmxlIHByZWNpc2lvbgorc3RhdGljIGRvdWJsZSBtYWtlX2RvdWJsZSh1aW50NjRfdCBmLCBpbnQgZSkKK3sKKyAgICBjb25zdGV4cHIgdWludDY0X3Qga0hpZGRlbkJpdCAgICAgICAgICAgICAgID0gMHgwMDEwMDAwMDAwMDAwMDAwOworICAgIGNvbnN0ZXhwciB1aW50NjRfdCBrU2lnbmlmaWNhbmRNYXNrICAgICAgICAgPSAweDAwMEZGRkZGRkZGRkZGRkY7CisgICAgY29uc3RleHByIGludCAgICAgIGtQaHlzaWNhbFNpZ25pZmljYW5kU2l6ZSA9IDUyOyAgLy8gRXhjbHVkZXMgdGhlIGhpZGRlbiBiaXQuCisgICAgY29uc3RleHByIGludCAgICAgIGtFeHBvbmVudEJpYXMgICAgICAgICAgICA9IDB4M0ZGICsga1BoeXNpY2FsU2lnbmlmaWNhbmRTaXplOworICAgIGNvbnN0ZXhwciBpbnQgICAgICBrRGVub3JtYWxFeHBvbmVudCAgICAgICAgPSAxICAgICAtIGtFeHBvbmVudEJpYXM7CisgICAgY29uc3RleHByIGludCAgICAgIGtNYXhFeHBvbmVudCAgICAgICAgICAgICA9IDB4N0ZGIC0ga0V4cG9uZW50QmlhczsKKworICAgIHdoaWxlIChmID4ga0hpZGRlbkJpdCArIGtTaWduaWZpY2FuZE1hc2spCisgICAgeworICAgICAgICBmID4+PSAxOworICAgICAgICBlKys7CisgICAgfQorICAgIGlmIChlID49IGtNYXhFeHBvbmVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgICAgfQorICAgIGlmIChlIDwga0Rlbm9ybWFsRXhwb25lbnQpCisgICAgeworICAgICAgICByZXR1cm4gMC4wOworICAgIH0KKyAgICB3aGlsZSAoZSA+IGtEZW5vcm1hbEV4cG9uZW50ICYmIChmICYga0hpZGRlbkJpdCkgPT0gMCkKKyAgICB7CisgICAgICAgIGYgPDw9IDE7CisgICAgICAgIGUtLTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBiaWFzZWRfZXhwb25lbnQgPSAoZSA9PSBrRGVub3JtYWxFeHBvbmVudCAmJiAoZiAmIGtIaWRkZW5CaXQpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZSArIGtFeHBvbmVudEJpYXMpOworCisgICAgdWludDY0X3QgYml0cyA9IChmICYga1NpZ25pZmljYW5kTWFzaykgfCAoYmlhc2VkX2V4cG9uZW50IDw8IGtQaHlzaWNhbFNpZ25pZmljYW5kU2l6ZSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2JpdHM8ZG91YmxlPihiaXRzKTsKK30KKworVEVTVF9DQVNFKCJkaWdpdCBnZW4iKQoreworICAgIFNFQ1RJT04oInNpbmdsZSBwcmVjaXNpb24iKQorICAgIHsKKyAgICAgICAgYXV0byBjaGVja19mbG9hdCA9IFtdKGZsb2F0IG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBkaWdpdHMsIGludCBleHBlY3RlZF9leHBvbmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgQ0FQVFVSRShudW1iZXIpOworICAgICAgICAgICAgQ0FQVFVSRShkaWdpdHMpOworICAgICAgICAgICAgQ0FQVFVSRShleHBlY3RlZF9leHBvbmVudCk7CisKKyAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICAgICAgaW50IGV4cG9uZW50ID0gMDsKKyAgICAgICAgICAgIG5sb2htYW5uOjpkZXRhaWw6OmR0b2FfaW1wbDo6Z3Jpc3UyKGJ1ZiwgbGVuLCBleHBvbmVudCwgbnVtYmVyKTsKKworICAgICAgICAgICAgQ0hFQ0soZGlnaXRzID09IHN0ZDo6c3RyaW5nKGJ1ZiwgYnVmICsgbGVuKSk7CisgICAgICAgICAgICBDSEVDSyhleHBlY3RlZF9leHBvbmVudCA9PSBleHBvbmVudCk7CisgICAgICAgIH07CisKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgIDAsIDB4MDAwMDAwMDEpLCAgICAgICAgIjEiLCAtNDUpOyAvLyBtaW4gZGVub3JtYWwKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgIDAsIDB4MDA3RkZGRkYpLCAiMTE3NTQ5NDIiLCAtNDUpOyAvLyBtYXggZGVub3JtYWwKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgIDEsIDB4MDAwMDAwMDApLCAiMTE3NTQ5NDQiLCAtNDUpOyAvLyBtaW4gbm9ybWFsCisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMCwgICAxLCAweDAwMDAwMDAxKSwgIjExNzU0OTQ1IiwgLTQ1KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgIDEsIDB4MDA3RkZGRkYpLCAiMjM1MDk4ODYiLCAtNDUpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDAsICAgMiwgMHgwMDAwMDAwMCksICIyMzUwOTg4NyIsIC00NSk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMCwgICAyLCAweDAwMDAwMDAxKSwgICIyMzUwOTg5IiwgLTQ0KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgMjQsIDB4MDAwMDAwMDApLCAiOTg2MDc2MTMiLCAtMzkpOyAvLyBmYWlsIGlmIG5vIHNwZWNpYWwgY2FzZSBpbiBub3JtYWxpemVkIGJvdW5kYXJpZXMKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgMzAsIDB4MDAwMDAwMDApLCAiNjMxMDg4NzIiLCAtMzcpOyAvLyBmYWlsIGlmIG5vIHNwZWNpYWwgY2FzZSBpbiBub3JtYWxpemVkIGJvdW5kYXJpZXMKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgMzEsIDB4MDAwMDAwMDApLCAiMTI2MjE3NzUiLCAtMzYpOyAvLyBmYWlsIGlmIG5vIHNwZWNpYWwgY2FzZSBpbiBub3JtYWxpemVkIGJvdW5kYXJpZXMKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAgNTcsIDB4MDAwMDAwMDApLCAiODQ3MDMyOTUiLCAtMjkpOyAvLyBmYWlsIGlmIG5vIHNwZWNpYWwgY2FzZSBpbiBub3JtYWxpemVkIGJvdW5kYXJpZXMKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgwLCAyNTQsIDB4MDA3RkZGRkUpLCAiMzQwMjgyMzMiLCAgMzEpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDAsIDI1NCwgMHgwMDdGRkZGRiksICIzNDAyODIzNSIsICAzMSk7IC8vIG1heCBub3JtYWwKKworICAgICAgICAvLyBWLiBQYXhzb24gYW5kIFcuIEthaGFuLCAiQSBQcm9ncmFtIGZvciBUZXN0aW5nIElFRUUgQmluYXJ5LURlY2ltYWwgQ29udmVyc2lvbiIsIG1hbnVzY3JpcHQsIE1heSAxOTkxLAorICAgICAgICAvLyBmdHA6Ly9mdHAuZWUubGJsLmdvdi90ZXN0YmFzZS1yZXBvcnQucHMuWiAgICAocmVwb3J0KQorICAgICAgICAvLyBmdHA6Ly9mdHAuZWUubGJsLmdvdi90ZXN0YmFzZS50YXIuWiAgICAgICAgICAocHJvZ3JhbSkKKworICAgICAgICAvLyBUYWJsZSAxNjogU3RyZXNzIElucHV0cyBmb3IgQ29udmVydGluZyAyNC1iaXQgQmluYXJ5IHRvIERlY2ltYWwsIDwgMS8yIFVMUAorICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDEyNjc2NTA2LCAtMTAyKSwgICAgICAgIjI1IiwgLTI1KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMjY3NjUwNiwgLTEwMyksICAgICAgIjEyNSIsIC0yNik7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTU0NDUwMTMsICAgODYpLCAgICAgIjExOTUiLCAgMzApOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDEzNzM0MTIzLCAtMTM4KSwgICAgIjM5NDE1IiwgLTM5KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMjQyODI2OSwgLTEzMCksICAgIjkxMzA4NSIsIC0zOCk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTUzMzQwMzcsIC0xNDYpLCAgIjE3MTkwMDUiLCAtNDMpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDExNTE4Mjg3LCAgLTQxKSwgIjUyMzc5MTA1IiwgLTEzKTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMjU4NDk1MywgLTE0NSksICAiMjgyMTY0NCIsIC00Myk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTU5NjEwODQsIC0xMjUpLCAiMzc1MjQzMjgiLCAtMzgpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDE0OTE1ODE3LCAtMTQ2KSwgIjE2NzIxMjA5IiwgLTQ0KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMDg0NTQ4NCwgLTEwMiksICIyMTM4ODk0NiIsIC0zMSk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTY0MzEwNTksICAtNjEpLCAgIjcxMjU4MzYiLCAtMTgpOworCisgICAgICAgIC8vIFRhYmxlIDE3OiBTdHJlc3MgSW5wdXRzIGZvciBDb252ZXJ0aW5nIDI0LWJpdCBCaW5hcnkgdG8gRGVjaW1hbCwgPiAxLzIgVUxQCisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTYwOTM2MjYsICAgNjkpLCAgICAgICAiOTUiLCAgMjYpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KCA5OTgzNzc4LCAgIDI1KSwgICAgICAiMzM1IiwgIDEyKTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMjc0NTAzNCwgIDEwNCksICAgICAiMjU4NSIsICAzNSk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTI3MDY1NTMsICAgNzIpLCAgICAiNjAwMDUiLCAgMjQpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDExMDA1MDI4LCAgIDQ1KSwgICAiMzg3MjA1IiwgIDE1KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxNTA1OTU0NywgICA3MSksICAiMzU1NTgzNSIsICAyMik7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTYwMTU2OTEsICAtOTkpLCAiMjUyNjgzMDUiLCAtMzApOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KCA4NjY3ODU5LCAgIDU2KSwgICI2MjQ1ODUxIiwgIDE3KTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxNDg1NTkyMiwgIC04MiksICIzMDcyMTMyNyIsIC0yNSk7CisgICAgICAgIGNoZWNrX2Zsb2F0KG1ha2VfZmxvYXQoMTQ4NTU5MjIsICAtODMpLCAiMTUzNjA2NjMiLCAtMjUpOworICAgICAgICBjaGVja19mbG9hdChtYWtlX2Zsb2F0KDEwMTQ0MTY0LCAtMTEwKSwgICAiNzgxNDc4IiwgLTMyKTsKKyAgICAgICAgY2hlY2tfZmxvYXQobWFrZV9mbG9hdCgxMzI0ODA3NCwgICA5NSksICI1MjQ4MTAyOCIsICAyOCk7CisgICAgfQorCisgICAgU0VDVElPTigiZG91YmxlIHByZWNpc2lvbiIpCisgICAgeworICAgICAgICBhdXRvIGNoZWNrX2RvdWJsZSA9IFtdKGRvdWJsZSBudW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZGlnaXRzLCBpbnQgZXhwZWN0ZWRfZXhwb25lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENBUFRVUkUobnVtYmVyKTsKKyAgICAgICAgICAgIENBUFRVUkUoZGlnaXRzKTsKKyAgICAgICAgICAgIENBUFRVUkUoZXhwZWN0ZWRfZXhwb25lbnQpOworCisgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgIGludCBleHBvbmVudCA9IDA7CisgICAgICAgICAgICBubG9obWFubjo6ZGV0YWlsOjpkdG9hX2ltcGw6OmdyaXN1MihidWYsIGxlbiwgZXhwb25lbnQsIG51bWJlcik7CisKKyAgICAgICAgICAgIENIRUNLKGRpZ2l0cyA9PSBzdGQ6OnN0cmluZyhidWYsIGJ1ZiArIGxlbikpOworICAgICAgICAgICAgQ0hFQ0soZXhwZWN0ZWRfZXhwb25lbnQgPT0gZXhwb25lbnQpOworICAgICAgICB9OworCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICAwLCAweDAwMDAwMDAwMDAwMDAwMDEpLCAgICAgICAgICAgICAgICAgIjUiLCAtMzI0KTsgLy8gbWluIGRlbm9ybWFsCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICAwLCAweDAwMEZGRkZGRkZGRkZGRkYpLCAgIjIyMjUwNzM4NTg1MDcyMDEiLCAtMzIzKTsgLy8gbWF4IGRlbm9ybWFsCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICAxLCAweDAwMDAwMDAwMDAwMDAwMDApLCAiMjIyNTA3Mzg1ODUwNzIwMTQiLCAtMzI0KTsgLy8gbWluIG5vcm1hbAorICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoMCwgICAgMSwgMHgwMDAwMDAwMDAwMDAwMDAxKSwgICIyMjI1MDczODU4NTA3MjAyIiwgLTMyMyk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICAxLCAweDAwMEZGRkZGRkZGRkZGRkYpLCAiNDQ1MDE0NzcxNzAxNDQwMjMiLCAtMzI0KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDAsICAgIDIsIDB4MDAwMDAwMDAwMDAwMDAwMCksICAiNDQ1MDE0NzcxNzAxNDQwMyIsIC0zMjMpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoMCwgICAgMiwgMHgwMDAwMDAwMDAwMDAwMDAxKSwgICI0NDUwMTQ3NzE3MDE0NDA0IiwgLTMyMyk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICA0LCAweDAwMDAwMDAwMDAwMDAwMDApLCAiMTc4MDA1OTA4NjgwNTc2MTEiLCAtMzIzKTsgLy8gZmFpbCBpZiBubyBzcGVjaWFsIGNhc2UgaW4gbm9ybWFsaXplZCBib3VuZGFyaWVzCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICA1LCAweDAwMDAwMDAwMDAwMDAwMDApLCAiMzU2MDExODE3MzYxMTUyMjIiLCAtMzIzKTsgLy8gZmFpbCBpZiBubyBzcGVjaWFsIGNhc2UgaW4gbm9ybWFsaXplZCBib3VuZGFyaWVzCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgICA2LCAweDAwMDAwMDAwMDAwMDAwMDApLCAgIjcxMjAyMzYzNDcyMjMwNDUiLCAtMzIyKTsgLy8gZmFpbCBpZiBubyBzcGVjaWFsIGNhc2UgaW4gbm9ybWFsaXplZCBib3VuZGFyaWVzCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAgIDEwLCAweDAwMDAwMDAwMDAwMDAwMDApLCAiMTEzOTIzNzgxNTU1NTY4NzEiLCAtMzIxKTsgLy8gZmFpbCBpZiBubyBzcGVjaWFsIGNhc2UgaW4gbm9ybWFsaXplZCBib3VuZGFyaWVzCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgwLCAyMDQ2LCAweDAwMEZGRkZGRkZGRkZGRkUpLCAiMTc5NzY5MzEzNDg2MjMxNTUiLCAgMjkyKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDAsIDIwNDYsIDB4MDAwRkZGRkZGRkZGRkZGRiksICIxNzk3NjkzMTM0ODYyMzE1NyIsICAyOTIpOyAvLyBtYXggbm9ybWFsCisKKyAgICAgICAgLy8gVGVzdCBkaWZmZXJlbnQgcGF0aHMgaW4gRGlnaXRHZW4KKyAgICAgICAgY2hlY2tfZG91YmxlKCAgICAgICAgICAgICAgICAgIDEwMDAwLCAgICAgICAgICAgICAgICAgIjEiLCAgICA0KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgICAgICAgICAgICAgICAxMjAwMDAwLCAgICAgICAgICAgICAgICAiMTIiLCAgICA1KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0LCAgICAgICAgICAgICAgICAgIjUiLCAtMzI0KTsgLy8gZXhpdCBpbnRlZ3JhbCBsb29wCisgICAgICAgIGNoZWNrX2RvdWJsZSgyLjIyNTA3Mzg1ODUwNzIwMDllLTMwOCwgICIyMjI1MDczODU4NTA3MjAxIiwgLTMyMyk7IC8vIGV4aXQgZnJhY3Rpb25hbCBsb29wCisgICAgICAgIGNoZWNrX2RvdWJsZSggICAxLjgyODc3OTgyNjA1MTY0ZS05OSwgICAiMTgyODc3OTgyNjA1MTY0IiwgLTExMyk7CisgICAgICAgIGNoZWNrX2RvdWJsZSggMS4xNTA1NDY2MjA4NjcxOTAzZS0wOSwgIjExNTA1NDY2MjA4NjcxOTAzIiwgIC0yNSk7CisgICAgICAgIGNoZWNrX2RvdWJsZSggNS41NjQ1ODkzMTMzNzY2NzIyZSsyMCwgICI1NTY0NTg5MzEzMzc2NjcyIiwgICAgNSk7CisgICAgICAgIGNoZWNrX2RvdWJsZSggICAgIDUzLjAzNDgzMDM4ODg2NjIyNiwgIjUzMDM0ODMwMzg4ODY2MjI2IiwgIC0xNSk7CisgICAgICAgIGNoZWNrX2RvdWJsZSggIDAuMDAyMTA2NjUzMTY3MDE3ODYwNSwgIjIxMDY2NTMxNjcwMTc4NjA1IiwgIC0xOSk7CisKKyAgICAgICAgLy8gVi4gUGF4c29uIGFuZCBXLiBLYWhhbiwgIkEgUHJvZ3JhbSBmb3IgVGVzdGluZyBJRUVFIEJpbmFyeS1EZWNpbWFsIENvbnZlcnNpb24iLCBtYW51c2NyaXB0LCBNYXkgMTk5MSwKKyAgICAgICAgLy8gZnRwOi8vZnRwLmVlLmxibC5nb3YvdGVzdGJhc2UtcmVwb3J0LnBzLlogICAgKHJlcG9ydCkKKyAgICAgICAgLy8gZnRwOi8vZnRwLmVlLmxibC5nb3YvdGVzdGJhc2UudGFyLlogICAgICAgICAgKHByb2dyYW0pCisKKyAgICAgICAgLy8gVGFibGUgMzogU3RyZXNzIElucHV0cyBmb3IgQ29udmVydGluZyA1My1iaXQgQmluYXJ5IHRvIERlY2ltYWwsIDwgMS8yIFVMUAorICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODUxMTAzMDAyMDI3NTY1NiwgIC0zNDIpIC8qICAgICAgICAgICAgICAgIDkuNWUtMDg4ICovLCAgICAgICAgICAgICAgICAiOTUiLCAgLTg5KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDUyMDE5ODg0MDcwNjY3NDEsICAtODI0KSAvKiAgICAgICAgICAgICAgIDQuNjVlLTIzMyAqLywgICAgICAgICAgICAgICAiNDY1IiwgLTIzNSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2NDA2ODkyOTQ4MjY5ODk5LCAgKzIzNykgLyogICAgICAgICAgICAgIDEuNDE1ZSswODcgKi8sICAgICAgICAgICAgICAiMTQxNSIsICAgODQpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODQzMTE1NDE5ODczMjQ5MiwgICArNzIpIC8qICAgICAgICAgICAgIDMuOTgxNWUrMDM3ICovLCAgICAgICAgICAgICAiMzk4MTUiLCAgIDMzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY0NzUwNDkxOTYxNDQ1ODcsICAgKzk5KSAvKiAgICAgICAgICAgIDQuMTA0MDVlKzA0NSAqLywgICAgICAgICAgICAiNDEwNDA1IiwgICA0MCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg4Mjc0MzA3NTQyOTcyODQyLCAgKzcyNikgLyogICAgICAgICAgIDIuOTIwODQ1ZSsyMzQgKi8sICAgICAgICAgICAiMjkyMDg0NSIsICAyMjgpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTM4MTA2NTQ4NDI2NTMzMiwgIC00NTYpIC8qICAgICAgICAgIDIuODkxOTQ2NWUtMTIyICovLCAgICAgICAgICAiMjg5MTk0NjUiLCAtMTI5KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY3NjE3Mjg1ODU0OTk3MzQsIC0xMDU3KSAvKiAgICAgICAgIDQuMzc4NzcxODVlLTMwMyAqLywgICAgICAgICAiNDM3ODc3MTg1IiwgLTMxMSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg3OTc2NTM4NDc4NjEwNzU2LCAgKzM3NikgLyogICAgICAgIDEuMjI3NzAxNjM1ZSsxMjkgKi8sICAgICAgICAiMTIyNzcwMTYzNSIsICAxMjApOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTk4MjQwMzg1ODk1ODA2NywgICszNzcpIC8qICAgICAgIDEuODQxNTUyNDUyNWUrMTI5ICovLCAgICAgICAiMTg0MTU1MjQ1MjUiLCAgMTE5KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU1MzY5OTUxOTA2MzA4MzcsICAgKzkzKSAvKiAgICAgIDUuNDgzNTc0NDM1MDVlKzA0MyAqLywgICAgICAiNTQ4MzU3NDQzNTA1IiwgICAzMik7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg3MjI1NDUwODg5MjgyMTk0LCAgKzcxMCkgLyogICAgIDMuODkxOTAxODExNDY1ZSsyMjkgKi8sICAgICAiMzg5MTkwMTgxMTQ2NSIsICAyMTcpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNzIyNTQ1MDg4OTI4MjE5NCwgICs3MDkpIC8qICAgIDEuOTQ1OTUwOTA1NzMyNWUrMjI5ICovLCAgICAiMTk0NTk1MDkwNTczMjUiLCAgMjE2KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDg3MDMzNzI3NDExNDczNzksICArMTE3KSAvKiAgIDEuNDQ2MDk1ODM4MTYwNTVlKzA1MSAqLywgICAiMTQ0NjA5NTgzODE2MDU1IiwgICAzNyk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg4OTQ0MjYyNjc1Mjc1MjE3LCAtMTAwMSkgLyogIDQuMTczNjc3NDc0NTg1MzE1ZS0yODYgKi8sICAiNDE3MzY3NzQ3NDU4NTMxNSIsIC0zMDEpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNzQ1OTgwMzY5NjA4NzY5MiwgIC03MDcpIC8qIDEuMTA3OTUwNzcyODc4ODg4NWUtMTk3ICovLCAiMTEwNzk1MDc3Mjg3ODg4ODUiLCAtMjEzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDYwODA0NjkwMTY2NzAzNzksICAtMzgxKSAvKiAgMS4yMzQ1NTAxMzY2MzI3NDRlLTA5OSAqLywgICIxMjM0NTUwMTM2NjMyNzQ0IiwgLTExNCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg4Mzg1NTE1MTQ3MDM0NzU3LCAgKzcyMSkgLyogOS4yNTAzMTcxMTk2MDM2NTAyZSsyMzIgKi8sICAgIjkyNTAzMTcxMTk2MDM2NSIsICAyMTgpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNzUxNDIxNjgxMTM4OTc4NiwgIC04MjgpIC8qIDQuMTk4MDQ3MTUwMjg0ODg5OGUtMjM0ICovLCAgICI0MTk4MDQ3MTUwMjg0ODkiLCAtMjQ4KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDgzOTcyOTc4MDMyNjA1MTEsICAtMzQ1KSAvKiAxLjE3MTYzMTUzMTk3ODY1MTFlLTA4OCAqLywgIjExNzE2MzE1MzE5Nzg2NTExIiwgLTEwNCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2NzMzNDU5MjM5MzEwNTQzLCAgKzIwMikgLyogNC4zMjgxMDA3Mjg0NDYxMjQ5ZSswNzYgKi8sICAiNDMyODEwMDcyODQ0NjEyNSIsICAgNjEpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODA5MTQ1MDU4NzI5Mjc5NCwgIC00NzMpIC8qIDMuMzE3NzEwMTE4MTYwMDMxMWUtMTI3ICovLCAgIjMzMTc3MTAxMTgxNjAwMzEiLCAtMTQyKTsKKworICAgICAgICAvLyBUYWJsZSA0OiBTdHJlc3MgSW5wdXRzIGZvciBDb252ZXJ0aW5nIDUzLWJpdCBCaW5hcnkgdG8gRGVjaW1hbCwgPiAxLzIgVUxQCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2NTY3MjU4ODgyMDc3NDAyLCAgKzk1MikgLyogICAgICAgICAgICAgICAgMi41ZSszMDIgKi8sICAgICAgICAgICAgICAgICIyNSIsICAzMDEpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjcxMjczMTQyMzQ0NDkzNCwgICs1MzUpIC8qICAgICAgICAgICAgICAgNy41NWUrMTc2ICovLCAgICAgICAgICAgICAgICI3NTUiLCAgMTc0KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY3MTI3MzE0MjM0NDQ5MzQsICArNTM0KSAvKiAgICAgICAgICAgICAgMy43NzVlKzE3NiAqLywgICAgICAgICAgICAgICIzNzc1IiwgIDE3Myk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1Mjk4NDA1NDExNTczMDM3LCAgLTk1NykgLyogICAgICAgICAgICAgNC4zNDk1ZS0yNzMgKi8sICAgICAgICAgICAgICI0MzQ5NSIsIC0yNzcpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTEzNzMxMTE2NzY1OTUwNywgIC0xNDQpIC8qICAgICAgICAgICAgMi4zMDM2NWUtMDI4ICovLCAgICAgICAgICAgICIyMzAzNjUiLCAgLTMzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY3MjIyODA3MDk2NjE4NjgsICArMzYzKSAvKiAgICAgICAgICAgMS4yNjMwMDVlKzEyNSAqLywgICAgICAgICAgICIxMjYzMDA1IiwgIDExOSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1MzQ0NDM2Mzk4MDM0OTI3LCAgLTE2OSkgLyogICAgICAgICAgNy4xNDIyMTA1ZS0wMzYgKi8sICAgICAgICAgICI3MTQyMjEwNSIsICAtNDMpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODM2OTEyMzYwNDI3NzI4MSwgIC04NTMpIC8qICAgICAgICAgMS4zOTM0NTczNWUtMjQxICovLCAgICAgICAgICIxMzkzNDU3MzUiLCAtMjQ5KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDg5OTU4MjIxMDg0ODc2NjMsICAtNzgwKSAvKiAgICAgICAgMS40MTQ2MzQ0ODVlLTIxOSAqLywgICAgICAgICIxNDE0NjM0NDg1IiwgLTIyOCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg4OTQyODMyODM1NTY0NzgyLCAgLTM4MykgLyogICAgICAgNC41MzkyNzc5MTk1ZS0xMDAgKi8sICAgICAgICI0NTM5Mjc3OTE5NSIsIC0xMTApOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODk0MjgzMjgzNTU2NDc4MiwgIC0zODQpIC8qICAgICAgMi4yNjk2Mzg5NTk3NWUtMTAwICovLCAgICAgICIyMjY5NjM4OTU5NzUiLCAtMTExKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDg5NDI4MzI4MzU1NjQ3ODIsICAtMzg1KSAvKiAgICAgMS4xMzQ4MTk0Nzk4NzVlLTEwMCAqLywgICAgICIxMTM0ODE5NDc5ODc1IiwgLTExMik7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2OTY1OTQ5NDY5NDg3MTQ2LCAgLTI0OSkgLyogICAgNy43MDAzNjY1NjE4ODk1ZS0wNjAgKi8sICAgICI3NzAwMzY2NTYxODg5NSIsICAtNzMpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjk2NTk0OTQ2OTQ4NzE0NiwgIC0yNTApIC8qICAgMy44NTAxODMyODA5NDQ3NWUtMDYwICovLCAgICIzODUwMTgzMjgwOTQ0NzUiLCAgLTc0KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY5NjU5NDk0Njk0ODcxNDYsICAtMjUxKSAvKiAgMS45MjUwOTE2NDA0NzIzNzVlLTA2MCAqLywgICIxOTI1MDkxNjQwNDcyMzc1IiwgIC03NSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg3NDg3MjUyNzIwOTg2ODI2LCAgKzU0OCkgLyogNi44OTg1ODY1MzE3NzQyMDA1ZSsxODAgKi8sICI2ODk4NTg2NTMxNzc0MjAwNSIsICAxNjQpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTU5MjExNzY3OTYyODUxMSwgICsxNjQpIC8qIDEuMzA3NjYyMjYzMTg3ODY1NGUrMDY1ICovLCAiMTMwNzY2MjI2MzE4Nzg2NTQiLCAgIDQ5KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDg4ODcwNTUyNDkzNTU3ODgsICArNjY1KSAvKiAxLjM2MDUyMDIwNzU2MTIxMjRlKzIxNiAqLywgIjEzNjA1MjAyMDc1NjEyMTI0IiwgIDIwMCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2OTk0MTg3NDcyNjMyNDQ5LCAgKzY5MCkgLyogMy41OTI4MTAyMTc0NzU5NTk3ZSsyMjMgKi8sICIzNTkyODEwMjE3NDc1OTU5NyIsICAyMDcpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoODc5NzU3NjU3OTAxMjE0MywgICs1ODgpIC8qIDguOTEyNTE5NzcxMjQ4NDU1MmUrMTkyICovLCAgIjg5MTI1MTk3NzEyNDg0NTUiLCAgMTc3KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDczNjMzMjY3MzM1MDUzMzcsICArMjcyKSAvKiA1LjU4NzY5NzU3MzYyMzAxMTRlKzA5NyAqLywgIjU1ODc2OTc1NzM2MjMwMTE0IiwgICA4MSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg4NTQ5NDk3NDExMjk0NTAyLCAgLTQ0OCkgLyogMS4xNzYyNTc4MzA3Mjg1NDA0ZS0xMTkgKi8sICIxMTc2MjU3ODMwNzI4NTQwNCIsIC0xMzUpOworCisgICAgICAgIC8vIFRhYmxlIDIwOiBTdHJlc3MgSW5wdXRzIGZvciBDb252ZXJ0aW5nIDU2LWJpdCBCaW5hcnkgdG8gRGVjaW1hbCwgPCAxLzIgVUxQCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1MDg4MzY0MTAwNTMxMjcxNiwgLTE3MikgLyogOC40OTk5OTk5OTk5OTk5OTkzZS0wMzYgKi8sICAiODQ5OTk5OTk5OTk5OTk5OSIsICAtNTEpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoMzgxNjI3MzA3NTM5ODQ1MzcsIC0xNzApIC8qIDIuNTQ5OTk5OTk5OTk5OTk5OWUtMDM1ICovLCAgICAgICAgICAgICAgICIyNTUiLCAgLTM3KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDUwODMyNzg5MDY5MTUxOTk5LCAtMTAxKSAvKiAyLjAwNDk5OTk5OTk5OTk5OTdlLTAxNCAqLywgIjIwMDQ5OTk5OTk5OTk5OTk3IiwgIC0zMCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1MTgyMjM2NzgzMzcxNDE2NCwgLTEwOSkgLyogNy45ODQ0OTk5OTk5OTk5OTk0ZS0wMTcgKi8sICAiNzk4NDQ5OTk5OTk5OTk5OSIsICAtMzIpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjY4NDAxNTIxOTM1MDgxMzMsIC0xNzIpIC8qIDEuMTE2NTQ5OTk5OTk5OTk5OWUtMDM1ICovLCAiMTExNjU0OTk5OTk5OTk5OTkiLCAgLTUxKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU1MTExMjM5MjQ1NTg0MzkzLCAtMTM4KSAvKiAgICAgICAgICAgMS41ODE2MTVlLTAyNSAqLywgICAgICAgICAgICIxNTgxNjE1IiwgIC0zMSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg3MTcwNDg2NjczMzMyMTQ4MiwgLTExMikgLyogICAgICAgICAgMS4zODA5ODU1ZS0wMTcgKi8sICAgICAgICAgICIxMzgwOTg1NSIsICAtMjQpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjcxNjA5NDkzMjgyMzMxNzMsIC0xNDIpIC8qIDEuMjA0NjQwNDQ5OTk5OTk5OWUtMDI2ICovLCAiMTIwNDY0MDQ0OTk5OTk5OTkiLCAgLTQyKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDUzMjM3MTQxMzA4MDQwMTg5LCAtMTUyKSAvKiA5LjMyNTE0MDU0NDk5OTk5OTFlLTAzMCAqLywgICI5MzI1MTQwNTQ0OTk5OTk5IiwgIC00NSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2Mjc4NTMyOTM5NDk3NTc4NiwgLTExMikgLyogICAgICAgMS4yMDkyMDE0NTk1ZS0wMTcgKi8sICAgICAgICIxMjA5MjAxNDU5NSIsICAtMjcpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNDgzNjc2ODAxNTQ2ODk1MjMsICAtNzcpIC8qIDMuMjAwNzA0NTgzODQ5OTk5OGUtMDA3ICovLCAgICAgICIzMjAwNzA0NTgzODUiLCAgLTE4KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDQyNTUyMjIzMTgwNjA2Nzk3LCAtMTAyKSAvKiAgOC4zOTE5NDYzMjQzNTQ5OTllLTAxNSAqLywgICI4MzkxOTQ2MzI0MzU0OTk5IiwgIC0zMCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2MzYyNjM1NjE3MzAxMTI0MSwgLTExMikgLyogICAgMS4yMjUzOTkwNDYwNTg1ZS0wMTcgKi8sICAgICIxMjI1Mzk5MDQ2MDU4NSIsICAtMzApOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNDM1NjYzODg1OTU3ODM2NDMsICAtOTkpIC8qIDYuODczNTY0MTQ4OTc2MDQ5NWUtMDE0ICovLCAgICI2ODczNTY0MTQ4OTc2MDUiLCAgLTI4KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU0NTEyNjY5NjM2Njc1MjcyLCAtMTU5KSAvKiAgNy40NTk4MTY0MzA0ODAzODVlLTAzMiAqLywgICI3NDU5ODE2NDMwNDgwMzg1IiwgIC00Nyk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1MjMwNjQ5MDUyNzUxNDYxNCwgLTE2NykgLyogMi43OTYwNTg4Mzk4MTQyNTUyZS0wMzQgKi8sICAiMjc5NjA1ODgzOTgxNDI1NSIsICAtNDkpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTIzMDY0OTA1Mjc1MTQ2MTQsIC0xNjgpIC8qIDEuMzk4MDI5NDE5OTA3MTI3NmUtMDM0ICovLCAiMTM5ODAyOTQxOTkwNzEyNzYiLCAgLTUwKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDQxMDI0NzIxNTkwNDQ5NDIzLCAgLTg5KSAvKiA2LjYyNzkwMTIzNzMwNTczNTllLTAxMSAqLywgICI2NjI3OTAxMjM3MzA1NzM2IiwgIC0yNik7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgzNzY2NDAyMDQxNTg5NDczOCwgLTEzMikgLyogNi45MTc3ODgwMDQzOTY4MDcyZS0wMjQgKi8sICAiNjkxNzc4ODAwNDM5NjgwNyIsICAtMzkpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoMzc1NDk4ODM2OTI4NjYyOTQsICAtOTMpIC8qIDMuNzkxNTY5MzEwODM0OTcwOGUtMDEyICovLCAgIjM3OTE1NjkzMTA4MzQ5NzEiLCAgLTI3KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY5MTI0MTEwMzc0Mzk5ODM5LCAtMTA0KSAvKiAzLjQwODA4MTc2NzY1OTEzNjVlLTAxNSAqLywgIjM0MDgwODE3Njc2NTkxMzY1IiwgIC0zMSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2OTEyNDExMDM3NDM5OTgzOSwgLTEwNSkgLyogMS43MDQwNDA4ODM4Mjk1NjgzZS0wMTUgKi8sICIxNzA0MDQwODgzODI5NTY4MyIsICAtMzEpOworCisgICAgICAgIC8vIFRhYmxlIDIxOiBTdHJlc3MgSW5wdXRzIGZvciBDb252ZXJ0aW5nIDU2LWJpdCBCaW5hcnkgdG8gRGVjaW1hbCwgPiAxLzIgVUxQCisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg0OTUxNzYwMTU3MTQxNTIxMSwgIC05NCkgLyogMi40OTk5OTk5OTk5OTk5OTk4ZS0wMTIgKi8sICAgICAgICAgICAgICAgICIyNSIsICAtMTMpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNDk1MTc2MDE1NzE0MTUyMTEsICAtOTUpIC8qIDEuMjQ5OTk5OTk5OTk5OTk5OWUtMDEyICovLCAgICAgICAgICAgICAgICIxMjUiLCAgLTE0KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU0MzkwNzMzNTI4NjQyODA0LCAtMTMzKSAvKiA0Ljk5NDk5OTk5OTk5OTk5OTZlLTAyNCAqLywgIjQ5OTQ5OTk5OTk5OTk5OTk2IiwgIC00MCk7IC8vIHNob3J0ZXN0OiA0OTk1ZS0yNworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNzE4MDU0MDIzMTkxMTM5MjQsIC0xNTcpIC8qIDMuOTMwNDk5OTk5OTk5OTk5OGUtMDMxICovLCAiMzkzMDQ5OTk5OTk5OTk5OTgiLCAgLTQ3KTsgLy8gc2hvcnRlc3Q6IDM5MzA1ZS0zNQorICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNDA0MzUyNzc5Njk2MzE2OTQsIC0xNzkpIC8qIDUuMjc3MDQ5OTk5OTk5OTk5MmUtMDM4ICovLCAgIjUyNzcwNDk5OTk5OTk5OTkiLCAgLTUzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU3MjQxOTkxNTY4NjE5MDQ5LCAtMTY1KSAvKiAgICAgICAgICAgMS4yMjM5NTVlLTAzMyAqLywgICAgICAgICAgICIxMjIzOTU1IiwgIC0zOSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2NTIyNDE2Mjg3NjI0Mjg4NiwgICs1OCkgLyogMS44Nzk5NTg0OTk5OTk5OTk4ZSswMzQgKi8sICIxODc5OTU4NDk5OTk5OTk5OCIsICAgMTgpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNzAxNzMzNzY4NDg4OTUzNjgsIC0xMzgpIC8qICAgICAgICAgMi4wMTM4NzcxNWUtMDI1ICovLCAgICAgICAgICIyMDEzODc3MTUiLCAgLTMzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDM3MDcyODQ4MTE3MzgzMjA3LCAgLTk5KSAvKiA1Ljg0OTA2NDEwNDk5OTk5ODllLTAxNCAqLywgICI1ODQ5MDY0MTA0OTk5OTk5IiwgIC0yOSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg1Njg0NTA1MTU4NTM4OTY5NywgLTE3NikgLyogNS45MzQ5MDAzMDU0OTk5OTk5ZS0wMzcgKi8sICAgICAgICI1OTM0OTAwMzA1NSIsICAtNDcpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNTQ3OTE2NzMzNjY5MzY0MzEsIC0xNDUpIC8qIDEuMjI4NDcxODAzOTQ5OTk5OGUtMDI3ICovLCAiMTIyODQ3MTgwMzk0OTk5OTgiLCAgLTQzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY2ODAwMzE4NjY5MTA2MjMxLCAtMTY5KSAvKiA4LjkyNzA3NjcxODA4NDk5OTFlLTAzNSAqLywgICI4OTI3MDc2NzE4MDg0OTk5IiwgIC01MCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2NjgwMDMxODY2OTEwNjIzMSwgLTE3MCkgLyogNC40NjM1MzgzNTkwNDI0OTk1ZS0wMzUgKi8sICI0NDYzNTM4MzU5MDQyNDk5NSIsICAtNTEpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjY1NzQzMjM0NDAxMTI0MzgsIC0xMTkpIC8qIDEuMDAxNjk5MDg2MjU0OTQ5OWUtMDE5ICovLCAiMTAwMTY5OTA4NjI1NDk0OTkiLCAgLTM1KTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDY1NjQ1MTc5OTY5MzMwOTYzLCAtMTczKSAvKiA1LjQ4Mjk0MTI2MjgwMjQ2NDdlLTAzNiAqLywgICI1NDgyOTQxMjYyODAyNDY1IiwgIC01MSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2MTg0NzI1NDMzNDY4MTA3NiwgLTEwOSkgLyogOS41MjkwNzgzMjgxMDM2NDM5ZS0wMTcgKi8sICAiOTUyOTA3ODMyODEwMzY0NCIsICAtMzIpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoMzk5OTA3MTI5MjEzOTM2MDYsIC0xNDUpIC8qIDguOTY2MjI3OTM2NjQwNTU1M2UtMDI4ICovLCAgIjg5NjYyMjc5MzY2NDA1NTUiLCAgLTQzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDU5MjkyMzE4MTg0NDAwMjgzLCAtMTQ5KSAvKiA4LjMwODYyMzQ0MTgwNTg1MzhlLTAyOSAqLywgICI4MzA4NjIzNDQxODA1ODU0IiwgIC00NCk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSg2OTExNjU1ODYxNTMyNjE1MywgLTE0MykgLyogNi4xOTg1ODczNTY2MTI2NTU1ZS0wMjcgKi8sICI2MTk4NTg3MzU2NjEyNjU1NSIsICAtNDMpOworICAgICAgICBjaGVja19kb3VibGUobWFrZV9kb3VibGUoNjkxMTY1NTg2MTUzMjYxNTMsIC0xNDQpIC8qIDMuMDk5MjkzNjc4MzA2MzI3N2UtMDI3ICovLCAiMzA5OTI5MzY3ODMwNjMyNzciLCAgLTQzKTsKKyAgICAgICAgY2hlY2tfZG91YmxlKG1ha2VfZG91YmxlKDM5NDYyNTQ5NDk0NDY4NTEzLCAtMTUyKSAvKiA2LjkxMjM1MTI1MDYxNzYwMTVlLTAzMCAqLywgICI2OTEyMzUxMjUwNjE3NjAyIiwgIC00NSk7CisgICAgICAgIGNoZWNrX2RvdWJsZShtYWtlX2RvdWJsZSgzOTQ2MjU0OTQ5NDQ2ODUxMywgLTE1MykgLyogMy40NTYxNzU2MjUzMDg4MDA4ZS0wMzAgKi8sICAiMzQ1NjE3NTYyNTMwODgwMSIsICAtNDUpOworICAgIH0KK30KKworVEVTVF9DQVNFKCJmb3JtYXR0aW5nIikKK3sKKyAgICBTRUNUSU9OKCJzaW5nbGUgcHJlY2lzaW9uIikKKyAgICB7CisgICAgICAgIGF1dG8gY2hlY2tfZmxvYXQgPSBbXShmbG9hdCBudW1iZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZXhwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgIGNoYXIqIGVuZCA9IG5sb2htYW5uOjpkZXRhaWw6OnRvX2NoYXJzKGJ1ZiwgYnVmICsgMzIsIG51bWJlcik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWwoYnVmLCBlbmQpOworCisgICAgICAgICAgICBDSEVDSyhhY3R1YWwgPT0gZXhwZWN0ZWQpOworICAgICAgICB9OworICAgICAgICAvLyAlLjlnCisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS0yMmYsICItMS4yMzQ1ZS0yMiIgICk7IC8vIC0xLjIzNDUwMDA0ZS0yMgorICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtMjFmLCAiLTEuMjM0NWUtMjEiICApOyAvLyAtMS4yMzQ1MDAwMmUtMjEKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTIwZiwgIi0xLjIzNDVlLTIwIiAgKTsgLy8gLTEuMjM0NTAwMDJlLTIwCisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS0xOWYsICItMS4yMzQ1ZS0xOSIgICk7IC8vIC0xLjIzNDQ5OTk5ZS0xOQorICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtMThmLCAiLTEuMjM0NWUtMTgiICApOyAvLyAtMS4yMzQ0OTk5NmUtMTgKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTE3ZiwgIi0xLjIzNDVlLTE3IiAgKTsgLy8gLTEuMjM0NDk5OThlLTE3CisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS0xNmYsICItMS4yMzQ1ZS0xNiIgICk7IC8vIC0xLjIzNDQ5OTk2ZS0xNgorICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtMTVmLCAiLTEuMjM0NWUtMTUiICApOyAvLyAtMS4yMzQ1MDAwMmUtMTUKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTE0ZiwgIi0xLjIzNDVlLTE0IiAgKTsgLy8gLTEuMjM0NTAwMDRlLTE0CisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS0xM2YsICItMS4yMzQ1ZS0xMyIgICk7IC8vIC0xLjIzNDQ5OTk3ZS0xMworICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtMTJmLCAiLTEuMjM0NWUtMTIiICApOyAvLyAtMS4yMzQ1MDAwMmUtMTIKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTExZiwgIi0xLjIzNDVlLTExIiAgKTsgLy8gLTEuMjM0NWUtMTEKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTEwZiwgIi0xLjIzNDVlLTEwIiAgKTsgLy8gLTEuMjM0NWUtMTAKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTlmLCAgIi0xLjIzNDVlLTA5IiAgKTsgLy8gLTEuMjM0NDk5OTVlLTA5CisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS04ZiwgICItMS4yMzQ1ZS0wOCIgICk7IC8vIC0xLjIzNDQ5OTk3ZS0wOAorICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtN2YsICAiLTEuMjM0NWUtMDciICApOyAvLyAtMS4yMzQ0OTk5M2UtMDcKKyAgICAgICAgY2hlY2tfZmxvYXQoIC0xLjIzNDVlLTZmLCAgIi0xLjIzNDVlLTA2IiAgKTsgLy8gLTEuMjM0NTAwMDJlLTA2CisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS01ZiwgICItMS4yMzQ1ZS0wNSIgICk7IC8vIC0xLjIzNDVlLTA1CisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS00ZiwgICItMC4wMDAxMjM0NSIgICk7IC8vIC0wLjAwMDEyMzQ0OTk5NAorICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtM2YsICAiLTAuMDAxMjM0NSIgICApOyAvLyAtMC4wMDEyMzQ0OTk5NworICAgICAgICBjaGVja19mbG9hdCggLTEuMjM0NWUtMmYsICAiLTAuMDEyMzQ1IiAgICApOyAvLyAtMC4wMTIzNDUwMDAyCisgICAgICAgIGNoZWNrX2Zsb2F0KCAtMS4yMzQ1ZS0xZiwgICItMC4xMjM0NSIgICAgICk7IC8vIC0wLjEyMzQ1MDAwNAorICAgICAgICBjaGVja19mbG9hdCggLTAuMGYsICAgICAgICAiLTAuMCIgICAgICAgICApOyAvLyAtMAorICAgICAgICBjaGVja19mbG9hdCggIDAuMGYsICAgICAgICAgIjAuMCIgICAgICAgICApOyAvLyAgMAorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMGYsICAgIjEuMjM0NSIgICAgICApOyAvLyAgMS4yMzQ1MDAwNQorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMWYsICAgIjEyLjM0NSIgICAgICApOyAvLyAgMTIuMzQ1MDAwMworICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMmYsICAgIjEyMy40NSIgICAgICApOyAvLyAgMTIzLjQ0OTk5NworICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrM2YsICAgIjEyMzQuNSIgICAgICApOyAvLyAgMTIzNC41CisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSs0ZiwgICAiMTIzNDUuMCIgICAgICk7IC8vICAxMjM0NQorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrNWYsICAgIjEyMzQ1MC4wIiAgICApOyAvLyAgMTIzNDUwCisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSs2ZiwgICAiMS4yMzQ1ZSswNiIgICk7IC8vICAxMjM0NTAwCisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSs3ZiwgICAiMS4yMzQ1ZSswNyIgICk7IC8vICAxMjM0NTAwMAorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrOGYsICAgIjEuMjM0NWUrMDgiICApOyAvLyAgMTIzNDUwMDAwCisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSs5ZiwgICAiMS4yMzQ1ZSswOSIgICk7IC8vICAxLjIzNDQ5OTk3ZSswOQorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMTBmLCAgIjEuMjM0NWUrMTAiICApOyAvLyAgMS4yMzQ0OTk5OWUrMTAKKyAgICAgICAgY2hlY2tfZmxvYXQoICAxLjIzNDVlKzExZiwgICIxLjIzNDVlKzExIiAgKTsgLy8gIDEuMjM0NDk5OTllKzExCisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSsxMmYsICAiMS4yMzQ1ZSsxMiIgICk7IC8vICAxLjIzNDUwMDA2ZSsxMgorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMTNmLCAgIjEuMjM0NWUrMTMiICApOyAvLyAgMS4yMzQ0OTk5NWUrMTMKKyAgICAgICAgY2hlY2tfZmxvYXQoICAxLjIzNDVlKzE0ZiwgICIxLjIzNDVlKzE0IiAgKTsgLy8gIDEuMjM0NTAwMDJlKzE0CisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSsxNWYsICAiMS4yMzQ1ZSsxNSIgICk7IC8vICAxLjIzNDUwMDAzZSsxNQorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMTZmLCAgIjEuMjM0NWUrMTYiICApOyAvLyAgMS4yMzQ0OTk5OGUrMTYKKyAgICAgICAgY2hlY2tfZmxvYXQoICAxLjIzNDVlKzE3ZiwgICIxLjIzNDVlKzE3IiAgKTsgLy8gIDEuMjM0NDk5OTZlKzE3CisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSsxOGYsICAiMS4yMzQ1ZSsxOCIgICk7IC8vICAxLjIzNDUwMDA0ZSsxOAorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMTlmLCAgIjEuMjM0NWUrMTkiICApOyAvLyAgMS4yMzQ0OTk5OWUrMTkKKyAgICAgICAgY2hlY2tfZmxvYXQoICAxLjIzNDVlKzIwZiwgICIxLjIzNDVlKzIwIiAgKTsgLy8gIDEuMjM0NDk5OTllKzIwCisgICAgICAgIGNoZWNrX2Zsb2F0KCAgMS4yMzQ1ZSsyMWYsICAiMS4yMzQ1ZSsyMSIgICk7IC8vICAxLjIzNDQ5OTk5ZSsyMQorICAgICAgICBjaGVja19mbG9hdCggIDEuMjM0NWUrMjJmLCAgIjEuMjM0NWUrMjIiICApOyAvLyAgMS4yMzQ1MDAwNWUrMjIKKyAgICB9CisKKyAgICBTRUNUSU9OKCJkb3VibGUgcHJlY2lzaW9uIikKKyAgICB7CisgICAgICAgIGF1dG8gY2hlY2tfZG91YmxlID0gW10oZG91YmxlIG51bWJlciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBidWZbMzJdOworICAgICAgICAgICAgY2hhciogZW5kID0gbmxvaG1hbm46OmRldGFpbDo6dG9fY2hhcnMoYnVmLCBidWYgKyAzMiwgbnVtYmVyKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFjdHVhbChidWYsIGVuZCk7CisKKyAgICAgICAgICAgIENIRUNLKGFjdHVhbCA9PSBleHBlY3RlZCk7CisgICAgICAgIH07CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRvYSAgICAgICAgICAgICAgICAgICAgICAgICAgICUuMTVnICAgICAgICAgICAgICAgICAgICAgJS4xN2cgICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdAorICAgICAgICBjaGVja19kb3VibGUoIC0xLjIzNDVlLTIyLCAgIi0xLjIzNDVlLTIyIiAgICAgICAgICAgICApOyAvLyAtMS4yMzQ1ZS0yMiAgICAgICAgICAgICAgIC0xLjIzNDUwMDAwMDAwMDAwMDFlLTIyICAgLTEuMjM0NWUtMjIKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS0yMSwgICItMS4yMzQ1ZS0yMSIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMjEgICAgICAgICAgICAgICAtMS4yMzQ1MDAwMDAwMDAwMDAxZS0yMSAgIC0xLjIzNDVlLTIxCisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMjAsICAiLTEuMjM0NWUtMjAiICAgICAgICAgICAgICk7IC8vIC0xLjIzNDVlLTIwICAgICAgICAgICAgICAgLTEuMjM0NWUtMjAgICAgICAgICAgICAgICAtMS4yMzQ1ZS0yMAorICAgICAgICBjaGVja19kb3VibGUoIC0xLjIzNDVlLTE5LCAgIi0xLjIzNDVlLTE5IiAgICAgICAgICAgICApOyAvLyAtMS4yMzQ1ZS0xOSAgICAgICAgICAgICAgIC0xLjIzNDUwMDAwMDAwMDAwMDFlLTE5ICAgLTEuMjM0NWUtMTkKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS0xOCwgICItMS4yMzQ1ZS0xOCIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMTggICAgICAgICAgICAgICAtMS4yMzQ1MDAwMDAwMDAwMDAxZS0xOCAgIC0xLjIzNDVlLTE4CisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMTcsICAiLTEuMjM0NWUtMTciICAgICAgICAgICAgICk7IC8vIC0xLjIzNDVlLTE3ICAgICAgICAgICAgICAgLTEuMjM0NWUtMTcgICAgICAgICAgICAgICAtMS4yMzQ1ZS0xNworICAgICAgICBjaGVja19kb3VibGUoIC0xLjIzNDVlLTE2LCAgIi0xLjIzNDVlLTE2IiAgICAgICAgICAgICApOyAvLyAtMS4yMzQ1ZS0xNiAgICAgICAgICAgICAgIC0xLjIzNDQ5OTk5OTk5OTk5OTllLTE2ICAgLTEuMjM0NWUtMTYKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS0xNSwgICItMS4yMzQ1ZS0xNSIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMTUgICAgICAgICAgICAgICAtMS4yMzQ1ZS0xNSAgICAgICAgICAgICAgIC0xLjIzNDVlLTE1CisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMTQsICAiLTEuMjM0NWUtMTQiICAgICAgICAgICAgICk7IC8vIC0xLjIzNDVlLTE0ICAgICAgICAgICAgICAgLTEuMjM0NWUtMTQgICAgICAgICAgICAgICAtMS4yMzQ1ZS0xNAorICAgICAgICBjaGVja19kb3VibGUoIC0xLjIzNDVlLTEzLCAgIi0xLjIzNDVlLTEzIiAgICAgICAgICAgICApOyAvLyAtMS4yMzQ1ZS0xMyAgICAgICAgICAgICAgIC0xLjIzNDQ5OTk5OTk5OTk5OTllLTEzICAgLTEuMjM0NWUtMTMKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS0xMiwgICItMS4yMzQ1ZS0xMiIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMTIgICAgICAgICAgICAgICAtMS4yMzQ1ZS0xMiAgICAgICAgICAgICAgIC0xLjIzNDVlLTEyCisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMTEsICAiLTEuMjM0NWUtMTEiICAgICAgICAgICAgICk7IC8vIC0xLjIzNDVlLTExICAgICAgICAgICAgICAgLTEuMjM0NWUtMTEgICAgICAgICAgICAgICAtMS4yMzQ1ZS0xMQorICAgICAgICBjaGVja19kb3VibGUoIC0xLjIzNDVlLTEwLCAgIi0xLjIzNDVlLTEwIiAgICAgICAgICAgICApOyAvLyAtMS4yMzQ1ZS0xMCAgICAgICAgICAgICAgIC0xLjIzNDVlLTEwICAgICAgICAgICAgICAgLTEuMjM0NWUtMTAKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS05LCAgICItMS4yMzQ1ZS0wOSIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMDkgICAgICAgICAgICAgICAtMS4yMzQ1ZS0wOSAgICAgICAgICAgICAgIC0xLjIzNDVlLTkKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS04LCAgICItMS4yMzQ1ZS0wOCIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMDggICAgICAgICAgICAgICAtMS4yMzQ1MDAwMDAwMDAwMDAxZS0wOCAgIC0xLjIzNDVlLTgKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS03LCAgICItMS4yMzQ1ZS0wNyIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMDcgICAgICAgICAgICAgICAtMS4yMzQ1MDAwMDAwMDAwMDAxZS0wNyAgIC0xLjIzNDVlLTcKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS02LCAgICItMS4yMzQ1ZS0wNiIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMDYgICAgICAgICAgICAgICAtMS4yMzQ1ZS0wNiAgICAgICAgICAgICAgIC0xLjIzNDVlLTYKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS01LCAgICItMS4yMzQ1ZS0wNSIgICAgICAgICAgICAgKTsgLy8gLTEuMjM0NWUtMDUgICAgICAgICAgICAgICAtMS4yMzQ1ZS0wNSAgICAgICAgICAgICAgIC0xLjIzNDVlLTUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS00LCAgICItMC4wMDAxMjM0NSIgICAgICAgICAgICAgKTsgLy8gLTAuMDAwMTIzNDUgICAgICAgICAgICAgICAtMC4wMDAxMjM0NDk5OTk5OTk5OTk5OSAgIC0wLjAwMDEyMzQ1CisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMywgICAiLTAuMDAxMjM0NSIgICAgICAgICAgICAgICk7IC8vIC0wLjAwMTIzNDUgICAgICAgICAgICAgICAgLTAuMDAxMjM0NDk5OTk5OTk5OTk5OSAgICAtMC4wMDEyMzQ1CisgICAgICAgIGNoZWNrX2RvdWJsZSggLTEuMjM0NWUtMiwgICAiLTAuMDEyMzQ1IiAgICAgICAgICAgICAgICk7IC8vIC0wLjAxMjM0NSAgICAgICAgICAgICAgICAgLTAuMDEyMzQ1ICAgICAgICAgICAgICAgICAtMC4wMTIzNDUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAtMS4yMzQ1ZS0xLCAgICItMC4xMjM0NSIgICAgICAgICAgICAgICAgKTsgLy8gLTAuMTIzNDUgICAgICAgICAgICAgICAgICAtMC4xMjM0NSAgICAgICAgICAgICAgICAgIC0wLjEyMzQ1CisgICAgICAgIGNoZWNrX2RvdWJsZSggLTAuMCwgICAgICAgICAiLTAuMCIgICAgICAgICAgICAgICAgICAgICk7IC8vIC0wICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAgICAgICAgICAgICAgICAgICAgICAtMAorICAgICAgICBjaGVja19kb3VibGUoICAwLjAsICAgICAgICAgICIwLjAiICAgICAgICAgICAgICAgICAgICApOyAvLyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSswLCAgICAiMS4yMzQ1IiAgICAgICAgICAgICAgICAgKTsgLy8gIDEuMjM0NSAgICAgICAgICAgICAgICAgICAgMS4yMzQ0OTk5OTk5OTk5OTk5ICAgICAgICAxLjIzNDUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSsxLCAgICAiMTIuMzQ1IiAgICAgICAgICAgICAgICAgKTsgLy8gIDEyLjM0NSAgICAgICAgICAgICAgICAgICAgMTIuMzQ1MDAwMDAwMDAwMDAxICAgICAgICAxMi4zNDUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSsyLCAgICAiMTIzLjQ1IiAgICAgICAgICAgICAgICAgKTsgLy8gIDEyMy40NSAgICAgICAgICAgICAgICAgICAgMTIzLjQ1ICAgICAgICAgICAgICAgICAgICAxMjMuNDUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSszLCAgICAiMTIzNC41IiAgICAgICAgICAgICAgICAgKTsgLy8gIDEyMzQuNSAgICAgICAgICAgICAgICAgICAgMTIzNC41ICAgICAgICAgICAgICAgICAgICAxMjM0LjUKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSs0LCAgICAiMTIzNDUuMCIgICAgICAgICAgICAgICAgKTsgLy8gIDEyMzQ1ICAgICAgICAgICAgICAgICAgICAgMTIzNDUgICAgICAgICAgICAgICAgICAgICAxMjM0NQorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzUsICAgICIxMjM0NTAuMCIgICAgICAgICAgICAgICApOyAvLyAgMTIzNDUwICAgICAgICAgICAgICAgICAgICAxMjM0NTAgICAgICAgICAgICAgICAgICAgIDEyMzQ1MAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzYsICAgICIxMjM0NTAwLjAiICAgICAgICAgICAgICApOyAvLyAgMTIzNDUwMCAgICAgICAgICAgICAgICAgICAxMjM0NTAwICAgICAgICAgICAgICAgICAgIDEyMzQ1MDAKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSs3LCAgICAiMTIzNDUwMDAuMCIgICAgICAgICAgICAgKTsgLy8gIDEyMzQ1MDAwICAgICAgICAgICAgICAgICAgMTIzNDUwMDAgICAgICAgICAgICAgICAgICAxMjM0NTAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzgsICAgICIxMjM0NTAwMDAuMCIgICAgICAgICAgICApOyAvLyAgMTIzNDUwMDAwICAgICAgICAgICAgICAgICAxMjM0NTAwMDAgICAgICAgICAgICAgICAgIDEyMzQ1MDAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzksICAgICIxMjM0NTAwMDAwLjAiICAgICAgICAgICApOyAvLyAgMTIzNDUwMDAwMCAgICAgICAgICAgICAgICAxMjM0NTAwMDAwICAgICAgICAgICAgICAgIDEyMzQ1MDAwMDAKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSsxMCwgICAiMTIzNDUwMDAwMDAuMCIgICAgICAgICAgKTsgLy8gIDEyMzQ1MDAwMDAwICAgICAgICAgICAgICAgMTIzNDUwMDAwMDAgICAgICAgICAgICAgICAxMjM0NTAwMDAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzExLCAgICIxMjM0NTAwMDAwMDAuMCIgICAgICAgICApOyAvLyAgMTIzNDUwMDAwMDAwICAgICAgICAgICAgICAxMjM0NTAwMDAwMDAgICAgICAgICAgICAgIDEyMzQ1MDAwMDAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzEyLCAgICIxMjM0NTAwMDAwMDAwLjAiICAgICAgICApOyAvLyAgMTIzNDUwMDAwMDAwMCAgICAgICAgICAgICAxMjM0NTAwMDAwMDAwICAgICAgICAgICAgIDEyMzQ1MDAwMDAwMDAKKyAgICAgICAgY2hlY2tfZG91YmxlKCAgMS4yMzQ1ZSsxMywgICAiMTIzNDUwMDAwMDAwMDAuMCIgICAgICAgKTsgLy8gIDEyMzQ1MDAwMDAwMDAwICAgICAgICAgICAgMTIzNDUwMDAwMDAwMDAgICAgICAgICAgICAxMjM0NTAwMDAwMDAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE0LCAgICIxMjM0NTAwMDAwMDAwMDAuMCIgICAgICApOyAvLyAgMTIzNDUwMDAwMDAwMDAwICAgICAgICAgICAxMjM0NTAwMDAwMDAwMDAgICAgICAgICAgIDEyMzQ1MDAwMDAwMDAwMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE1LCAgICIxLjIzNDVlKzE1IiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsxNSAgICAgICAgICAgICAgICAxMjM0NTAwMDAwMDAwMDAwICAgICAgICAgIDEuMjM0NWUxNQorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE2LCAgICIxLjIzNDVlKzE2IiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsxNiAgICAgICAgICAgICAgICAxMjM0NTAwMDAwMDAwMDAwMCAgICAgICAgIDEuMjM0NWUxNgorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE3LCAgICIxLjIzNDVlKzE3IiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsxNyAgICAgICAgICAgICAgICAxLjIzNDVlKzE3ICAgICAgICAgICAgICAgIDEuMjM0NWUxNworICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE4LCAgICIxLjIzNDVlKzE4IiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsxOCAgICAgICAgICAgICAgICAxLjIzNDVlKzE4ICAgICAgICAgICAgICAgIDEuMjM0NWUxOAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzE5LCAgICIxLjIzNDVlKzE5IiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsxOSAgICAgICAgICAgICAgICAxLjIzNDVlKzE5ICAgICAgICAgICAgICAgIDEuMjM0NWUxOQorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzIwLCAgICIxLjIzNDVlKzIwIiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsyMCAgICAgICAgICAgICAgICAxLjIzNDVlKzIwICAgICAgICAgICAgICAgIDEuMjM0NWUyMAorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzIxLCAgICIxLjIzNDQ5OTk5OTk5OTk5OTllKzIxIiApOyAvLyAgMS4yMzQ1ZSsyMSAgICAgICAgICAgICAgICAxLjIzNDQ5OTk5OTk5OTk5OTllKzIxICAgIDEuMjM0NWUyMQorICAgICAgICBjaGVja19kb3VibGUoICAxLjIzNDVlKzIyLCAgICIxLjIzNDVlKzIyIiAgICAgICAgICAgICApOyAvLyAgMS4yMzQ1ZSsyMiAgICAgICAgICAgICAgICAxLjIzNDVlKzIyICAgICAgICAgICAgICAgIDEuMjM0NWUyMgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtdWJqc29uLmNwcCBiL3Rlc3Qvc3JjL3VuaXQtdWJqc29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVlNWVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcmMvdW5pdC11Ympzb24uY3BwCkBAIC0wLDAgKzEsMjIyMCBAQAorLyoKKyAgICBfXyBfX19fXyBfX19fXyBfX19fXworIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKK3xfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlICB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCAgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byAgdXNlLCBjb3B5LCAgbW9kaWZ5LCBtZXJnZSwgIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3IgIHNlbGwKK2NvcGllcyAgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCAgdG8gIHBlcm1pdCBwZXJzb25zICB0byAgd2hvbSAgdGhlIFNvZnR3YXJlICBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZICBPRiBBTlkgS0lORCwgIEVYUFJFU1MgT1IKK0lNUExJRUQsICBJTkNMVURJTkcgQlVUICBOT1QgIExJTUlURUQgVE8gIFRIRSAgV0FSUkFOVElFUyBPRiAgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCAgU0hBTEwgVEhFCitBVVRIT1JTICBPUiBDT1BZUklHSFQgIEhPTERFUlMgIEJFICBMSUFCTEUgRk9SICBBTlkgIENMQUlNLCAgREFNQUdFUyBPUiAgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCitTT0ZUV0FSRS4KKyovCisKKyNpbmNsdWRlICJjYXRjaC5ocHAiCisKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KK3VzaW5nIG5sb2htYW5uOjpqc29uOworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworVEVTVF9DQVNFKCJVQkpTT04iKQoreworICAgIFNFQ1RJT04oImluZGl2aWR1YWwgdmFsdWVzIikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oImRpc2NhcmRlZCIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRpc2NhcmRlZCB2YWx1ZXMgYXJlIG5vdCBzZXJpYWxpemVkCisgICAgICAgICAgICBqc29uIGogPSBqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQ7CisgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgIENIRUNLKHJlc3VsdC5lbXB0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oIm51bGwiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSBudWxscHRyOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1onfTsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiYm9vbGVhbiIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ1RJT04oInRydWUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gaiA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1QnfTsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiZmFsc2UiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gaiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydGJ307CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJudW1iZXIiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJzaWduZWQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oIi05MjIzMzcyMDM2ODU0Nzc1ODA4Li4tMjE0NzQ4MzY0OSAoaW50NjQpIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG51bWJlcnM7CisgICAgICAgICAgICAgICAgICAgIG51bWJlcnMucHVzaF9iYWNrKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOworICAgICAgICAgICAgICAgICAgICBudW1iZXJzLnB1c2hfYmFjaygtMTAwMDAwMDAwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICBudW1iZXJzLnB1c2hfYmFjaygtMTAwMDAwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICBudW1iZXJzLnB1c2hfYmFjaygtMTAwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICBudW1iZXJzLnB1c2hfYmFjaygtMjE0NzQ4MzY0OWxsKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBudW1iZXJzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl9pbnRlZ2VyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCdMJykpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDU2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiA0OCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gNDApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDMyKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAyNCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMTYpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkgJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSA5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0WzBdID09ICdMJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFsxXSkgPDwgMDcwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFsyXSkgPDwgMDYwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFszXSkgPDwgMDUwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFs0XSkgPDwgMDQwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFs1XSkgPDwgMDMwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFs2XSkgPDwgMDIwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDY0X3Q+KHJlc3VsdFs3XSkgPDwgMDEwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmVzdWx0WzhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3RvcmVkID09IGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCItMjE0NzQ4MzY0OC4uLTMyNzY5IChpbnQzMikiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbnVtYmVyczsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTMyNzY5KTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIG51bWJlcnMucHVzaF9iYWNrKC0xMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTEwMDAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIG51bWJlcnMucHVzaF9iYWNrKC0xMDAwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycy5wdXNoX2JhY2soLTIxNDc0ODM2NDgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IG51bWJlcnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENBUFRVUkUoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oJ2wnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMjQpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihpICYgMHhmZikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdC5zaXplKCkgPT0gNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdFswXSA9PSAnbCcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXN0b3JlZCA9IChzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN1bHRbMV0pIDw8IDAzMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN1bHRbMl0pIDw8IDAyMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN1bHRbM10pIDw8IDAxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlc3VsdFs0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN0b3JlZCA9PSBpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigiLTMyNzY4Li4tMTI5IChpbnQxNikiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAtMzI3Njg7IGkgPD0gLTEyOTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl9pbnRlZ2VyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCdJJykpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkgJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0WzBdID09ICdJJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oKChyZXN1bHRbMV0gPDwgOCkgKyByZXN1bHRbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3RvcmVkID09IGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCItOTI2MyAoaW50MTYpIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IC05MjYzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnSScsIDB4ZGIsIDB4ZDF9OworCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSAzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdFswXSA9PSAnSScpOworICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oKChyZXN1bHRbMV0gPDwgOCkgKyByZXN1bHRbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdG9yZWQgPT0gLTkyNjMpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oIi0xMjguLi0xIChpbnQ4KSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA9IC0xMjg7IGkgPD0gLTE7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRShpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAganNvbiBqID0gaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfaW50ZWdlcigpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygnaScpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMF0gPT0gJ2knKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHN0YXRpY19jYXN0PGludDhfdD4ocmVzdWx0WzFdKSA9PSBpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigiMC4uMTI3IChpbnQ4KSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSAxMjc7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRShpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAganNvbiBqID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBqLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkgPSBzdGF0aWNfY2FzdDxqc29uOjpudW1iZXJfaW50ZWdlcl90PihpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfaW50ZWdlcigpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PignaScpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0WzBdID09ICdpJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMV0gPT0gaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oIjEyOC4uMjU1ICh1aW50OCkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDEyODsgaSA8PSAyNTU7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRShpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAganNvbiBqID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBqLmdldF9yZWY8anNvbjo6bnVtYmVyX2ludGVnZXJfdCY+KCkgPSBzdGF0aWNfY2FzdDxqc29uOjpudW1iZXJfaW50ZWdlcl90PihpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfaW50ZWdlcigpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PignVScpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0WzBdID09ICdVJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMV0gPT0gaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oIjI1Ni4uMzI3NjcgKGludDE2KSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMjU2OyBpIDw9IDMyNzY3OyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENBUFRVUkUoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggaW50ZWdlciBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgai5nZXRfcmVmPGpzb246Om51bWJlcl9pbnRlZ2VyX3QmPigpID0gc3RhdGljX2Nhc3Q8anNvbjo6bnVtYmVyX2ludGVnZXJfdD4oaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGouaXNfbnVtYmVyX2ludGVnZXIoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oJ0knKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oaSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMF0gPT0gJ0knKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSkgKiAyNTYgKyBzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3RvcmVkID09IGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCI2NTUzNi4uMjE0NzQ4MzY0NyAoaW50MzIpIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNnUsIDc3Nzc3dSwgMTA0ODU3NnUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGouZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSA9IHN0YXRpY19jYXN0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl9pbnRlZ2VyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKCdsJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMjQpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihpICYgMHhmZikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdC5zaXplKCkgPT0gNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdFswXSA9PSAnbCcpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVzdG9yZWQgPSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlc3VsdFsxXSkgPDwgMDMwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVzdWx0WzJdKSA8PCAwMjApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXN1bHRbM10pIDw8IDAxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVzdWx0WzRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3RvcmVkID09IGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCIyMTQ3NDgzNjQ4Li45MjIzMzcyMDM2ODU0Nzc1ODA3IChpbnQ2NCkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHYgPSB7MjE0NzQ4MzY0OHVsLCA5MjIzMzcyMDM2ODU0Nzc1ODA3dWx9OworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQ2NF90IGkgOiB2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGouZ2V0X3JlZjxqc29uOjpudW1iZXJfaW50ZWdlcl90Jj4oKSA9IHN0YXRpY19jYXN0PGpzb246Om51bWJlcl9pbnRlZ2VyX3Q+KGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl9pbnRlZ2VyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKCdMJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMDcwKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAwNjApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDA1MCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMDQwKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAwMzApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDAyMCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMDEwKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihpICYgMHhmZikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdC5zaXplKCkgPT0gOSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdFswXSA9PSAnTCcpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcmVzdG9yZWQgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFsxXSkgPDwgMDcwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0WzJdKSA8PCAwNjApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHRbM10pIDw8IDA1MCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFs0XSkgPDwgMDQwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0WzVdKSA8PCAwMzApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHRbNl0pIDw8IDAyMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFs3XSkgPDwgMDEwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHRbOF0pOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdG9yZWQgPT0gaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigidW5zaWduZWQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oIjAuLjEyNyAoaW50OCkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gMTI3OyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENBUFRVUkUoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggdW5zaWduZWQgaW50ZWdlciBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKCdpJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oaSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHJlc3VsdCArIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdC5zaXplKCkgPT0gMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGluZGl2aWR1YWwgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdFswXSA9PSAnaScpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZXN0b3JlZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN0b3JlZCA9PSBpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigiMTI4Li4yNTUgKHVpbnQ4KSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTI4OyBpIDw9IDI1NTsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygnVScpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMF0gPT0gJ1UnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzdG9yZWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdG9yZWQgPT0gaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oIjI1Ni4uMzI3NjcgKGludDE2KSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMjU2OyBpIDw9IDMyNzY3OyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENBUFRVUkUoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggdW5zaWduZWQgaW50ZWdlciBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGouaXNfbnVtYmVyX3Vuc2lnbmVkKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKCdJJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oaSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMF0gPT0gJ0knKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHJlc3RvcmVkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlc3VsdFsxXSkgKiAyNTYgKyBzdGF0aWNfY2FzdDx1aW50OF90PihyZXN1bHRbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3RvcmVkID09IGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCI2NTUzNi4uMjE0NzQ4MzY0NyAoaW50MzIpIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNnUsIDc3Nzc3dSwgMTA0ODU3NnUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHVuc2lnbmVkIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqLmlzX251bWJlcl91bnNpZ25lZCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygnbCcpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDI0KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAxNikgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oaSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IDUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbmRpdmlkdWFsIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHRbMF0gPT0gJ2wnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlc3RvcmVkID0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXN1bHRbMV0pIDw8IDAzMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlc3VsdFsyXSkgPDwgMDIwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVzdWx0WzNdKSA8PCAwMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlc3VsdFs0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN0b3JlZCA9PSBpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigiMjE0NzQ4MzY0OC4uOTIyMzM3MjAzNjg1NDc3NTgwNyAoaW50NjQpIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiB2ID0gezIxNDc0ODM2NDh1bCwgOTIyMzM3MjAzNjg1NDc3NTgwN3VsfTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50NjRfdCBpIDogdikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRShpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBpbnRlZ2VyIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAganNvbiBqID0gaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soai5pc19udW1iZXJfdW5zaWduZWQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soJ0wnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAwNzApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDA2MCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMDUwKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAwNDApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChpID4+IDAzMCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dWludDhfdD4oKGkgPj4gMDIwKSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PigoaSA+PiAwMTApICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkgJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSA5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5kaXZpZHVhbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0WzBdID09ICdMJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZXN0b3JlZCA9IChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0WzFdKSA8PCAwNzApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHRbMl0pIDw8IDA2MCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFszXSkgPDwgMDUwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0WzRdKSA8PCAwNDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHRbNV0pIDw8IDAzMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFs2XSkgPDwgMDIwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVzdWx0WzddKSA8PCAwMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlc3VsdFs4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN0b3JlZCA9PSBpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJmbG9hdDY0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCIzLjE0MTU5MjUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYgPSAzLjE0MTU5MjU7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IHY7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJ0QnLCAweDQwLCAweDA5LCAweDIxLCAweGZiLCAweDNmLCAweGE2LCAweGRlLCAweGZjCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oInN0cmluZyIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ1RJT04oIk4gPSAwLi4xMjciKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IE4gPSAwOyBOIDw9IDEyNzsgKytOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRShOKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgSlNPTiB2YWx1ZSB3aXRoIHN0cmluZyBjb250YWluaW5nIG9mIE4gKiAneCcKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byBzID0gc3RkOjpzdHJpbmcoTiwgJ3gnKTsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0gczsKKworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwZWN0ZWQgYnl0ZSB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygnUycpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soJ2knKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KE4pKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjaygneCcpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IE4gKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKE4gPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuYmFjaygpICE9ICdceDAwJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk4gPSAxMjguLjI1NSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgTiA9IDEyODsgTiA8PSAyNTU7ICsrTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENBUFRVUkUoTik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIEpTT04gdmFsdWUgd2l0aCBzdHJpbmcgY29udGFpbmluZyBvZiBOICogJ3gnCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcyA9IHN0ZDo6c3RyaW5nKE4sICd4Jyk7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IHM7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGV4cGVjdGVkIGJ5dGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soJ1MnKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKCdVJyk7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1aW50OF90PihOKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTjsgKytpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soJ3gnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVzdWx0ICsgc2l6ZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LnNpemUoKSA9PSBOICsgMyk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbCBieXRlIGlzIGFwcGVuZGVkCisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdC5iYWNrKCkgIT0gJ1x4MDAnKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk4gPSAyNTYuLjMyNzY3IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBOIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTZ1LCA5OTl1LCAxMDI1dSwgMzMzM3UsIDIwNDh1LCAzMjc2N3UKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKE4pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgb2YgTiAqICd4JworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhOLCAneCcpOworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBzOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvciAoaGFjazogY3JlYXRlIHN0cmluZyBmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQoTiwgJ3gnKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBvcmRlciBvZiBjb21tYW5kcywgYmVjYXVzZSB3ZSBpbnNlcnQgYXQgYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oTiAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuaW5zZXJ0KGV4cGVjdGVkLmJlZ2luKCksIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChOID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgJ0knKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuaW5zZXJ0KGV4cGVjdGVkLmJlZ2luKCksICdTJyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IE4gKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LmJhY2soKSAhPSAnXHgwMCcpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiTiA9IDY1NTM2Li4yMTQ3NDgzNjQ3IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBOIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNnUsIDc3Nzc3dSwgMTA0ODU3NnUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDQVBUVVJFKE4pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBKU09OIHZhbHVlIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgb2YgTiAqICd4JworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHMgPSBzdGQ6OnN0cmluZyhOLCAneCcpOworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBzOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBleHBlY3RlZCBieXRlIHZlY3RvciAoaGFjazogY3JlYXRlIHN0cmluZyBmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQoTiwgJ3gnKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBvcmRlciBvZiBjb21tYW5kcywgYmVjYXVzZSB3ZSBpbnNlcnQgYXQgYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oTiAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuaW5zZXJ0KGV4cGVjdGVkLmJlZ2luKCksIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChOID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oKE4gPj4gMTYpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oKE4gPj4gMjQpICYgMHhmZikpOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5pbnNlcnQoZXhwZWN0ZWQuYmVnaW4oKSwgJ2wnKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuaW5zZXJ0KGV4cGVjdGVkLmJlZ2luKCksICdTJyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSByZXN1bHQgKyBzaXplCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQuc2l6ZSgpID09IE4gKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBudWxsIGJ5dGUgaXMgYXBwZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0LmJhY2soKSAhPSAnXHgwMCcpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImFycmF5IikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigiZW1wdHkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9ZmFsc2UgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjphcnJheSgpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICddJ307CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9dHJ1ZSB0eXBlPWZhbHNlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGpzb246OmFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyMnLCAnaScsIDB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT10cnVlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGpzb246OmFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyMnLCAnaScsIDB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIltudWxsXSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT1mYWxzZSB0eXBlPWZhbHNlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IHtudWxscHRyfTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnWicsICddJ307CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9dHJ1ZSB0eXBlPWZhbHNlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IHtudWxscHRyfTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnIycsICdpJywgMSwgJ1onfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9dHJ1ZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSB7bnVsbHB0cn07CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnWicsICcjJywgJ2knLCAxfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJbMSwyLDMsNCw1XSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT1mYWxzZSB0eXBlPWZhbHNlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCJbMSwyLDMsNCw1XSIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICdpJywgMSwgJ2knLCAyLCAnaScsIDMsICdpJywgNCwgJ2knLCA1LCAnXSd9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjpwYXJzZSgiWzEsMiwzLDQsNV0iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnIycsICdpJywgNSwgJ2knLCAxLCAnaScsIDIsICdpJywgMywgJ2knLCA0LCAnaScsIDV9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT10cnVlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCJbMSwyLDMsNCw1XSIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICckJywgJ2knLCAnIycsICdpJywgNSwgMSwgMiwgMywgNCwgNX07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGosIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiW1tbW11dXV0iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9ZmFsc2UgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjpwYXJzZSgiW1tbW11dXV0iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnWycsICdbJywgJ1snLCAnXScsICddJywgJ10nLCAnXSd9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjpwYXJzZSgiW1tbW11dXV0iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnIycsICdpJywgMSwgJ1snLCAnIycsICdpJywgMSwgJ1snLCAnIycsICdpJywgMSwgJ1snLCAnIycsICdpJywgMH07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGosIHRydWUpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9dHJ1ZSB0eXBlPXRydWUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0ganNvbjo6cGFyc2UoIltbW1tdXV1dIik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnWycsICcjJywgJ2knLCAxLCAnJCcsICdbJywgJyMnLCAnaScsIDEsICckJywgJ1snLCAnIycsICdpJywgMSwgJyMnLCAnaScsIDB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oImFycmF5IHdpdGggdWludDE2X3QgZWxlbWVudHMiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9ZmFsc2UgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGooMjU3LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQoai5zaXplKCkgKyAyLCAnWicpOyAvLyBhbGwgbnVsbAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFswXSA9ICdbJzsgLy8gb3BlbmluZyBhcnJheQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFsyNThdID0gJ10nOyAvLyBjbG9zaW5nIGFycmF5CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGopOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9dHJ1ZSB0eXBlPWZhbHNlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaigyNTcsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZChqLnNpemUoKSArIDUsICdaJyk7IC8vIGFsbCBudWxsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzBdID0gJ1snOyAvLyBvcGVuaW5nIGFycmF5CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzFdID0gJyMnOyAvLyBhcnJheSBzaXplCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzJdID0gJ0knOyAvLyBpbnQxNgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFszXSA9IDB4MDE7IC8vIDB4MDEwMSwgZmlyc3QgYnl0ZQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFs0XSA9IDB4MDE7IC8vIDB4MDEwMSwgc2Vjb25kIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9dHJ1ZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGooMjU3LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnJCcsICdaJywgJyMnLCAnSScsIDB4MDEsIDB4MDF9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oImFycmF5IHdpdGggdWludDMyX3QgZWxlbWVudHMiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9ZmFsc2UgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGooNjU3OTMsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZChqLnNpemUoKSArIDIsICdaJyk7IC8vIGFsbCBudWxsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzBdID0gJ1snOyAvLyBvcGVuaW5nIGFycmF5CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzY1Nzk0XSA9ICddJzsgLy8gY2xvc2luZyBhcnJheQorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGooNjU3OTMsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZChqLnNpemUoKSArIDcsICdaJyk7IC8vIGFsbCBudWxsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzBdID0gJ1snOyAvLyBvcGVuaW5nIGFycmF5CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzFdID0gJyMnOyAvLyBhcnJheSBzaXplCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkWzJdID0gJ2wnOyAvLyBpbnQzMgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFszXSA9IDB4MDA7IC8vIDB4MDAwMTAxMDEsIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbNF0gPSAweDAxOyAvLyAweDAwMDEwMTAxLCBzZWNvbmQgYnl0ZQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFs1XSA9IDB4MDE7IC8vIDB4MDAwMTAxMDEsIHRoaXJkIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbNl0gPSAweDAxOyAvLyAweDAwMDEwMTAxLCBmb3VydGggYnl0ZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT10cnVlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaig2NTc5MywgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnWicsICcjJywgJ2wnLCAweDAwLCAweDAxLCAweDAxLCAweDAxfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigib2JqZWN0IikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigiZW1wdHkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9ZmFsc2UgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjpvYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J3snLCAnfSd9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSBqc29uOjpvYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J3snLCAnIycsICdpJywgMH07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0ganNvbjo6dG9fdWJqc29uKGosIHRydWUpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0gZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihyZXN1bHQpID09IGopOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ1RJT04oInNpemU9dHJ1ZSB0eXBlPXRydWUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0ganNvbjo6b2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geyd7JywgJyMnLCAnaScsIDB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIntcIlwiOm51bGx9IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPWZhbHNlIHR5cGU9ZmFsc2UiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0ge3siIiwgbnVsbHB0cn19OworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsneycsICdpJywgMCwgJ1onLCAnfSd9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSB7eyIiLCBudWxscHRyfX07CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geyd7JywgJyMnLCAnaScsIDEsICdpJywgMCwgJ1onfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9dHJ1ZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqc29uIGogPSB7eyIiLCBudWxscHRyfX07CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geyd7JywgJyQnLCAnWicsICcjJywgJ2knLCAxLCAnaScsIDB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIntcImFcIjoge1wiYlwiOiB7XCJjXCI6IHt9fX19IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPWZhbHNlIHR5cGU9ZmFsc2UiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0ganNvbjo6cGFyc2UoIntcImFcIjoge1wiYlwiOiB7XCJjXCI6IHt9fX19Iik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJ3snLCAnaScsIDEsICdhJywgJ3snLCAnaScsIDEsICdiJywgJ3snLCAnaScsIDEsICdjJywgJ3snLCAnfScsICd9JywgJ30nLCAnfScKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaik7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9ZmFsc2UiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiBqID0ganNvbjo6cGFyc2UoIntcImFcIjoge1wiYlwiOiB7XCJjXCI6IHt9fX19Iik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJ3snLCAnIycsICdpJywgMSwgJ2knLCAxLCAnYScsICd7JywgJyMnLCAnaScsIDEsICdpJywgMSwgJ2InLCAneycsICcjJywgJ2knLCAxLCAnaScsIDEsICdjJywgJ3snLCAnIycsICdpJywgMAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIHJlc3VsdCA9IGpzb246OnRvX3VianNvbihqLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzdWx0ID09IGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24ocmVzdWx0KSA9PSBqKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT10cnVlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gaiA9IGpzb246OnBhcnNlKCJ7XCJhXCI6IHtcImJcIjoge1wiY1wiOiB7fX19fSIpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICd7JywgJyQnLCAneycsICcjJywgJ2knLCAxLCAnaScsIDEsICdhJywgJyQnLCAneycsICcjJywgJ2knLCAxLCAnaScsIDEsICdiJywgJyQnLCAneycsICcjJywgJ2knLCAxLCAnaScsIDEsICdjJywgJyMnLCAnaScsIDAKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3VsdCA9PSBleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHJlc3VsdCkgPT0gaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiZXJyb3JzIikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oInN0cmljdCBtb2RlIikKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjID0geydaJywgJ1onfTsKKyAgICAgICAgICAgIFNFQ1RJT04oIm5vbi1zdHJpY3QgbW9kZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byByZXN1bHQgPSBqc29uOjpmcm9tX3VianNvbih2ZWMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhyZXN1bHQgPT0ganNvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigic3RyaWN0IG1vZGUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhqc29uOjpmcm9tX3VianNvbih2ZWMpLCBqc29uOjpwYXJzZV9lcnJvciYpOworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKGpzb246OmZyb21fdWJqc29uKHZlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IGV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigibnVtYmVyIG91dCBvZiByYW5nZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGxhcmdlciB0aGFuIG1heCBpbnQ2NAorICAgICAgICAgICAganNvbiBqID0gOTIyMzM3MjAzNjg1NDc3NTgwOGxsdTsKKyAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhqc29uOjp0b191Ympzb24oaiksIGpzb246Om91dF9vZl9yYW5nZSYpOworICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX1dJVEgoanNvbjo6dG9fdWJqc29uKGopLCAiW2pzb24uZXhjZXB0aW9uLm91dF9vZl9yYW5nZS40MDddIG51bWJlciBvdmVyZmxvdyBzZXJpYWxpemluZyA5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNUSU9OKCJwYXJzaW5nIHZhbHVlcyIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJzdHJpbmdzIikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgZm9yIGFsbCBudW1iZXIgdHlwZXMKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNfaSA9IHsnUycsICdpJywgMSwgJ2EnfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNfVSA9IHsnUycsICdVJywgMSwgJ2EnfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNfSSA9IHsnUycsICdJJywgMCwgMSwgJ2EnfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNfbCA9IHsnUycsICdsJywgMCwgMCwgMCwgMSwgJ2EnfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNfTCA9IHsnUycsICdMJywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgJ2EnfTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgc3RyaW5nIGlzIHBhcnNlZCBjb3JyZWN0bHkgdG8gImEiCisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihzX2kpID09ICJhIik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihzX1UpID09ICJhIik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihzX0kpID09ICJhIik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihzX2wpID09ICJhIik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbihzX0wpID09ICJhIik7CisKKyAgICAgICAgICAgIC8vIHJvdW5kdHJpcDogb3V0cHV0IHNob3VsZCBiZSBvcHRpbWl6ZWQKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqc29uOjpmcm9tX3VianNvbihzX2kpKSA9PSBzX2kpOworICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGpzb246OmZyb21fdWJqc29uKHNfVSkpID09IHNfaSk7CisgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24oc19JKSkgPT0gc19pKTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqc29uOjpmcm9tX3VianNvbihzX2wpKSA9PSBzX2kpOworICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGpzb246OmZyb21fdWJqc29uKHNfTCkpID09IHNfaSk7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJudW1iZXIiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJmbG9hdCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZmxvYXQzMgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfZCA9IHsnZCcsIDB4NDAsIDB4NDksIDB4MGYsIDB4ZDB9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfZCkgPT0gMy4xNDE1OWYpOworCisgICAgICAgICAgICAgICAgLy8gZmxvYXQ2NAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfRCA9IHsnRCcsIDB4NDAsIDB4MDksIDB4MjEsIDB4ZjksIDB4ZjAsIDB4MWIsIDB4ODYsIDB4NmV9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfRCkgPT0gMy4xNDE1OSk7CisKKyAgICAgICAgICAgICAgICAvLyBmbG9hdDMyIGlzIHNlcmlhbGl6ZWQgYXMgZmxvYXQ2NCBhcyB0aGUgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0MzIKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9kKSkgPT0ganNvbjo6dG9fdWJqc29uKDMuMTQxNTlmKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJhcnJheSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ1RJT04oIm9wdGltaXplZCB2ZXJzaW9uIChsZW5ndGggb25seSkiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB2ZWN0b3Igd2l0aCB0d28gZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfVCA9IHsnWycsICcjJywgJ2knLCAyLCAnVCcsICdUJ307CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9GID0geydbJywgJyMnLCAnaScsIDIsICdGJywgJ0YnfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X1ogPSB7J1snLCAnIycsICdpJywgMiwgJ1onLCAnWid9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfaSA9IHsnWycsICcjJywgJ2knLCAyLCAnaScsIDB4N0YsICdpJywgMHg3Rn07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9VID0geydbJywgJyMnLCAnaScsIDIsICdVJywgMHhGRiwgJ1UnLCAweEZGfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X0kgPSB7J1snLCAnIycsICdpJywgMiwgJ0knLCAweDdGLCAweEZGLCAnSScsIDB4N0YsIDB4RkZ9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfbCA9IHsnWycsICcjJywgJ2knLCAyLCAnbCcsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsICdsJywgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRn07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9MID0geydbJywgJyMnLCAnaScsIDIsICdMJywgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgJ0wnLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X0QgPSB7J1snLCAnIycsICdpJywgMiwgJ0QnLCAweDQwLCAweDA5LCAweDIxLCAweGZiLCAweDRkLCAweDEyLCAweGQ4LCAweDRhLCAnRCcsIDB4NDAsIDB4MDksIDB4MjEsIDB4ZmIsIDB4NGQsIDB4MTIsIDB4ZDgsIDB4NGF9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfUyA9IHsnWycsICcjJywgJ2knLCAyLCAnUycsICdpJywgMSwgJ2EnLCAnUycsICdpJywgMSwgJ2EnfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X0MgPSB7J1snLCAnIycsICdpJywgMiwgJ0MnLCAnYScsICdDJywgJ2EnfTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZlY3RvciBpcyBwYXJzZWQgY29ycmVjdGx5CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9UKSA9PSBqc29uKHt0cnVlLCB0cnVlfSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfRikgPT0ganNvbih7ZmFsc2UsIGZhbHNlfSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfWikgPT0ganNvbih7bnVsbHB0ciwgbnVsbHB0cn0pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2X2kpID09IGpzb24oezEyNywgMTI3fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfVSkgPT0ganNvbih7MjU1LCAyNTV9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9JKSA9PSBqc29uKHszMjc2NywgMzI3Njd9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9sKSA9PSBqc29uKHsyMTQ3NDgzNjQ3LCAyMTQ3NDgzNjQ3fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfTCkgPT0ganNvbih7OTIyMzM3MjAzNjg1NDc3NTgwNywgOTIyMzM3MjAzNjg1NDc3NTgwN30pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2X0QpID09IGpzb24oezMuMTQxNTkyNiwgMy4xNDE1OTI2fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfUykgPT0ganNvbih7ImEiLCAiYSJ9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9DKSA9PSBqc29uKHsiYSIsICJhIn0pKTsKKworICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcDogb3V0cHV0IHNob3VsZCBiZSBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9UKSwgdHJ1ZSkgPT0gdl9UKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9GKSwgdHJ1ZSkgPT0gdl9GKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9aKSwgdHJ1ZSkgPT0gdl9aKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9pKSwgdHJ1ZSkgPT0gdl9pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9VKSwgdHJ1ZSkgPT0gdl9VKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9JKSwgdHJ1ZSkgPT0gdl9JKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9sKSwgdHJ1ZSkgPT0gdl9sKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9MKSwgdHJ1ZSkgPT0gdl9MKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9EKSwgdHJ1ZSkgPT0gdl9EKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9TKSwgdHJ1ZSkgPT0gdl9TKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9DKSwgdHJ1ZSkgPT0gdl9TKTsgLy8gY2hhciBpcyBzZXJpYWxpemVkIHRvIHN0cmluZworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJvcHRpbWl6ZWQgdmVyc2lvbiAodHlwZSBhbmQgbGVuZ3RoKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHZlY3RvciB3aXRoIHR3byBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9OID0geydbJywgJyQnLCAnTicsICcjJywgJ2knLCAyfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X1QgPSB7J1snLCAnJCcsICdUJywgJyMnLCAnaScsIDJ9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfRiA9IHsnWycsICckJywgJ0YnLCAnIycsICdpJywgMn07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9aID0geydbJywgJyQnLCAnWicsICcjJywgJ2knLCAyfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X2kgPSB7J1snLCAnJCcsICdpJywgJyMnLCAnaScsIDIsIDB4N0YsIDB4N0Z9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfVSA9IHsnWycsICckJywgJ1UnLCAnIycsICdpJywgMiwgMHhGRiwgMHhGRn07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9JID0geydbJywgJyQnLCAnSScsICcjJywgJ2knLCAyLCAweDdGLCAweEZGLCAweDdGLCAweEZGfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X2wgPSB7J1snLCAnJCcsICdsJywgJyMnLCAnaScsIDIsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkZ9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZfTCA9IHsnWycsICckJywgJ0wnLCAnIycsICdpJywgMiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9EID0geydbJywgJyQnLCAnRCcsICcjJywgJ2knLCAyLCAweDQwLCAweDA5LCAweDIxLCAweGZiLCAweDRkLCAweDEyLCAweGQ4LCAweDRhLCAweDQwLCAweDA5LCAweDIxLCAweGZiLCAweDRkLCAweDEyLCAweGQ4LCAweDRhfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X1MgPSB7J1snLCAnJCcsICdTJywgJyMnLCAnaScsIDIsICdpJywgMSwgJ2EnLCAnaScsIDEsICdhJ307CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdl9DID0geydbJywgJyQnLCAnQycsICcjJywgJ2knLCAyLCAnYScsICdhJ307CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB2ZWN0b3IgaXMgcGFyc2VkIGNvcnJlY3RseQorICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfTikgPT0ganNvbjo6YXJyYXkoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9UKSA9PSBqc29uKHt0cnVlLCB0cnVlfSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfRikgPT0ganNvbih7ZmFsc2UsIGZhbHNlfSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfWikgPT0ganNvbih7bnVsbHB0ciwgbnVsbHB0cn0pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2X2kpID09IGpzb24oezEyNywgMTI3fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfVSkgPT0ganNvbih7MjU1LCAyNTV9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9JKSA9PSBqc29uKHszMjc2NywgMzI3Njd9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9sKSA9PSBqc29uKHsyMTQ3NDgzNjQ3LCAyMTQ3NDgzNjQ3fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfTCkgPT0ganNvbih7OTIyMzM3MjAzNjg1NDc3NTgwNywgOTIyMzM3MjAzNjg1NDc3NTgwN30pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2X0QpID09IGpzb24oezMuMTQxNTkyNiwgMy4xNDE1OTI2fSkpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHZfUykgPT0ganNvbih7ImEiLCAiYSJ9KSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odl9DKSA9PSBqc29uKHsiYSIsICJhIn0pKTsKKworICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcDogb3V0cHV0IHNob3VsZCBiZSBvcHRpbWl6ZWQKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2X2VtcHR5ID0geydbJywgJyMnLCAnaScsIDB9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqc29uOjpmcm9tX3VianNvbih2X04pLCB0cnVlLCB0cnVlKSA9PSB2X2VtcHR5KTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9UKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9UKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9GKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9GKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9aKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9aKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9pKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9pKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9VKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9VKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9JKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9JKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9sKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9sKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9MKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9MKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9EKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9EKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9TKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9TKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oanNvbjo6ZnJvbV91Ympzb24odl9DKSwgdHJ1ZSwgdHJ1ZSkgPT0gdl9TKTsgLy8gY2hhciBpcyBzZXJpYWxpemVkIHRvIHN0cmluZworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigicGFyc2UgZXJyb3JzIikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oImVtcHR5IGJ5dGUgdmVjdG9yIikKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGpzb246OmZyb21fdWJqc29uKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCkpLCBqc29uOjpwYXJzZV9lcnJvciYpOworICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX1dJVEgoanNvbjo6ZnJvbV91Ympzb24oc3RkOjp2ZWN0b3I8dWludDhfdD4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMTogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImNoYXIiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJlb2YgYWZ0ZXIgQyBieXRlIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geydDJ307CisgICAgICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGpzb246OmZyb21fdWJqc29uKHYpLCBqc29uOjpwYXJzZV9lcnJvciYpOworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKGpzb246OmZyb21fdWJqc29uKHYpLCAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMF0gcGFyc2UgZXJyb3IgYXQgMjogdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiYnl0ZSBvdXQgb2YgcmFuZ2UiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J0MnLCAxMzB9OworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhqc29uOjpmcm9tX3VianNvbih2KSwganNvbjo6cGFyc2VfZXJyb3ImKTsKKyAgICAgICAgICAgICAgICBDSEVDS19USFJPV1NfV0lUSChqc29uOjpmcm9tX3VianNvbih2KSwgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTNdIHBhcnNlIGVycm9yIGF0IDI6IGJ5dGUgYWZ0ZXIgJ0MnIG11c3QgYmUgaW4gcmFuZ2UgMHgwMC4uMHg3RjsgbGFzdCBieXRlOiAweDgyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJzdHJpbmdzIikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigiZW9mIGFmdGVyIFMgYnl0ZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsnUyd9OworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19BUyhqc29uOjpmcm9tX3VianNvbih2KSwganNvbjo6cGFyc2VfZXJyb3ImKTsKKyAgICAgICAgICAgICAgICBDSEVDS19USFJPV1NfV0lUSChqc29uOjpmcm9tX3VianNvbih2KSwgIltqc29uLmV4Y2VwdGlvbi5wYXJzZV9lcnJvci4xMTBdIHBhcnNlIGVycm9yIGF0IDI6IHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oImludmFsaWQgYnl0ZSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsnUycsICcxJywgJ2EnfTsKKyAgICAgICAgICAgICAgICBDSEVDS19USFJPV1NfQVMoanNvbjo6ZnJvbV91Ympzb24odiksIGpzb246OnBhcnNlX2Vycm9yJik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX1dJVEgoanNvbjo6ZnJvbV91Ympzb24odiksICJbanNvbi5leGNlcHRpb24ucGFyc2VfZXJyb3IuMTEzXSBwYXJzZSBlcnJvciBhdCAyOiBleHBlY3RlZCBhIFVCSlNPTiBzdHJpbmc7IGxhc3QgYnl0ZTogMHgzMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiYXJyYXkiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJvcHRpbWl6ZWQgYXJyYXk6IG5vIHNpemUgZm9sbG93aW5nIHR5cGUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1snLCAnJCcsICdpJywgMn07CisgICAgICAgICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGpzb246OmZyb21fdWJqc29uKHYpLCBqc29uOjpwYXJzZV9lcnJvciYpOworICAgICAgICAgICAgICAgIENIRUNLX1RIUk9XU19XSVRIKGpzb246OmZyb21fdWJqc29uKHYpLCAiW2pzb24uZXhjZXB0aW9uLnBhcnNlX2Vycm9yLjExMl0gcGFyc2UgZXJyb3IgYXQgNDogZXhwZWN0ZWQgJyMnIGFmdGVyIFVCSlNPTiB0eXBlIGluZm9ybWF0aW9uOyBsYXN0IGJ5dGU6IDB4MDIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oIndyaXRpbmcgb3B0aW1pemVkIHZhbHVlcyIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJpbnRlZ2VyIikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigiYXJyYXkgb2YgaSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBqID0gezEsIC0xfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICckJywgJ2knLCAnIycsICdpJywgMiwgMSwgMHhmZn07CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUsIHRydWUpID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiYXJyYXkgb2YgVSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBqID0gezIwMCwgMjAxfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICckJywgJ1UnLCAnIycsICdpJywgMiwgMHhDOCwgMHhDOX07CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUsIHRydWUpID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiYXJyYXkgb2YgSSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBqID0gezMwMDAwLCAtMzAwMDB9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnSScsICcjJywgJ2knLCAyLCAweDc1LCAweDMwLCAweDhhLCAweGQwfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJhcnJheSBvZiBsIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqc29uIGogPSB7NzAwMDAsIC03MDAwMH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnJCcsICdsJywgJyMnLCAnaScsIDIsIDB4MDAsIDB4MDEsIDB4MTEsIDB4NzAsIDB4RkYsIDB4RkUsIDB4RUUsIDB4OTB9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKSA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oImFycmF5IG9mIEwiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gaiA9IHs1MDAwMDAwMDAwLCAtNTAwMDAwMDAwMH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnJCcsICdMJywgJyMnLCAnaScsIDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RDUsIDB4RkEsIDB4MEUsIDB4MDB9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKSA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJ1bnNpZ25lZCBpbnRlZ2VyIikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigiYXJyYXkgb2YgaSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBqID0gezF1LCAydX07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnJCcsICdpJywgJyMnLCAnaScsIDIsIDEsIDJ9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkX3NpemUgPSB7J1snLCAnIycsICdpJywgMiwgJ2knLCAxLCAnaScsIDJ9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKSA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUpID09IGV4cGVjdGVkX3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJhcnJheSBvZiBVIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqc29uIGogPSB7MjAwdSwgMjAxdX07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWQgPSB7J1snLCAnJCcsICdVJywgJyMnLCAnaScsIDIsIDB4QzgsIDB4Qzl9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkX3NpemUgPSB7J1snLCAnIycsICdpJywgMiwgJ1UnLCAweEM4LCAnVScsIDB4Qzl9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKSA9PSBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUpID09IGV4cGVjdGVkX3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNUSU9OKCJhcnJheSBvZiBJIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqc29uIGogPSB7MzAwMDB1LCAzMDAwMXV9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnSScsICcjJywgJ2knLCAyLCAweDc1LCAweDMwLCAweDc1LCAweDMxfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZF9zaXplID0geydbJywgJyMnLCAnaScsIDIsICdJJywgMHg3NSwgMHgzMCwgJ0knLCAweDc1LCAweDMxfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlKSA9PSBleHBlY3RlZF9zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiYXJyYXkgb2YgbCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAganNvbiBqID0gezcwMDAwdSwgNzAwMDF1fTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICckJywgJ2wnLCAnIycsICdpJywgMiwgMHgwMCwgMHgwMSwgMHgxMSwgMHg3MCwgMHgwMCwgMHgwMSwgMHgxMSwgMHg3MX07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZXhwZWN0ZWRfc2l6ZSA9IHsnWycsICcjJywgJ2knLCAyLCAnbCcsIDB4MDAsIDB4MDEsIDB4MTEsIDB4NzAsICdsJywgMHgwMCwgMHgwMSwgMHgxMSwgMHg3MX07CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUsIHRydWUpID09IGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSkgPT0gZXhwZWN0ZWRfc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oImFycmF5IG9mIEwiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpzb24gaiA9IHs1MDAwMDAwMDAwdSwgNTAwMDAwMDAwMXV9OworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGV4cGVjdGVkID0geydbJywgJyQnLCAnTCcsICcjJywgJ2knLCAyLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLCAweDA1LCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLCAweDA1LCAweEYyLCAweDAxfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZF9zaXplID0geydbJywgJyMnLCAnaScsIDIsICdMJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyQSwgMHgwNSwgMHhGMiwgMHgwMCwgJ0wnLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLCAweDA1LCAweEYyLCAweDAxfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlKSA9PSBleHBlY3RlZF9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oImRpc2NhcmRlZCIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9IHtqc29uOjp2YWx1ZV90OjpkaXNjYXJkZWQsIGpzb246OnZhbHVlX3Q6OmRpc2NhcmRlZH07CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBleHBlY3RlZCA9IHsnWycsICckJywgJ04nLCAnIycsICdpJywgMn07CisgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gZXhwZWN0ZWQpOworICAgICAgICB9CisgICAgfQorfQorCisvKgorLy8gdXNlIHRoaXMgdGVzdGNhc2Ugb3V0c2lkZSBbaGlkZV0gdG8gcnVuIGl0IHdpdGggVmFsZ3JpbmQKK1RFU1RfQ0FTRSgic2luZ2xlIFVCSlNPTiByb3VuZHRyaXAiKQoreworICAgIFNFQ1RJT04oInNhbXBsZS5qc29uIikKKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gInRlc3QvZGF0YS9qc29uX3Rlc3RzdWl0ZS9zYW1wbGUuanNvbiI7CisKKyAgICAgICAgLy8gcGFyc2UgSlNPTiBmaWxlCisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl9qc29uKGZpbGVuYW1lKTsKKyAgICAgICAganNvbiBqMSA9IGpzb246OnBhcnNlKGZfanNvbik7CisKKyAgICAgICAgLy8gcGFyc2UgTWVzc2FnZVBhY2sgZmlsZQorICAgICAgICBzdGQ6Omlmc3RyZWFtIGZfdWJqc29uKGZpbGVuYW1lICsgIi51YmoiLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2VkKChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl91Ympzb24pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKTsKKyAgICAgICAganNvbiBqMjsKKyAgICAgICAgQ0hFQ0tfTk9USFJPVyhqMiA9IGpzb246OmZyb21fdWJqc29uKHBhY2tlZCkpOworCisgICAgICAgIC8vIGNvbXBhcmUgcGFyc2VkIEpTT04gdmFsdWVzCisgICAgICAgIENIRUNLKGoxID09IGoyKTsKKworICAgICAgICBTRUNUSU9OKCJyb3VuZHRyaXBzIikKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVElPTigic3RkOjpvc3RyaW5nc3RyZWFtIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICAgICAganNvbjo6dG9fdWJqc29uKGoxLCBzcyk7CisgICAgICAgICAgICAgICAganNvbiBqMyA9IGpzb246OmZyb21fdWJqc29uKHNzLnN0cigpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqMSA9PSBqMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oInN0ZDo6c3RyaW5nIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzOworICAgICAgICAgICAgICAgIGpzb246OnRvX3VianNvbihqMSwgcyk7CisgICAgICAgICAgICAgICAganNvbiBqMyA9IGpzb246OmZyb21fdWJqc29uKHMpOworICAgICAgICAgICAgICAgIENIRUNLKGoxID09IGozKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHdpdGggZGlmZmVyZW50IHN0YXJ0IGluZGV4CisgICAgICAgIC8vIHBhY2tlZC5pbnNlcnQocGFja2VkLmJlZ2luKCksIDUsIDB4ZmYpOworICAgICAgICAvLyBDSEVDSyhqMSA9PSBqc29uOjpmcm9tX3VianNvbihwYWNrZWQuYmVnaW4oKSArIDUsIHBhY2tlZC5lbmQoKSkpOworICAgIH0KK30KKyovCisKKy8qCitURVNUX0NBU0UoIlVCSlNPTiByb3VuZHRyaXBzIiwgIltoaWRlXSIpCit7CisgICAgU0VDVElPTigiaW5wdXQgZnJvbSBweS11Ympzb24iKQorICAgIHsKKyAgICAgICAgZm9yIChzdGQ6OnN0cmluZyBmaWxlbmFtZSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fbmxvaG1hbm5fdGVzdHMvYWxsX3VuaWNvZGUuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvMS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uLm9yZy8yLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb24ub3JnLzMuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvNC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uLm9yZy81Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDExLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fdGVzdHN1aXRlL3NhbXBsZS5qc29uIiwgLy8ga2lsbHMgQXBwVmV5b3IKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uX3Rlc3RzL3Bhc3MxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczIuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL2Zsb2F0cy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL3NpZ25lZF9pbnRzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL3JlZ3Jlc3Npb24vdW5zaWduZWRfaW50cy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9yZWdyZXNzaW9uL3dvcmtpbmdfZmlsZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfYXJyYXlzV2l0aFNwYWNlcy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfZW1wdHktc3RyaW5nLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV9lbXB0eS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfZW5kaW5nX3dpdGhfbmV3bGluZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfZmFsc2UuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X2hldGVyb2dlbmVvdXMuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X251bGwuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X2FycmF5X3dpdGhfMV9hbmRfbmV3bGluZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfd2l0aF9sZWFkaW5nX3NwYWNlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9hcnJheV93aXRoX3NldmVyYWxfbnVsbC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfYXJyYXlfd2l0aF90cmFpbGluZ19zcGFjZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfMGUrMS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyXzBlMS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX2FmdGVyX3NwYWNlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfZG91YmxlX2Nsb3NlX3RvX3plcm8uanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9kb3VibGVfaHVnZV9uZWdfZXhwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9odWdlX2V4cC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX2ludF93aXRoX2V4cC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX21pbnVzX3plcm8uanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9uZWdhdGl2ZV9pbnQuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9uZWdhdGl2ZV9vbmUuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9uZWdhdGl2ZV96ZXJvLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9jYXBpdGFsX2UuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX2NhcGl0YWxfZV9uZWdfZXhwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9jYXBpdGFsX2VfcG9zX2V4cC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfZXhwb25lbnQuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX2ZyYWN0aW9uX2V4cG9uZW50Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfcmVhbF9uZWdfZXhwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX25lZ19vdmVyZmxvdy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfcG9zX2V4cG9uZW50Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl9yZWFsX3Bvc19vdmVyZmxvdy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3JlYWxfdW5kZXJmbG93Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfc2ltcGxlX2ludC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3NpbXBsZV9yZWFsLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAvLyJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X251bWJlcl90b29fYmlnX25lZ19pbnQuanNvbiIsCisgICAgICAgICAgICAgICAgICAgIC8vInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfbnVtYmVyX3Rvb19iaWdfcG9zX2ludC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgLy8idGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9udW1iZXJfdmVyeV9iaWdfbmVnYXRpdmVfaW50Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3QuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9iYXNpYy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfb2JqZWN0X2R1cGxpY2F0ZWRfa2V5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfZHVwbGljYXRlZF9rZXlfYW5kX3ZhbHVlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfZW1wdHkuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9lbXB0eV9rZXkuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF9lc2NhcGVkX251bGxfaW5fa2V5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfZXh0cmVtZV9udW1iZXJzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3RfbG9uZ19zdHJpbmdzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3Rfc2ltcGxlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9vYmplY3Rfc3RyaW5nX3VuaWNvZGUuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X29iamVjdF93aXRoX25ld2xpbmVzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfMV8yXzNfYnl0ZXNfVVRGLThfc2VxdWVuY2VzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfVVRGLTE2X1N1cnJvZ2F0ZXNfVSsxRDExRV9NVVNJQ0FMX1NZTUJPTF9HX0NMRUYuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19hY2NlcHRlZF9zdXJyb2dhdGVfcGFpci5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2FjY2VwdGVkX3N1cnJvZ2F0ZV9wYWlycy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2FsbG93ZWRfZXNjYXBlcy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2JhY2tzbGFzaF9hbmRfdV9lc2NhcGVkX3plcm8uanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19iYWNrc2xhc2hfZG91YmxlcXVvdGVzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfY29tbWVudHMuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19kb3VibGVfZXNjYXBlX2EuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19kb3VibGVfZXNjYXBlX24uanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19lc2NhcGVkX2NvbnRyb2xfY2hhcmFjdGVyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfZXNjYXBlZF9ub25jaGFyYWN0ZXIuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19pbl9hcnJheS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2luX2FycmF5X3dpdGhfbGVhZGluZ19zcGFjZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX2xhc3Rfc3Vycm9nYXRlc18xX2FuZF8yLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfbmV3bGluZV91ZXNjYXBlZC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX25vbkNoYXJhY3RlckluVVRGLThfVSsxMEZGRkYuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19ub25DaGFyYWN0ZXJJblVURi04X1UrMUZGRkYuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19ub25DaGFyYWN0ZXJJblVURi04X1UrRkZGRi5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX251bGxfZXNjYXBlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfb25lLWJ5dGUtdXRmLTguanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ19waS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3NpbXBsZV9hc2NpaS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3NwYWNlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdGhyZWUtYnl0ZS11dGYtOC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3R3by1ieXRlLXV0Zi04Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdSsyMDI4X2xpbmVfc2VwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdSsyMDI5X3Bhcl9zZXAuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cmluZ191RXNjYXBlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5lc2NhcGVkX2NoYXJfZGVsZXRlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VuaWNvZGVFc2NhcGVkQmFja3NsYXNoLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV8yLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV9VKzIwMEJfWkVST19XSURUSF9TUEFDRS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3VuaWNvZGVfVSsyMDY0X2ludmlzaWJsZV9wbHVzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdW5pY29kZV9lc2NhcGVkX2RvdWJsZV9xdW90ZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgLy8gInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3V0ZjE2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJpbmdfdXRmOC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RyaW5nX3dpdGhfZGVsX2NoYXJhY3Rlci5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9mYWxzZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9pbnQuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV9sb25lbHlfbmVnYXRpdmVfcmVhbC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV9udWxsLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfbG9uZWx5X3N0cmluZy5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX2xvbmVseV90cnVlLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfc3RyaW5nX2VtcHR5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL25zdF9qc29uX3Rlc3RzdWl0ZS90ZXN0X3BhcnNpbmcveV9zdHJ1Y3R1cmVfdHJhaWxpbmdfbmV3bGluZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9uc3RfanNvbl90ZXN0c3VpdGUvdGVzdF9wYXJzaW5nL3lfc3RydWN0dXJlX3RydWVfaW5fYXJyYXkuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvbnN0X2pzb25fdGVzdHN1aXRlL3Rlc3RfcGFyc2luZy95X3N0cnVjdHVyZV93aGl0ZXNwYWNlX2FycmF5Lmpzb24iCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgeworICAgICAgICAgICAgQ0FQVFVSRShmaWxlbmFtZSk7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIEpTT04gZmlsZQorICAgICAgICAgICAgc3RkOjppZnN0cmVhbSBmX2pzb24oZmlsZW5hbWUpOworICAgICAgICAgICAganNvbiBqMSA9IGpzb246OnBhcnNlKGZfanNvbik7CisKKyAgICAgICAgICAgIFNFQ1RJT04oInN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSBVQkpTT04gZmlsZQorICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl91Ympzb24oZmlsZW5hbWUgKyAiLnViaiIsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX3VianNvbikpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSk7CisgICAgICAgICAgICAgICAganNvbiBqMjsKKyAgICAgICAgICAgICAgICBDSEVDS19OT1RIUk9XKGoyID0ganNvbjo6ZnJvbV91Ympzb24ocGFja2VkKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcworICAgICAgICAgICAgICAgIENIRUNLKGoxID09IGoyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigic3RkOjppZnN0cmVhbSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcGFyc2UgVUJKU09OIGZpbGUKKyAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGZfdWJqc29uKGZpbGVuYW1lICsgIi51YmoiLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgICAgICAgICAgICAgICBqc29uIGoyOworICAgICAgICAgICAgICAgIENIRUNLX05PVEhST1coajIgPSBqc29uOjpmcm9tX3VianNvbihmX3VianNvbikpOworCisgICAgICAgICAgICAgICAgLy8gY29tcGFyZSBwYXJzZWQgSlNPTiB2YWx1ZXMKKyAgICAgICAgICAgICAgICBDSEVDSyhqMSA9PSBqMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oInVpbnQ4X3QqIGFuZCBzaXplIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSBVQkpTT04gZmlsZQorICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl91Ympzb24oZmlsZW5hbWUgKyAiLnViaiIsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX3VianNvbikpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSk7CisgICAgICAgICAgICAgICAganNvbiBqMjsKKyAgICAgICAgICAgICAgICBDSEVDS19OT1RIUk9XKGoyID0ganNvbjo6ZnJvbV91Ympzb24oe3BhY2tlZC5kYXRhKCksIHBhY2tlZC5zaXplKCl9KSk7CisKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcworICAgICAgICAgICAgICAgIENIRUNLKGoxID09IGoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyovCisKK1RFU1RfQ0FTRSgiVW5pdmVyc2FsIEJpbmFyeSBKU09OIFNwZWNpZmljYXRpb24gRXhhbXBsZXMgMSIpCit7CisgICAgU0VDVElPTigiTnVsbCBWYWx1ZSIpCisgICAgeworICAgICAgICBqc29uIGogPSB7eyJwYXNzY29kZSIsIG51bGxwdHJ9fTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsneycsICdpJywgOCwgJ3AnLCAnYScsICdzJywgJ3MnLCAnYycsICdvJywgJ2QnLCAnZScsICdaJywgJ30nfTsKKyAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGopID09IHYpOworICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2KSA9PSBqKTsKKyAgICB9CisKKyAgICBTRUNUSU9OKCJOby1PcCBWYWx1ZSIpCisgICAgeworICAgICAgICBqc29uIGogPSB7ImZvbyIsICJiYXIiLCAiYmF6In07CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1snLCAnUycsICdpJywgMywgJ2YnLCAnbycsICdvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsICdpJywgMywgJ2InLCAnYScsICdyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsICdpJywgMywgJ2InLCAnYScsICd6JywgJ10nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2MiA9IHsnWycsICdTJywgJ2knLCAzLCAnZicsICdvJywgJ28nLCAnTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJywgJ2knLCAzLCAnYicsICdhJywgJ3InLCAnTicsICdOJywgJ04nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsICdpJywgMywgJ2InLCAnYScsICd6JywgJ04nLCAnTicsICddJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYyKSA9PSBqKTsKKyAgICB9CisKKyAgICBTRUNUSU9OKCJCb29sZWFuIFR5cGVzIikKKyAgICB7CisgICAgICAgIGpzb24gaiA9IHt7ImF1dGhvcml6ZWQiLCB0cnVlfSwgeyJ2ZXJpZmllZCIsIGZhbHNlfX07CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J3snLCAnaScsIDEwLCAnYScsICd1JywgJ3QnLCAnaCcsICdvJywgJ3InLCAnaScsICd6JywgJ2UnLCAnZCcsICdUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDgsICd2JywgJ2UnLCAncicsICdpJywgJ2YnLCAnaScsICdlJywgJ2QnLCAnRicsICd9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGopID09IHYpOworICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2KSA9PSBqKTsKKyAgICB9CisKKyAgICBTRUNUSU9OKCJOdW1lcmljIFR5cGVzIikKKyAgICB7CisgICAgICAgIGpzb24gaiA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsiaW50OCIsIDE2fSwKKyAgICAgICAgICAgIHsidWludDgiLCAyNTV9LAorICAgICAgICAgICAgeyJpbnQxNiIsIDMyNzY3fSwKKyAgICAgICAgICAgIHsiaW50MzIiLCAyMTQ3NDgzNjQ3fSwKKyAgICAgICAgICAgIHsiaW50NjQiLCA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKKyAgICAgICAgICAgIHsiZmxvYXQ2NCIsIDExMzI0My43ODYzMTIzfQorICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geyd7JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDcsICdmJywgJ2wnLCAnbycsICdhJywgJ3QnLCAnNicsICc0JywgJ0QnLCAweDQwLCAweGZiLCAweGE1LCAweGJjLCAweDk0LCAweGJjLCAweDM0LCAweGNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNSwgJ2knLCAnbicsICd0JywgJzEnLCAnNicsICdJJywgMHg3ZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDUsICdpJywgJ24nLCAndCcsICczJywgJzInLCAnbCcsIDB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA1LCAnaScsICduJywgJ3QnLCAnNicsICc0JywgJ0wnLCAweDdmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNCwgJ2knLCAnbicsICd0JywgJzgnLCAnaScsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNSwgJ3UnLCAnaScsICduJywgJ3QnLCAnOCcsICdVJywgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgfQorCisgICAgU0VDVElPTigiQ2hhciBUeXBlIikKKyAgICB7CisgICAgICAgIGpzb24gaiA9IHt7InJvbGVjb2RlIiwgImEifSwgeyJkZWxpbSIsICI7In19OworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geyd7JywgJ2knLCA1LCAnZCcsICdlJywgJ2wnLCAnaScsICdtJywgJ0MnLCAnOycsICdpJywgOCwgJ3InLCAnbycsICdsJywgJ2UnLCAnYycsICdvJywgJ2QnLCAnZScsICdDJywgJ2EnLCAnfSd9OworICAgICAgICAvL0NIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgfQorCisgICAgU0VDVElPTigiU3RyaW5nIFR5cGUiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigiRW5nbGlzaCIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9ICJoZWxsbyI7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geydTJywgJ2knLCA1LCAnaCcsICdlJywgJ2wnLCAnbCcsICdvJ307CisgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaikgPT0gdik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2KSA9PSBqKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oIlJ1c3NpYW4iKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPSAi0L/RgNC40LLQtdGCIjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1MnLCAnaScsIDEyLCAweEQwLCAweEJGLCAweEQxLCAweDgwLCAweEQwLCAweEI4LCAweEQwLCAweEIyLCAweEQwLCAweEI1LCAweEQxLCAweDgyfTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiUnVzc2lhbiIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9ICLZhdix2K3YqNinIjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1MnLCAnaScsIDEwLCAweEQ5LCAweDg1LCAweEQ4LCAweEIxLCAweEQ4LCAweEFELCAweEQ4LCAweEE4LCAweEQ4LCAweEE3fTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiQXJyYXkgVHlwZSIpCisgICAgeworICAgICAgICBTRUNUSU9OKCJzaXplPWZhbHNlIHR5cGU9ZmFsc2UiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RlIHRoZSBmbG9hdCBoYXMgYmVlbiByZXBsYWNlZCBieSBhIGRvdWJsZQorICAgICAgICAgICAganNvbiBqID0ge251bGxwdHIsIHRydWUsIGZhbHNlLCA0NzgyMzQ1MTkzLCAxNTMuMTMyLCAiaGFtIn07CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geydbJywgJ1onLCAnVCcsICdGJywgJ0wnLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDFELCAweDBDLCAweENCLCAweEU5LCAnRCcsIDB4NDAsIDB4NjMsIDB4MjQsIDB4MzksIDB4NTgsIDB4MTAsIDB4NjIsIDB4NGUsICdTJywgJ2knLCAzLCAnaCcsICdhJywgJ20nLCAnXSd9OworICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGopID09IHYpOworICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJzaXplPXRydWUgdHlwZT1mYWxzZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGUgdGhlIGZsb2F0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGEgZG91YmxlCisgICAgICAgICAgICBqc29uIGogPSB7bnVsbHB0ciwgdHJ1ZSwgZmFsc2UsIDQ3ODIzNDUxOTMsIDE1My4xMzIsICJoYW0ifTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1snLCAnIycsICdpJywgNiwgJ1onLCAnVCcsICdGJywgJ0wnLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDFELCAweDBDLCAweENCLCAweEU5LCAnRCcsIDB4NDAsIDB4NjMsIDB4MjQsIDB4MzksIDB4NTgsIDB4MTAsIDB4NjIsIDB4NGUsICdTJywgJ2knLCAzLCAnaCcsICdhJywgJ20nfTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9dHJ1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGUgdGhlIGZsb2F0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGEgZG91YmxlCisgICAgICAgICAgICBqc29uIGogPSB7bnVsbHB0ciwgdHJ1ZSwgZmFsc2UsIDQ3ODIzNDUxOTMsIDE1My4xMzIsICJoYW0ifTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J1snLCAnIycsICdpJywgNiwgJ1onLCAnVCcsICdGJywgJ0wnLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDFELCAweDBDLCAweENCLCAweEU5LCAnRCcsIDB4NDAsIDB4NjMsIDB4MjQsIDB4MzksIDB4NTgsIDB4MTAsIDB4NjIsIDB4NGUsICdTJywgJ2knLCAzLCAnaCcsICdhJywgJ20nfTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlLCB0cnVlKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiT2JqZWN0IFR5cGUiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigic2l6ZT1mYWxzZSB0eXBlPWZhbHNlIikKKyAgICAgICAgeworICAgICAgICAgICAganNvbiBqID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJwb3N0IiwgeworICAgICAgICAgICAgICAgICAgICAgICAgeyJpZCIsIDExMzd9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJhdXRob3IiLCAicmthbGxhIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7InRpbWVzdGFtcCIsIDEzNjQ0ODIwOTA1OTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJib2R5IiwgIkkgdG90YWxseSBhZ3JlZSEifQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHYgPSB7J3snLCAnaScsIDQsICdwJywgJ28nLCAncycsICd0JywgJ3snLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDYsICdhJywgJ3UnLCAndCcsICdoJywgJ28nLCAncicsICdTJywgJ2knLCA2LCAncicsICdrJywgJ2EnLCAnbCcsICdsJywgJ2EnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDQsICdiJywgJ28nLCAnZCcsICd5JywgJ1MnLCAnaScsIDE2LCAnSScsICcgJywgJ3QnLCAnbycsICd0JywgJ2EnLCAnbCcsICdsJywgJ3knLCAnICcsICdhJywgJ2cnLCAncicsICdlJywgJ2UnLCAnIScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgMiwgJ2knLCAnZCcsICdJJywgMHgwNCwgMHg3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA5LCAndCcsICdpJywgJ20nLCAnZScsICdzJywgJ3QnLCAnYScsICdtJywgJ3AnLCAnTCcsIDB4MDAsIDB4MDAsIDB4MDEsIDB4M0QsIDB4QjEsIDB4NzgsIDB4NjYsIDB4NjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JywgJ30nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9ZmFsc2UiKQorICAgICAgICB7CisgICAgICAgICAgICBqc29uIGogPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInBvc3QiLCB7CisgICAgICAgICAgICAgICAgICAgICAgICB7ImlkIiwgMTEzN30sCisgICAgICAgICAgICAgICAgICAgICAgICB7ImF1dGhvciIsICJya2FsbGEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsidGltZXN0YW1wIiwgMTM2NDQ4MjA5MDU5Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ImJvZHkiLCAiSSB0b3RhbGx5IGFncmVlISJ9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsneycsICcjJywgJ2knLCAxLCAnaScsIDQsICdwJywgJ28nLCAncycsICd0JywgJ3snLCAnIycsICdpJywgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA2LCAnYScsICd1JywgJ3QnLCAnaCcsICdvJywgJ3InLCAnUycsICdpJywgNiwgJ3InLCAnaycsICdhJywgJ2wnLCAnbCcsICdhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA0LCAnYicsICdvJywgJ2QnLCAneScsICdTJywgJ2knLCAxNiwgJ0knLCAnICcsICd0JywgJ28nLCAndCcsICdhJywgJ2wnLCAnbCcsICd5JywgJyAnLCAnYScsICdnJywgJ3InLCAnZScsICdlJywgJyEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDIsICdpJywgJ2QnLCAnSScsIDB4MDQsIDB4NzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgOSwgJ3QnLCAnaScsICdtJywgJ2UnLCAncycsICd0JywgJ2EnLCAnbScsICdwJywgJ0wnLCAweDAwLCAweDAwLCAweDAxLCAweDNELCAweEIxLCAweDc4LCAweDY2LCAweDYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqLCB0cnVlKSA9PSB2KTsKKyAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigic2l6ZT10cnVlIHR5cGU9dHJ1ZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGpzb24gaiA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAicG9zdCIsIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiaWQiLCAxMTM3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiYXV0aG9yIiwgInJrYWxsYSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyJ0aW1lc3RhbXAiLCAxMzY0NDgyMDkwNTkyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiYm9keSIsICJJIHRvdGFsbHkgYWdyZWUhIn0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geyd7JywgJyQnLCAneycsICcjJywgJ2knLCAxLCAnaScsIDQsICdwJywgJ28nLCAncycsICd0JywgJyMnLCAnaScsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNiwgJ2EnLCAndScsICd0JywgJ2gnLCAnbycsICdyJywgJ1MnLCAnaScsIDYsICdyJywgJ2snLCAnYScsICdsJywgJ2wnLCAnYScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNCwgJ2InLCAnbycsICdkJywgJ3knLCAnUycsICdpJywgMTYsICdJJywgJyAnLCAndCcsICdvJywgJ3QnLCAnYScsICdsJywgJ2wnLCAneScsICcgJywgJ2EnLCAnZycsICdyJywgJ2UnLCAnZScsICchJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCAyLCAnaScsICdkJywgJ0knLCAweDA0LCAweDcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDksICd0JywgJ2knLCAnbScsICdlJywgJ3MnLCAndCcsICdhJywgJ20nLCAncCcsICdMJywgMHgwMCwgMHgwMCwgMHgwMSwgMHgzRCwgMHhCMSwgMHg3OCwgMHg2NiwgMHg2MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gdik7CisgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2KSA9PSBqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ1RJT04oIk9wdGltaXplZCBGb3JtYXQiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigiQXJyYXkgRXhhbXBsZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ1RJT04oIk5vIE9wdGltaXphdGlvbiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGUgZmxvYXRzIGhhdmUgYmVlbiByZXBsYWNlZCBieSBkb3VibGVzCisgICAgICAgICAgICAgICAganNvbiBqID0gezI5Ljk3LCAzMS4xMywgNjcuMCwgMi4xMTMsIDIzLjg4OH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsnWycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4M2QsIDB4ZjgsIDB4NTEsIDB4ZWIsIDB4ODUsIDB4MWUsIDB4YjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4M2YsIDB4MjEsIDB4NDcsIDB4YWUsIDB4MTQsIDB4N2EsIDB4ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4NTAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4MDAsIDB4ZTcsIDB4NmMsIDB4OGIsIDB4NDMsIDB4OTUsIDB4ODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4MzcsIDB4ZTMsIDB4NTMsIDB4ZjcsIDB4Y2UsIDB4ZDksIDB4MTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaikgPT0gdik7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk9wdGltaXplZCB3aXRoIGNvdW50IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlIHRoZSBmbG9hdHMgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IGRvdWJsZXMKKyAgICAgICAgICAgICAgICBqc29uIGogPSB7MjkuOTcsIDMxLjEzLCA2Ny4wLCAyLjExMywgMjMuODg4fTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geydbJywgJyMnLCAnaScsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4M2QsIDB4ZjgsIDB4NTEsIDB4ZWIsIDB4ODUsIDB4MWUsIDB4YjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4M2YsIDB4MjEsIDB4NDcsIDB4YWUsIDB4MTQsIDB4N2EsIDB4ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4NTAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4MDAsIDB4ZTcsIDB4NmMsIDB4OGIsIDB4NDMsIDB4OTUsIDB4ODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsIDB4NDAsIDB4MzcsIDB4ZTMsIDB4NTMsIDB4ZjcsIDB4Y2UsIDB4ZDksIDB4MTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSkgPT0gdik7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk9wdGltaXplZCB3aXRoIHR5cGUgJiBjb3VudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGUgZmxvYXRzIGhhdmUgYmVlbiByZXBsYWNlZCBieSBkb3VibGVzCisgICAgICAgICAgICAgICAganNvbiBqID0gezI5Ljk3LCAzMS4xMywgNjcuMCwgMi4xMTMsIDIzLjg4OH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsnWycsICckJywgJ0QnLCAnIycsICdpJywgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAsIDB4M2QsIDB4ZjgsIDB4NTEsIDB4ZWIsIDB4ODUsIDB4MWUsIDB4YjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwLCAweDNmLCAweDIxLCAweDQ3LCAweGFlLCAweDE0LCAweDdhLCAweGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCwgMHg1MCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAsIDB4MDAsIDB4ZTcsIDB4NmMsIDB4OGIsIDB4NDMsIDB4OTUsIDB4ODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwLCAweDM3LCAweGUzLCAweDUzLCAweGY3LCAweGNlLCAweGQ5LCAweDE3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6dG9fdWJqc29uKGosIHRydWUsIHRydWUpID09IHYpOworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiT2JqZWN0IEV4YW1wbGUiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJObyBPcHRpbWl6YXRpb24iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhlIGZsb2F0cyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgZG91YmxlcworICAgICAgICAgICAgICAgIGpzb24gaiA9IHsgeyJsYXQiLCAyOS45NzZ9LCB7ImxvbmciLCAzMS4xMzF9LCB7ImFsdCIsIDY3LjB9IH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsneycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDMsICdhJywgJ2wnLCAndCcsICdEJywgMHg0MCwgMHg1MCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgMywgJ2wnLCAnYScsICd0JywgJ0QnLCAweDQwLCAweDNkLCAweGY5LCAweGRiLCAweDIyLCAweGQwLCAweGU1LCAweDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA0LCAnbCcsICdvJywgJ24nLCAnZycsICdEJywgMHg0MCwgMHgzZiwgMHgyMSwgMHg4OSwgMHgzNywgMHg0YiwgMHhjNiwgMHhhOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OnRvX3VianNvbihqKSA9PSB2KTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjpmcm9tX3VianNvbih2KSA9PSBqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigiT3B0aW1pemVkIHdpdGggY291bnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhlIGZsb2F0cyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgZG91YmxlcworICAgICAgICAgICAgICAgIGpzb24gaiA9IHsgeyJsYXQiLCAyOS45NzZ9LCB7ImxvbmciLCAzMS4xMzF9LCB7ImFsdCIsIDY3LjB9IH07CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsneycsICcjJywgJ2knLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCAzLCAnYScsICdsJywgJ3QnLCAnRCcsIDB4NDAsIDB4NTAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsIDMsICdsJywgJ2EnLCAndCcsICdEJywgMHg0MCwgMHgzZCwgMHhmOSwgMHhkYiwgMHgyMiwgMHhkMCwgMHhlNSwgMHg2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywgNCwgJ2wnLCAnbycsICduJywgJ2cnLCAnRCcsIDB4NDAsIDB4M2YsIDB4MjEsIDB4ODksIDB4MzcsIDB4NGIsIDB4YzYsIDB4YTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSkgPT0gdik7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk9wdGltaXplZCB3aXRoIHR5cGUgJiBjb3VudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGUgZmxvYXRzIGhhdmUgYmVlbiByZXBsYWNlZCBieSBkb3VibGVzCisgICAgICAgICAgICAgICAganNvbiBqID0geyB7ImxhdCIsIDI5Ljk3Nn0sIHsibG9uZyIsIDMxLjEzMX0sIHsiYWx0IiwgNjcuMH0gfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ID0geyd7JywgJyQnLCAnRCcsICcjJywgJ2knLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCAzLCAnYScsICdsJywgJ3QnLCAweDQwLCAweDUwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCAzLCAnbCcsICdhJywgJ3QnLCAweDQwLCAweDNkLCAweGY5LCAweGRiLCAweDIyLCAweGQwLCAweGU1LCAweDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLCA0LCAnbCcsICdvJywgJ24nLCAnZycsIDB4NDAsIDB4M2YsIDB4MjEsIDB4ODksIDB4MzcsIDB4NGIsIDB4YzYsIDB4YTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBDSEVDSyhqc29uOjp0b191Ympzb24oaiwgdHJ1ZSwgdHJ1ZSkgPT0gdik7CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0gaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCJTcGVjaWFsIENhc2VzIChOdWxsLCBOby1PcCBhbmQgQm9vbGVhbikiKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNUSU9OKCJBcnJheSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsnWycsICckJywgJ04nLCAnIycsICdJJywgMHgwMiwgMHgwMH07CisgICAgICAgICAgICAgICAgQ0hFQ0soanNvbjo6ZnJvbV91Ympzb24odikgPT0ganNvbjo6YXJyYXkoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIk9iamVjdCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdiA9IHsneycsICckJywgJ1onLCAnIycsICdpJywgMywgJ2knLCA0LCAnbicsICdhJywgJ20nLCAnZScsICdpJywgOCwgJ3AnLCAnYScsICdzJywgJ3MnLCAndycsICdvJywgJ3InLCAnZCcsICdpJywgNSwgJ2UnLCAnbScsICdhJywgJ2knLCAnbCd9OworICAgICAgICAgICAgICAgIENIRUNLKGpzb246OmZyb21fdWJqc29uKHYpID09IGpzb24oeyB7Im5hbWUiLCBudWxscHRyfSwgeyJwYXNzd29yZCIsIG51bGxwdHJ9LCB7ImVtYWlsIiwgbnVsbHB0cn0gfSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorVEVTVF9DQVNFKCJVbml2ZXJzYWwgQmluYXJ5IEpTT04gU3BlY2lmaWNhdGlvbiBFeGFtcGxlcyAyIikKK3sKKyAgICBmb3IgKHN0ZDo6c3RyaW5nIHByZWZpeCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInRlc3QvZGF0YS91bml2ZXJzYWwtYmluYXJ5LWpzb24tamF2YS9Db3VjaERCNGsiLAorICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvdW5pdmVyc2FsLWJpbmFyeS1qc29uLWphdmEvTWVkaWFDb250ZW50IiwKKyAgICAgICAgICAgICAgICAidGVzdC9kYXRhL3VuaXZlcnNhbC1iaW5hcnktanNvbi1qYXZhL1R3aXR0ZXJUaW1lbGluZSIKKyAgICAgICAgICAgIH0pCisgICAgeworICAgICAgICBDQVBUVVJFKHByZWZpeCk7CisKKyAgICAgICAgLy8gcGFyc2UgSlNPTiBmaWxlCisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl9qc29uKHByZWZpeCArICIuZm9ybWF0dGVkLmpzb24iKTsKKyAgICAgICAganNvbiBqMSA9IGpzb246OnBhcnNlKGZfanNvbik7CisKKyAgICAgICAgU0VDVElPTigic3RkOjp2ZWN0b3I8dWludDhfdD4iKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBwYXJzZSBVQkpTT04gZmlsZQorICAgICAgICAgICAgc3RkOjppZnN0cmVhbSBmX3VianNvbihwcmVmaXggKyAiLnViaiIsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2VkKAorICAgICAgICAgICAgICAgIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl91Ympzb24pKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSk7CisgICAgICAgICAgICBqc29uIGoyOworICAgICAgICAgICAgQ0hFQ0tfTk9USFJPVyhqMiA9IGpzb246OmZyb21fdWJqc29uKHBhY2tlZCkpOworCisgICAgICAgICAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcworICAgICAgICAgICAgQ0hFQ0soajEgPT0gajIpOworICAgICAgICB9CisgICAgfQorfQorKi8KKworCitURVNUX0NBU0UoImFsbCBVQkpTT04gZmlyc3QgYnl0ZXMiLCAiWyF0aHJvd3NdIikKK3sKKyAgICAvLyB0aGVzZSBieXRlcyB3aWxsIGZhaWwgaW1tZWRpYXRlbHkgd2l0aCBleGNlcHRpb24gcGFyc2VfZXJyb3IuMTEyCisgICAgc3RkOjpzZXQ8dWludDhfdD4gc3VwcG9ydGVkID0KKyAgICB7CisgICAgICAgICdUJywgJ0YnLCAnWicsICdVJywgJ2knLCAnSScsICdsJywgJ0wnLCAnZCcsICdEJywgJ0MnLCAnUycsICdbJywgJ3snLCAnTicKKyAgICB9OworCisgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgMjU2OyArK2kpCisgICAgeworICAgICAgICBjb25zdCBhdXRvIGJ5dGUgPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKKyAgICAgICAgQ0FQVFVSRShieXRlKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAganNvbjo6ZnJvbV91Ympzb24oc3RkOjp2ZWN0b3I8dWludDhfdD4oMSwgYnl0ZSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChjb25zdCBqc29uOjpwYXJzZV9lcnJvciYgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBwYXJzZV9lcnJvci4xMTIgaXMgb25seSB0aHJvd24gaWYgdGhlCisgICAgICAgICAgICAvLyBmaXJzdCBieXRlIGlzIG5vdCBpbiB0aGUgc3VwcG9ydGVkIHNldAorICAgICAgICAgICAgQ0FQVFVSRShlLndoYXQoKSk7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKHN1cHBvcnRlZC5iZWdpbigpLCBzdXBwb3J0ZWQuZW5kKCksIGJ5dGUpID09IHN1cHBvcnRlZC5lbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhlLmlkID09IDExMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ0hFQ0soZS5pZCAhPSAxMTIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitURVNUX0NBU0UoIlVCSlNPTiByb3VuZHRyaXBzIiwgIltoaWRlXSIpCit7CisgICAgU0VDVElPTigiaW5wdXQgZnJvbSBzZWxmLWdlbmVyYXRlZCBVQkpTT04gZmlsZXMiKQorICAgIHsKKyAgICAgICAgZm9yIChzdGQ6OnN0cmluZyBmaWxlbmFtZSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fbmxvaG1hbm5fdGVzdHMvYWxsX3VuaWNvZGUuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvMS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uLm9yZy8yLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb24ub3JnLzMuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbi5vcmcvNC5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uLm9yZy81Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDAzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDA5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDExLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDEzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDE5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDIzLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI0Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI1Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI2Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI3Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI4Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDI5Lmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMwLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fcm91bmR0cmlwL3JvdW5kdHJpcDMyLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fdGVzdHN1aXRlL3NhbXBsZS5qc29uIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3QvZGF0YS9qc29uX3Rlc3RzL3Bhc3MxLmpzb24iLAorICAgICAgICAgICAgICAgICAgICAidGVzdC9kYXRhL2pzb25fdGVzdHMvcGFzczIuanNvbiIsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0L2RhdGEvanNvbl90ZXN0cy9wYXNzMy5qc29uIgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgIHsKKyAgICAgICAgICAgIENBUFRVUkUoZmlsZW5hbWUpOworCisgICAgICAgICAgICAvLyBwYXJzZSBKU09OIGZpbGUKKyAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl9qc29uKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGpzb24gajEgPSBqc29uOjpwYXJzZShmX2pzb24pOworCisgICAgICAgICAgICBTRUNUSU9OKCJzdGQ6OnZlY3Rvcjx1aW50OF90PiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcGFyc2UgTWVzc2FnZVBhY2sgZmlsZQorICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl91Ympzb24oZmlsZW5hbWUgKyAiLnVianNvbiIsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihmX3VianNvbikpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSk7CisgICAgICAgICAgICAgICAganNvbiBqMjsKKyAgICAgICAgICAgICAgICBDSEVDS19OT1RIUk9XKGoyID0ganNvbjo6ZnJvbV91Ympzb24ocGFja2VkKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcworICAgICAgICAgICAgICAgIENIRUNLKGoxID09IGoyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigic3RkOjppZnN0cmVhbSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcGFyc2UgTWVzc2FnZVBhY2sgZmlsZQorICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZl91Ympzb24oZmlsZW5hbWUgKyAiLnVianNvbiIsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICAgICAgICAgIGpzb24gajI7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTk9USFJPVyhqMiA9IGpzb246OmZyb21fdWJqc29uKGZfdWJqc29uKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHBhcnNlZCBKU09OIHZhbHVlcworICAgICAgICAgICAgICAgIENIRUNLKGoxID09IGoyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDVElPTigidWludDhfdCogYW5kIHNpemUiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHBhcnNlIE1lc3NhZ2VQYWNrIGZpbGUKKyAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGZfdWJqc29uKGZpbGVuYW1lICsgIi51Ympzb24iLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZWQoCisgICAgICAgICAgICAgICAgICAgIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl91Ympzb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOworICAgICAgICAgICAgICAgIGpzb24gajI7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTk9USFJPVyhqMiA9IGpzb246OmZyb21fdWJqc29uKHtwYWNrZWQuZGF0YSgpLCBwYWNrZWQuc2l6ZSgpfSkpOworCisgICAgICAgICAgICAgICAgLy8gY29tcGFyZSBwYXJzZWQgSlNPTiB2YWx1ZXMKKyAgICAgICAgICAgICAgICBDSEVDSyhqMSA9PSBqMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ1RJT04oIm91dHB1dCB0byBvdXRwdXQgYWRhcHRlcnMiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHBhcnNlIE1lc3NhZ2VQYWNrIGZpbGUKKyAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGZfdWJqc29uKGZpbGVuYW1lICsgIi51Ympzb24iLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYWNrZWQoCisgICAgICAgICAgICAgICAgICAgIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZl91Ympzb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOworCisgICAgICAgICAgICAgICAgU0VDVElPTigic3RkOjp2ZWN0b3I8dWludDhfdD4iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjOworICAgICAgICAgICAgICAgICAgICBqc29uOjp0b191Ympzb24oajEsIHZlYyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHZlYyA9PSBwYWNrZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtdWR0LmNwcCBiL3Rlc3Qvc3JjL3VuaXQtdWR0LmNwcAppbmRleCA0ZmQ2ZjdlLi4xN2JhZjRlIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LXVkdC5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC11ZHQuY3BwCkBAIC0xLDExICsxLDExIEBACiAvKgogICAgIF9fIF9fX19fIF9fX19fIF9fX19fCiAgX198ICB8ICAgX198ICAgICB8ICAgfCB8ICBKU09OIGZvciBNb2Rlcm4gQysrICh0ZXN0IHN1aXRlKQotfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjAuMQorfCAgfCAgfF9fICAgfCAgfCAgfCB8IHwgfCAgdmVyc2lvbiAzLjEuMAogfF9fX19ffF9fX19ffF9fX19ffF98X19ffCAgaHR0cHM6Ly9naXRodWIuY29tL25sb2htYW5uL2pzb24KIAogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPi4KLUNvcHlyaWdodCAoYykgMjAxMy0yMDE2IE5pZWxzIExvaG1hbm4gPGh0dHA6Ly9ubG9obWFubi5tZT4uCitDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgogCiBQZXJtaXNzaW9uIGlzIGhlcmVieSAgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSAgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiY2F0Y2guaHBwIgogCi0jaW5jbHVkZSAianNvbi5ocHAiCisjaW5jbHVkZSA8bmxvaG1hbm4vanNvbi5ocHA+CiAKIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCkBAIC02OTIsMyArNjkyLDIyIEBACiAgICAgQ0hFQ0sobWUgPT0gai5nZXQ8dWR0OjpwZXJzb24+KCkpOwogICAgIENIRUNLKG1lID09IGNqLmdldDx1ZHQ6OnBlcnNvbj4oKSk7CiB9CisKK25hbWVzcGFjZQoreworc3RydWN0IGluY29tcGxldGU7CisKKy8vIHN0ZDo6aXNfY29uc3RydWN0aWJsZSBpcyBicm9rZW4gb24gbWFjT1MnIGxpYmMrKworLy8gdXNlIHRoZSBjcHByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4KK3N0cnVjdCBpc19jb25zdHJ1Y3RpYmxlX3BhdGNoZWQgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGlzX2NvbnN0cnVjdGlibGVfcGF0Y2hlZDxULCBkZWNsdHlwZSh2b2lkKGpzb24oc3RkOjpkZWNsdmFsPFQ+KCkpKSk+IDogc3RkOjp0cnVlX3R5cGUge307Cit9CisKK1RFU1RfQ0FTRSgiYW4gaW5jb21wbGV0ZSB0eXBlIGRvZXMgbm90IHRyaWdnZXIgYSBjb21waWxlciBlcnJvciBpbiBub24tZXZhbHVhdGVkIGNvbnRleHQiLCAiW3VkdF0iKQoreworICAgIHN0YXRpY19hc3NlcnQobm90IGlzX2NvbnN0cnVjdGlibGVfcGF0Y2hlZDxqc29uLCBpbmNvbXBsZXRlPjo6dmFsdWUsICIiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL3VuaXQtdW5pY29kZS5jcHAgYi90ZXN0L3NyYy91bml0LXVuaWNvZGUuY3BwCmluZGV4IDNiMmEyMzkuLjA5OTEyOTAgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL3VuaXQtdW5pY29kZS5jcHAKKysrIGIvdGVzdC9zcmMvdW5pdC11bmljb2RlLmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjYXRjaC5ocHAiCiAKICNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKLSNpbmNsdWRlICJqc29uLmhwcCIKKyNpbmNsdWRlIDxubG9obWFubi9qc29uLmhwcD4KIHVzaW5nIG5sb2htYW5uOjpqc29uOwogCiAjaW5jbHVkZSA8ZnN0cmVhbT4KQEAgLTEwNzYsMyArMTA3NiwzOTUgQEAKICAgICAgICAgQ0hFQ0tfVEhST1dTX0FTKGpzb246OnBhcnNlKCJceGVmXHhiYlx4YmIiKSwganNvbjo6cGFyc2VfZXJyb3ImKTsKICAgICB9CiB9CisKK3ZvaWQgcm91bmR0cmlwKGJvb2wgc3VjY2Vzc19leHBlY3RlZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpOworCit2b2lkIHJvdW5kdHJpcChib29sIHN1Y2Nlc3NfZXhwZWN0ZWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQoreworICAgIENBUFRVUkUocyk7CisKKyAgICAvLyBjcmVhdGUgSlNPTiBzdHJpbmcgdmFsdWUKKyAgICBqc29uIGogPSBzOworICAgIC8vIGNyZWF0ZSBKU09OIHRleHQKKyAgICBzdGQ6OnN0cmluZyBwcyA9IHN0ZDo6c3RyaW5nKCJcIiIpICsgcyArICJcIiI7CisKKyAgICBpZiAoc3VjY2Vzc19leHBlY3RlZCkKKyAgICB7CisgICAgICAgIC8vIHNlcmlhbGl6YXRpb24gc3VjY2VlZHMKKyAgICAgICAgQ0hFQ0tfTk9USFJPVyhqLmR1bXAoKSk7CisKKyAgICAgICAgLy8gZXhjbHVkZSBwYXJzZSB0ZXN0IGZvciBVKzAwMDAKKyAgICAgICAgaWYgKHNbMF0gIT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcGFyc2luZyBKU09OIHRleHQgc3VjY2VlZHMKKyAgICAgICAgICAgIENIRUNLX05PVEhST1coanNvbjo6cGFyc2UocHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJvdW5kdHJpcCBzdWNjZWVkcworICAgICAgICBDSEVDS19OT1RIUk9XKGpzb246OnBhcnNlKGouZHVtcCgpKSk7CisKKyAgICAgICAgLy8gYWZ0ZXIgcm91bmR0cmlwLCB0aGUgc2FtZSBzdHJpbmcgaXMgc3RvcmVkCisgICAgICAgIGpzb24ganIgPSBqc29uOjpwYXJzZShqLmR1bXAoKSk7CisgICAgICAgIENIRUNLKGpyLmdldDxzdGQ6OnN0cmluZz4oKSA9PSBzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gc2VyaWFsaXphdGlvbiBmYWlscworICAgICAgICBDSEVDS19USFJPV1NfQVMoai5kdW1wKCksIGpzb246OnR5cGVfZXJyb3ImKTsKKworICAgICAgICAvLyBwYXJzaW5nIEpTT04gdGV4dCBmYWlscworICAgICAgICBDSEVDS19USFJPV1NfQVMoanNvbjo6cGFyc2UocHMpLCBqc29uOjpwYXJzZV9lcnJvciYpOworICAgIH0KK30KKworVEVTVF9DQVNFKCJNYXJrdXMgS3VobidzIFVURi04IGRlY29kZXIgY2FwYWJpbGl0eSBhbmQgc3RyZXNzIHRlc3QiKQoreworICAgIC8vIE1hcmt1cyBLdWhuIDxodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvPiAtIDIwMTUtMDgtMjggLSBDQyBCWSA0LjAKKyAgICAvLyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL2V4YW1wbGVzL1VURi04LXRlc3QudHh0CisKKyAgICBTRUNUSU9OKCIxICBTb21lIGNvcnJlY3QgVVRGLTggdGV4dCIpCisgICAgeworICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIs664b25z4POvM61Iik7CisgICAgfQorCisgICAgU0VDVElPTigiMiAgQm91bmRhcnkgY29uZGl0aW9uIHRlc3QgY2FzZXMiKQorICAgIHsKKyAgICAgICAgU0VDVElPTigiMi4xICBGaXJzdCBwb3NzaWJsZSBzZXF1ZW5jZSBvZiBhIGNlcnRhaW4gbGVuZ3RoIikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMi4xLjEgIDEgYnl0ZSAgKFUtMDAwMDAwMDApCisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgc3RkOjpzdHJpbmcoIlwwIiwgMSkpOworICAgICAgICAgICAgLy8gMi4xLjIgIDIgYnl0ZXMgKFUtMDAwMDAwODApCisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4YzJceDgwIik7CisgICAgICAgICAgICAvLyAyLjEuMyAgMyBieXRlcyAoVS0wMDAwMDgwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhlMFx4YTBceDgwIik7CisgICAgICAgICAgICAvLyAyLjEuNCAgNCBieXRlcyAoVS0wMDAxMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhmMFx4OTBceDgwXHg4MCIpOworCisgICAgICAgICAgICAvLyAyLjEuNSAgNSBieXRlcyAoVS0wMDIwMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4RjhceDg4XHg4MFx4ODBceDgwIik7CisgICAgICAgICAgICAvLyAyLjEuNiAgNiBieXRlcyAoVS0wNDAwMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4RkNceDg0XHg4MFx4ODBceDgwXHg4MCIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiMi4yICBMYXN0IHBvc3NpYmxlIHNlcXVlbmNlIG9mIGEgY2VydGFpbiBsZW5ndGgiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAyLjIuMSAgMSBieXRlICAoVS0wMDAwMDA3RikKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHg3ZiIpOworICAgICAgICAgICAgLy8gMi4yLjIgIDIgYnl0ZXMgKFUtMDAwMDA3RkYpCisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4ZGZceGJmIik7CisgICAgICAgICAgICAvLyAyLjIuMyAgMyBieXRlcyAoVS0wMDAwRkZGRikKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhlZlx4YmZceGJmIik7CisKKyAgICAgICAgICAgIC8vIDIuMi40ICA0IGJ5dGVzIChVLTAwMUZGRkZGKQorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhGN1x4QkZceEJGXHhCRiIpOworICAgICAgICAgICAgLy8gMi4yLjUgIDUgYnl0ZXMgKFUtMDNGRkZGRkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceEZCXHhCRlx4QkZceEJGXHhCRiIpOworICAgICAgICAgICAgLy8gMi4yLjYgIDYgYnl0ZXMgKFUtN0ZGRkZGRkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceEZEXHhCRlx4QkZceEJGXHhCRlx4QkYiKTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ1RJT04oIjIuMyAgT3RoZXIgYm91bmRhcnkgY29uZGl0aW9ucyIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDIuMy4xICBVLTAwMDBEN0ZGID0gZWQgOWYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhlZFx4OWZceGJmIik7CisgICAgICAgICAgICAvLyAyLjMuMiAgVS0wMDAwRTAwMCA9IGVlIDgwIDgwCisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4ZWVceDgwXHg4MCIpOworICAgICAgICAgICAgLy8gMi4zLjMgIFUtMDAwMEZGRkQgPSBlZiBiZiBiZAorICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceGVmXHhiZlx4YmQiKTsKKyAgICAgICAgICAgIC8vIDIuMy40ICBVLTAwMTBGRkZGID0gZjQgOGYgYmYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhmNFx4OGZceGJmXHhiZiIpOworCisgICAgICAgICAgICAvLyAyLjMuNSAgVS0wMDExMDAwMCA9IGY0IDkwIDgwIDgwCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGY0XHg5MFx4ODBceDgwIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNUSU9OKCIzICBNYWxmb3JtZWQgc2VxdWVuY2VzIikKKyAgICB7CisgICAgICAgIFNFQ1RJT04oIjMuMSAgVW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZXMiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFYWNoIHVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGUgc2hvdWxkIGJlIHNlcGFyYXRlbHkgc2lnbmFsbGVkIGFzIGEKKyAgICAgICAgICAgIC8vIG1hbGZvcm1lZCBzZXF1ZW5jZSBvZiBpdHMgb3duLgorCisgICAgICAgICAgICAvLyAzLjEuMSAgRmlyc3QgY29udGludWF0aW9uIGJ5dGUgMHg4MAorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHg4MCIpOworICAgICAgICAgICAgLy8gMy4xLjIgIExhc3QgIGNvbnRpbnVhdGlvbiBieXRlIDB4YmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4YmYiKTsKKworICAgICAgICAgICAgLy8gMy4xLjMgIDIgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceDgwXHhiZiIpOworICAgICAgICAgICAgLy8gMy4xLjQgIDMgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceDgwXHhiZlx4ODAiKTsKKyAgICAgICAgICAgIC8vIDMuMS41ICA0IGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHg4MFx4YmZceDgwXHhiZiIpOworICAgICAgICAgICAgLy8gMy4xLjYgIDUgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceDgwXHhiZlx4ODBceGJmXHg4MCIpOworICAgICAgICAgICAgLy8gMy4xLjcgIDYgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceDgwXHhiZlx4ODBceGJmXHg4MFx4YmYiKTsKKyAgICAgICAgICAgIC8vIDMuMS44ICA3IGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHg4MFx4YmZceDgwXHhiZlx4ODBceGJmXHg4MCIpOworCisgICAgICAgICAgICAvLyAzLjEuOSAgU2VxdWVuY2Ugb2YgYWxsIDY0IHBvc3NpYmxlIGNvbnRpbnVhdGlvbiBieXRlcyAoMHg4MC0weGJmKQorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODdceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4Zlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3XHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWZceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhN1x4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjdceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiMy4yICBMb25lbHkgc3RhcnQgY2hhcmFjdGVycyIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDMuMi4xICBBbGwgMzIgZmlyc3QgYnl0ZXMgb2YgMi1ieXRlIHNlcXVlbmNlcyAoMHhjMC0weGRmKQorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhjMCBceGMxIFx4YzIgXHhjMyBceGM0IFx4YzUgXHhjNiBceGM3IFx4YzggXHhjOSBceGNhIFx4Y2IgXHhjYyBceGNkIFx4Y2UgXHhjZiBceGQwIFx4ZDEgXHhkMiBceGQzIFx4ZDQgXHhkNSBceGQ2IFx4ZDcgXHhkOCBceGQ5IFx4ZGEgXHhkYiBceGRjIFx4ZGQgXHhkZSBceGRmIik7CisgICAgICAgICAgICAvLyAzLjIuMiAgQWxsIDE2IGZpcnN0IGJ5dGVzIG9mIDMtYnl0ZSBzZXF1ZW5jZXMgKDB4ZTAtMHhlZikKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZTAgXHhlMSBceGUyIFx4ZTMgXHhlNCBceGU1IFx4ZTYgXHhlNyBceGU4IFx4ZTkgXHhlYSBceGViIFx4ZWMgXHhlZCBceGVlIFx4ZWYiKTsKKyAgICAgICAgICAgIC8vIDMuMi4zICBBbGwgOCBmaXJzdCBieXRlcyBvZiA0LWJ5dGUgc2VxdWVuY2VzICgweGYwLTB4ZjcpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGYwIFx4ZjEgXHhmMiBceGYzIFx4ZjQgXHhmNSBceGY2IFx4ZjciKTsKKyAgICAgICAgICAgIC8vIDMuMi40ICBBbGwgNCBmaXJzdCBieXRlcyBvZiA1LWJ5dGUgc2VxdWVuY2VzICgweGY4LTB4ZmIpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGY4IFx4ZjkgXHhmYSBceGZiIik7CisgICAgICAgICAgICAvLyAzLjIuNSAgQWxsIDIgZmlyc3QgYnl0ZXMgb2YgNi1ieXRlIHNlcXVlbmNlcyAoMHhmYy0weGZkKQorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmYyBceGZkIik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCIzLjMgIFNlcXVlbmNlcyB3aXRoIGxhc3QgY29udGludWF0aW9uIGJ5dGUgbWlzc2luZyIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFsbCBieXRlcyBvZiBhbiBpbmNvbXBsZXRlIHNlcXVlbmNlIHNob3VsZCBiZSBzaWduYWxsZWQgYXMgYSBzaW5nbGUKKyAgICAgICAgICAgIC8vIG1hbGZvcm1lZCBzZXF1ZW5jZSwgaS5lLiwgeW91IHNob3VsZCBzZWUgb25seSBhIHNpbmdsZSByZXBsYWNlbWVudAorICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGluIGVhY2ggb2YgdGhlIG5leHQgMTAgdGVzdHMuIChDaGFyYWN0ZXJzIGFzIGluIHNlY3Rpb24gMikKKworICAgICAgICAgICAgLy8gMy4zLjEgIDItYnl0ZSBzZXF1ZW5jZSB3aXRoIGxhc3QgYnl0ZSBtaXNzaW5nIChVKzAwMDApCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGMwIik7CisgICAgICAgICAgICAvLyAzLjMuMiAgMy1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUrMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZTBceDgwIik7CisgICAgICAgICAgICAvLyAzLjMuMyAgNC1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUrMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZjBceDgwXHg4MCIpOworICAgICAgICAgICAgLy8gMy4zLjQgIDUtYnl0ZSBzZXF1ZW5jZSB3aXRoIGxhc3QgYnl0ZSBtaXNzaW5nIChVKzAwMDApCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGY4XHg4MFx4ODBceDgwIik7CisgICAgICAgICAgICAvLyAzLjMuNSAgNi1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUrMDAwMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZmNceDgwXHg4MFx4ODBceDgwIik7CisgICAgICAgICAgICAvLyAzLjMuNiAgMi1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDAwMDA3RkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGRmIik7CisgICAgICAgICAgICAvLyAzLjMuNyAgMy1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDAwMEZGRkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGVmXHhiZiIpOworICAgICAgICAgICAgLy8gMy4zLjggIDQtYnl0ZSBzZXF1ZW5jZSB3aXRoIGxhc3QgYnl0ZSBtaXNzaW5nIChVLTAwMUZGRkZGKQorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmN1x4YmZceGJmIik7CisgICAgICAgICAgICAvLyAzLjMuOSAgNS1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtMDNGRkZGRkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGZiXHhiZlx4YmZceGJmIik7CisgICAgICAgICAgICAvLyAzLjMuMTAgNi1ieXRlIHNlcXVlbmNlIHdpdGggbGFzdCBieXRlIG1pc3NpbmcgKFUtN0ZGRkZGRkYpCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGZkXHhiZlx4YmZceGJmXHhiZiIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiMy40ICBDb25jYXRlbmF0aW9uIG9mIGluY29tcGxldGUgc2VxdWVuY2VzIikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWxsIHRoZSAxMCBzZXF1ZW5jZXMgb2YgMy4zIGNvbmNhdGVuYXRlZCwgeW91IHNob3VsZCBzZWUgMTAgbWFsZm9ybWVkCisgICAgICAgICAgICAvLyBzZXF1ZW5jZXMgYmVpbmcgc2lnbmFsbGVkOgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhjMFx4ZTBceDgwXHhmMFx4ODBceDgwXHhmOFx4ODBceDgwXHg4MFx4ZmNceDgwXHg4MFx4ODBceDgwXHhkZlx4ZWZceGJmXHhmN1x4YmZceGJmXHhmYlx4YmZceGJmXHhiZlx4ZmRceGJmXHhiZlx4YmZceGJmIik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCIzLjUgIEltcG9zc2libGUgYnl0ZXMiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBieXRlcyBjYW5ub3QgYXBwZWFyIGluIGEgY29ycmVjdCBVVEYtOCBzdHJpbmcKKworICAgICAgICAgICAgLy8gMy41LjEgIGZlCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGZlIik7CisgICAgICAgICAgICAvLyAzLjUuMiAgZmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZmYiKTsKKyAgICAgICAgICAgIC8vIDMuNS4zICBmZSBmZSBmZiBmZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmZVx4ZmVceGZmXHhmZiIpOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiNCAgT3Zlcmxvbmcgc2VxdWVuY2VzIikKKyAgICB7CisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzIGFyZSBub3QgbWFsZm9ybWVkIGFjY29yZGluZyB0byB0aGUgbGV0dGVyIG9mCisgICAgICAgIC8vIHRoZSBVbmljb2RlIDIuMCBzdGFuZGFyZC4gSG93ZXZlciwgdGhleSBhcmUgbG9uZ2VyIHRoZW4gbmVjZXNzYXJ5IGFuZAorICAgICAgICAvLyBhIGNvcnJlY3QgVVRGLTggZW5jb2RlciBpcyBub3QgYWxsb3dlZCB0byBwcm9kdWNlIHRoZW0uIEEgInNhZmUgVVRGLTgKKyAgICAgICAgLy8gZGVjb2RlciIgc2hvdWxkIHJlamVjdCB0aGVtIGp1c3QgbGlrZSBtYWxmb3JtZWQgc2VxdWVuY2VzIGZvciB0d28KKyAgICAgICAgLy8gcmVhc29uczogKDEpIEl0IGhlbHBzIHRvIGRlYnVnIGFwcGxpY2F0aW9ucyBpZiBvdmVybG9uZyBzZXF1ZW5jZXMgYXJlCisgICAgICAgIC8vIG5vdCB0cmVhdGVkIGFzIHZhbGlkIHJlcHJlc2VudGF0aW9ucyBvZiBjaGFyYWN0ZXJzLCBiZWNhdXNlIHRoaXMgaGVscHMKKyAgICAgICAgLy8gdG8gc3BvdCBwcm9ibGVtcyBtb3JlIHF1aWNrbHkuICgyKSBPdmVybG9uZyBzZXF1ZW5jZXMgcHJvdmlkZQorICAgICAgICAvLyBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgb2YgY2hhcmFjdGVycywgdGhhdCBjb3VsZCBtYWxpY2lvdXNseSBiZQorICAgICAgICAvLyB1c2VkIHRvIGJ5cGFzcyBmaWx0ZXJzIHRoYXQgY2hlY2sgb25seSBmb3IgQVNDSUkgY2hhcmFjdGVycy4gRm9yCisgICAgICAgIC8vIGluc3RhbmNlLCBhIDItYnl0ZSBlbmNvZGVkIGxpbmUgZmVlZCAoTEYpIHdvdWxkIG5vdCBiZSBjYXVnaHQgYnkgYQorICAgICAgICAvLyBsaW5lIGNvdW50ZXIgdGhhdCBjb3VudHMgb25seSAweDBhIGJ5dGVzLCBidXQgaXQgd291bGQgc3RpbGwgYmUKKyAgICAgICAgLy8gcHJvY2Vzc2VkIGFzIGEgbGluZSBmZWVkIGJ5IGFuIHVuc2FmZSBVVEYtOCBkZWNvZGVyIGxhdGVyIGluIHRoZQorICAgICAgICAvLyBwaXBlbGluZS4gRnJvbSBhIHNlY3VyaXR5IHBvaW50IG9mIHZpZXcsIEFTQ0lJIGNvbXBhdGliaWxpdHkgb2YgVVRGLTgKKyAgICAgICAgLy8gc2VxdWVuY2VzIG1lYW5zIGFsc28sIHRoYXQgQVNDSUkgY2hhcmFjdGVycyBhcmUgKm9ubHkqIGFsbG93ZWQgdG8gYmUKKyAgICAgICAgLy8gcmVwcmVzZW50ZWQgYnkgQVNDSUkgYnl0ZXMgaW4gdGhlIHJhbmdlIDB4MDAtMHg3Zi4gVG8gZW5zdXJlIHRoaXMKKyAgICAgICAgLy8gYXNwZWN0IG9mIEFTQ0lJIGNvbXBhdGliaWxpdHksIHVzZSBvbmx5ICJzYWZlIFVURi04IGRlY29kZXJzIiB0aGF0CisgICAgICAgIC8vIHJlamVjdCBvdmVybG9uZyBVVEYtOCBzZXF1ZW5jZXMgZm9yIHdoaWNoIGEgc2hvcnRlciBlbmNvZGluZyBleGlzdHMuCisKKyAgICAgICAgU0VDVElPTigiNC4xICBFeGFtcGxlcyBvZiBhbiBvdmVybG9uZyBBU0NJSSBjaGFyYWN0ZXIiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaXRoIGEgc2FmZSBVVEYtOCBkZWNvZGVyLCBhbGwgb2YgdGhlIGZvbGxvd2luZyBmaXZlIG92ZXJsb25nCisgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIEFTQ0lJIGNoYXJhY3RlciBzbGFzaCAoIi8iKSBzaG91bGQgYmUgcmVqZWN0ZWQKKyAgICAgICAgICAgIC8vIGxpa2UgYSBtYWxmb3JtZWQgVVRGLTggc2VxdWVuY2UsIGZvciBpbnN0YW5jZSBieSBzdWJzdGl0dXRpbmcgaXQgd2l0aAorICAgICAgICAgICAgLy8gYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIElmIHlvdSBzZWUgYSBzbGFzaCBiZWxvdywgeW91IGRvIG5vdCBoYXZlIGEKKyAgICAgICAgICAgIC8vIHNhZmUgVVRGLTggZGVjb2RlciEKKworICAgICAgICAgICAgLy8gNC4xLjEgVSswMDJGID0gYzAgYWYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4YzBceGFmIik7CisgICAgICAgICAgICAvLyA0LjEuMiBVKzAwMkYgPSBlMCA4MCBhZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlMFx4ODBceGFmIik7CisgICAgICAgICAgICAvLyA0LjEuMyBVKzAwMkYgPSBmMCA4MCA4MCBhZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmMFx4ODBceDgwXHhhZiIpOworICAgICAgICAgICAgLy8gNC4xLjQgVSswMDJGID0gZjggODAgODAgODAgYWYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZjhceDgwXHg4MFx4ODBceGFmIik7CisgICAgICAgICAgICAvLyA0LjEuNSBVKzAwMkYgPSBmYyA4MCA4MCA4MCA4MCBhZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmY1x4ODBceDgwXHg4MFx4ODBceGFmIik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCI0LjIgIE1heGltdW0gb3Zlcmxvbmcgc2VxdWVuY2VzIikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQmVsb3cgeW91IHNlZSB0aGUgaGlnaGVzdCBVbmljb2RlIHZhbHVlIHRoYXQgaXMgc3RpbGwgcmVzdWx0aW5nIGluIGFuCisgICAgICAgICAgICAvLyBvdmVybG9uZyBzZXF1ZW5jZSBpZiByZXByZXNlbnRlZCB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuIFRoaXMKKyAgICAgICAgICAgIC8vIGlzIGEgYm91bmRhcnkgdGVzdCBmb3Igc2FmZSBVVEYtOCBkZWNvZGVycy4gQWxsIGZpdmUgY2hhcmFjdGVycyBzaG91bGQKKyAgICAgICAgICAgIC8vIGJlIHJlamVjdGVkIGxpa2UgbWFsZm9ybWVkIFVURi04IHNlcXVlbmNlcy4KKworICAgICAgICAgICAgLy8gNC4yLjEgIFUtMDAwMDAwN0YgPSBjMSBiZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhjMVx4YmYiKTsKKyAgICAgICAgICAgIC8vIDQuMi4yICBVLTAwMDAwN0ZGID0gZTAgOWYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZTBceDlmXHhiZiIpOworICAgICAgICAgICAgLy8gNC4yLjMgIFUtMDAwMEZGRkYgPSBmMCA4ZiBiZiBiZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmMFx4OGZceGJmXHhiZiIpOworICAgICAgICAgICAgLy8gNC4yLjQgIFUtMDAxRkZGRkYgPSBmOCA4NyBiZiBiZiBiZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhmOFx4ODdceGJmXHhiZlx4YmYiKTsKKyAgICAgICAgICAgIC8vIDQuMi41ICBVLTAzRkZGRkZGID0gZmMgODMgYmYgYmYgYmYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZmNceDgzXHhiZlx4YmZceGJmXHhiZiIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiNC4zICBPdmVybG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTlVMIGNoYXJhY3RlciIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZml2ZSBzZXF1ZW5jZXMgc2hvdWxkIGFsc28gYmUgcmVqZWN0ZWQgbGlrZSBtYWxmb3JtZWQKKyAgICAgICAgICAgIC8vIFVURi04IHNlcXVlbmNlcyBhbmQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGxpa2UgdGhlIEFTQ0lJIE5VTAorICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgorCisgICAgICAgICAgICAvLyA0LjMuMSAgVSswMDAwID0gYzAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4YzBceDgwIik7CisgICAgICAgICAgICAvLyA0LjMuMiAgVSswMDAwID0gZTAgODAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZTBceDgwXHg4MCIpOworICAgICAgICAgICAgLy8gNC4zLjMgIFUrMDAwMCA9IGYwIDgwIDgwIDgwCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGYwXHg4MFx4ODBceDgwIik7CisgICAgICAgICAgICAvLyA0LjMuNCAgVSswMDAwID0gZjggODAgODAgODAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZjhceDgwXHg4MFx4ODBceDgwIik7CisgICAgICAgICAgICAvLyA0LjMuNSAgVSswMDAwID0gZmMgODAgODAgODAgODAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZmNceDgwXHg4MFx4ODBceDgwXHg4MCIpOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDVElPTigiNSAgSWxsZWdhbCBjb2RlIHBvc2l0aW9ucyIpCisgICAgeworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIFVURi04IHNlcXVlbmNlcyBzaG91bGQgYmUgcmVqZWN0ZWQgbGlrZSBtYWxmb3JtZWQKKyAgICAgICAgLy8gc2VxdWVuY2VzLCBiZWNhdXNlIHRoZXkgbmV2ZXIgcmVwcmVzZW50IHZhbGlkIElTTyAxMDY0NiBjaGFyYWN0ZXJzIGFuZAorICAgICAgICAvLyBhIFVURi04IGRlY29kZXIgdGhhdCBhY2NlcHRzIHRoZW0gbWlnaHQgaW50cm9kdWNlIHNlY3VyaXR5IHByb2JsZW1zCisgICAgICAgIC8vIGNvbXBhcmFibGUgdG8gb3ZlcmxvbmcgVVRGLTggc2VxdWVuY2VzLgorCisgICAgICAgIFNFQ1RJT04oIjUuMSBTaW5nbGUgVVRGLTE2IHN1cnJvZ2F0ZXMiKQorICAgICAgICB7CisgICAgICAgICAgICAvLyA1LjEuMSAgVStEODAwID0gZWQgYTAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGEwXHg4MCIpOworICAgICAgICAgICAgLy8gNS4xLjIgIFUrREI3RiA9IGVkIGFkIGJmCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGVkXHhhZFx4YmYiKTsKKyAgICAgICAgICAgIC8vIDUuMS4zICBVK0RCODAgPSBlZCBhZSA4MAorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlZFx4YWVceDgwIik7CisgICAgICAgICAgICAvLyA1LjEuNCAgVStEQkZGID0gZWQgYWYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGFmXHhiZiIpOworICAgICAgICAgICAgLy8gNS4xLjUgIFUrREMwMCA9IGVkIGIwIDgwCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGVkXHhiMFx4ODAiKTsKKyAgICAgICAgICAgIC8vIDUuMS42ICBVK0RGODAgPSBlZCBiZSA4MAorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlZFx4YmVceDgwIik7CisgICAgICAgICAgICAvLyA1LjEuNyAgVStERkZGID0gZWQgYmYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGJmXHhiZiIpOworICAgICAgICB9CisKKyAgICAgICAgU0VDVElPTigiNS4yIFBhaXJlZCBVVEYtMTYgc3Vycm9nYXRlcyIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDUuMi4xICBVK0Q4MDAgVStEQzAwID0gZWQgYTAgODAgZWQgYjAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGEwXHg4MFx4ZWRceGIwXHg4MCIpOworICAgICAgICAgICAgLy8gNS4yLjIgIFUrRDgwMCBVK0RGRkYgPSBlZCBhMCA4MCBlZCBiZiBiZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlZFx4YTBceDgwXHhlZFx4YmZceGJmIik7CisgICAgICAgICAgICAvLyA1LjIuMyAgVStEQjdGIFUrREMwMCA9IGVkIGFkIGJmIGVkIGIwIDgwCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGVkXHhhZFx4YmZceGVkXHhiMFx4ODAiKTsKKyAgICAgICAgICAgIC8vIDUuMi40ICBVK0RCN0YgVStERkZGID0gZWQgYWQgYmYgZWQgYmYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGFkXHhiZlx4ZWRceGJmXHhiZiIpOworICAgICAgICAgICAgLy8gNS4yLjUgIFUrREI4MCBVK0RDMDAgPSBlZCBhZSA4MCBlZCBiMCA4MAorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlZFx4YWVceDgwXHhlZFx4YjBceDgwIik7CisgICAgICAgICAgICAvLyA1LjIuNiAgVStEQjgwIFUrREZGRiA9IGVkIGFlIDgwIGVkIGJmIGJmCisgICAgICAgICAgICByb3VuZHRyaXAoZmFsc2UsICJceGVkXHhhZVx4ODBceGVkXHhiZlx4YmYiKTsKKyAgICAgICAgICAgIC8vIDUuMi43ICBVK0RCRkYgVStEQzAwID0gZWQgYWYgYmYgZWQgYjAgODAKKyAgICAgICAgICAgIHJvdW5kdHJpcChmYWxzZSwgIlx4ZWRceGFmXHhiZlx4ZWRceGIwXHg4MCIpOworICAgICAgICAgICAgLy8gNS4yLjggIFUrREJGRiBVK0RGRkYgPSBlZCBhZiBiZiBlZCBiZiBiZgorICAgICAgICAgICAgcm91bmR0cmlwKGZhbHNlLCAiXHhlZFx4YWZceGJmXHhlZFx4YmZceGJmIik7CisgICAgICAgIH0KKworICAgICAgICBTRUNUSU9OKCI1LjMgTm9uY2hhcmFjdGVyIGNvZGUgcG9zaXRpb25zIikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyAibm9uY2hhcmFjdGVycyIgYXJlICJyZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIiBieQorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zLCBhbmQgYWNjb3JkaW5nIHRvIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBVbmljb2RlIFN0YW5kYXJkCisgICAgICAgICAgICAvLyAic2hvdWxkIG5ldmVyIGJlIGludGVyY2hhbmdlZCIuIFVuaWNvZGUgQ29ycmlnZW5kdW0gIzkgZHJvcHBlZCB0aGUKKyAgICAgICAgICAgIC8vIGxhdHRlciByZXN0cmljdGlvbi4gTmV2ZXJ0aGVsZXNzLCB0aGVpciBwcmVzZW5jZSBpbiBpbmNvbWluZyBVVEYtOCBkYXRhCisgICAgICAgICAgICAvLyBjYW4gcmVtYWluIGEgcG90ZW50aWFsIHNlY3VyaXR5IHJpc2ssIGRlcGVuZGluZyBvbiB3aGF0IHVzZSBpcyBtYWRlIG9mCisgICAgICAgICAgICAvLyB0aGVzZSBjb2RlcyBzdWJzZXF1ZW50bHkuIEV4YW1wbGVzIG9mIHN1Y2ggaW50ZXJuYWwgdXNlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAtIFNvbWUgZmlsZSBBUElzIHdpdGggMTYtYml0IGNoYXJhY3RlcnMgbWF5IHVzZSB0aGUgaW50ZWdlciB2YWx1ZSAtMQorICAgICAgICAgICAgLy8gICAgPSBVK0ZGRkYgdG8gc2lnbmFsIGFuIGVuZC1vZi1maWxlIChFT0YpIG9yIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgLSBJbiBzb21lIFVURi0xNiByZWNlaXZlcnMsIGNvZGUgcG9pbnQgVStGRkZFIG1pZ2h0IHRyaWdnZXIgYQorICAgICAgICAgICAgLy8gICAgYnl0ZS1zd2FwIG9wZXJhdGlvbiAodG8gY29udmVydCBiZXR3ZWVuIFVURi0xNkxFIGFuZCBVVEYtMTZCRSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2l0aCBzdWNoIGludGVybmFsIHVzZSBvZiBub25jaGFyYWN0ZXJzLCBpdCBtYXkgYmUgZGVzaXJhYmxlIGFuZCBzYWZlcgorICAgICAgICAgICAgLy8gdG8gYmxvY2sgdGhvc2UgY29kZSBwb2ludHMgaW4gVVRGLTggZGVjb2RlcnMsIGFzIHRoZXkgc2hvdWxkIG5ldmVyCisgICAgICAgICAgICAvLyBvY2N1ciBsZWdpdGltYXRlbHkgaW4gaW5jb21pbmcgVVRGLTggZGF0YSwgYW5kIGNvdWxkIHRyaWdnZXIgdW5zYWZlCisgICAgICAgICAgICAvLyBiZWhhdmlvdXIgaW4gc3Vic2VxdWVudCBwcm9jZXNzaW5nLgorCisgICAgICAgICAgICAvLyBQYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgbm9uY2hhcmFjdGVycyBpbiAxNi1iaXQgYXBwbGljYXRpb25zOgorCisgICAgICAgICAgICAvLyA1LjMuMSAgVStGRkZFID0gZWYgYmYgYmUKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhlZlx4YmZceGJlIik7CisgICAgICAgICAgICAvLyA1LjMuMiAgVStGRkZGID0gZWYgYmYgYmYKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhlZlx4YmZceGJmIik7CisKKyAgICAgICAgICAgIC8vIDUuMy4zICBVK0ZERDAgLi4gVStGREVGCisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5MCIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4OTEiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceDkyIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5MyIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4OTQiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceDk1Iik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5NiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4OTciKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceDk4Iik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5OSIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4OUEiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceDlCIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5QyIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4OUQiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceDlFIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHg5RiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QTAiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceEExIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHhBMiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QTMiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceEE0Iik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHhBNSIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QTYiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceEE3Iik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHhBOCIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QTkiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceEFBIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHhBQiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QUMiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhFRlx4QjdceEFEIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RUZceEI3XHhBRSIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEVGXHhCN1x4QUYiKTsKKworICAgICAgICAgICAgLy8gNS4zLjQgIFUrbkZGRkUgVStuRkZGRiAoZm9yIG4gPSAxLi4xMCkKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhGMFx4OUZceEJGXHhCRiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEYwXHhBRlx4QkZceEJGIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RjBceEJGXHhCRlx4QkYiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhGMVx4OEZceEJGXHhCRiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEYxXHg5Rlx4QkZceEJGIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RjFceEFGXHhCRlx4QkYiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhGMVx4QkZceEJGXHhCRiIpOworICAgICAgICAgICAgcm91bmR0cmlwKHRydWUsICJceEYyXHg4Rlx4QkZceEJGIik7CisgICAgICAgICAgICByb3VuZHRyaXAodHJ1ZSwgIlx4RjJceDlGXHhCRlx4QkYiKTsKKyAgICAgICAgICAgIHJvdW5kdHJpcCh0cnVlLCAiXHhGMlx4QUZceEJGXHhCRiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcmMvdW5pdC5jcHAgYi90ZXN0L3NyYy91bml0LmNwcAppbmRleCAxYWQ3N2NlLi5jM2NmYTBmIDEwMDY0NAotLS0gYS90ZXN0L3NyYy91bml0LmNwcAorKysgYi90ZXN0L3NyYy91bml0LmNwcApAQCAtMSwxMSArMSwxMSBAQAogLyoKICAgICBfXyBfX19fXyBfX19fXyBfX19fXwogIF9ffCAgfCAgIF9ffCAgICAgfCAgIHwgfCAgSlNPTiBmb3IgTW9kZXJuIEMrKyAodGVzdCBzdWl0ZSkKLXwgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4wLjEKK3wgIHwgIHxfXyAgIHwgIHwgIHwgfCB8IHwgIHZlcnNpb24gMy4xLjAKIHxfX19fX3xfX19fX3xfX19fX3xffF9fX3wgIGh0dHBzOi8vZ2l0aHViLmNvbS9ubG9obWFubi9qc29uCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uCi1Db3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBOaWVscyBMb2htYW5uIDxodHRwOi8vbmxvaG1hbm4ubWU+LgorQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggTmllbHMgTG9obWFubiA8aHR0cDovL25sb2htYW5uLm1lPi4KIAogUGVybWlzc2lvbiBpcyBoZXJlYnkgIGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FtYWxnYW1hdGUvQ0hBTkdFUy5tZCBiL3RoaXJkX3BhcnR5L2FtYWxnYW1hdGUvQ0hBTkdFUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjhiOTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9DSEFOR0VTLm1kCkBAIC0wLDAgKzEsMTAgQEAKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29kZSB3aXRoIHJlc3BlY3QgdG8gPGh0dHBzOi8vZ2l0aHViLmNvbS9lZGx1bmQvYW1hbGdhbWF0ZS9jb21taXQvYzkxZjA3ZWVhMTEzM2FhMTg0ZjY1MmI4ZjEzOThlYWYwMzU4NjIwOD46CisKKy0gUmVzb2x2ZWQgaW5zcGVjdGlvbiByZXN1bHRzIGZyb20gUHlDaGFybToKKyAgLSByZXBsYWNlZCB0YWJzIHdpdGggc3BhY2VzCisgIC0gYWRkZWQgZW5jb2RpbmcgYW5ub3RhdGlvbgorICAtIHJlaW5kZW50ZWQgZmlsZSB0byByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZXMKKyAgLSB1bnVzZWQgaW1wb3J0IGBzeXNgCisgIC0gbWVtYmVyc2hpcCBjaGVjaworICAtIG1hZGUgZnVuY3Rpb24gZnJvbSBgX2lzX3dpdGhpbmAKKyAgLSByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBgYWN0dWFsX3BhdGhgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbWFsZ2FtYXRlL0xJQ0VOU0UubWQgYi90aGlyZF9wYXJ0eS9hbWFsZ2FtYXRlL0xJQ0VOU0UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlOWNmMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2FtYWxnYW1hdGUvTElDRU5TRS5tZApAQCAtMCwwICsxLDI3IEBACithbWFsZ2FtYXRlLnB5IC0gQW1hbGdhbWF0ZSBDIHNvdXJjZSBhbmQgaGVhZGVyIGZpbGVzCitDb3B5cmlnaHQgKGMpIDIwMTIsIEVyaWsgRWRsdW5kIDxlcmlrLmVkbHVuZEAzMjc2Ny5zZT4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRXJpayBFZGx1bmQsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9SRUFETUUubWQgYi90aGlyZF9wYXJ0eS9hbWFsZ2FtYXRlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVjYTBiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9SRUFETUUubWQKQEAgLTAsMCArMSw2NiBAQAorCisjIGFtYWxnYW1hdGUucHkgLSBBbWFsZ2FtYXRlIEMgc291cmNlIGFuZCBoZWFkZXIgZmlsZXMKKworT3JpZ2luOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvZXJpa2VkbHVuZC9hbWFsZ2FtYXRlCisKK01pcnJvcjogaHR0cHM6Ly9naXRodWIuY29tL2VkbHVuZC9hbWFsZ2FtYXRlCisKK2BhbWFsZ2FtYXRlLnB5YCBhaW1zIHRvIG1ha2UgaXQgZWFzeSB0byB1c2UgU1FMaXRlLXN0eWxlIEMgc291cmNlIGFuZCBoZWFkZXIKK2FtYWxnYW1hdGlvbiBpbiBwcm9qZWN0cy4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0bzogaHR0cDovL3NxbGl0ZS5vcmcvYW1hbGdhbWF0aW9uLmh0bWwKKworIyMgSGVyZSBiZSBkcmFnb25zCisKK2BhbWFsZ2FtYXRlLnB5YCBpcyBxdWl0ZSBkdW1iLCBpdCBvbmx5IGtub3dzIHRoZSBiYXJlIG1pbmltdW0gYWJvdXQgQyBjb2RlCityZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGhhbmRsZSB0cml2aWFsIGluY2x1ZGUgZGlyZWN0aXZlcy4gSXQgY2FuCitwcm9kdWNlIHdlaXJkIHJlc3VsdHMgZm9yIHVuZXhwZWN0ZWQgY29kZS4KKworVGhpbmdzIHRvIGJlIGF3YXJlIG9mOgorCitgYW1hbGdhbWF0ZS5weWAgd2lsbCBub3QgaGFuZGxlIGNvbXBsZXggaW5jbHVkZSBkaXJlY3RpdmVzIGNvcnJlY3RseToKKworICAgICAgICAjZGVmaW5lIEhFQURFUl9QQVRIICJwYXRoL3RvL2hlYWRlci5oIgorICAgICAgICAjaW5jbHVkZSBIRUFERVJfUEFUSAorCitJbiB0aGUgYWJvdmUgZXhhbXBsZSwgYHBhdGgvdG8vaGVhZGVyLmhgIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZQorYW1hbGdhbWF0aW9uIChIRUFERVJfUEFUSCBpcyBuZXZlciBleHBhbmRlZCkuCisKK2BhbWFsZ2FtYXRlLnB5YCBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGVhY2ggc291cmNlIGFuZCBoZWFkZXIgZmlsZSB3aGljaAoraXMgbm90IGVtcHR5IHdpbGwgZW5kIGluIGEgbmV3LWxpbmUgY2hhcmFjdGVyLCB3aGljaCBpcyBub3QgaW1tZWRpYXRlbHkKK3ByZWNlZGVkIGJ5IGEgYmFja3NsYXNoIGNoYXJhY3RlciAoc2VlIDUuMS4xLjJwMS4yIG9mIElTTyBDOTkpLgorCitgYW1hbGdhbWF0ZS5weWAgc2hvdWxkIGJlIHVzYWJsZSB3aXRoIEMrKyBjb2RlLCBidXQgcmF3IHN0cmluZyBsaXRlcmFscyBmcm9tCitDKysxMSB3aWxsIGRlZmluaXRlbHkgY2F1c2UgcHJvYmxlbXM6CisKKyAgICAgICAgUiJkZWxpbWl0ZXIoVGVycmlibGUgcmF3IFwgZGF0YSAiICNpbmNsdWRlIDxzbmVha3kuaHBwPilkZWxpbWl0ZXIiCisgICAgICAgIFIiZGVsaW1pdGVyKFRlcnJpYmxlIHJhdyBcIGRhdGEgIiBlc2NhcGluZylkZWxpbWl0ZXIiCisKK0luIHRoZSBleGFtcGxlcyBhYm92ZSwgYGFtYWxnYW1hdGUucHlgIHdpbGwgc3RvcCBwYXJzaW5nIHRoZSByYXcgc3RyaW5nIGxpdGVyYWwKK3doZW4gaXQgZW5jb3VudGVycyB0aGUgZmlyc3QgcXVvdGF0aW9uIG1hcmssIHdoaWNoIHdpbGwgcHJvZHVjZSB1bmV4cGVjdGVkCityZXN1bHRzLgorCisjIyBJbnN0YWxsaW5nIGFtYWxnYW1hdGUucHkKKworUHl0aG9uIHYuMi43LjAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkLgorCitgYW1hbGdhbWF0ZS5weWAgY2FuIGJlIHRlc3RlZCBhbmQgaW5zdGFsbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgICAgICAgLi90ZXN0LnNoICYmIHN1ZG8gLWsgY3AgLi9hbWFsZ2FtYXRlLnB5IC91c3IvbG9jYWwvYmluLworCisjIyBVc2luZyBhbWFsZ2FtYXRlLnB5CisKKyAgICAgICAgYW1hbGdhbWF0ZS5weSBbLXZdIC1jIHBhdGgvdG8vY29uZmlnLmpzb24gLXMgcGF0aC90by9zb3VyY2UvZGlyIFwKKyAgICAgICAgICAgICAgICBbLXAgcGF0aC90by9wcm9sb2d1ZS4oY3xoKV0KKworICogVGhlIGAtYywgLS1jb25maWdgIG9wdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgcGF0aCB0byBhIEpTT04gY29uZmlnIGZpbGUgd2hpY2gKKyAgIGxpc3RzIHRoZSBzb3VyY2UgZmlsZXMsIGluY2x1ZGUgcGF0aHMgYW5kIHdoZXJlIHRvIHdyaXRlIHRoZSByZXN1bHRpbmcKKyAgIGFtYWxnYW1hdGlvbi4gSGF2ZSBhIGxvb2sgYXQgYHRlc3Qvc291cmNlLmMuanNvbmAgYW5kIGB0ZXN0L2luY2x1ZGUuaC5qc29uYAorICAgdG8gc2VlIHR3byBleGFtcGxlcy4KKworICogVGhlIGAtcywgLS1zb3VyY2VgIG9wdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyAgIFRoaXMgaXMgdXNlZnVsIGZvciBzdXBwb3J0aW5nIHNlcGFyYXRlIHNvdXJjZSBhbmQgYnVpbGQgZGlyZWN0b3JpZXMuCisKKyAqIFRoZSBgLXAsIC0tcHJvbG9ndWVgIG9wdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgcGF0aCB0byBhIGZpbGUgd2hpY2ggd2lsbCBiZQorICAgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYW1hbGdhbWF0aW9uLiBJdCBpcyBvcHRpb25hbC4KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9hbWFsZ2FtYXRlLnB5IGIvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9hbWFsZ2FtYXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwMWI0M2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9hbWFsZ2FtYXRlL2FtYWxnYW1hdGUucHkKQEAgLTAsMCArMSwyOTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBjb2Rpbmc9dXRmLTgKKworIyBhbWFsZ2FtYXRlLnB5IC0gQW1hbGdhbWF0ZSBDIHNvdXJjZSBhbmQgaGVhZGVyIGZpbGVzLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIsIEVyaWsgRWRsdW5kIDxlcmlrLmVkbHVuZEAzMjc2Ny5zZT4KKyMgCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisjIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyMgCisjICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyMgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIAorIyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisjICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgCisjICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRXJpayBFZGx1bmQsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyMgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyMgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMgCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcmUKKworCitjbGFzcyBBbWFsZ2FtYXRpb24ob2JqZWN0KToKKworICAgICMgUHJlcGVuZHMgc2VsZi5zb3VyY2VfcGF0aCB0byBmaWxlX3BhdGggaWYgbmVlZGVkLgorICAgIGRlZiBhY3R1YWxfcGF0aChzZWxmLCBmaWxlX3BhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhmaWxlX3BhdGgpOgorICAgICAgICAgICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuc291cmNlX3BhdGgsIGZpbGVfcGF0aCkKKyAgICAgICAgcmV0dXJuIGZpbGVfcGF0aAorCisgICAgIyBTZWFyY2ggaW5jbHVkZWQgZmlsZV9wYXRoIGluIHNlbGYuaW5jbHVkZV9wYXRocyBhbmQKKyAgICAjIGluIHNvdXJjZV9kaXIgaWYgc3BlY2lmaWVkLgorICAgIGRlZiBmaW5kX2luY2x1ZGVkX2ZpbGUoc2VsZiwgZmlsZV9wYXRoLCBzb3VyY2VfZGlyKToKKyAgICAgICAgc2VhcmNoX2RpcnMgPSBzZWxmLmluY2x1ZGVfcGF0aHNbOl0KKyAgICAgICAgaWYgc291cmNlX2RpcjoKKyAgICAgICAgICAgIHNlYXJjaF9kaXJzLmluc2VydCgwLCBzb3VyY2VfZGlyKQorCisgICAgICAgIGZvciBzZWFyY2hfZGlyIGluIHNlYXJjaF9kaXJzOgorICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VhcmNoX2RpciwgZmlsZV9wYXRoKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5hY3R1YWxfcGF0aChzZWFyY2hfcGF0aCkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWFyY2hfcGF0aAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MpOgorICAgICAgICB3aXRoIG9wZW4oYXJncy5jb25maWcsICdyJykgYXMgZjoKKyAgICAgICAgICAgIGNvbmZpZyA9IGpzb24ubG9hZHMoZi5yZWFkKCkpCisgICAgICAgICAgICBmb3Iga2V5IGluIGNvbmZpZzoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgY29uZmlnW2tleV0pCisKKyAgICAgICAgICAgIHNlbGYudmVyYm9zZSA9IGFyZ3MudmVyYm9zZSA9PSAieWVzIgorICAgICAgICAgICAgc2VsZi5wcm9sb2d1ZSA9IGFyZ3MucHJvbG9ndWUKKyAgICAgICAgICAgIHNlbGYuc291cmNlX3BhdGggPSBhcmdzLnNvdXJjZV9wYXRoCisgICAgICAgICAgICBzZWxmLmluY2x1ZGVkX2ZpbGVzID0gW10KKworICAgICMgR2VuZXJhdGUgdGhlIGFtYWxnYW1hdGlvbiBhbmQgd3JpdGUgaXQgdG8gdGhlIHRhcmdldCBmaWxlLgorICAgIGRlZiBnZW5lcmF0ZShzZWxmKToKKyAgICAgICAgYW1hbGdhbWF0aW9uID0gIiIKKworICAgICAgICBpZiBzZWxmLnByb2xvZ3VlOgorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYucHJvbG9ndWUsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICBhbWFsZ2FtYXRpb24gKz0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoZi5yZWFkKCkpCisKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIkNvbmZpZzoiKQorICAgICAgICAgICAgcHJpbnQoIiB0YXJnZXQgICAgICAgID0gezB9Ii5mb3JtYXQoc2VsZi50YXJnZXQpKQorICAgICAgICAgICAgcHJpbnQoIiB3b3JraW5nX2RpciAgID0gezB9Ii5mb3JtYXQob3MuZ2V0Y3dkKCkpKQorICAgICAgICAgICAgcHJpbnQoIiBpbmNsdWRlX3BhdGhzID0gezB9Ii5mb3JtYXQoc2VsZi5pbmNsdWRlX3BhdGhzKSkKKyAgICAgICAgcHJpbnQoIkNyZWF0aW5nIGFtYWxnYW1hdGlvbjoiKQorICAgICAgICBmb3IgZmlsZV9wYXRoIGluIHNlbGYuc291cmNlczoKKyAgICAgICAgICAgICMgRG8gbm90IGNoZWNrIHRoZSBpbmNsdWRlIHBhdGhzIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNvdXJjZQorICAgICAgICAgICAgIyBsaXN0LCBhbGwgZ2l2ZW4gc291cmNlIHBhdGhzIG11c3QgYmUgY29ycmVjdC4KKyAgICAgICAgICAgICMgYWN0dWFsX3BhdGggPSBzZWxmLmFjdHVhbF9wYXRoKGZpbGVfcGF0aCkKKyAgICAgICAgICAgIHByaW50KCIgLSBwcm9jZXNzaW5nIFwiezB9XCIiLmZvcm1hdChmaWxlX3BhdGgpKQorICAgICAgICAgICAgdCA9IFRyYW5zbGF0aW9uVW5pdChmaWxlX3BhdGgsIHNlbGYsIFRydWUpCisgICAgICAgICAgICBhbWFsZ2FtYXRpb24gKz0gdC5jb250ZW50CisKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYudGFyZ2V0LCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGFtYWxnYW1hdGlvbikKKworICAgICAgICBwcmludCgiLi4uZG9uZSFcbiIpCisgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJGaWxlcyBwcm9jZXNzZWQ6IHswfSIuZm9ybWF0KHNlbGYuc291cmNlcykpCisgICAgICAgICAgICBwcmludCgiRmlsZXMgaW5jbHVkZWQ6IHswfSIuZm9ybWF0KHNlbGYuaW5jbHVkZWRfZmlsZXMpKQorICAgICAgICBwcmludCgiIikKKworCitkZWYgX2lzX3dpdGhpbihtYXRjaCwgbWF0Y2hlcyk6CisgICAgZm9yIG0gaW4gbWF0Y2hlczoKKyAgICAgICAgaWYgbWF0Y2guc3RhcnQoKSA+IG0uc3RhcnQoKSBhbmQgXAorICAgICAgICAgICAgICAgIG1hdGNoLmVuZCgpIDwgbS5lbmQoKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgVHJhbnNsYXRpb25Vbml0KG9iamVjdCk6CisgICAgIyAvLyBDKysgY29tbWVudC4KKyAgICBjcHBfY29tbWVudF9wYXR0ZXJuID0gcmUuY29tcGlsZShyIi8vLio/XG4iKQorCisgICAgIyAvKiBDIGNvbW1lbnQuICovCisgICAgY19jb21tZW50X3BhdHRlcm4gPSByZS5jb21waWxlKHIiL1wqLio/XCovIiwgcmUuUykKKworICAgICMgImNvbXBsZXggXCJzdHJpXFxcbmdcIiB2YWx1ZSIuCisgICAgc3RyaW5nX3BhdHRlcm4gPSByZS5jb21waWxlKCJbXiddIiByJyIuKj8oPzw9W15cXF0pIicsIHJlLlMpCisKKyAgICAjIEhhbmRsZSBzaW1wbGUgaW5jbHVkZSBkaXJlY3RpdmVzLiBTdXBwb3J0IGZvciBhZHZhbmNlZAorICAgICMgZGlyZWN0aXZlcyB3aGVyZSBtYWNyb3MgYW5kIGRlZmluZXMgbmVlZHMgdG8gZXhwYW5kZWQgaXMKKyAgICAjIG5vdCBhIGNvbmNlcm4gcmlnaHQgbm93LgorICAgIGluY2x1ZGVfcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInI1xzKmluY2x1ZGVccysoPHwiKSg/UDxwYXRoPi4qPykoInw+KScsIHJlLlMpCisKKyAgICAjICNwcmFnbWEgb25jZQorICAgIHByYWdtYV9vbmNlX3BhdHRlcm4gPSByZS5jb21waWxlKHInI1xzKnByYWdtYVxzK29uY2UnLCByZS5TKQorCisgICAgIyBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gc2VsZi5jb250ZW50LCBhZGQgdGhlIG1hdGNoIHRvCisgICAgIyBjb250ZXh0cyBpZiBmb3VuZCBhbmQgdXBkYXRlIHRoZSBpbmRleCBhY2NvcmRpbmdseS4KKyAgICBkZWYgX3NlYXJjaF9jb250ZW50KHNlbGYsIGluZGV4LCBwYXR0ZXJuLCBjb250ZXh0cyk6CisgICAgICAgIG1hdGNoID0gcGF0dGVybi5zZWFyY2goc2VsZi5jb250ZW50LCBpbmRleCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBjb250ZXh0cy5hcHBlbmQobWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gbWF0Y2guZW5kKCkKKyAgICAgICAgcmV0dXJuIGluZGV4ICsgMgorCisgICAgIyBSZXR1cm4gYWxsIHRoZSBza2lwcGFibGUgY29udGV4dHMsIGkuZS4sIGNvbW1lbnRzIGFuZCBzdHJpbmdzCisgICAgZGVmIF9maW5kX3NraXBwYWJsZV9jb250ZXh0cyhzZWxmKToKKyAgICAgICAgIyBGaW5kIGNvbnRleHRzIGluIHRoZSBjb250ZW50IGluIHdoaWNoIGEgZm91bmQgaW5jbHVkZQorICAgICAgICAjIGRpcmVjdGl2ZSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZC4KKyAgICAgICAgc2tpcHBhYmxlX2NvbnRleHRzID0gW10KKworICAgICAgICAjIFdhbGsgdGhyb3VnaCB0aGUgY29udGVudCBjaGFyIGJ5IGNoYXIsIGFuZCB0cnkgdG8gZ3JhYgorICAgICAgICAjIHNraXBwYWJsZSBjb250ZXh0cyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zIHdoZW4gZm91bmQuCisgICAgICAgIGkgPSAxCisgICAgICAgIGNvbnRlbnRfbGVuID0gbGVuKHNlbGYuY29udGVudCkKKyAgICAgICAgd2hpbGUgaSA8IGNvbnRlbnRfbGVuOgorICAgICAgICAgICAgaiA9IGkgLSAxCisgICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5jb250ZW50W2ldCisgICAgICAgICAgICBwcmV2aW91cyA9IHNlbGYuY29udGVudFtqXQorCisgICAgICAgICAgICBpZiBjdXJyZW50ID09ICciJzoKKyAgICAgICAgICAgICAgICAjIFN0cmluZyB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpID0gc2VsZi5fc2VhcmNoX2NvbnRlbnQoaiwgc2VsZi5zdHJpbmdfcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBhYmxlX2NvbnRleHRzKQorICAgICAgICAgICAgZWxpZiBjdXJyZW50ID09ICcqJyBhbmQgcHJldmlvdXMgPT0gJy8nOgorICAgICAgICAgICAgICAgICMgQyBzdHlsZSBjb21tZW50LgorICAgICAgICAgICAgICAgIGkgPSBzZWxmLl9zZWFyY2hfY29udGVudChqLCBzZWxmLmNfY29tbWVudF9wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGFibGVfY29udGV4dHMpCisgICAgICAgICAgICBlbGlmIGN1cnJlbnQgPT0gJy8nIGFuZCBwcmV2aW91cyA9PSAnLyc6CisgICAgICAgICAgICAgICAgIyBDKysgc3R5bGUgY29tbWVudC4KKyAgICAgICAgICAgICAgICBpID0gc2VsZi5fc2VhcmNoX2NvbnRlbnQoaiwgc2VsZi5jcHBfY29tbWVudF9wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGFibGVfY29udGV4dHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgU2tpcCB0byB0aGUgbmV4dCBjaGFyLgorICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgIHJldHVybiBza2lwcGFibGVfY29udGV4dHMKKworICAgICMgUmV0dXJucyBUcnVlIGlmIHRoZSBtYXRjaCBpcyB3aXRoaW4gbGlzdCBvZiBvdGhlciBtYXRjaGVzCisKKyAgICAjIFJlbW92ZXMgcHJhZ21hIG9uY2UgZnJvbSBjb250ZW50CisgICAgZGVmIF9wcm9jZXNzX3ByYWdtYV9vbmNlKHNlbGYpOgorICAgICAgICBjb250ZW50X2xlbiA9IGxlbihzZWxmLmNvbnRlbnQpCisgICAgICAgIGlmIGNvbnRlbnRfbGVuIDwgbGVuKCIjaW5jbHVkZSA8eD4iKToKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgIyBGaW5kIGNvbnRleHRzIGluIHRoZSBjb250ZW50IGluIHdoaWNoIGEgZm91bmQgaW5jbHVkZQorICAgICAgICAjIGRpcmVjdGl2ZSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZC4KKyAgICAgICAgc2tpcHBhYmxlX2NvbnRleHRzID0gc2VsZi5fZmluZF9za2lwcGFibGVfY29udGV4dHMoKQorCisgICAgICAgIHByYWdtYXMgPSBbXQorICAgICAgICBwcmFnbWFfb25jZV9tYXRjaCA9IHNlbGYucHJhZ21hX29uY2VfcGF0dGVybi5zZWFyY2goc2VsZi5jb250ZW50KQorICAgICAgICB3aGlsZSBwcmFnbWFfb25jZV9tYXRjaDoKKyAgICAgICAgICAgIGlmIG5vdCBfaXNfd2l0aGluKHByYWdtYV9vbmNlX21hdGNoLCBza2lwcGFibGVfY29udGV4dHMpOgorICAgICAgICAgICAgICAgIHByYWdtYXMuYXBwZW5kKHByYWdtYV9vbmNlX21hdGNoKQorCisgICAgICAgICAgICBwcmFnbWFfb25jZV9tYXRjaCA9IHNlbGYucHJhZ21hX29uY2VfcGF0dGVybi5zZWFyY2goc2VsZi5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByYWdtYV9vbmNlX21hdGNoLmVuZCgpKQorCisgICAgICAgICMgSGFuZGxlIGFsbCBjb2xsZWN0ZWQgcHJhZ21hIG9uY2UgZGlyZWN0aXZlcy4KKyAgICAgICAgcHJldl9lbmQgPSAwCisgICAgICAgIHRtcF9jb250ZW50ID0gJycKKyAgICAgICAgZm9yIHByYWdtYV9tYXRjaCBpbiBwcmFnbWFzOgorICAgICAgICAgICAgdG1wX2NvbnRlbnQgKz0gc2VsZi5jb250ZW50W3ByZXZfZW5kOnByYWdtYV9tYXRjaC5zdGFydCgpXQorICAgICAgICAgICAgcHJldl9lbmQgPSBwcmFnbWFfbWF0Y2guZW5kKCkKKyAgICAgICAgdG1wX2NvbnRlbnQgKz0gc2VsZi5jb250ZW50W3ByZXZfZW5kOl0KKyAgICAgICAgc2VsZi5jb250ZW50ID0gdG1wX2NvbnRlbnQKKworICAgICMgSW5jbHVkZSBhbGwgdHJpdmlhbCAjaW5jbHVkZSBkaXJlY3RpdmVzIGludG8gc2VsZi5jb250ZW50LgorICAgIGRlZiBfcHJvY2Vzc19pbmNsdWRlcyhzZWxmKToKKyAgICAgICAgY29udGVudF9sZW4gPSBsZW4oc2VsZi5jb250ZW50KQorICAgICAgICBpZiBjb250ZW50X2xlbiA8IGxlbigiI2luY2x1ZGUgPHg+Iik6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgICMgRmluZCBjb250ZXh0cyBpbiB0aGUgY29udGVudCBpbiB3aGljaCBhIGZvdW5kIGluY2x1ZGUKKyAgICAgICAgIyBkaXJlY3RpdmUgc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQuCisgICAgICAgIHNraXBwYWJsZV9jb250ZXh0cyA9IHNlbGYuX2ZpbmRfc2tpcHBhYmxlX2NvbnRleHRzKCkKKworICAgICAgICAjIFNlYXJjaCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGluIHRoZSBjb250ZW50LCBjb2xsZWN0IHRob3NlCisgICAgICAgICMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbnRlbnQuCisgICAgICAgIGluY2x1ZGVzID0gW10KKyAgICAgICAgaW5jbHVkZV9tYXRjaCA9IHNlbGYuaW5jbHVkZV9wYXR0ZXJuLnNlYXJjaChzZWxmLmNvbnRlbnQpCisgICAgICAgIHdoaWxlIGluY2x1ZGVfbWF0Y2g6CisgICAgICAgICAgICBpZiBub3QgX2lzX3dpdGhpbihpbmNsdWRlX21hdGNoLCBza2lwcGFibGVfY29udGV4dHMpOgorICAgICAgICAgICAgICAgIGluY2x1ZGVfcGF0aCA9IGluY2x1ZGVfbWF0Y2guZ3JvdXAoInBhdGgiKQorICAgICAgICAgICAgICAgIHNlYXJjaF9zYW1lX2RpciA9IGluY2x1ZGVfbWF0Y2guZ3JvdXAoMSkgPT0gJyInCisgICAgICAgICAgICAgICAgZm91bmRfaW5jbHVkZWRfcGF0aCA9IHNlbGYuYW1hbGdhbWF0aW9uLmZpbmRfaW5jbHVkZWRfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9wYXRoLCBzZWxmLmZpbGVfZGlyIGlmIHNlYXJjaF9zYW1lX2RpciBlbHNlIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgZm91bmRfaW5jbHVkZWRfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMuYXBwZW5kKChpbmNsdWRlX21hdGNoLCBmb3VuZF9pbmNsdWRlZF9wYXRoKSkKKworICAgICAgICAgICAgaW5jbHVkZV9tYXRjaCA9IHNlbGYuaW5jbHVkZV9wYXR0ZXJuLnNlYXJjaChzZWxmLmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfbWF0Y2guZW5kKCkpCisKKyAgICAgICAgIyBIYW5kbGUgYWxsIGNvbGxlY3RlZCBpbmNsdWRlIGRpcmVjdGl2ZXMuCisgICAgICAgIHByZXZfZW5kID0gMAorICAgICAgICB0bXBfY29udGVudCA9ICcnCisgICAgICAgIGZvciBpbmNsdWRlIGluIGluY2x1ZGVzOgorICAgICAgICAgICAgaW5jbHVkZV9tYXRjaCwgZm91bmRfaW5jbHVkZWRfcGF0aCA9IGluY2x1ZGUKKyAgICAgICAgICAgIHRtcF9jb250ZW50ICs9IHNlbGYuY29udGVudFtwcmV2X2VuZDppbmNsdWRlX21hdGNoLnN0YXJ0KCldCisgICAgICAgICAgICB0bXBfY29udGVudCArPSAiLy8gezB9XG4iLmZvcm1hdChpbmNsdWRlX21hdGNoLmdyb3VwKDApKQorICAgICAgICAgICAgaWYgZm91bmRfaW5jbHVkZWRfcGF0aCBub3QgaW4gc2VsZi5hbWFsZ2FtYXRpb24uaW5jbHVkZWRfZmlsZXM6CisgICAgICAgICAgICAgICAgdCA9IFRyYW5zbGF0aW9uVW5pdChmb3VuZF9pbmNsdWRlZF9wYXRoLCBzZWxmLmFtYWxnYW1hdGlvbiwgRmFsc2UpCisgICAgICAgICAgICAgICAgdG1wX2NvbnRlbnQgKz0gdC5jb250ZW50CisgICAgICAgICAgICBwcmV2X2VuZCA9IGluY2x1ZGVfbWF0Y2guZW5kKCkKKyAgICAgICAgdG1wX2NvbnRlbnQgKz0gc2VsZi5jb250ZW50W3ByZXZfZW5kOl0KKyAgICAgICAgc2VsZi5jb250ZW50ID0gdG1wX2NvbnRlbnQKKworICAgICAgICByZXR1cm4gbGVuKGluY2x1ZGVzKQorCisgICAgIyBNYWtlIGFsbCBjb250ZW50IHByb2Nlc3NpbmcKKyAgICBkZWYgX3Byb2Nlc3Moc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3Jvb3Q6CisgICAgICAgICAgICBzZWxmLl9wcm9jZXNzX3ByYWdtYV9vbmNlKCkKKyAgICAgICAgc2VsZi5fcHJvY2Vzc19pbmNsdWRlcygpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZV9wYXRoLCBhbWFsZ2FtYXRpb24sIGlzX3Jvb3QpOgorICAgICAgICBzZWxmLmZpbGVfcGF0aCA9IGZpbGVfcGF0aAorICAgICAgICBzZWxmLmZpbGVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGZpbGVfcGF0aCkKKyAgICAgICAgc2VsZi5hbWFsZ2FtYXRpb24gPSBhbWFsZ2FtYXRpb24KKyAgICAgICAgc2VsZi5pc19yb290ID0gaXNfcm9vdAorCisgICAgICAgIHNlbGYuYW1hbGdhbWF0aW9uLmluY2x1ZGVkX2ZpbGVzLmFwcGVuZChzZWxmLmZpbGVfcGF0aCkKKworICAgICAgICBhY3R1YWxfcGF0aCA9IHNlbGYuYW1hbGdhbWF0aW9uLmFjdHVhbF9wYXRoKGZpbGVfcGF0aCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGFjdHVhbF9wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkZpbGUgbm90IGZvdW5kOiBcInswfVwiIi5mb3JtYXQoZmlsZV9wYXRoKSkKKyAgICAgICAgd2l0aCBvcGVuKGFjdHVhbF9wYXRoLCAncicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5fcHJvY2VzcygpCisKKworZGVmIG1haW4oKToKKyAgICBkZXNjcmlwdGlvbiA9ICJBbWFsZ2FtYXRlIEMgc291cmNlIGFuZCBoZWFkZXIgZmlsZXMuIgorICAgIHVzYWdlID0gIiAiLmpvaW4oWworICAgICAgICAiYW1hbGdhbWF0ZS5weSIsCisgICAgICAgICJbLXZdIiwKKyAgICAgICAgIi1jIHBhdGgvdG8vY29uZmlnLmpzb24iLAorICAgICAgICAiLXMgcGF0aC90by9zb3VyY2UvZGlyIiwKKyAgICAgICAgIlstcCBwYXRoL3RvL3Byb2xvZ3VlLihjfGgpXSIKKyAgICBdKQorICAgIGFyZ3NwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgZGVzY3JpcHRpb249ZGVzY3JpcHRpb24sIHVzYWdlPXVzYWdlKQorCisgICAgYXJnc3BhcnNlci5hZGRfYXJndW1lbnQoIi12IiwgIi0tdmVyYm9zZSIsIGRlc3Q9InZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WyJ5ZXMiLCAibm8iXSwgbWV0YXZhcj0iIiwgaGVscD0iYmUgdmVyYm9zZSIpCisKKyAgICBhcmdzcGFyc2VyLmFkZF9hcmd1bWVudCgiLWMiLCAiLS1jb25maWciLCBkZXN0PSJjb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUsIG1ldGF2YXI9IiIsIGhlbHA9InBhdGggdG8gYSBKU09OIGNvbmZpZyBmaWxlIikKKworICAgIGFyZ3NwYXJzZXIuYWRkX2FyZ3VtZW50KCItcyIsICItLXNvdXJjZSIsIGRlc3Q9InNvdXJjZV9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlLCBtZXRhdmFyPSIiLCBoZWxwPSJzb3VyY2UgY29kZSBwYXRoIikKKworICAgIGFyZ3NwYXJzZXIuYWRkX2FyZ3VtZW50KCItcCIsICItLXByb2xvZ3VlIiwgZGVzdD0icHJvbG9ndWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLCBtZXRhdmFyPSIiLCBoZWxwPSJwYXRoIHRvIGEgQyBwcm9sb2d1ZSBmaWxlIikKKworICAgIGFtYWxnYW1hdGlvbiA9IEFtYWxnYW1hdGlvbihhcmdzcGFyc2VyLnBhcnNlX2FyZ3MoKSkKKyAgICBhbWFsZ2FtYXRpb24uZ2VuZXJhdGUoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hbWFsZ2FtYXRlL2NvbmZpZy5qc29uIGIvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9jb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmZjMjFjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYW1hbGdhbWF0ZS9jb25maWcuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKwkicHJvamVjdCI6ICJKU09OIGZvciBNb2Rlcm4gQysrIiwKKwkidGFyZ2V0IjogInNpbmdsZV9pbmNsdWRlL25sb2htYW5uL2pzb24uaHBwIiwKKwkic291cmNlcyI6IFsKKwkJImluY2x1ZGUvbmxvaG1hbm4vanNvbi5ocHAiCisJXSwKKwkiaW5jbHVkZV9wYXRocyI6IFsiaW5jbHVkZSJdCit9Cg==